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}