1package eu.siacs.conversations.ui;
2
3import android.content.Intent;
4import android.content.pm.ActivityInfo;
5import android.databinding.DataBindingUtil;
6import android.os.Bundle;
7import android.support.annotation.NonNull;
8import android.support.v7.app.AppCompatActivity;
9import android.support.v7.widget.Toolbar;
10import android.util.Log;
11import android.view.Menu;
12import android.view.MenuItem;
13import android.widget.Toast;
14
15import java.util.List;
16
17import eu.siacs.conversations.Config;
18import eu.siacs.conversations.R;
19import eu.siacs.conversations.databinding.ActivityWelcomeBinding;
20import eu.siacs.conversations.entities.Account;
21import eu.siacs.conversations.utils.InstallReferrerUtils;
22import eu.siacs.conversations.utils.SignupUtils;
23import eu.siacs.conversations.utils.XmppUri;
24import rocks.xmpp.addr.Jid;
25
26import static eu.siacs.conversations.utils.PermissionUtils.allGranted;
27import static eu.siacs.conversations.utils.PermissionUtils.writeGranted;
28
29public class WelcomeActivity extends XmppActivity {
30
31 private static final int REQUEST_IMPORT_BACKUP = 0x63fb;
32
33 private XmppUri inviteUri;
34
35 public void onInstallReferrerDiscovered(final String referrer) {
36 Log.d(Config.LOGTAG,"welcome activity: on install referrer discovered "+referrer);
37 if (referrer != null) {
38 final XmppUri xmppUri = new XmppUri(referrer);
39 runOnUiThread(() -> processXmppUri(xmppUri));
40 }
41 }
42
43 private boolean processXmppUri(final XmppUri xmppUri) {
44 if (xmppUri.isValidJid()) {
45 final String preauth = xmppUri.getParamater("preauth");
46 final Jid jid = xmppUri.getJid();
47 final Intent intent;
48 if (xmppUri.isAction(XmppUri.ACTION_REGISTER)) {
49 intent = SignupUtils.getTokenRegistrationIntent(this, jid, preauth);
50 } else if (xmppUri.isAction(XmppUri.ACTION_ROSTER) && "y".equals(xmppUri.getParamater("ibr"))) {
51 intent = SignupUtils.getTokenRegistrationIntent(this, Jid.ofDomain(jid.getDomain()), preauth);
52 intent.putExtra(StartConversationActivity.EXTRA_INVITE_URI, xmppUri.toString());
53 } else {
54 intent = null;
55 }
56 if (intent != null) {
57 startActivity(intent);
58 finish();
59 return true;
60 }
61 this.inviteUri = xmppUri;
62 }
63 return false;
64 }
65
66 @Override
67 protected void refreshUiReal() {
68
69 }
70
71 @Override
72 void onBackendConnected() {
73
74 }
75
76 @Override
77 public void onStart() {
78 super.onStart();
79 final int theme = findTheme();
80 if (this.mTheme != theme) {
81 recreate();
82 }
83 new InstallReferrerUtils(this);
84 }
85
86 @Override
87 public void onStop() {
88 super.onStop();
89 }
90
91 @Override
92 public void onNewIntent(Intent intent) {
93 if (intent != null) {
94 setIntent(intent);
95 }
96 }
97
98 @Override
99 protected void onCreate(final Bundle savedInstanceState) {
100 if (getResources().getBoolean(R.bool.portrait_only)) {
101 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
102 }
103 super.onCreate(savedInstanceState);
104 ActivityWelcomeBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_welcome);
105 setSupportActionBar((Toolbar) binding.toolbar);
106 configureActionBar(getSupportActionBar(), false);
107 binding.registerNewAccount.setOnClickListener(v -> {
108 final Intent intent = new Intent(this, PickServerActivity.class);
109 addInviteUri(intent);
110 startActivity(intent);
111 });
112 binding.useExisting.setOnClickListener(v -> {
113 List<Account> accounts = xmppConnectionService.getAccounts();
114 Intent intent = new Intent(WelcomeActivity.this, EditAccountActivity.class);
115 intent.putExtra(EditAccountActivity.EXTRA_FORCE_REGISTER, false);
116 if (accounts.size() == 1) {
117 intent.putExtra("jid", accounts.get(0).getJid().asBareJid().toString());
118 intent.putExtra("init", true);
119 } else if (accounts.size() >= 1) {
120 intent = new Intent(WelcomeActivity.this, ManageAccountActivity.class);
121 }
122 addInviteUri(intent);
123 startActivity(intent);
124 });
125
126 }
127
128 @Override
129 public boolean onCreateOptionsMenu(Menu menu) {
130 getMenuInflater().inflate(R.menu.welcome_menu, menu);
131 return super.onCreateOptionsMenu(menu);
132 }
133
134 @Override
135 public boolean onOptionsItemSelected(MenuItem item) {
136 if (item.getItemId() == R.id.action_import_backup) {
137 if (hasStoragePermission(REQUEST_IMPORT_BACKUP)) {
138 startActivity(new Intent(this, ImportBackupActivity.class));
139 }
140 return true;
141 }
142 return super.onOptionsItemSelected(item);
143 }
144
145 @Override
146 public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
147 if (grantResults.length > 0) {
148 if (allGranted(grantResults)) {
149 switch (requestCode) {
150 case REQUEST_IMPORT_BACKUP:
151 startActivity(new Intent(this, ImportBackupActivity.class));
152 break;
153 }
154 } else {
155 Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
156 }
157 }
158 if (writeGranted(grantResults, permissions)) {
159 if (xmppConnectionService != null) {
160 xmppConnectionService.restartFileObserver();
161 }
162 }
163 }
164
165 public void addInviteUri(Intent to) {
166 final Intent from = getIntent();
167 if (from != null && from.hasExtra(StartConversationActivity.EXTRA_INVITE_URI)) {
168 final String invite = from.getStringExtra(StartConversationActivity.EXTRA_INVITE_URI);
169 to.putExtra(StartConversationActivity.EXTRA_INVITE_URI, invite);
170 } else if (this.inviteUri != null) {
171 Log.d(Config.LOGTAG,"injecting referrer uri into on-boarding flow");
172 to.putExtra(StartConversationActivity.EXTRA_INVITE_URI, this.inviteUri.toString());
173 }
174 }
175
176 public static void launch(AppCompatActivity activity) {
177 Intent intent = new Intent(activity, WelcomeActivity.class);
178 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
179 activity.startActivity(intent);
180 activity.overridePendingTransition(0, 0);
181 }
182
183}