1package eu.siacs.conversations.ui;
2
3import android.app.Activity;
4import android.content.Intent;
5import android.graphics.Bitmap;
6import android.graphics.Point;
7import android.os.Bundle;
8import android.util.Log;
9import android.view.Menu;
10import android.view.MenuItem;
11import android.view.View;
12import android.widget.Toast;
13
14import androidx.databinding.DataBindingUtil;
15
16import com.google.common.base.Strings;
17
18import eu.siacs.conversations.Config;
19import eu.siacs.conversations.R;
20import eu.siacs.conversations.databinding.ActivityEasyInviteBinding;
21import eu.siacs.conversations.entities.Account;
22import eu.siacs.conversations.services.BarcodeProvider;
23import eu.siacs.conversations.utils.EasyOnboardingInvite;
24import eu.siacs.conversations.xmpp.Jid;
25
26public class EasyOnboardingInviteActivity extends XmppActivity implements EasyOnboardingInvite.OnInviteRequested {
27
28 private ActivityEasyInviteBinding binding;
29
30 private EasyOnboardingInvite easyOnboardingInvite;
31
32
33 @Override
34 public void onCreate(final Bundle bundle) {
35 super.onCreate(bundle);
36 this.binding = DataBindingUtil.setContentView(this, R.layout.activity_easy_invite);
37 setSupportActionBar(binding.toolbar);
38 configureActionBar(getSupportActionBar(), true);
39 this.binding.shareButton.setOnClickListener(v -> share());
40 if (bundle != null && bundle.containsKey("invite")) {
41 this.easyOnboardingInvite = bundle.getParcelable("invite");
42 if (this.easyOnboardingInvite != null) {
43 showInvite(this.easyOnboardingInvite);
44 return;
45 }
46 }
47 this.showLoading();
48 }
49
50 @Override
51 public boolean onCreateOptionsMenu(Menu menu) {
52 getMenuInflater().inflate(R.menu.easy_onboarding_invite, menu);
53 final MenuItem share = menu.findItem(R.id.action_share);
54 share.setVisible(easyOnboardingInvite != null);
55 return super.onCreateOptionsMenu(menu);
56 }
57
58 public boolean onOptionsItemSelected(MenuItem menuItem) {
59 if (menuItem.getItemId() == R.id.action_share) {
60 share();
61 return true;
62 } else {
63 return super.onOptionsItemSelected(menuItem);
64 }
65 }
66
67 private void share() {
68 final String shareText = getString(
69 R.string.easy_invite_share_text,
70 easyOnboardingInvite.getDomain(),
71 easyOnboardingInvite.getShareableLink()
72 );
73 final Intent sendIntent = new Intent();
74 sendIntent.setAction(Intent.ACTION_SEND);
75 sendIntent.putExtra(Intent.EXTRA_TEXT, shareText);
76 sendIntent.setType("text/plain");
77 startActivity(Intent.createChooser(sendIntent, getString(R.string.share_invite_with)));
78 }
79
80 @Override
81 protected void refreshUiReal() {
82 invalidateOptionsMenu();
83 if (easyOnboardingInvite != null) {
84 showInvite(easyOnboardingInvite);
85 } else {
86 showLoading();
87 }
88 }
89
90 private void showLoading() {
91 this.binding.inProgress.setVisibility(View.VISIBLE);
92 this.binding.invite.setVisibility(View.GONE);
93 }
94
95 private void showInvite(final EasyOnboardingInvite invite) {
96 this.binding.inProgress.setVisibility(View.GONE);
97 this.binding.invite.setVisibility(View.VISIBLE);
98 this.binding.tapToShare.setText(getString(R.string.tap_share_button_send_invite, invite.getDomain()));
99 final Point size = new Point();
100 getWindowManager().getDefaultDisplay().getSize(size);
101 final int width = Math.min(size.x, size.y);
102 final Bitmap bitmap = BarcodeProvider.create2dBarcodeBitmap(invite.getShareableLink(), width);
103 binding.qrCode.setImageBitmap(bitmap);
104 }
105
106 @Override
107 public void onSaveInstanceState(Bundle bundle) {
108 super.onSaveInstanceState(bundle);
109 if (easyOnboardingInvite != null) {
110 bundle.putParcelable("invite", easyOnboardingInvite);
111 }
112 }
113
114 @Override
115 void onBackendConnected() {
116 if (easyOnboardingInvite != null) {
117 return;
118 }
119 final Intent launchIntent = getIntent();
120 final String accountExtra = launchIntent.getStringExtra(EXTRA_ACCOUNT);
121 final Jid jid = accountExtra == null ? null : Jid.ofEscaped(accountExtra);
122 if (jid == null) {
123 return;
124 }
125 final Account account = xmppConnectionService.findAccountByJid(jid);
126 xmppConnectionService.requestEasyOnboardingInvite(account, this);
127 }
128
129 public static void launch(final Account account, final Activity context) {
130 final Intent intent = new Intent(context, EasyOnboardingInviteActivity.class);
131 intent.putExtra(EXTRA_ACCOUNT, account.getJid().asBareJid().toEscapedString());
132 context.startActivity(intent);
133 }
134
135 @Override
136 public void inviteRequested(EasyOnboardingInvite invite) {
137 this.easyOnboardingInvite = invite;
138 Log.d(Config.LOGTAG, "invite requested");
139 refreshUi();
140 }
141
142 @Override
143 public void inviteRequestFailed(final String message) {
144 runOnUiThread(() -> {
145 if (!Strings.isNullOrEmpty(message)) {
146 Toast.makeText(this, message, Toast.LENGTH_LONG).show();
147 }
148 finish();
149 });
150 }
151}