1package eu.siacs.conversations.ui;
2
3import android.app.Activity;
4import android.support.v7.app.AppCompatActivity ;
5import android.content.Intent;
6import android.net.Uri;
7import android.util.Log;
8
9import java.util.Arrays;
10import java.util.List;
11
12import eu.siacs.conversations.Config;
13import eu.siacs.conversations.R;
14import eu.siacs.conversations.persistance.DatabaseBackend;
15import eu.siacs.conversations.utils.XmppUri;
16import eu.siacs.conversations.utils.zxing.IntentIntegrator;
17import eu.siacs.conversations.utils.zxing.IntentResult;
18import eu.siacs.conversations.xmpp.jid.Jid;
19
20public class UriHandlerActivity extends AppCompatActivity {
21 public static final String ACTION_SCAN_QR_CODE = "scan_qr_code";
22
23 @Override
24 public void onStart() {
25 super.onStart();
26 handleIntent(getIntent());
27 }
28
29 @Override
30 public void onNewIntent(Intent intent) {
31 handleIntent(intent);
32 }
33
34 private void handleUri(Uri uri) {
35 final Intent intent;
36 final XmppUri xmppUri = new XmppUri(uri);
37 final List<Jid> accounts = DatabaseBackend.getInstance(this).getAccountJids();
38
39 if (accounts.size() == 0) {
40 intent = new Intent(getApplicationContext(), WelcomeActivity.class);
41 WelcomeActivity.addInviteUri(intent, xmppUri);
42 startActivity(intent);
43 return;
44 }
45
46 if (xmppUri.isAction(XmppUri.ACTION_MESSAGE)) {
47 final Jid jid = xmppUri.getJid();
48 final String body = xmppUri.getBody();
49
50 if (jid != null) {
51 intent = new Intent(getApplicationContext(), ShareViaAccountActivity.class);
52 intent.putExtra(ShareViaAccountActivity.EXTRA_CONTACT, jid.toString());
53 intent.putExtra(ShareViaAccountActivity.EXTRA_BODY, body);
54 } else {
55 intent = new Intent(getApplicationContext(), ShareWithActivity.class);
56 intent.setAction(Intent.ACTION_SEND);
57 intent.setType("text/plain");
58 intent.putExtra(Intent.EXTRA_TEXT, body);
59 }
60 } else if (accounts.contains(xmppUri.getJid())) {
61 intent = new Intent(getApplicationContext(), EditAccountActivity.class);
62 intent.setAction(Intent.ACTION_VIEW);
63 intent.putExtra("jid", xmppUri.getJid().toBareJid().toString());
64 intent.setData(uri);
65 } else {
66 intent = new Intent(getApplicationContext(), StartConversationActivity.class);
67 intent.setAction(Intent.ACTION_VIEW);
68 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
69 intent.setData(uri);
70 }
71
72 startActivity(intent);
73 }
74
75 private void handleIntent(Intent data) {
76 if (data == null || data.getAction() == null) {
77 finish();
78 return;
79 }
80
81 switch (data.getAction()) {
82 case Intent.ACTION_VIEW:
83 case Intent.ACTION_SENDTO:
84 handleUri(data.getData());
85 break;
86 case ACTION_SCAN_QR_CODE:
87 new IntentIntegrator(this).initiateScan(Arrays.asList("AZTEC", "QR_CODE"));
88 return;
89 }
90
91 finish();
92 }
93
94 @Override
95 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
96 if ((requestCode & 0xFFFF) == IntentIntegrator.REQUEST_CODE) {
97 IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
98
99 if (scanResult != null && scanResult.getFormatName() != null) {
100 String data = scanResult.getContents();
101 handleUri(Uri.parse(data));
102 }
103 }
104
105 finish();
106 super.onActivityResult(requestCode, requestCode, intent);
107 }
108
109 public static void scan(Activity activity) {
110 Intent intent = new Intent(activity, UriHandlerActivity.class);
111 intent.setAction(UriHandlerActivity.ACTION_SCAN_QR_CODE);
112 intent.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
113 activity.startActivity(intent);
114 }
115}