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.java221
1 files changed, 127 insertions, 94 deletions
diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
index ed6b2a85..fe188737 100644
--- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java
@@ -62,61 +62,30 @@ import eu.siacs.conversations.entities.ListItem;
import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate;
import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
import eu.siacs.conversations.ui.adapter.ListItemAdapter;
+import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.Validator;
+import eu.siacs.conversations.xmpp.jid.InvalidJidException;
+import eu.siacs.conversations.xmpp.jid.Jid;
-public class StartConversationActivity extends XmppActivity {
+public class StartConversationActivity extends XmppActivity implements OnRosterUpdate {
+ public int conference_context_id;
+ public int contact_context_id;
private Tab mContactsTab;
private Tab mConferencesTab;
private ViewPager mViewPager;
-
private MyListFragment mContactsListFragment = new MyListFragment();
- private List<ListItem> contacts = new ArrayList<ListItem>();
+ private List<ListItem> contacts = new ArrayList<>();
private ArrayAdapter<ListItem> mContactsAdapter;
-
private MyListFragment mConferenceListFragment = new MyListFragment();
private List<ListItem> conferences = new ArrayList<ListItem>();
private ArrayAdapter<ListItem> mConferenceAdapter;
-
private List<String> mActivatedAccounts = new ArrayList<String>();
private List<String> mKnownHosts;
private List<String> mKnownConferenceHosts;
-
private Invite mPendingInvite = null;
-
private Menu mOptionsMenu;
private EditText mSearchEditText;
-
- public int conference_context_id;
- public int contact_context_id;
-
- private TabListener mTabListener = new TabListener() {
-
- @Override
- public void onTabUnselected(Tab tab, FragmentTransaction ft) {
- return;
- }
-
- @Override
- public void onTabSelected(Tab tab, FragmentTransaction ft) {
- mViewPager.setCurrentItem(tab.getPosition());
- onTabChanged();
- }
-
- @Override
- public void onTabReselected(Tab tab, FragmentTransaction ft) {
- return;
- }
- };
-
- private ViewPager.SimpleOnPageChangeListener mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
- @Override
- public void onPageSelected(int position) {
- getActionBar().setSelectedNavigationItem(position);
- onTabChanged();
- }
- };
-
private MenuItem.OnActionExpandListener mOnActionExpandListener = new MenuItem.OnActionExpandListener() {
@Override
@@ -145,6 +114,31 @@ public class StartConversationActivity extends XmppActivity {
return true;
}
};
+ private TabListener mTabListener = new TabListener() {
+
+ @Override
+ public void onTabUnselected(Tab tab, FragmentTransaction ft) {
+ return;
+ }
+
+ @Override
+ public void onTabSelected(Tab tab, FragmentTransaction ft) {
+ mViewPager.setCurrentItem(tab.getPosition());
+ onTabChanged();
+ }
+
+ @Override
+ public void onTabReselected(Tab tab, FragmentTransaction ft) {
+ return;
+ }
+ };
+ private ViewPager.SimpleOnPageChangeListener mOnPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {
+ @Override
+ public void onPageSelected(int position) {
+ getActionBar().setSelectedNavigationItem(position);
+ onTabChanged();
+ }
+ };
private TextWatcher mSearchTextWatcher = new TextWatcher() {
@Override
@@ -162,23 +156,21 @@ public class StartConversationActivity extends XmppActivity {
int count) {
}
};
- private OnRosterUpdate onRosterUpdate = new OnRosterUpdate() {
+ private MenuItem mMenuSearchView;
+ private String mInitialJid;
- @Override
- public void onRosterUpdate() {
- runOnUiThread(new Runnable() {
+ @Override
+ public void onRosterUpdate() {
+ runOnUiThread(new Runnable() {
- @Override
- public void run() {
- if (mSearchEditText != null) {
- filter(mSearchEditText.getText().toString());
- }
+ @Override
+ public void run() {
+ if (mSearchEditText != null) {
+ filter(mSearchEditText.getText().toString());
}
- });
- }
- };
- private MenuItem mMenuSearchView;
- private String mInitialJid;
+ }
+ });
+ }
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -241,12 +233,6 @@ public class StartConversationActivity extends XmppActivity {
}
- @Override
- public void onStop() {
- super.onStop();
- xmppConnectionService.removeOnRosterUpdateListener();
- }
-
protected void openConversationForContact(int position) {
Contact contact = (Contact) contacts.get(position);
Conversation conversation = xmppConnectionService
@@ -331,7 +317,7 @@ public class StartConversationActivity extends XmppActivity {
}
@SuppressLint("InflateParams")
- protected void showCreateContactDialog(String prefilledJid) {
+ protected void showCreateContactDialog(final String prefilledJid, final String fingerprint) {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(R.string.create_contact);
View dialogView = getLayoutInflater().inflate(
@@ -343,6 +329,12 @@ public class StartConversationActivity extends XmppActivity {
android.R.layout.simple_list_item_1, mKnownHosts));
if (prefilledJid != null) {
jid.append(prefilledJid);
+ if (fingerprint!=null) {
+ jid.setFocusable(false);
+ jid.setFocusableInTouchMode(false);
+ jid.setClickable(false);
+ jid.setCursorVisible(false);
+ }
}
populateAccountSpinner(spinner);
builder.setView(dialogView);
@@ -359,20 +351,30 @@ public class StartConversationActivity extends XmppActivity {
return;
}
if (Validator.isValidJid(jid.getText().toString())) {
- String accountJid = (String) spinner
- .getSelectedItem();
- String contactJid = jid.getText().toString();
+ final Jid accountJid;
+ try {
+ accountJid = Jid.fromString((String) spinner
+ .getSelectedItem());
+ } catch (final InvalidJidException e) {
+ return;
+ }
+ final Jid contactJid;
+ try {
+ contactJid = Jid.fromString(jid.getText().toString());
+ } catch (final InvalidJidException e) {
+ return;
+ }
Account account = xmppConnectionService
.findAccountByJid(accountJid);
if (account == null) {
dialog.dismiss();
return;
}
- Contact contact = account.getRoster().getContact(
- contactJid);
+ Contact contact = account.getRoster().getContact(contactJid);
if (contact.showInRoster()) {
jid.setError(getString(R.string.contact_already_exists));
} else {
+ contact.addOtrFingerprint(fingerprint);
xmppConnectionService.createContact(contact);
dialog.dismiss();
switchToConversation(contact);
@@ -416,9 +418,18 @@ public class StartConversationActivity extends XmppActivity {
return;
}
if (Validator.isValidJid(jid.getText().toString())) {
- String accountJid = (String) spinner
- .getSelectedItem();
- String conferenceJid = jid.getText().toString();
+ final Jid accountJid;
+ try {
+ accountJid = Jid.fromString((String) spinner.getSelectedItem());
+ } catch (final InvalidJidException e) {
+ return;
+ }
+ final Jid conferenceJid;
+ try {
+ conferenceJid = Jid.fromString(jid.getText().toString());
+ } catch (final InvalidJidException e) {
+ return; // TODO: Do some error handling...
+ }
Account account = xmppConnectionService
.findAccountByJid(accountJid);
if (account == null) {
@@ -471,7 +482,7 @@ public class StartConversationActivity extends XmppActivity {
}
private void populateAccountSpinner(Spinner spinner) {
- ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
+ ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_item, mActivatedAccounts);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
@@ -508,7 +519,7 @@ public class StartConversationActivity extends XmppActivity {
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_create_contact:
- showCreateContactDialog(null);
+ showCreateContactDialog(null,null);
return true;
case R.id.action_join_conference:
showJoinConferenceDialog(null);
@@ -550,11 +561,10 @@ public class StartConversationActivity extends XmppActivity {
@Override
protected void onBackendConnected() {
- xmppConnectionService.setOnRosterUpdateListener(this.onRosterUpdate);
this.mActivatedAccounts.clear();
for (Account account : xmppConnectionService.getAccounts()) {
- if (account.getStatus() != Account.STATUS_DISABLED) {
- this.mActivatedAccounts.add(account.getJid());
+ if (account.getStatus() != Account.State.DISABLED) {
+ this.mActivatedAccounts.add(account.getJid().toBareJid().toString());
}
}
this.mKnownHosts = xmppConnectionService.getKnownHosts();
@@ -591,20 +601,20 @@ public class StartConversationActivity extends XmppActivity {
for (Parcelable message : getIntent().getParcelableArrayExtra(NfcAdapter.EXTRA_NDEF_MESSAGES)) {
if (message instanceof NdefMessage) {
Log.d(Config.LOGTAG, "received message=" + message);
- for (NdefRecord record : ((NdefMessage)message).getRecords()) {
+ for (NdefRecord record : ((NdefMessage) message).getRecords()) {
switch (record.getTnf()) {
- case NdefRecord.TNF_WELL_KNOWN:
- if (Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
- if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
- return getInviteJellyBean(record).invite();
- } else {
- byte[] payload = record.getPayload();
- if (payload[0] == 0) {
- return new Invite(Uri.parse(new String(Arrays.copyOfRange(
- payload, 1, payload.length)))).invite();
+ case NdefRecord.TNF_WELL_KNOWN:
+ if (Arrays.equals(record.getType(), NdefRecord.RTD_URI)) {
+ if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
+ return getInviteJellyBean(record).invite();
+ } else {
+ byte[] payload = record.getPayload();
+ if (payload[0] == 0) {
+ return new Invite(Uri.parse(new String(Arrays.copyOfRange(
+ payload, 1, payload.length)))).invite();
+ }
}
}
- }
}
}
}
@@ -613,22 +623,29 @@ public class StartConversationActivity extends XmppActivity {
return false;
}
- private boolean handleJid(String jid) {
- List<Contact> contacts = xmppConnectionService.findContacts(jid);
+ private boolean handleJid(Invite invite) {
+ List<Contact> contacts = xmppConnectionService.findContacts(invite.jid);
if (contacts.size() == 0) {
- showCreateContactDialog(jid);
+ showCreateContactDialog(invite.jid,invite.fingerprint);
return false;
} else if (contacts.size() == 1) {
- switchToConversation(contacts.get(0));
+ Contact contact = contacts.get(0);
+ if (invite.fingerprint != null) {
+ if (contact.addOtrFingerprint(invite.fingerprint)) {
+ Log.d(Config.LOGTAG,"added new fingerprint");
+ xmppConnectionService.syncRosterToDisk(contact.getAccount());
+ }
+ }
+ switchToConversation(contact);
return true;
} else {
if (mMenuSearchView != null) {
mMenuSearchView.expandActionView();
mSearchEditText.setText("");
- mSearchEditText.append(jid);
- filter(jid);
+ mSearchEditText.append(invite.jid);
+ filter(invite.jid);
} else {
- mInitialJid = jid;
+ mInitialJid = invite.jid;
}
return true;
}
@@ -644,7 +661,7 @@ public class StartConversationActivity extends XmppActivity {
protected void filterContacts(String needle) {
this.contacts.clear();
for (Account account : xmppConnectionService.getAccounts()) {
- if (account.getStatus() != Account.STATUS_DISABLED) {
+ if (account.getStatus() != Account.State.DISABLED) {
for (Contact contact : account.getRoster().getContacts()) {
if (contact.showInRoster() && contact.match(needle)) {
this.contacts.add(contact);
@@ -659,7 +676,7 @@ public class StartConversationActivity extends XmppActivity {
protected void filterConferences(String needle) {
this.conferences.clear();
for (Account account : xmppConnectionService.getAccounts()) {
- if (account.getStatus() != Account.STATUS_DISABLED) {
+ if (account.getStatus() != Account.State.DISABLED) {
for (Bookmark bookmark : account.getBookmarks()) {
if (bookmark.match(needle)) {
this.conferences.add(bookmark);
@@ -741,6 +758,7 @@ public class StartConversationActivity extends XmppActivity {
private class Invite {
private String jid;
private boolean muc;
+ private String fingerprint;
Invite(Uri uri) {
parse(uri);
@@ -759,7 +777,7 @@ public class StartConversationActivity extends XmppActivity {
if (muc) {
showJoinConferenceDialog(jid);
} else {
- return handleJid(jid);
+ return handleJid(this);
}
}
return false;
@@ -775,11 +793,26 @@ public class StartConversationActivity extends XmppActivity {
} else {
jid = uri.getSchemeSpecificPart().split("\\?")[0];
}
+ fingerprint = parseFingerprint(uri.getQuery());
} else if ("imto".equals(scheme)) {
// sample: imto://xmpp/jid@foo.com
try {
jid = URLDecoder.decode(uri.getEncodedPath(), "UTF-8").split("/")[1];
- } catch (UnsupportedEncodingException e) {
+ } catch (final UnsupportedEncodingException ignored) {
+ }
+ }
+ }
+
+ String parseFingerprint(String query) {
+ if (query == null) {
+ return null;
+ } else {
+ final String NEEDLE = "otr-fingerprint=";
+ int index = query.indexOf(NEEDLE);
+ if (index >= 0 && query.length() >= (NEEDLE.length() + index + 40)) {
+ return CryptoHelper.prettifyFingerprint(query.substring(index + NEEDLE.length(), index + NEEDLE.length() + 40));
+ } else {
+ return null;
}
}
}