aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java')
-rw-r--r--src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java175
1 files changed, 120 insertions, 55 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
index 2dd74d9f..aa19ff0e 100644
--- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
@@ -1,13 +1,5 @@
package eu.siacs.conversations.ui;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
import android.annotation.SuppressLint;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
@@ -22,6 +14,7 @@ import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.net.Uri;
import android.nfc.NdefMessage;
+import android.nfc.NdefRecord;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Parcelable;
@@ -29,7 +22,6 @@ import android.support.v13.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Editable;
import android.text.TextWatcher;
-import android.util.Log;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent;
@@ -47,7 +39,15 @@ import android.widget.EditText;
import android.widget.ListView;
import android.widget.Spinner;
-import eu.siacs.conversations.Config;
+import com.google.zxing.integration.android.IntentIntegrator;
+import com.google.zxing.integration.android.IntentResult;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Bookmark;
@@ -77,6 +77,8 @@ public class StartConversationActivity extends XmppActivity {
private List<String> mKnownHosts;
private List<String> mKnownConferenceHosts;
+ private Invite mPendingInvite = null;
+
private Menu mOptionsMenu;
private EditText mSearchEditText;
@@ -147,12 +149,12 @@ public class StartConversationActivity extends XmppActivity {
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
- int after) {
+ int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
- int count) {
+ int count) {
}
};
private OnRosterUpdate onRosterUpdate = new OnRosterUpdate() {
@@ -214,7 +216,7 @@ public class StartConversationActivity extends XmppActivity {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
- int position, long arg3) {
+ int position, long arg3) {
openConversationForBookmark(position);
}
});
@@ -227,7 +229,7 @@ public class StartConversationActivity extends XmppActivity {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
- int position, long arg3) {
+ int position, long arg3) {
openConversationForContact(position);
}
});
@@ -500,12 +502,15 @@ public class StartConversationActivity extends XmppActivity {
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case R.id.action_create_contact:
- showCreateContactDialog(null);
- break;
- case R.id.action_join_conference:
- showJoinConferenceDialog(null);
- break;
+ case R.id.action_create_contact:
+ showCreateContactDialog(null);
+ return true;
+ case R.id.action_join_conference:
+ showJoinConferenceDialog(null);
+ return true;
+ case R.id.action_scan_qr_code:
+ new IntentIntegrator(this).initiateScan();
+ return true;
}
return super.onOptionsItemSelected(item);
}
@@ -520,6 +525,29 @@ public class StartConversationActivity extends XmppActivity {
}
@Override
+ public void onActivityResult(int requestCode, int resultCode, Intent intent) {
+ if ((requestCode & 0xFFFF) == IntentIntegrator.REQUEST_CODE) {
+ IntentResult scanResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
+ if (scanResult != null && scanResult.getFormatName() != null) {
+ String data = scanResult.getContents();
+ Invite invite = parseInviteUri(data);
+ if (xmppConnectionServiceBound) {
+ if (invite.muc) {
+ showJoinConferenceDialog(invite.jid);
+ } else {
+ handleJid(invite.jid);
+ }
+ } else if (invite.jid != null) {
+ this.mPendingInvite = invite;
+ } else {
+ this.mPendingInvite = null;
+ }
+ }
+ }
+ super.onActivityResult(requestCode, requestCode, intent);
+ }
+
+ @Override
protected void onBackendConnected() {
xmppConnectionService.setOnRosterUpdateListener(this.onRosterUpdate);
this.mActivatedAccounts.clear();
@@ -531,21 +559,31 @@ public class StartConversationActivity extends XmppActivity {
this.mKnownHosts = xmppConnectionService.getKnownHosts();
this.mKnownConferenceHosts = xmppConnectionService
.getKnownConferenceHosts();
- if (!handleIntent(getIntent())) {
+ if (this.mPendingInvite != null) {
+ if (this.mPendingInvite.muc) {
+ showJoinConferenceDialog(this.mPendingInvite.jid);
+ } else {
+ handleJid(this.mPendingInvite.jid);
+ }
+ this.mPendingInvite = null;
+ } else if (!handleIntent(getIntent())) {
if (mSearchEditText != null) {
filter(mSearchEditText.getText().toString());
} else {
filter(null);
}
}
+ setIntent(null);
}
protected boolean handleIntent(Intent intent) {
- if (intent==null || intent.getAction() == null) {
+ if (intent == null || intent.getAction() == null) {
return false;
}
String jid;
- switch(intent.getAction()) {
+ Uri uri;
+ Invite invite;
+ switch (intent.getAction()) {
case Intent.ACTION_SENDTO:
try {
jid = URLDecoder.decode(
@@ -556,26 +594,28 @@ public class StartConversationActivity extends XmppActivity {
return false;
}
case Intent.ACTION_VIEW:
- Uri uri = intent.getData();
- boolean muc = uri.getQuery() != null && uri.getQuery().equalsIgnoreCase("join");
- if (uri.getAuthority() != null) {
- jid = uri.getAuthority();
- } else {
- jid = uri.getSchemeSpecificPart().split("\\?")[0];
- }
- if (muc) {
- showJoinConferenceDialog(jid);
+ uri = intent.getData();
+ invite = parseInviteUri(uri);
+ if (invite.muc) {
+ showJoinConferenceDialog(invite.jid);
return false;
} else {
- return handleJid(jid);
+ return handleJid(invite.jid);
}
case NfcAdapter.ACTION_NDEF_DISCOVERED:
- Parcelable[] messages = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
- NdefMessage message = (NdefMessage) messages[0];
- String payload = message.getRecords()[0].toString();
- if (payload.startsWith("xmpp:")) {
- jid = payload.substring(5);
- return handleJid(jid);
+ if (android.os.Build.VERSION.SDK_INT >= 16) {
+ Parcelable[] messages = getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES);
+ NdefMessage message = (NdefMessage) messages[0];
+ NdefRecord record = message.getRecords()[0];
+ invite = parseInviteUri(record.toUri());
+ if (invite != null) {
+ if (invite.muc) {
+ showJoinConferenceDialog(invite.jid);
+ return false;
+ } else {
+ return handleJid(invite.jid);
+ }
+ }
} else {
return false;
}
@@ -584,6 +624,25 @@ public class StartConversationActivity extends XmppActivity {
}
}
+ private Invite parseInviteUri(String uri) {
+ try {
+ return parseInviteUri(Uri.parse(uri));
+ } catch (IllegalArgumentException e) {
+ return null;
+ }
+ }
+
+ private Invite parseInviteUri(Uri uri) {
+ Invite invite = new Invite();
+ invite.muc = uri.getQuery() != null && uri.getQuery().equalsIgnoreCase("join");
+ if (uri.getAuthority() != null) {
+ invite.jid = uri.getAuthority();
+ } else {
+ invite.jid = uri.getSchemeSpecificPart().split("\\?")[0];
+ }
+ return invite;
+ }
+
private boolean handleJid(String jid) {
List<Contact> contacts = xmppConnectionService.findContacts(jid);
if (contacts.size() == 0) {
@@ -595,7 +654,8 @@ public class StartConversationActivity extends XmppActivity {
} else {
if (mMenuSearchView != null) {
mMenuSearchView.expandActionView();
- mSearchEditText.setText(jid);
+ mSearchEditText.setText("");
+ mSearchEditText.append(jid);
filter(jid);
} else {
mInitialJid = jid;
@@ -673,7 +733,7 @@ public class StartConversationActivity extends XmppActivity {
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
- ContextMenuInfo menuInfo) {
+ ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
StartConversationActivity activity = (StartConversationActivity) getActivity();
activity.getMenuInflater().inflate(mResContextMenu, menu);
@@ -689,22 +749,27 @@ public class StartConversationActivity extends XmppActivity {
public boolean onContextItemSelected(MenuItem item) {
StartConversationActivity activity = (StartConversationActivity) getActivity();
switch (item.getItemId()) {
- case R.id.context_start_conversation:
- activity.openConversationForContact();
- break;
- case R.id.context_contact_details:
- activity.openDetailsForContact();
- break;
- case R.id.context_delete_contact:
- activity.deleteContact();
- break;
- case R.id.context_join_conference:
- activity.openConversationForBookmark();
- break;
- case R.id.context_delete_conference:
- activity.deleteConference();
+ case R.id.context_start_conversation:
+ activity.openConversationForContact();
+ break;
+ case R.id.context_contact_details:
+ activity.openDetailsForContact();
+ break;
+ case R.id.context_delete_contact:
+ activity.deleteContact();
+ break;
+ case R.id.context_join_conference:
+ activity.openConversationForBookmark();
+ break;
+ case R.id.context_delete_conference:
+ activity.deleteConference();
}
return true;
}
}
+
+ private class Invite {
+ public String jid;
+ public boolean muc;
+ }
}