Added axolotl activation code to UI

Andreas Straub created

Change summary

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  9 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java      | 20 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java        | 18 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        | 10 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java                | 23 
5 files changed, 80 insertions(+)

Detailed changes

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -758,6 +758,15 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 						}
 					}
 					break;
+				case Message.ENCRYPTION_AXOLOTL:
+					try {
+						packet = mMessageGenerator.generateAxolotlChat(message);
+						Log.d(Config.LOGTAG, "Succeeded generating axolotl chat message!");
+					} catch (NoSessionsCreatedException e) {
+						message.setStatus(Message.STATUS_WAITING);
+					}
+					break;
+
 			}
 			if (packet != null) {
 				if (account.getXmppConnection().getFeatures().sm() || conversation.getMode() == Conversation.MODE_MULTI) {

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

@@ -29,6 +29,7 @@ import android.widget.QuickContactBadge;
 import android.widget.TextView;
 
 import org.openintents.openpgp.util.OpenPgpUtils;
+import org.whispersystems.libaxolotl.IdentityKey;
 
 import java.util.List;
 
@@ -376,6 +377,25 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 				}
 			});
 		}
+		for(final IdentityKey identityKey:contact.getAxolotlIdentityKeys()) {
+			hasKeys = true;
+			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("Axolotl Fingerprint");
+			key.setText(identityKey.getFingerprint());
+			keys.addView(view);
+			remove.setOnClickListener(new OnClickListener() {
+
+				@Override
+				public void onClick(View v) {
+					//confirmToDeleteFingerprint(otrFingerprint);
+				}
+			});
+		}
 		if (contact.getPgpKeyId() != 0) {
 			hasKeys = true;
 			View view = inflater.inflate(R.layout.contact_key, keys, false);

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

@@ -16,6 +16,7 @@ import android.os.Bundle;
 import android.provider.MediaStore;
 import android.support.v4.widget.SlidingPaneLayout;
 import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener;
+import android.util.Log;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
@@ -34,6 +35,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.entities.Blockable;
@@ -749,6 +751,17 @@ public class ConversationActivity extends XmppActivity
 								showInstallPgpDialog();
 							}
 							break;
+						case R.id.encryption_choice_axolotl:
+                            Log.d(Config.LOGTAG, "Trying to enable axolotl...");
+							if(conversation.getAccount().getAxolotlService().isContactAxolotlCapable(conversation.getContact())) {
+                                Log.d(Config.LOGTAG, "Enabled axolotl for Contact " + conversation.getContact().getJid() );
+								conversation.setNextEncryption(Message.ENCRYPTION_AXOLOTL);
+								item.setChecked(true);
+							} else {
+                                Log.d(Config.LOGTAG, "Contact " + conversation.getContact().getJid() + " not axolotl capable!");
+								showAxolotlNoSessionsDialog();
+							}
+                            break;
 						default:
 							conversation.setNextEncryption(Message.ENCRYPTION_NONE);
 							break;
@@ -780,6 +793,11 @@ public class ConversationActivity extends XmppActivity
 				case Message.ENCRYPTION_PGP:
 					pgp.setChecked(true);
 					break;
+				case Message.ENCRYPTION_AXOLOTL:
+                    Log.d(Config.LOGTAG, "Axolotl confirmed. Setting menu item checked!");
+					popup.getMenu().findItem(R.id.encryption_choice_axolotl)
+							.setChecked(true);
+					break;
 				default:
 					none.setChecked(true);
 					break;

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

@@ -303,6 +303,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 			sendOtrMessage(message);
 		} else if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_PGP) {
 			sendPgpMessage(message);
+		} else if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_AXOLOTL) {
+			sendAxolotlMessage(message);
 		} else {
 			sendPlainTextMessage(message);
 		}
@@ -1120,6 +1122,14 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa
 		builder.create().show();
 	}
 
+	protected void sendAxolotlMessage(final Message message) {
+		final ConversationActivity activity = (ConversationActivity) getActivity();
+		final XmppConnectionService xmppService = activity.xmppConnectionService;
+		//message.setCounterpart(conversation.getNextCounterpart());
+		xmppService.sendMessage(message);
+		messageSent();
+	}
+
 	protected void sendOtrMessage(final Message message) {
 		final ConversationActivity activity = (ConversationActivity) getActivity();
 		final XmppConnectionService xmppService = activity.xmppConnectionService;

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

@@ -266,6 +266,29 @@ public abstract class XmppActivity extends Activity {
 		builder.create().show();
 	}
 
+	public void showAxolotlNoSessionsDialog() {
+		Builder builder = new AlertDialog.Builder(this);
+		builder.setTitle("No Sessions");
+		builder.setIconAttribute(android.R.attr.alertDialogIcon);
+		builder.setMessage("Your contact is not Axolotl-capable!");
+		builder.setNegativeButton(getString(R.string.cancel), null);
+		builder.setNeutralButton("Foo",
+				new OnClickListener() {
+
+					@Override
+					public void onClick(DialogInterface dialog, int which) {
+					}
+				});
+		builder.setPositiveButton("Bar",
+				new OnClickListener() {
+
+					@Override
+					public void onClick(DialogInterface dialog, int which) {
+					}
+				});
+		builder.create().show();
+	}
+
 	abstract void onBackendConnected();
 
 	protected void registerListeners() {