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