redesigned muc details a little bit

iNPUTmice created

Change summary

res/drawable-hdpi/ic_action_edit_dark.png                 |   0 
res/drawable-mdpi/ic_action_edit_dark.png                 |   0 
res/drawable-xhdpi/ic_action_edit_dark.png                |   0 
res/drawable-xxhdpi/ic_action_edit_dark.png               |   0 
res/layout/activity_muc_details.xml                       | 239 +++----
res/layout/edit_contact_name.xml                          |  28 
res/layout/quickedit.xml                                  |  18 
res/menu/muc_details.xml                                  |   6 
res/values/colors.xml                                     |   2 
res/values/strings.xml                                    |   2 
res/values/styles.xml                                     |   4 
res/values/themes.xml                                     |   4 
src/eu/siacs/conversations/entities/MucOptions.java       |  28 
src/eu/siacs/conversations/ui/ContactDetailsActivity.java |  18 
src/eu/siacs/conversations/ui/ConversationFragment.java   |  28 
src/eu/siacs/conversations/ui/MucDetailsActivity.java     | 287 +++++---
src/eu/siacs/conversations/ui/XmppActivity.java           |  31 
17 files changed, 362 insertions(+), 333 deletions(-)

Detailed changes

res/layout/activity_muc_details.xml 🔗

@@ -2,147 +2,128 @@
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:background="@color/secondarybackground">
-
-<LinearLayout
-    android:layout_width="wrap_content"
-    android:layout_height="wrap_content"
-    android:orientation="vertical" >
-     <TextView
-        style="@style/sectionHeader"
+    android:background="@color/primarybackground" >
+
+    <LinearLayout
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:padding="8dp"
-        android:text="@string/muc_details_conference"
-        android:textColor="@color/primarytext"/>
-       <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/primarybackground" >
-        
+        android:orientation="vertical" >
 
-        <EditText
-            android:id="@+id/muc_subject"
+        <TextView
+            style="@style/sectionHeader"
             android:layout_width="wrap_content"
-            android:layout_height="48dp"
-            android:layout_alignParentLeft="true"
-            android:layout_toLeftOf="@+id/muc_edit_subject"
-            android:background="@color/primarybackground"
-            android:ems="10"
-            android:hint="@string/muc_details_conference_subject"
-            android:inputType="textAutoComplete"
-            android:paddingBottom="12dp"
-            android:paddingLeft="8dp"
-            android:paddingRight="8dp"
-            android:paddingTop="12dp" />
-
-        <ImageButton
-            android:id="@+id/muc_edit_subject"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:layout_alignParentRight="true"
-            android:layout_alignParentTop="true"
-            android:layout_centerVertical="true"
-            android:background="?android:selectableItemBackground"
+            android:layout_height="wrap_content"
             android:padding="8dp"
-            android:src="@drawable/ic_action_edit" />
-    </RelativeLayout>
-    <TextView
-        android:id="@+id/muc_jabberid"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="8dp"
-        android:singleLine="true"
-        android:textSize="14sp"
-        android:textColor="@color/primarytext"/>
+            android:text="@string/muc_details_conference" />
 
-    <TextView
-        style="@style/sectionHeader"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingLeft="8dp"
-        android:paddingRight="8dp"
-        android:paddingTop="8dp"
-        android:text="@string/muc_details_your_nickname"
-        android:textColor="@color/primarytext"/>
-
-    <RelativeLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:background="@color/primarybackground" >
-        
+        <TextView
+            android:id="@+id/muc_jabberid"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:singleLine="true"
+            android:text="@string/account_settings_example_jabber_id"
+            android:textColor="@color/primarytext"
+            android:textSize="14sp"/>
 
-        <EditText
-            android:id="@+id/muc_your_nick"
+        <TextView
+            style="@style/sectionHeader"
             android:layout_width="wrap_content"
-            android:layout_height="48dp"
-            android:layout_alignParentLeft="true"
-            android:layout_toLeftOf="@+id/muc_edit_nick"
-            android:background="@color/primarybackground"
-            android:ems="10"
-            android:hint="@string/muc_details_your_nickname"
-            android:inputType="textEmailAddress"
-            android:paddingBottom="12dp"
+            android:layout_height="wrap_content"
             android:paddingLeft="8dp"
             android:paddingRight="8dp"
-            android:paddingTop="12dp" />
-
-        <ImageButton
-            android:id="@+id/muc_edit_nick"
-            android:layout_width="48dp"
-            android:layout_height="48dp"
-            android:layout_alignParentRight="true"
-            android:layout_alignParentTop="true"
-            android:layout_centerVertical="true"
-            android:background="?android:selectableItemBackground"
+            android:paddingTop="8dp"
+            android:text="@string/you" />
+
+        <RelativeLayout
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:background="?android:attr/activatedBackgroundIndicator"
             android:padding="8dp"
-            android:src="@drawable/ic_action_edit" />
-    </RelativeLayout>
-    <TextView
-        android:id="@+id/muc_role"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:padding="8dp"
-        android:singleLine="true"
-        android:textSize="14sp"
-        android:textColor="@color/primarytext"/>
-    
-    <LinearLayout
-        android:id="@+id/muc_more_details"
-        android:layout_width="fill_parent"
-        android:layout_height="fill_parent"
-        android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/muc_participants_header"
-        style="@style/sectionHeader"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:paddingLeft="8dp"
-        android:paddingRight="8dp"
-        android:paddingTop="8dp"
-        android:text="@string/muc_details_other_members"
-        android:textColor="@color/primarytext"/>
+            android:paddingBottom="8dp" >
 
-    <LinearLayout
-        android:id="@+id/muc_members"
-        android:layout_width="fill_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1" 
-        android:orientation="vertical"
-        android:divider="?android:dividerHorizontal"
-        android:showDividers="middle"
-        >
-    </LinearLayout>
+            <ImageView
+                android:id="@+id/your_photo"
+                android:layout_width="48dp"
+                android:layout_height="48dp"
+                android:layout_alignParentLeft="true"
+                android:src="@drawable/ic_profile" >
+            </ImageView>
+
+            <LinearLayout
+                android:layout_width="fill_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toRightOf="@+id/your_photo"
+                android:orientation="vertical"
+                android:paddingLeft="8dp" >
+
+                <TextView
+                    android:id="@+id/muc_your_nick"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:text="hallo hallo"
+                    android:textColor="@color/primarytext"
+                    android:textSize="18sp" />
+
+                <TextView
+                    android:id="@+id/muc_role"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:singleLine="true"
+                    android:text="Participant"
+                    android:textColor="@color/primarytext"
+                    android:textSize="14sp" />
+            </LinearLayout>
+
+            <ImageButton
+                android:id="@+id/edit_nick_button"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_centerVertical="true"
+                android:background="?android:selectableItemBackground"
+              	android:src="@drawable/ic_action_edit_dark"
+              	android:padding="8dp"/>
+
+        </RelativeLayout>
+
+        <LinearLayout
+            android:id="@+id/muc_more_details"
+            android:layout_width="fill_parent"
+            android:layout_height="fill_parent"
+            android:orientation="vertical" >
+
+            <TextView
+                android:id="@+id/muc_participants_header"
+                style="@style/sectionHeader"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:paddingLeft="8dp"
+                android:paddingRight="8dp"
+                android:paddingTop="8dp"
+                android:text="@string/muc_details_other_members" />
+
+            <LinearLayout
+                android:id="@+id/muc_members"
+                android:layout_width="fill_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:divider="?android:dividerHorizontal"
+                android:orientation="vertical"
+                android:showDividers="middle" >
+            </LinearLayout>
+        </LinearLayout>
+
+        <Button
+            android:id="@+id/invite"
+            style="?android:attr/buttonStyleSmall"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="24dp"
+            android:text="@string/invite_contacts" />
     </LinearLayout>
 
-    <Button
-        android:layout_marginTop="24dp"
-        android:id="@+id/invite"
-        style="?android:attr/buttonStyleSmall"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/invite_contacts"
-        android:layout_gravity="center_horizontal"/>
-</LinearLayout>
 </ScrollView>

res/layout/edit_contact_name.xml 🔗

@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:padding="8dp">
-
-    <TextView
-        android:id="@+id/textView1"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="@string/enter_new_name"
-        android:textColor="@color/primarytext"
-        android:textSize="18sp" />
-
-    <EditText
-        android:paddingTop="16dp"
-        android:paddingBottom="8dp"
-        android:id="@+id/editText1"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:ems="10"
-        android:inputType="textPersonName" >
-
-        <requestFocus />
-    </EditText>
-    
-</LinearLayout>

res/layout/quickedit.xml 🔗

@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:padding="16dp">
+    <EditText
+        android:id="@+id/editor"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:ems="10"
+        android:inputType="textPersonName"
+        android:textColor="@color/primarytext">
+
+        <requestFocus />
+    </EditText>
+    
+</LinearLayout>

res/menu/muc_details.xml 🔗

@@ -1,5 +1,11 @@
 <?xml version="1.0" encoding="utf-8"?>
 <menu xmlns:android="http://schemas.android.com/apk/res/android" >
+    <item
+        android:id="@+id/action_edit_subject"
+        android:orderInCategory="10"
+        android:showAsAction="always"
+        android:icon="@drawable/ic_action_edit"
+        android:title="@string/action_edit_subject" />
     <item
         android:id="@+id/action_accounts"
         android:orderInCategory="90"

res/values/colors.xml 🔗

@@ -1,5 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
+    <color name="primary" type="color">#ff259b24</color>
+    <color name="primarydark" type="color">#ff0a7e07</color>
     <color name="primarytext" type="color">#de000000</color>
     <color name="secondarytext" type="color">#8a000000</color>
     <color name="ondarktext" type="color">#fffafafa</color>

res/values/strings.xml 🔗

@@ -270,4 +270,6 @@
     <string name="save_as_bookmark">Save as bookmark</string>
     <string name="delete_bookmark">Delete bookmark</string>
     <string name="bookmark_already_exists">This bookmark already exists</string>
+    <string name="you">You</string>
+    <string name="action_edit_subject">Edit conference subject</string>
 </resources>

res/values/styles.xml 🔗

@@ -6,14 +6,14 @@
         <item name="android:layout_marginTop">8dp</item>
         <item name="android:textSize">14sp</item>
         <item name="android:textAllCaps">true</item>
-        <item name="android:textColor">#5b5b5b</item>
+        <item name="android:textColor">@color/primarytext</item>
         <item name="android:textStyle">bold</item>
     </style>
 
     <style name="Divider">
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">1.5dp</item>
-        <item name="android:background">#b7b7b7</item>
+        <item name="android:background">@color/divider</item>
     </style>
 
 </resources>

res/values/themes.xml 🔗

@@ -8,8 +8,8 @@
     </style>
 
     <style name="ConversationsActionBar" parent="@android:style/Widget.Holo.Light.ActionBar.Solid.Inverse">
-        <item name="android:background">#259b24</item>
-        <item name="android:backgroundStacked">#0a7e07</item>
+        <item name="android:background">@color/primary</item>
+        <item name="android:backgroundStacked">@color/primarydark</item>
         <item name="android:displayOptions">showHome|homeAsUp|showTitle</item>
         <item name="android:icon">@android:color/transparent</item>
     </style>

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

@@ -87,7 +87,7 @@ public class MucOptions {
 	private boolean aboutToRename = false;
 	private User self = new User();
 	private String subject = null;
-	private String nick;
+	private String joinnick;
 
 	public MucOptions(Account account) {
 		this.account = account;
@@ -124,10 +124,16 @@ public class MucOptions {
 				user.setAffiliation(item.getAttribute("affiliation"));
 				user.setRole(item.getAttribute("role"));
 				user.setName(name);
-				if (name.equals(getJoinNick())) {
+				if (name.equals(this.joinnick)) {
 					this.isOnline = true;
 					this.error = 0;
 					self = user;
+					if (aboutToRename) {
+						if (renameListener!=null) {
+							renameListener.onRename(true);
+						}
+						aboutToRename = false;
+					}
 				} else {
 					addUser(user);
 				}
@@ -146,16 +152,6 @@ public class MucOptions {
 					}
 				}
 			} else if (type.equals("unavailable")) {
-				if (name.equals(self.getName())) {
-					Element item = packet.findChild("x","http://jabber.org/protocol/muc#user").findChild("item");
-					String nick = item.getAttribute("nick");
-					if (nick!=null) {
-						aboutToRename = false;
-						if (renameListener!=null) {
-							renameListener.onRename(true);
-						}
-					}
-				}
 				deleteUser(packet.getAttribute("from").split("/")[1]);
 			} else if (type.equals("error")) {
 				Element error = packet.findChild("error");
@@ -191,10 +187,6 @@ public class MucOptions {
 		}
 	}
 	
-	public String getJoinNick() {
-		return this.nick;
-	}
-	
 	public String getActualNick() {
 		if (this.self.getName()!=null) {
 			return this.self.getName();
@@ -204,7 +196,7 @@ public class MucOptions {
 	}
 	
 	public void setJoinNick(String nick) {
-		this.nick = nick;
+		this.joinnick = nick;
 	}
 	
 	public void setConversation(Conversation conversation) {
@@ -282,6 +274,6 @@ public class MucOptions {
 	}
 
 	public String getJoinJid() {
-		return this.conversation.getContactJid().split("/")[0]+"/"+this.getJoinNick();
+		return this.conversation.getContactJid().split("/")[0]+"/"+this.joinnick;
 	}
 }

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

@@ -141,15 +141,15 @@ public class ContactDetailsActivity extends XmppActivity {
 			break;
 		case R.id.action_edit_contact:
 			if (contact.getSystemAccount() == null) {
-
-				View view = (View) getLayoutInflater().inflate(
-						R.layout.edit_contact_name, null);
-				name = (EditText) view.findViewById(R.id.editText1);
-				name.setText(contact.getDisplayName());
-				builder.setView(view).setTitle(contact.getJid())
-						.setPositiveButton(getString(R.string.edit), editContactNameListener)
-						.create().show();
-
+				quickEdit(contact.getDisplayName(), new OnValueEdited() {
+					
+					@Override
+					public void onValueEdited(String value) {
+						contact.setServerName(value);
+						activity.xmppConnectionService.pushContactToServer(contact);
+						populateView();
+					}
+				});
 			} else {
 				Intent intent = new Intent(Intent.ACTION_EDIT);
 				String[] systemAccount = contact.getSystemAccount().split("#");

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

@@ -654,34 +654,6 @@ public class ConversationFragment extends Fragment {
 				activity.invalidateOptionsMenu();
 			}
 		}
-		if (conversation.getMode() == Conversation.MODE_MULTI) {
-			activity.xmppConnectionService
-					.setOnRenameListener(new OnRenameListener() {
-
-						@Override
-						public void onRename(final boolean success) {
-							activity.xmppConnectionService
-									.updateConversation(conversation);
-							getActivity().runOnUiThread(new Runnable() {
-
-								@Override
-								public void run() {
-									if (success) {
-										Toast.makeText(
-												getActivity(),
-												getString(R.string.your_nick_has_been_changed),
-												Toast.LENGTH_SHORT).show();
-									} else {
-										Toast.makeText(
-												getActivity(),
-												getString(R.string.nick_in_use),
-												Toast.LENGTH_SHORT).show();
-									}
-								}
-							});
-						}
-					});
-		}
 	}
 
 	private void decryptMessage(Message message) {

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

@@ -9,108 +9,124 @@ import eu.siacs.conversations.R;
 import eu.siacs.conversations.crypto.PgpEngine;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.MucOptions;
+import eu.siacs.conversations.entities.MucOptions.OnRenameListener;
 import eu.siacs.conversations.entities.MucOptions.User;
+import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdate;
 import eu.siacs.conversations.utils.UIHelper;
 import eu.siacs.conversations.xmpp.stanzas.MessagePacket;
 import android.app.PendingIntent;
 import android.content.Context;
-import android.content.SharedPreferences;
 import android.content.IntentSender.SendIntentException;
+import android.graphics.Bitmap;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.Button;
-import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.ImageView;
 import android.widget.LinearLayout;
 import android.widget.TextView;
+import android.widget.Toast;
 
 public class MucDetailsActivity extends XmppActivity {
 	public static final String ACTION_VIEW_MUC = "view_muc";
 	private Conversation conversation;
-	private EditText mYourNick;
-	private EditText mSubject;
+	private TextView mYourNick;
+	private ImageView mYourPhoto;
+	private ImageButton mEditNickButton;
 	private TextView mRoleAffiliaton;
 	private TextView mFullJid;
 	private LinearLayout membersView;
 	private LinearLayout mMoreDetails;
 	private Button mInviteButton;
 	private String uuid = null;
-	private OnClickListener changeNickListener = new OnClickListener() {
 
-		@Override
-		public void onClick(View arg0) {
-			MucOptions options = conversation.getMucOptions();
-			String nick = mYourNick.getText().toString();
-			if (!options.getActualNick().equals(nick)) {
-				xmppConnectionService.renameInMuc(conversation, nick);
-				finish();
-			}
-		}
-	};
-	
-	private OnClickListener changeSubjectListener = new OnClickListener() {
+	private OnClickListener inviteListener = new OnClickListener() {
 
 		@Override
-		public void onClick(View arg0) {
-			String subject = mSubject.getText().toString();
-			MucOptions options = conversation.getMucOptions();
-			if (!subject.equals(options.getSubject())) {
-				MessagePacket packet = xmppConnectionService.getMessageGenerator().conferenceSubject(conversation, subject);
-				xmppConnectionService.sendMessagePacket(conversation.getAccount(), packet);
-				finish();
-			}
+		public void onClick(View v) {
+			/*
+			 * Intent intent = new Intent(getApplicationContext(),
+			 * ContactsActivity.class); intent.setAction("invite");
+			 * intent.putExtra("uuid",conversation.getUuid());
+			 * startActivity(intent);
+			 */
 		}
 	};
-	
-	private OnClickListener inviteListener = new OnClickListener() {
+
+	private List<User> users = new ArrayList<MucOptions.User>();
+	private OnConversationUpdate onConvChanged = new OnConversationUpdate() {
 		
 		@Override
-		public void onClick(View v) {
-			/*Intent intent = new Intent(getApplicationContext(),
-					ContactsActivity.class);
-			intent.setAction("invite");
-			intent.putExtra("uuid",conversation.getUuid());
-			startActivity(intent);*/
+		public void onConversationUpdate() {
+			runOnUiThread(new Runnable() {
+
+				@Override
+				public void run() {
+					populateView();
+				}
+			});
 		}
 	};
-	
-	private List<User> users = new ArrayList<MucOptions.User>();
 
 	@Override
 	protected void onCreate(Bundle savedInstanceState) {
 		super.onCreate(savedInstanceState);
 		setContentView(R.layout.activity_muc_details);
-		mYourNick = (EditText) findViewById(R.id.muc_your_nick);
+		mYourNick = (TextView) findViewById(R.id.muc_your_nick);
+		mYourPhoto = (ImageView) findViewById(R.id.your_photo);
+		mEditNickButton = (ImageButton) findViewById(R.id.edit_nick_button);
 		mFullJid = (TextView) findViewById(R.id.muc_jabberid);
-		ImageButton editNickButton = (ImageButton) findViewById(R.id.muc_edit_nick);
-		editNickButton.setOnClickListener(this.changeNickListener);
-		ImageButton editSubjectButton = (ImageButton) findViewById(R.id.muc_edit_subject);
-		editSubjectButton.setOnClickListener(this.changeSubjectListener);
 		membersView = (LinearLayout) findViewById(R.id.muc_members);
 		mMoreDetails = (LinearLayout) findViewById(R.id.muc_more_details);
 		mMoreDetails.setVisibility(View.GONE);
-		mSubject = (EditText) findViewById(R.id.muc_subject);
 		mInviteButton = (Button) findViewById(R.id.invite);
 		mInviteButton.setOnClickListener(inviteListener);
 		getActionBar().setHomeButtonEnabled(true);
 		getActionBar().setDisplayHomeAsUpEnabled(true);
-		
+		mEditNickButton.setOnClickListener(new OnClickListener() {
+
+			@Override
+			public void onClick(View v) {
+				quickEdit(conversation.getMucOptions().getActualNick(),
+						new OnValueEdited() {
+
+							@Override
+							public void onValueEdited(String value) {
+								xmppConnectionService.renameInMuc(conversation,
+										value);
+							}
+						});
+			}
+		});
 	}
-	
+
 	@Override
 	public boolean onOptionsItemSelected(MenuItem menuItem) {
-	    switch (menuItem.getItemId()) {
-	    case android.R.id.home:
-	      finish();
-	    }
-	    return super.onOptionsItemSelected(menuItem);
+		switch (menuItem.getItemId()) {
+		case android.R.id.home:
+			finish();
+			break;
+		case R.id.action_edit_subject:
+			if (conversation != null) {
+				quickEdit(conversation.getName(true), new OnValueEdited() {
+
+					@Override
+					public void onValueEdited(String value) {
+						MessagePacket packet = xmppConnectionService
+								.getMessageGenerator().conferenceSubject(
+										conversation, value);
+						xmppConnectionService.sendMessagePacket(
+								conversation.getAccount(), packet);
+					}
+				});
+			}
+			break;
+		}
+		return super.onOptionsItemSelected(menuItem);
 	}
 
 	public String getReadableRole(int role) {
@@ -125,7 +141,7 @@ public class MucDetailsActivity extends XmppActivity {
 			return "";
 		}
 	}
-	
+
 	@Override
 	public boolean onCreateOptionsMenu(Menu menu) {
 		getMenuInflater().inflate(R.menu.muc_details, menu);
@@ -134,8 +150,7 @@ public class MucDetailsActivity extends XmppActivity {
 
 	@Override
 	void onBackendConnected() {
-		SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
-		boolean useSubject = preferences.getBoolean("use_subject_in_muc", true);
+		registerListener();
 		if (getIntent().getAction().equals(ACTION_VIEW_MUC)) {
 			this.uuid = getIntent().getExtras().getString("uuid");
 		}
@@ -146,69 +161,117 @@ public class MucDetailsActivity extends XmppActivity {
 				}
 			}
 			if (this.conversation != null) {
-				mSubject.setText(conversation.getMucOptions().getSubject());
-				setTitle(conversation.getName(useSubject));
-				mFullJid.setText(conversation.getContactJid().split("/")[0]);
-				mYourNick.setText(conversation.getMucOptions().getActualNick());
-				mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
-				if (conversation.getMucOptions().online()) {
-					mMoreDetails.setVisibility(View.VISIBLE);
-					User self = conversation.getMucOptions().getSelf();
-					switch (self.getAffiliation()) {
-					case User.AFFILIATION_ADMIN:
-						mRoleAffiliaton.setText(getReadableRole(self.getRole())
-								+ " (" + getString(R.string.admin) + ")");
-						break;
-					case User.AFFILIATION_OWNER:
-						mRoleAffiliaton.setText(getReadableRole(self.getRole())
-								+ " (" + getString(R.string.owner) + ")");
-						break;
-					default:
-						mRoleAffiliaton
-								.setText(getReadableRole(self.getRole()));
-						break;
+				populateView();
+			}
+		}
+	}
+	
+	@Override
+	protected void onStop() {
+		if (xmppConnectionServiceBound) {
+			xmppConnectionService.removeOnConversationListChangedListener();
+		}
+		super.onStop();
+	}
+	
+	protected void registerListener() {
+		if (xmppConnectionServiceBound) {
+			xmppConnectionService
+					.setOnConversationListChangedListener(this.onConvChanged);
+		xmppConnectionService.setOnRenameListener(new OnRenameListener() {
+
+			@Override
+			public void onRename(final boolean success) {
+				runOnUiThread(new Runnable() {
+
+					@Override
+					public void run() {
+						populateView();
+						if (success) {
+							Toast.makeText(MucDetailsActivity.this,
+									getString(R.string.your_nick_has_been_changed),
+									Toast.LENGTH_SHORT).show();
+						} else {
+							Toast.makeText(MucDetailsActivity.this,
+									getString(R.string.nick_in_use),
+									Toast.LENGTH_SHORT).show();
+						}
 					}
-				}
-				this.users.clear();
-				this.users.addAll(conversation.getMucOptions().getUsers());
-				LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
-				membersView.removeAllViews();
-				for(final User contact : conversation.getMucOptions().getUsers()) {
-					View view = (View) inflater.inflate(R.layout.contact, null);
-					TextView displayName = (TextView) view.findViewById(R.id.contact_display_name);
-					TextView key = (TextView) view.findViewById(R.id.key);
-					displayName.setText(contact.getName());
-					TextView role = (TextView) view.findViewById(R.id.contact_jid);
-					role.setText(getReadableRole(contact.getRole()));
-					if (contact.getPgpKeyId()!=0) {
-						key.setVisibility(View.VISIBLE);
-						key.setOnClickListener(new OnClickListener() {
-							
-							@Override
-							public void onClick(View v) {
-								PgpEngine pgp = xmppConnectionService.getPgpEngine();
-								if (pgp!=null) {
-									PendingIntent intent = pgp.getIntentForKey(conversation.getAccount(), contact.getPgpKeyId());
-									if (intent!=null) {
-										try {
-											startIntentSenderForResult(intent.getIntentSender(), 0, null, 0, 0, 0);
-										} catch (SendIntentException e) {
-											
-										}
-									}
-								}
-							}
-						});
-						key.setText(OpenPgpUtils.convertKeyIdToHex(contact.getPgpKeyId()));
+				});
+			}
+		});
+		}
+	}
+
+	private void populateView() {
+		mYourPhoto.setImageBitmap(UIHelper.getContactPicture(conversation
+				.getMucOptions().getActualNick(), 48, this, false));
+		setTitle(conversation.getName(true));
+		mFullJid.setText(conversation.getContactJid().split("/")[0]);
+		mYourNick.setText(conversation.getMucOptions().getActualNick());
+		mRoleAffiliaton = (TextView) findViewById(R.id.muc_role);
+		if (conversation.getMucOptions().online()) {
+			mMoreDetails.setVisibility(View.VISIBLE);
+			User self = conversation.getMucOptions().getSelf();
+			switch (self.getAffiliation()) {
+			case User.AFFILIATION_ADMIN:
+				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
+						+ getString(R.string.admin) + ")");
+				break;
+			case User.AFFILIATION_OWNER:
+				mRoleAffiliaton.setText(getReadableRole(self.getRole()) + " ("
+						+ getString(R.string.owner) + ")");
+				break;
+			default:
+				mRoleAffiliaton.setText(getReadableRole(self.getRole()));
+				break;
+			}
+		}
+		this.users.clear();
+		this.users.addAll(conversation.getMucOptions().getUsers());
+		LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
+		membersView.removeAllViews();
+		for (final User contact : conversation.getMucOptions().getUsers()) {
+			View view = (View) inflater.inflate(R.layout.contact, null);
+			TextView displayName = (TextView) view
+					.findViewById(R.id.contact_display_name);
+			TextView key = (TextView) view.findViewById(R.id.key);
+			displayName.setText(contact.getName());
+			TextView role = (TextView) view.findViewById(R.id.contact_jid);
+			role.setText(getReadableRole(contact.getRole()));
+			if (contact.getPgpKeyId() != 0) {
+				key.setVisibility(View.VISIBLE);
+				key.setOnClickListener(new OnClickListener() {
+
+					@Override
+					public void onClick(View v) {
+						viewPgpKey(contact);
 					}
-					ImageView imageView = (ImageView) view
-							.findViewById(R.id.contact_photo);
-					imageView.setImageBitmap(UIHelper.getContactPicture(contact.getName(), 48,this.getApplicationContext(), false));
-					membersView.addView(view);
+				});
+				key.setText(OpenPgpUtils.convertKeyIdToHex(contact
+						.getPgpKeyId()));
+			}
+			Bitmap bm = UIHelper.getContactPicture(contact.getName(), 48, this,
+					false);
+			ImageView iv = (ImageView) view.findViewById(R.id.contact_photo);
+			iv.setImageBitmap(bm);
+			membersView.addView(view);
+		}
+	}
+
+	private void viewPgpKey(User user) {
+		PgpEngine pgp = xmppConnectionService.getPgpEngine();
+		if (pgp != null) {
+			PendingIntent intent = pgp.getIntentForKey(
+					conversation.getAccount(), user.getPgpKeyId());
+			if (intent != null) {
+				try {
+					startIntentSenderForResult(intent.getIntentSender(), 0,
+							null, 0, 0, 0);
+				} catch (SendIntentException e) {
+
 				}
 			}
-		} else {
-			Log.d("xmppService","uuid in muc details was null");
 		}
 	}
 }

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

@@ -23,10 +23,10 @@ import android.content.ServiceConnection;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.IBinder;
-import android.util.Log;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
+import android.widget.EditText;
 
 public abstract class XmppActivity extends Activity {
 
@@ -37,6 +37,10 @@ public abstract class XmppActivity extends Activity {
 	public XmppConnectionService xmppConnectionService;
 	public boolean xmppConnectionServiceBound = false;
 	protected boolean handledViewIntent = false;
+	
+	protected interface OnValueEdited {
+		public void onValueEdited(String value);
+	}
 
 	protected ServiceConnection mConnection = new ServiceConnection() {
 
@@ -193,10 +197,7 @@ public abstract class XmppActivity extends Activity {
 						try {
 							startIntentSenderForResult(pi.getIntentSender(),
 									REQUEST_ANNOUNCE_PGP, null, 0, 0, 0);
-						} catch (SendIntentException e) {
-							Log.d("xmppService",
-									"coulnd start intent for pgp anncouncment");
-						}
+						} catch (SendIntentException e) {}
 					}
 
 					@Override
@@ -256,6 +257,26 @@ public abstract class XmppActivity extends Activity {
 		builder.create().show();
 	}
 
+	protected void quickEdit(final String previousValue, final OnValueEdited callback) {
+		AlertDialog.Builder builder = new AlertDialog.Builder(this);
+		View view = (View) getLayoutInflater().inflate(R.layout.quickedit, null);
+		final EditText editor = (EditText) view.findViewById(R.id.editor);
+		editor.setText(previousValue);
+		builder.setView(view);
+		builder.setNegativeButton(R.string.cancel, null);
+		builder.setPositiveButton(R.string.edit, new OnClickListener() {
+			
+			@Override
+			public void onClick(DialogInterface dialog, int which) {
+				String value = editor.getText().toString();
+				if (!previousValue.equals(value) && value.trim().length() > 0) {
+					callback.onValueEdited(value);
+				}
+			}
+		});
+		builder.create().show();
+	}
+	
 	public void selectPresence(final Conversation conversation,
 			final OnPresenceSelected listener) {
 		Contact contact = conversation.getContact();