diff options
Diffstat (limited to 'src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java')
-rw-r--r-- | src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java | 175 |
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; + } } |