show unverified devices warning in contact and account details

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java    |   6 
src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java |   4 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java        |   8 
src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java           |  13 
src/main/java/eu/siacs/conversations/ui/OmemoActivity.java                 |   1 
src/main/res/layout/activity_contact_details.xml                           |  13 
src/main/res/layout/activity_edit_account.xml                              | 223 
src/main/res/values/strings.xml                                            |   2 
8 files changed, 176 insertions(+), 94 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java 🔗

@@ -736,8 +736,12 @@ public class AxolotlService implements OnAdvancedStreamFeaturesLoaded {
         return axolotlStore.getFingerprintCertificate(fingerprint);
     }
 
-    public void setFingerprintTrust(String fingerprint, FingerprintStatus status) {
+    public void setFingerprintTrust(final String fingerprint, final FingerprintStatus status) {
         axolotlStore.setFingerprintStatus(fingerprint, status);
+        // TODO we decided to call this after a fingerprint gets toggled to update the 'your contact
+        //  is using unverified devices text'; however this means the entire screen gets redrawn
+        //  after a toggle which might be annoying or cause other weird UI glitches
+        mXmppConnectionService.updateAccountUi();
     }
 
     private ListenableFuture<XmppAxolotlSession> verifySessionWithPEP(final XmppAxolotlSession session) {

src/main/java/eu/siacs/conversations/crypto/axolotl/FingerprintStatus.java 🔗

@@ -97,6 +97,10 @@ public class FingerprintStatus implements Comparable<FingerprintStatus> {
         return trust == Trust.TRUSTED || isVerified();
     }
 
+    public boolean isUnverified() {
+        return trust == Trust.TRUSTED;
+    }
+
     public boolean isVerified() {
         return trust == Trust.VERIFIED || trust == Trust.VERIFIED_X509;
     }

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

@@ -455,6 +455,7 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
             }
             boolean skippedInactive = false;
             boolean showsInactive = false;
+            boolean showUnverifiedWarning = false;
             for (final XmppAxolotlSession session : sessions) {
                 final FingerprintStatus trust = session.getTrust();
                 hasKeys |= !trust.isCompromised();
@@ -470,7 +471,11 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
                     boolean highlight = session.getFingerprint().equals(messageFingerprint);
                     addFingerprintRow(binding.detailsContactKeys, session, highlight);
                 }
+                if (trust.isUnverified()) {
+                    showUnverifiedWarning = true;
+                }
             }
+            binding.unverifiedWarning.setVisibility(showUnverifiedWarning ? View.VISIBLE : View.GONE);
             if (showsInactive || skippedInactive) {
                 binding.showInactiveDevices.setText(showsInactive ? R.string.hide_inactive_devices : R.string.show_inactive_devices);
                 binding.showInactiveDevices.setVisibility(View.VISIBLE);
@@ -480,7 +485,8 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
         } else {
             binding.showInactiveDevices.setVisibility(View.GONE);
         }
-        binding.scanButton.setVisibility(hasKeys && isCameraFeatureAvailable() ? View.VISIBLE : View.GONE);
+        final boolean isCameraFeatureAvailable = isCameraFeatureAvailable();
+        binding.scanButton.setVisibility(hasKeys && isCameraFeatureAvailable ? View.VISIBLE : View.GONE);
         if (hasKeys) {
             binding.scanButton.setOnClickListener((v) -> ScanActivity.scan(this));
         }

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

@@ -49,6 +49,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.crypto.axolotl.AxolotlService;
+import eu.siacs.conversations.crypto.axolotl.FingerprintStatus;
 import eu.siacs.conversations.crypto.axolotl.XmppAxolotlSession;
 import eu.siacs.conversations.databinding.ActivityEditAccountBinding;
 import eu.siacs.conversations.databinding.DialogPresenceBinding;
@@ -630,6 +631,7 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
             this.binding.accountRegisterNew.setVisibility(View.GONE);
         }
         this.binding.actionEditYourName.setOnClickListener(this::onEditYourNameClicked);
+        this.binding.scanButton.setOnClickListener((v) -> ScanActivity.scan(this));
     }
 
     private void onEditYourNameClicked(View view) {
@@ -1166,13 +1168,18 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
                 this.binding.axolotlFingerprintBox.setVisibility(View.GONE);
             }
             boolean hasKeys = false;
+            boolean showUnverifiedWarning = false;
             binding.otherDeviceKeys.removeAllViews();
-            for (XmppAxolotlSession session : mAccount.getAxolotlService().findOwnSessions()) {
-                if (!session.getTrust().isCompromised()) {
+            for (final XmppAxolotlSession session : mAccount.getAxolotlService().findOwnSessions()) {
+                final FingerprintStatus trust = session.getTrust();
+                if (!trust.isCompromised()) {
                     boolean highlight = session.getFingerprint().equals(messageFingerprint);
                     addFingerprintRow(binding.otherDeviceKeys, session, highlight);
                     hasKeys = true;
                 }
+                if (trust.isUnverified()) {
+                    showUnverifiedWarning = true;
+                }
             }
             if (hasKeys && Config.supportOmemo()) { //TODO: either the button should be visible if we print an active device or the device list should be fed with reactived devices
                 this.binding.otherDeviceKeysCard.setVisibility(View.VISIBLE);
@@ -1182,6 +1189,8 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat
                 } else {
                     binding.clearDevices.setVisibility(View.VISIBLE);
                 }
+                binding.unverifiedWarning.setVisibility(showUnverifiedWarning ? View.VISIBLE : View.GONE);
+                binding.scanButton.setVisibility(showUnverifiedWarning ? View.VISIBLE : View.GONE);
             } else {
                 this.binding.otherDeviceKeysCard.setVisibility(View.GONE);
             }

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

@@ -205,6 +205,7 @@ public abstract class OmemoActivity extends XmppActivity {
 
 	@Override
 	public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
+		super.onRequestPermissionsResult(requestCode, permissions, grantResults);
 		ScanActivity.onRequestPermissionResult(this, requestCode, grantResults);
 	}
 }

src/main/res/layout/activity_contact_details.xml 🔗

@@ -186,6 +186,19 @@
                             android:orientation="vertical"
                             android:padding="@dimen/card_padding_list"/>
 
+                        <LinearLayout
+                            android:id="@+id/unverified_warning"
+                            android:layout_width="match_parent"
+                            android:layout_height="wrap_content"
+                            android:paddingHorizontal="@dimen/card_padding_list">
+                            <TextView
+                                android:layout_marginHorizontal="@dimen/list_padding"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:textAppearance="@style/TextAppearance.Conversations.Body1.Secondary"
+                                android:text="@string/contact_uses_unverified_keys"/>
+                        </LinearLayout>
+
                         <LinearLayout
                             android:layout_width="wrap_content"
                             android:layout_height="match_parent"

src/main/res/layout/activity_edit_account.xml 🔗

@@ -1,14 +1,15 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        xmlns:tools="http://schemas.android.com/tools">
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
 
     <RelativeLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="?attr/color_background_secondary">
 
-        <include android:id="@+id/toolbar"
+        <include
+            android:id="@+id/toolbar"
             layout="@layout/toolbar" />
 
         <ScrollView
@@ -28,10 +29,10 @@
                     android:id="@+id/editor"
                     android:layout_width="fill_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:layout_marginLeft="@dimen/activity_horizontal_margin"
+                    android:layout_marginTop="@dimen/activity_vertical_margin"
                     android:layout_marginRight="@dimen/activity_horizontal_margin"
-                    android:layout_marginTop="@dimen/activity_vertical_margin">
+                    android:layout_marginBottom="@dimen/activity_vertical_margin">
 
                     <RelativeLayout
                         android:layout_width="match_parent"
@@ -45,7 +46,7 @@
                             android:layout_alignParentTop="true"
                             android:layout_marginRight="@dimen/avatar_item_distance"
                             android:contentDescription="@string/account_image_description"
-                            app:riv_corner_radius="8dp"/>
+                            app:riv_corner_radius="8dp" />
 
                         <LinearLayout
                             android:layout_width="fill_parent"
@@ -58,17 +59,17 @@
                                 android:layout_width="match_parent"
                                 android:layout_height="wrap_content"
                                 android:hint="@string/account_settings_jabber_id"
-                                app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint"
-                                app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error">
+                                app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error"
+                                app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint">
 
                                 <AutoCompleteTextView
                                     android:id="@+id/account_jid"
+                                    style="@style/Widget.Conversations.EditText"
                                     android:layout_width="match_parent"
                                     android:layout_height="wrap_content"
                                     android:imeOptions="actionNext"
                                     android:inputType="textEmailAddress"
-                                    android:textColor="?attr/edit_text_color"
-                                    style="@style/Widget.Conversations.EditText"/>
+                                    android:textColor="?attr/edit_text_color" />
                             </com.google.android.material.textfield.TextInputLayout>
 
 
@@ -76,21 +77,21 @@
                                 android:id="@+id/account_password_layout"
                                 android:layout_width="match_parent"
                                 android:layout_height="wrap_content"
+                                app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error"
+                                app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint"
                                 app:passwordToggleDrawable="@drawable/visibility_toggle_drawable"
                                 app:passwordToggleEnabled="true"
-                                app:passwordToggleTint="?android:textColorSecondary"
-                                app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint"
-                                app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error">
+                                app:passwordToggleTint="?android:textColorSecondary">
 
                                 <eu.siacs.conversations.ui.widget.TextInputEditText
                                     android:id="@+id/account_password"
+                                    style="@style/Widget.Conversations.EditText"
                                     android:layout_width="match_parent"
                                     android:layout_height="wrap_content"
                                     android:layout_alignParentTop="true"
                                     android:hint="@string/password"
                                     android:inputType="textPassword"
-                                    android:textColor="?attr/edit_text_color"
-                                    style="@style/Widget.Conversations.EditText"/>
+                                    android:textColor="?attr/edit_text_color" />
                             </com.google.android.material.textfield.TextInputLayout>
 
                             <LinearLayout
@@ -112,15 +113,15 @@
                                         android:layout_width="match_parent"
                                         android:layout_height="wrap_content"
                                         android:hint="@string/account_settings_hostname"
-                                        app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint"
-                                        app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error">
+                                        app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error"
+                                        app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint">
 
                                         <EditText
                                             android:id="@+id/hostname"
+                                            style="@style/Widget.Conversations.EditText"
                                             android:layout_width="fill_parent"
                                             android:layout_height="wrap_content"
-                                            android:inputType="textWebEmailAddress"
-                                            style="@style/Widget.Conversations.EditText"/>
+                                            android:inputType="textWebEmailAddress" />
                                     </com.google.android.material.textfield.TextInputLayout>
                                 </LinearLayout>
 
@@ -135,16 +136,16 @@
                                         android:layout_width="match_parent"
                                         android:layout_height="wrap_content"
                                         android:hint="@string/account_settings_port"
-                                        app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint"
-                                        app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error">
+                                        app:errorTextAppearance="@style/TextAppearance.Conversations.Design.Error"
+                                        app:hintTextAppearance="@style/TextAppearance.Conversations.Design.Hint">
 
                                         <EditText
                                             android:id="@+id/port"
+                                            style="@style/Widget.Conversations.EditText"
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent"
                                             android:inputType="number"
-                                            android:maxLength="5"
-                                            style="@style/Widget.Conversations.EditText"/>
+                                            android:maxLength="5" />
                                     </com.google.android.material.textfield.TextInputLayout>
                                 </LinearLayout>
                             </LinearLayout>
@@ -155,7 +156,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:layout_marginTop="8dp"
-                                android:text="@string/register_account"/>
+                                android:text="@string/register_account" />
                         </LinearLayout>
                     </RelativeLayout>
                 </androidx.cardview.widget.CardView>
@@ -164,10 +165,10 @@
                     android:id="@+id/os_optimization"
                     android:layout_width="fill_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:layout_marginLeft="@dimen/activity_horizontal_margin"
-                    android:layout_marginRight="@dimen/activity_horizontal_margin"
                     android:layout_marginTop="@dimen/activity_vertical_margin"
+                    android:layout_marginRight="@dimen/activity_horizontal_margin"
+                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:visibility="gone">
 
                     <LinearLayout
@@ -186,7 +187,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:text="@string/battery_optimizations_enabled"
-                                android:textAppearance="@style/TextAppearance.Conversations.Title"/>
+                                android:textAppearance="@style/TextAppearance.Conversations.Title" />
 
                             <TextView
                                 android:id="@+id/os_optimization_body"
@@ -194,7 +195,7 @@
                                 android:layout_height="wrap_content"
                                 android:layout_marginTop="8dp"
                                 android:text="@string/battery_optimizations_enabled_explained"
-                                android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                android:textAppearance="@style/TextAppearance.Conversations.Body1" />
                         </LinearLayout>
 
                         <LinearLayout
@@ -212,7 +213,7 @@
                                 android:paddingLeft="16dp"
                                 android:paddingRight="16dp"
                                 android:text="@string/disable"
-                                android:textColor="?colorAccent"/>
+                                android:textColor="?colorAccent" />
                         </LinearLayout>
                     </LinearLayout>
                 </androidx.cardview.widget.CardView>
@@ -222,10 +223,10 @@
                     android:id="@+id/stats"
                     android:layout_width="fill_parent"
                     android:layout_height="fill_parent"
-                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:layout_marginLeft="@dimen/activity_horizontal_margin"
-                    android:layout_marginRight="@dimen/activity_horizontal_margin"
                     android:layout_marginTop="@dimen/activity_vertical_margin"
+                    android:layout_marginRight="@dimen/activity_horizontal_margin"
+                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:visibility="gone">
 
                     <LinearLayout
@@ -251,7 +252,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_session_established"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/session_est"
@@ -259,7 +260,7 @@
                                     android:layout_height="wrap_content"
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
                             </TableRow>
 
                         </TableLayout>
@@ -282,7 +283,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_pep"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_pep"
@@ -291,7 +292,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -304,7 +305,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_blocking"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_blocking"
@@ -313,7 +314,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -326,7 +327,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_stream_management"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_sm"
@@ -335,7 +336,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -348,7 +349,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_external_service_discovery"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_external_service"
@@ -357,7 +358,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -370,7 +371,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_roster_version"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_roster_version"
@@ -379,7 +380,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -392,7 +393,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_carbon_messages"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_carbons"
@@ -401,7 +402,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -414,7 +415,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_mam"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_mam"
@@ -423,7 +424,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -436,7 +437,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_csi"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_csi"
@@ -445,7 +446,7 @@
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
                                     android:textAppearance="@style/TextAppearance.Conversations.Body1"
-                                    tools:ignore="RtlHardcoded"/>
+                                    tools:ignore="RtlHardcoded" />
                             </TableRow>
 
                             <TableRow
@@ -459,7 +460,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_push"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_push"
@@ -467,7 +468,7 @@
                                     android:layout_height="wrap_content"
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
                             </TableRow>
 
                             <TableRow
@@ -481,7 +482,7 @@
                                     android:ellipsize="end"
                                     android:singleLine="true"
                                     android:text="@string/server_info_http_upload"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
 
                                 <TextView
                                     android:id="@+id/server_info_http_upload"
@@ -489,7 +490,7 @@
                                     android:layout_height="wrap_content"
                                     android:layout_gravity="right"
                                     android:paddingLeft="4dp"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1" />
                             </TableRow>
                         </TableLayout>
 
@@ -512,14 +513,14 @@
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
                                     android:text="@string/no_name_set_instructions"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Body1.Tertiary"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Body1.Tertiary" />
 
                                 <TextView
                                     android:id="@+id/your_name_desc"
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
                                     android:text="@string/your_name"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Caption" />
                             </LinearLayout>
 
                             <ImageButton
@@ -532,7 +533,7 @@
                                 android:background="?attr/selectableItemBackgroundBorderless"
                                 android:padding="@dimen/image_button_padding"
                                 android:src="?attr/icon_edit_body"
-                                android:visibility="visible"/>
+                                android:visibility="visible" />
                         </RelativeLayout>
 
                         <RelativeLayout
@@ -553,14 +554,14 @@
                                     android:id="@+id/pgp_fingerprint"
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Fingerprint"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Fingerprint" />
 
                                 <TextView
                                     android:id="@+id/pgp_fingerprint_desc"
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
                                     android:text="@string/openpgp_key_id"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Caption" />
                             </LinearLayout>
 
                             <ImageButton
@@ -573,7 +574,7 @@
                                 android:background="?attr/selectableItemBackgroundBorderless"
                                 android:padding="@dimen/image_button_padding"
                                 android:src="?attr/icon_remove"
-                                android:visibility="visible"/>
+                                android:visibility="visible" />
                         </RelativeLayout>
 
                         <RelativeLayout
@@ -594,13 +595,13 @@
                                     android:id="@+id/axolotl_fingerprint"
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Fingerprint"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Fingerprint" />
 
                                 <TextView
                                     android:id="@+id/own_fingerprint_desc"
                                     android:layout_width="wrap_content"
                                     android:layout_height="wrap_content"
-                                    android:textAppearance="@style/TextAppearance.Conversations.Caption"/>
+                                    android:textAppearance="@style/TextAppearance.Conversations.Caption" />
                             </LinearLayout>
 
                             <LinearLayout
@@ -620,7 +621,7 @@
                                     android:contentDescription="@string/copy_omemo_clipboard_description"
                                     android:padding="@dimen/image_button_padding"
                                     android:src="?attr/icon_copy"
-                                    android:visibility="visible"/>
+                                    android:visibility="visible" />
 
                                 <ImageButton
                                     android:id="@+id/action_regenerate_axolotl_key"
@@ -631,7 +632,7 @@
                                     android:contentDescription="@string/regenerate_omemo_key"
                                     android:padding="@dimen/image_button_padding"
                                     android:src="?attr/icon_refresh"
-                                    android:visibility="gone"/>
+                                    android:visibility="gone" />
 
                             </LinearLayout>
                         </RelativeLayout>
@@ -642,41 +643,83 @@
                     android:id="@+id/other_device_keys_card"
                     android:layout_width="fill_parent"
                     android:layout_height="wrap_content"
-                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:layout_marginLeft="@dimen/activity_horizontal_margin"
-                    android:layout_marginRight="@dimen/activity_horizontal_margin"
                     android:layout_marginTop="@dimen/activity_vertical_margin"
+                    android:layout_marginRight="@dimen/activity_horizontal_margin"
+                    android:layout_marginBottom="@dimen/activity_vertical_margin"
                     android:visibility="gone">
 
                     <LinearLayout
                         android:layout_width="match_parent"
                         android:layout_height="wrap_content"
-                        android:orientation="vertical"
-                        android:padding="@dimen/card_padding_list">
+                        android:orientation="vertical">
 
-                        <TextView
-                            android:id="@+id/other_device_keys_title"
-                            android:layout_width="wrap_content"
+                        <LinearLayout
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:layout_margin="@dimen/list_padding"
-                            android:text="@string/other_devices"
-                            android:textAppearance="@style/TextAppearance.Conversations.Title"/>
+                            android:orientation="vertical"
+                            android:padding="@dimen/card_padding_list">
+
+                            <TextView
+                                android:id="@+id/other_device_keys_title"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_margin="@dimen/list_padding"
+                                android:text="@string/other_devices"
+                                android:textAppearance="@style/TextAppearance.Conversations.Title" />
+
+                            <LinearLayout
+                                android:id="@+id/other_device_keys"
+                                android:layout_width="fill_parent"
+                                android:layout_height="wrap_content"
+                                android:orientation="vertical" />
+                        </LinearLayout>
 
                         <LinearLayout
-                            android:id="@+id/other_device_keys"
-                            android:layout_width="fill_parent"
+                            android:id="@+id/unverified_warning"
+                            android:layout_width="match_parent"
                             android:layout_height="wrap_content"
-                            android:orientation="vertical"/>
+                            android:paddingHorizontal="@dimen/card_padding_list">
+
+                            <TextView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginHorizontal="@dimen/list_padding"
+                                android:text="@string/unverified_devices"
+                                android:textAppearance="@style/TextAppearance.Conversations.Body1.Secondary" />
+                        </LinearLayout>
 
-                        <Button
-                            android:id="@+id/clear_devices"
-                            style="@style/Widget.Conversations.Button.Borderless"
+                        <LinearLayout
                             android:layout_width="wrap_content"
-                            android:layout_height="wrap_content"
-                            android:layout_gravity="center_horizontal"
-                            android:text="@string/clear_other_devices"
-                            android:textColor="?colorAccent"/>
+                            android:layout_height="match_parent"
+                            android:layout_marginTop="8dp"
+                            android:orientation="horizontal">
+
+
+                            <Button
+                                android:id="@+id/scan_button"
+                                style="@style/Widget.Conversations.Button.Borderless"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:minWidth="0dp"
+                                android:paddingLeft="16dp"
+                                android:paddingRight="16dp"
+                                android:text="@string/scan_qr_code"
+                                android:textColor="?attr/colorAccent" />
+
+                            <Button
+                                android:id="@+id/clear_devices"
+                                style="@style/Widget.Conversations.Button.Borderless"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:minWidth="0dp"
+                                android:paddingLeft="16dp"
+                                android:paddingRight="16dp"
+                                android:text="@string/clear_other_devices"
+                                android:textColor="?attr/colorAccent" />
+                        </LinearLayout>
                     </LinearLayout>
+
                 </androidx.cardview.widget.CardView>
             </LinearLayout>
         </ScrollView>
@@ -685,11 +728,11 @@
             android:id="@+id/button_bar"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_alignParentBottom="true"
-            android:layout_alignParentEnd="true"
+            android:layout_alignParentStart="true"
             android:layout_alignParentLeft="true"
+            android:layout_alignParentEnd="true"
             android:layout_alignParentRight="true"
-            android:layout_alignParentStart="true">
+            android:layout_alignParentBottom="true">
 
             <Button
                 android:id="@+id/cancel_button"
@@ -697,14 +740,14 @@
                 android:layout_width="0dp"
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
-                android:text="@string/cancel"/>
+                android:text="@string/cancel" />
 
             <View
                 android:layout_width="1dp"
                 android:layout_height="fill_parent"
-                android:layout_marginBottom="7dp"
                 android:layout_marginTop="7dp"
-                android:background="?attr/divider"/>
+                android:layout_marginBottom="7dp"
+                android:background="?attr/divider" />
 
             <Button
                 android:id="@+id/save_button"
@@ -713,7 +756,7 @@
                 android:layout_height="wrap_content"
                 android:layout_weight="1"
                 android:enabled="false"
-                android:text="@string/save"/>
+                android:text="@string/save" />
         </LinearLayout>
 
     </RelativeLayout>

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

@@ -1018,4 +1018,6 @@
     <string name="hide_notification">Hide notification</string>
     <string name="log_out">Log out</string>
     <string name="log_in">Log in</string>
+    <string name="contact_uses_unverified_keys">Your contact uses unverified devices. Scan their 2D barcode to perform verification and impede active MITM attacks.</string>
+    <string name="unverified_devices">You are using unverified devices. Scan the 2D barcodes of your other devices to perform verification and impede active MITM attack.</string>
 </resources>