EasyOnboardingInviteActivity.java

  1package eu.siacs.conversations.ui;
  2
  3import android.app.Activity;
  4import android.content.Intent;
  5import android.graphics.Bitmap;
  6import android.graphics.Point;
  7import android.net.Uri;
  8import android.os.Bundle;
  9import android.util.Log;
 10import android.view.Menu;
 11import android.view.MenuItem;
 12import android.view.View;
 13import android.widget.Toast;
 14
 15import androidx.databinding.DataBindingUtil;
 16
 17import com.google.common.base.Strings;
 18
 19import eu.siacs.conversations.Config;
 20import eu.siacs.conversations.R;
 21import eu.siacs.conversations.databinding.ActivityEasyInviteBinding;
 22import eu.siacs.conversations.entities.Account;
 23import eu.siacs.conversations.services.BarcodeProvider;
 24import eu.siacs.conversations.utils.EasyOnboardingInvite;
 25import eu.siacs.conversations.utils.XmppUri;
 26import eu.siacs.conversations.xmpp.Jid;
 27
 28public class EasyOnboardingInviteActivity extends XmppActivity implements EasyOnboardingInvite.OnInviteRequested {
 29
 30    private ActivityEasyInviteBinding binding;
 31
 32    private EasyOnboardingInvite easyOnboardingInvite;
 33
 34
 35    @Override
 36    public void onCreate(final Bundle bundle) {
 37        super.onCreate(bundle);
 38        this.binding = DataBindingUtil.setContentView(this, R.layout.activity_easy_invite);
 39        Activities.setStatusAndNavigationBarColors(this, binding.getRoot());
 40        setSupportActionBar(binding.toolbar);
 41        configureActionBar(getSupportActionBar(), true);
 42        this.binding.shareButton.setOnClickListener(v -> share());
 43        this.binding.useMyselfButton.setOnClickListener(v -> {
 44            final Intent intent = new Intent(this, UriHandlerActivity.class);
 45            intent.setAction(Intent.ACTION_VIEW);
 46            intent.setData(Uri.parse(easyOnboardingInvite.getUri().replace("roster;", "register;").replaceFirst(":[^@]+@", ":")));
 47            startActivity(intent);
 48            finish();
 49        });
 50        if (bundle != null && bundle.containsKey("invite")) {
 51            this.easyOnboardingInvite = bundle.getParcelable("invite");
 52            if (this.easyOnboardingInvite != null) {
 53                showInvite(this.easyOnboardingInvite);
 54                return;
 55            }
 56        }
 57        this.showLoading();
 58    }
 59
 60    @Override
 61    public boolean onCreateOptionsMenu(Menu menu) {
 62        getMenuInflater().inflate(R.menu.easy_onboarding_invite, menu);
 63        final MenuItem share = menu.findItem(R.id.action_share);
 64        share.setVisible(easyOnboardingInvite != null);
 65        return super.onCreateOptionsMenu(menu);
 66    }
 67
 68    public boolean onOptionsItemSelected(MenuItem menuItem) {
 69        if (menuItem.getItemId() == R.id.action_share) {
 70            share();
 71            return true;
 72        } else {
 73            return super.onOptionsItemSelected(menuItem);
 74        }
 75    }
 76
 77    private void share() {
 78        final String shareText = getString(
 79                R.string.easy_invite_share_text,
 80                easyOnboardingInvite.getDomain(),
 81                easyOnboardingInvite.getShareableLink()
 82        );
 83        final Intent sendIntent = new Intent();
 84        sendIntent.setAction(Intent.ACTION_SEND);
 85        sendIntent.putExtra(Intent.EXTRA_TEXT, shareText);
 86        sendIntent.setType("text/plain");
 87        startActivity(Intent.createChooser(sendIntent, getString(R.string.share_invite_with)));
 88    }
 89
 90    @Override
 91    protected void refreshUiReal() {
 92        invalidateOptionsMenu();
 93        if (easyOnboardingInvite != null) {
 94            showInvite(easyOnboardingInvite);
 95        } else {
 96            showLoading();
 97        }
 98    }
 99
100    private void showLoading() {
101        this.binding.inProgress.setVisibility(View.VISIBLE);
102        this.binding.invite.setVisibility(View.GONE);
103    }
104
105    private void showInvite(final EasyOnboardingInvite invite) {
106        this.binding.inProgress.setVisibility(View.GONE);
107        this.binding.invite.setVisibility(View.VISIBLE);
108        this.binding.tapToShare.setText(getString(R.string.tap_share_button_send_invite, invite.getDomain()));
109        final Point size = new Point();
110        getWindowManager().getDefaultDisplay().getSize(size);
111        final int width = Math.min(size.x, size.y);
112        final Bitmap bitmap = BarcodeProvider.create2dBarcodeBitmap(invite.getShareableLink(), width);
113        binding.qrCode.setImageBitmap(bitmap);
114
115        XmppUri xmppUri = new XmppUri(invite.getUri());
116        if (xmppUri.isAction(XmppUri.ACTION_ROSTER) && !"y".equals(xmppUri.getParameter(XmppUri.PARAMETER_IBR))) {
117            binding.useMyselfButton.setVisibility(View.INVISIBLE);
118        }
119    }
120
121    @Override
122    public void onSaveInstanceState(Bundle bundle) {
123        super.onSaveInstanceState(bundle);
124        if (easyOnboardingInvite != null) {
125            bundle.putParcelable("invite", easyOnboardingInvite);
126        }
127    }
128
129    @Override
130    protected void onBackendConnected() {
131        if (easyOnboardingInvite != null) {
132            return;
133        }
134        final Intent launchIntent = getIntent();
135        final String accountExtra = launchIntent.getStringExtra(EXTRA_ACCOUNT);
136        final Jid jid = accountExtra == null ? null : Jid.of(accountExtra);
137        if (jid == null) {
138            return;
139        }
140        final Account account = xmppConnectionService.findAccountByJid(jid);
141        xmppConnectionService.requestEasyOnboardingInvite(account, this);
142    }
143
144    public static void launch(final Account account, final Activity context) {
145        final Intent intent = new Intent(context, EasyOnboardingInviteActivity.class);
146        intent.putExtra(EXTRA_ACCOUNT, account.getJid().asBareJid().toString());
147        context.startActivity(intent);
148    }
149
150    @Override
151    public void inviteRequested(EasyOnboardingInvite invite) {
152        this.easyOnboardingInvite = invite;
153        Log.d(Config.LOGTAG, "invite requested");
154        refreshUi();
155    }
156
157    @Override
158    public void inviteRequestFailed(final String message) {
159        runOnUiThread(() -> {
160            if (!Strings.isNullOrEmpty(message)) {
161                Toast.makeText(this, message, Toast.LENGTH_LONG).show();
162            }
163            finish();
164        });
165    }
166}