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}