open manage account + certificate chooser when cbe mode is enabled

Daniel Gultsch created

Change summary

src/main/AndroidManifest.xml                                       | 125 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java  |  43 
src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java |  24 
src/main/res/values/strings.xml                                    |   1 
4 files changed, 105 insertions(+), 88 deletions(-)

Detailed changes

src/main/AndroidManifest.xml 🔗

@@ -4,33 +4,35 @@
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools">
 
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
-    <uses-permission android:name="android.permission.READ_CONTACTS" />
-    <uses-permission android:name="android.permission.READ_PROFILE" />
-    <uses-permission android:name="android.permission.INTERNET" />
-    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
-    <uses-permission android:name="android.permission.WAKE_LOCK" />
-    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
-    <uses-permission android:name="android.permission.VIBRATE" />
-    <uses-permission android:name="android.permission.NFC" />
-
-    <uses-permission android:name="android.permission.READ_PHONE_STATE" tools:node="remove" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.READ_PROFILE"/>
+    <uses-permission android:name="android.permission.INTERNET"/>
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+    <uses-permission android:name="android.permission.WAKE_LOCK"/>
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.NFC"/>
+
+    <uses-permission
+        android:name="android.permission.READ_PHONE_STATE"
+        tools:node="remove"/>
 
     <application
         android:allowBackup="true"
         android:icon="@drawable/ic_launcher"
         android:label="@string/app_name"
         android:theme="@style/ConversationsTheme"
-        tools:replace="android:label" >
-        <service android:name=".services.XmppConnectionService" />
+        tools:replace="android:label">
+        <service android:name=".services.XmppConnectionService"/>
 
-        <receiver android:name=".services.EventReceiver" >
+        <receiver android:name=".services.EventReceiver">
             <intent-filter>
-                <action android:name="android.intent.action.BOOT_COMPLETED" />
-                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
-                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
-                <action android:name="android.media.RINGER_MODE_CHANGED" />
+                <action android:name="android.intent.action.BOOT_COMPLETED"/>
+                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
+                <action android:name="android.intent.action.ACTION_SHUTDOWN"/>
+                <action android:name="android.media.RINGER_MODE_CHANGED"/>
             </intent-filter>
         </receiver>
 
@@ -38,100 +40,102 @@
             android:name=".ui.ConversationActivity"
             android:label="@string/app_name"
             android:launchMode="singleTask"
-            android:windowSoftInputMode="stateHidden" >
+            android:windowSoftInputMode="stateHidden">
             <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
+                <action android:name="android.intent.action.MAIN"/>
 
-                <category android:name="android.intent.category.LAUNCHER" />
+                <category android:name="android.intent.category.LAUNCHER"/>
             </intent-filter>
         </activity>
         <activity
             android:name=".ui.StartConversationActivity"
             android:configChanges="orientation|screenSize"
-            android:launchMode="singleTask"
-            android:label="@string/title_activity_start_conversation" >
+            android:label="@string/title_activity_start_conversation"
+            android:launchMode="singleTask">
             <intent-filter>
-                <action android:name="android.intent.action.SENDTO" />
+                <action android:name="android.intent.action.SENDTO"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.DEFAULT"/>
 
-                <data android:scheme="imto" />
-                <data android:host="jabber" />
+                <data android:scheme="imto"/>
+                <data android:host="jabber"/>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.VIEW" />
+                <action android:name="android.intent.action.VIEW"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
-                <category android:name="android.intent.category.BROWSABLE" />
+                <category android:name="android.intent.category.DEFAULT"/>
+                <category android:name="android.intent.category.BROWSABLE"/>
 
-                <data android:scheme="xmpp" />
+                <data android:scheme="xmpp"/>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.nfc.action.NDEF_DISCOVERED" />
+                <action android:name="android.nfc.action.NDEF_DISCOVERED"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.DEFAULT"/>
 
-                <data android:scheme="xmpp" />
+                <data android:scheme="xmpp"/>
             </intent-filter>
         </activity>
         <activity
             android:name=".ui.SettingsActivity"
-            android:label="@string/title_activity_settings" />
+            android:label="@string/title_activity_settings"/>
         <activity
             android:name=".ui.ChooseContactActivity"
-            android:label="@string/title_activity_choose_contact" />
+            android:label="@string/title_activity_choose_contact"/>
         <activity
             android:name=".ui.BlocklistActivity"
-            android:label="@string/title_activity_block_list" />
-	    <activity
-		    android:name=".ui.ChangePasswordActivity"
-		    android:label="@string/change_password_on_server" />
+            android:label="@string/title_activity_block_list"/>
+        <activity
+            android:name=".ui.ChangePasswordActivity"
+            android:label="@string/change_password_on_server"/>
         <activity
             android:name=".ui.ManageAccountActivity"
             android:configChanges="orientation|screenSize"
-            android:label="@string/title_activity_manage_accounts" />
+            android:label="@string/title_activity_manage_accounts"
+            android:launchMode="singleTask"/>
         <activity
             android:name=".ui.EditAccountActivity"
-            android:windowSoftInputMode="stateHidden|adjustResize" />
+            android:launchMode="singleTask"
+            android:windowSoftInputMode="stateHidden|adjustResize"/>
         <activity
             android:name=".ui.ConferenceDetailsActivity"
             android:label="@string/title_activity_conference_details"
-            android:windowSoftInputMode="stateHidden" />
+            android:windowSoftInputMode="stateHidden"/>
         <activity
             android:name=".ui.ContactDetailsActivity"
             android:label="@string/title_activity_contact_details"
-            android:windowSoftInputMode="stateHidden" />
+            android:windowSoftInputMode="stateHidden"/>
         <activity
             android:name=".ui.PublishProfilePictureActivity"
             android:label="@string/mgmt_account_publish_avatar"
-            android:windowSoftInputMode="stateHidden" />
+            android:windowSoftInputMode="stateHidden"/>
         <activity
             android:name=".ui.VerifyOTRActivity"
             android:label="@string/verify_otr"
-            android:windowSoftInputMode="stateHidden" />
+            android:windowSoftInputMode="stateHidden"/>
         <activity
             android:name=".ui.ShareWithActivity"
-            android:label="@string/app_name" >
+            android:label="@string/app_name">
             <intent-filter>
-                <action android:name="android.intent.action.SEND" />
+                <action android:name="android.intent.action.SEND"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.DEFAULT"/>
 
-                <data android:mimeType="text/plain" />
+                <data android:mimeType="text/plain"/>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.SEND" />
+                <action android:name="android.intent.action.SEND"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.DEFAULT"/>
 
-                <data android:mimeType="*/*" />
+                <data android:mimeType="*/*"/>
             </intent-filter>
             <intent-filter>
-                <action android:name="android.intent.action.SEND_MULTIPLE" />
+                <action android:name="android.intent.action.SEND_MULTIPLE"/>
 
-                <category android:name="android.intent.category.DEFAULT" />
+                <category android:name="android.intent.category.DEFAULT"/>
 
-                <data android:mimeType="image/*" />
+                <data android:mimeType="image/*"/>
             </intent-filter>
         </activity>
         <activity
@@ -145,12 +149,13 @@
         <activity
             android:name=".ui.AboutActivity"
             android:label="@string/title_activity_about"
-            android:parentActivityName=".ui.SettingsActivity" >
+            android:parentActivityName=".ui.SettingsActivity">
             <meta-data
                 android:name="android.support.PARENT_ACTIVITY"
-                android:value="eu.siacs.conversations.ui.SettingsActivity" />
+                android:value="eu.siacs.conversations.ui.SettingsActivity"/>
         </activity>
-        <service android:name=".services.ExportLogsService" />
+
+        <service android:name=".services.ExportLogsService"/>
     </application>
 
 </manifest>

src/main/java/eu/siacs/conversations/ui/ConversationActivity.java 🔗

@@ -35,6 +35,7 @@ import net.java.otr4j.session.SessionStatus;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import de.timroes.android.listview.EnhancedListView;
 import eu.siacs.conversations.Config;
@@ -105,7 +106,7 @@ public class ConversationActivity extends XmppActivity
 	private Toast prepareFileToast;
 
 	private boolean mActivityPaused = false;
-	private boolean mRedirected = true;
+	private AtomicBoolean mRedirected = new AtomicBoolean(false);
 
 	public Conversation getSelectedConversation() {
 		return this.mSelectedConversation;
@@ -631,6 +632,12 @@ public class ConversationActivity extends XmppActivity
 				this.mConversationFragment.reInit(getSelectedConversation());
 			} else {
 				setSelectedConversation(null);
+				if (mRedirected.compareAndSet(false,true)) {
+					Intent intent = new Intent(this, StartConversationActivity.class);
+					intent.putExtra("init",true);
+					startActivity(intent);
+					finish();
+				}
 			}
 		}
 	}
@@ -985,7 +992,7 @@ public class ConversationActivity extends XmppActivity
 	@Override
 	public void onStart() {
 		super.onStart();
-		this.mRedirected = false;
+		this.mRedirected.set(false);
 		if (this.xmppConnectionServiceBound) {
 			this.onBackendConnected();
 		}
@@ -1049,14 +1056,16 @@ public class ConversationActivity extends XmppActivity
 		}
 
 		if (xmppConnectionService.getAccounts().size() == 0) {
-			if (!mRedirected) {
-				this.mRedirected = true;
-				startActivity(new Intent(this, EditAccountActivity.class));
+			if (mRedirected.compareAndSet(false,true)) {
+				if (Config.X509_VERIFICATION) {
+					startActivity(new Intent(this, ManageAccountActivity.class));
+				} else {
+					startActivity(new Intent(this, EditAccountActivity.class));
+				}
 				finish();
 			}
 		} else if (conversationList.size() <= 0) {
-			if (!mRedirected) {
-				this.mRedirected = true;
+			if (mRedirected.compareAndSet(false,true)) {
 				Intent intent = new Intent(this, StartConversationActivity.class);
 				intent.putExtra("init",true);
 				startActivity(intent);
@@ -1349,7 +1358,7 @@ public class ConversationActivity extends XmppActivity
 
 					@Override
 					public void userInputRequried(PendingIntent pi,
-							Message message) {
+												  Message message) {
 						ConversationActivity.this.runIntent(pi,
 								ConversationActivity.REQUEST_SEND_MESSAGE);
 					}
@@ -1406,25 +1415,11 @@ public class ConversationActivity extends XmppActivity
 	@Override
 	protected void refreshUiReal() {
 		updateConversationList();
-		if (xmppConnectionService != null && xmppConnectionService.getAccounts().size() == 0) {
-			if (!mRedirected) {
-				this.mRedirected = true;
-				startActivity(new Intent(this, EditAccountActivity.class));
-				finish();
-			}
-		} else if (conversationList.size() == 0) {
-			if (!mRedirected) {
-				this.mRedirected = true;
-				Intent intent = new Intent(this, StartConversationActivity.class);
-				intent.putExtra("init",true);
-				startActivity(intent);
-				finish();
-			}
-		} else {
+		if (conversationList.size() > 0) {
 			ConversationActivity.this.mConversationFragment.updateMessages();
 			updateActionBarTitle();
+			invalidateOptionsMenu();
 		}
-		invalidateOptionsMenu();
 	}
 
 	@Override

src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java 🔗

@@ -1,6 +1,8 @@
 package eu.siacs.conversations.ui;
 
+import android.app.ActionBar;
 import android.app.AlertDialog;
+import android.content.ActivityNotFoundException;
 import android.content.DialogInterface;
 import android.content.DialogInterface.OnClickListener;
 import android.content.Intent;
@@ -20,6 +22,7 @@ import android.widget.Toast;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
@@ -35,6 +38,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
 	protected final List<Account> accountList = new ArrayList<>();
 	protected ListView accountListView;
 	protected AccountAdapter mAccountAdapter;
+	protected AtomicBoolean mInvokedAddAccount = new AtomicBoolean(false);
 
 	@Override
 	public void onAccountUpdate() {
@@ -47,6 +51,11 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
 			accountList.clear();
 			accountList.addAll(xmppConnectionService.getAccounts());
 		}
+		ActionBar actionBar = getActionBar();
+		if (actionBar != null) {
+			actionBar.setHomeButtonEnabled(this.accountList.size() > 0);
+			actionBar.setDisplayHomeAsUpEnabled(this.accountList.size() > 0);
+		}
 		invalidateOptionsMenu();
 		mAccountAdapter.notifyDataSetChanged();
 	}
@@ -93,9 +102,12 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
 
 	@Override
 	void onBackendConnected() {
-		this.accountList.clear();
-		this.accountList.addAll(xmppConnectionService.getAccounts());
-		mAccountAdapter.notifyDataSetChanged();
+		refreshUiReal();
+		if (Config.X509_VERIFICATION && this.accountList.size() == 0) {
+			if (mInvokedAddAccount.compareAndSet(false,true)) {
+				addAccountFromKey();
+			}
+		}
 	}
 
 	@Override
@@ -195,7 +207,11 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
 	}
 
 	private void addAccountFromKey() {
-		KeyChain.choosePrivateKeyAlias(this, this, null, null, null, -1, null);
+		try {
+			KeyChain.choosePrivateKeyAlias(this, this, null, null, null, -1, null);
+		} catch (ActivityNotFoundException e) {
+			Toast.makeText(this,R.string.device_does_not_support_certificates,Toast.LENGTH_LONG).show();
+		}
 	}
 
 	private void publishAvatar(Account account) {

src/main/res/values/strings.xml 🔗

@@ -535,4 +535,5 @@
 	<string name="action_renew_certificate">Renew certificate</string>
 	<string name="error_fetching_omemo_key">Error fetching OMEMO key!</string>
 	<string name="verified_omemo_key_with_certificate">Verified OMEMO key with certificate!</string>
+	<string name="device_does_not_support_certificates">Your device does not support the selection of client certificates!</string>
 </resources>