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}