1package eu.siacs.conversations.ui;
2
3import android.annotation.TargetApi;
4import android.app.Activity;
5import android.content.Intent;
6import android.net.Uri;
7import android.nfc.NdefMessage;
8import android.nfc.NdefRecord;
9import android.nfc.NfcAdapter;
10import android.os.Build;
11import android.os.Parcelable;
12
13import com.google.zxing.integration.android.IntentIntegrator;
14import com.google.zxing.integration.android.IntentResult;
15
16import java.util.Arrays;
17
18import eu.siacs.conversations.persistance.DatabaseBackend;
19import eu.siacs.conversations.utils.XmppUri;
20import eu.siacs.conversations.xmpp.jid.Jid;
21
22public class UriHandlerActivity extends Activity {
23 public static final String ACTION_SCAN_QR_CODE = "scan_qr_code";
24
25 @Override
26 public void onStart() {
27 super.onStart();
28 handleIntent(getIntent());
29 }
30
31 @Override
32 public void onNewIntent(Intent intent) {
33 handleIntent(intent);
34 }
35
36 @TargetApi(Build.VERSION_CODES.JELLY_BEAN)
37 Uri getInviteJellyBean(NdefRecord record) {
38 return record.toUri();
39 }
40
41 private void handleUri(Uri uri) {
42 final Intent intent;
43 final XmppUri xmppUri = new XmppUri(uri);
44 final int numAccounts = DatabaseBackend.getInstance(this).getAccountJids().size();
45
46 if (numAccounts == 0) {
47 intent = new Intent(getApplicationContext(), WelcomeActivity.class);
48 startActivity(intent);
49 return;
50 }
51
52 if (xmppUri.isAction(XmppUri.ACTION_MESSAGE)) {
53 final Jid jid = xmppUri.getJid();
54 final String body = xmppUri.getBody();
55
56 if (jid != null) {
57 intent = new Intent(getApplicationContext(), ShareViaAccountActivity.class);
58 intent.putExtra(ShareViaAccountActivity.EXTRA_CONTACT, jid.toString());
59 intent.putExtra(ShareViaAccountActivity.EXTRA_BODY, body);
60 } else {
61 intent = new Intent(getApplicationContext(), ShareWithActivity.class);
62 intent.setAction(Intent.ACTION_SEND);
63 intent.setType("text/plain");
64 intent.putExtra(Intent.EXTRA_TEXT, body);
65 }
66 } else {
67 intent = new Intent(getApplicationContext(), StartConversationActivity.class);
68 intent.setAction(Intent.ACTION_VIEW);
69 intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
70 intent.setData(uri);
71 }
72
73 startActivity(intent);
74 }
75
76 private void handleNfcIntent(Intent data) {
77 for (Parcelable message : data.getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) {
78 if (message instanceof NdefMessage) {
79 for (NdefRecord record : ((NdefMessage) message).getRecords()) {
80 switch (record.getTnf()) {
81 case NdefRecord.TNF_WELL_KNOWN:
82 if (Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
83 if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
84 handleUri(getInviteJellyBean(record));
85 } else {
86 byte[] payload = record.getPayload();
87 if (payload[0] == 0) {
88 Uri uri = Uri.parse(new String(Arrays.copyOfRange(
89 payload, 1, payload.length)));
90 handleUri(uri);
91 }
92 }
93 }
94 }
95 }
96 }
97 }
98 }
99
100 private void handleIntent(Intent data) {
101 if (data == null) {
102 finish();
103 return;
104 }
105
106 switch (data.getAction()) {
107 case Intent.ACTION_VIEW:
108 case Intent.ACTION_SENDTO:
109 handleUri(data.getData());
110 break;
111 case ACTION_SCAN_QR_CODE:
112 new IntentIntegrator(this).initiateScan(Arrays.asList("AZTEC", "QR_CODE"));
113 return;
114 case NfcAdapter.ACTION_NDEF_DISCOVERED:
115 handleNfcIntent(data);
116 }
117
118 finish();
119 }
120
121 @Override
122 public void onActivityResult(int requestCode, int resultCode, Intent intent) {
123 if ((requestCode & 0xFFFF) == IntentIntegrator.REQUEST_CODE) {
124 IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode,
125 intent);
126
127 if (scanResult != null && scanResult.getFormatName() != null) {
128 String data = scanResult.getContents();
129 handleUri(Uri.parse(data));
130 }
131 }
132
133 finish();
134 super.onActivityResult(requestCode, requestCode, intent);
135 }
136}