fixed #321 - delete otr fingerprints

iNPUTmice created

Change summary

res/drawable-hdpi/ic_action_remove.png                    |  0 
res/drawable-mdpi/ic_action_remove.png                    |  0 
res/drawable-xhdpi/ic_action_remove.png                   |  0 
res/drawable-xxhdpi/ic_action_remove.png                  |  0 
res/layout/contact_key.xml                                | 46 ++++++--
res/values/strings.xml                                    |  2 
src/eu/siacs/conversations/entities/Contact.java          | 22 ++++
src/eu/siacs/conversations/ui/ContactDetailsActivity.java | 35 ++++++
8 files changed, 88 insertions(+), 17 deletions(-)

Detailed changes

res/layout/contact_key.xml 🔗

@@ -1,22 +1,40 @@
 <?xml version="1.0" encoding="utf-8"?>
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent" >
+
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_alignParentLeft="true"
+        android:layout_toLeftOf="@+id/button_remove"
         android:orientation="vertical"
         android:padding="8dp" >
 
-    <TextView 
-        android:id="@+id/key"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:textSize="18sp"
-        android:textColor="@color/primarytext"
-        android:typeface="monospace"
-        />
-    <TextView 
-        android:id="@+id/key_type"
+        <TextView
+            android:id="@+id/key"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@color/primarytext"
+            android:textSize="18sp"
+            android:typeface="monospace" />
+
+        <TextView
+            android:id="@+id/key_type"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textColor="@color/secondarytext" />
+    </LinearLayout>
+
+    <ImageButton
+        android:id="@+id/button_remove"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:textColor="@color/secondarytext"
-        />
-    </LinearLayout>
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:padding="8dp"
+        android:background="?android:selectableItemBackground"
+        android:src="@drawable/ic_action_remove"
+        android:visibility="invisible"/>
+
+</RelativeLayout>

res/values/strings.xml 🔗

@@ -245,5 +245,7 @@
     <string name="request_presence_updates">Please request presence updates from your contact first.\n\n<small>This will be used to determine what client(s) your contact is using.</small></string>
     <string name="request_now">Request now</string>
     <string name="unable_to_decrypt_otr_message">Unable to decrypt OTR message</string>
+    <string name="delete_fingerprint">Delete Fingerprint</string>
+    <string name="sure_delete_fingerprint">Are you sure you would like to delete this fingerprint?</string>
 
 </resources>

src/eu/siacs/conversations/entities/Contact.java 🔗

@@ -351,4 +351,26 @@ public class Contact implements ListItem {
 			return true;
 		}
 	}
+
+	public boolean deleteOtrFingerprint(String fingerprint) {
+		boolean success = false;
+		try {
+			if (this.keys.has("otr_fingerprints")) {
+				JSONArray newPrints = new JSONArray();
+				JSONArray oldPrints = this.keys
+						.getJSONArray("otr_fingerprints");
+				for (int i = 0; i < oldPrints.length(); ++i) {
+					if (!oldPrints.getString(i).equals(fingerprint)) {
+						newPrints.put(oldPrints.getString(i));
+					} else {
+						success = true;
+					}
+				}
+				this.keys.put("otr_fingerprints", newPrints);
+			}
+			return success;
+		} catch (JSONException e) {
+			return false;
+		}
+	}
 }

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

@@ -23,6 +23,7 @@ import android.view.View.OnClickListener;
 import android.widget.CheckBox;
 import android.widget.CompoundButton.OnCheckedChangeListener;
 import android.widget.CompoundButton;
+import android.widget.ImageButton;
 import android.widget.LinearLayout;
 import android.widget.QuickContactBadge;
 import android.widget.TextView;
@@ -323,16 +324,25 @@ public class ContactDetailsActivity extends XmppActivity {
 		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 		for (Iterator<String> iterator = contact.getOtrFingerprints()
 				.iterator(); iterator.hasNext();) {
-			String otrFingerprint = iterator.next();
-			View view = (View) inflater.inflate(R.layout.contact_key, null);
+			final String otrFingerprint = iterator.next();
+			View view = (View) inflater.inflate(R.layout.contact_key, keys,false);
 			TextView key = (TextView) view.findViewById(R.id.key);
 			TextView keyType = (TextView) view.findViewById(R.id.key_type);
+			ImageButton remove = (ImageButton) view.findViewById(R.id.button_remove);
+			remove.setVisibility(View.VISIBLE);
 			keyType.setText("OTR Fingerprint");
 			key.setText(otrFingerprint);
 			keys.addView(view);
+			remove.setOnClickListener(new OnClickListener() {
+				
+				@Override
+				public void onClick(View v) {
+					confirmToDeleteFingerprint(otrFingerprint);
+				}
+			});
 		}
 		if (contact.getPgpKeyId() != 0) {
-			View view = (View) inflater.inflate(R.layout.contact_key, null);
+			View view = (View) inflater.inflate(R.layout.contact_key, keys,false);
 			TextView key = (TextView) view.findViewById(R.id.key);
 			TextView keyType = (TextView) view.findViewById(R.id.key_type);
 			keyType.setText("PGP Key ID");
@@ -360,6 +370,25 @@ public class ContactDetailsActivity extends XmppActivity {
 			keys.addView(view);
 		}
 	}
+	
+	protected void confirmToDeleteFingerprint(final String fingerprint) {
+		AlertDialog.Builder builder = new AlertDialog.Builder(this);
+		builder.setTitle(R.string.delete_fingerprint);
+		builder.setMessage(R.string.sure_delete_fingerprint);
+		builder.setNegativeButton(R.string.cancel, null);
+		builder.setPositiveButton(R.string.delete,new android.content.DialogInterface.OnClickListener() {
+
+			@Override
+			public void onClick(DialogInterface dialog, int which) {
+				if (contact.deleteOtrFingerprint(fingerprint)) {
+					populateView();
+					xmppConnectionService.syncRosterToDisk(contact.getAccount());
+				}
+			}
+			
+		});
+		builder.create().show();
+	}
 
 	@Override
 	public void onBackendConnected() {