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