always allow access to contact details. provide add button in contact details

iNPUTmice created

Change summary

src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java | 111 
src/main/java/eu/siacs/conversations/ui/ConversationActivity.java   |  22 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java   |   9 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java           |  12 
src/main/res/layout/activity_contact_details.xml                    |   7 
src/main/res/menu/conversations.xml                                 |  12 
6 files changed, 89 insertions(+), 84 deletions(-)

Detailed changes

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

@@ -18,6 +18,7 @@ import android.view.Menu;
 import android.view.MenuItem;
 import android.view.View;
 import android.view.View.OnClickListener;
+import android.widget.Button;
 import android.widget.CheckBox;
 import android.widget.CompoundButton;
 import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -40,6 +41,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate;
 import eu.siacs.conversations.utils.CryptoHelper;
 import eu.siacs.conversations.utils.UIHelper;
 import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
+import eu.siacs.conversations.xmpp.XmppConnection;
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
 
@@ -51,9 +53,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 
 		@Override
 		public void onClick(DialogInterface dialog, int which) {
-			ContactDetailsActivity.this.xmppConnectionService
-				.deleteContactOnServer(contact);
-			ContactDetailsActivity.this.finish();
+			xmppConnectionService.deleteContactOnServer(contact);
 		}
 	};
 	private OnCheckedChangeListener mOnSendCheckedChange = new OnCheckedChangeListener() {
@@ -102,6 +102,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 	private TextView lastseen;
 	private CheckBox send;
 	private CheckBox receive;
+	private Button addContactButton;
 	private QuickContactBadge badge;
 	private LinearLayout keys;
 	private LinearLayout tags;
@@ -142,6 +143,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 
 			@Override
 			public void run() {
+				invalidateOptionsMenu();
 				populateView();
 			}
 		});
@@ -153,6 +155,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 
 			@Override
 			public void run() {
+				invalidateOptionsMenu();
 				populateView();
 			}
 		});
@@ -188,6 +191,13 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 		send = (CheckBox) findViewById(R.id.details_send_presence);
 		receive = (CheckBox) findViewById(R.id.details_receive_presence);
 		badge = (QuickContactBadge) findViewById(R.id.details_contact_badge);
+		addContactButton = (Button) findViewById(R.id.add_contact_button);
+		addContactButton.setOnClickListener(new OnClickListener() {
+			@Override
+			public void onClick(View view) {
+				showAddToRosterDialog(contact);
+			}
+		});
 		keys = (LinearLayout) findViewById(R.id.details_contact_keys);
 		tags = (LinearLayout) findViewById(R.id.tags);
 		if (getActionBar() != null) {
@@ -250,58 +260,83 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd
 	@Override
 	public boolean onCreateOptionsMenu(final Menu menu) {
 		getMenuInflater().inflate(R.menu.contact_details, menu);
-		if (this.contact.isBlocked()) {
-			menu.findItem(R.id.action_block).setVisible(false);
+		MenuItem block = menu.findItem(R.id.action_block);
+		MenuItem unblock = menu.findItem(R.id.action_unblock);
+		MenuItem edit = menu.findItem(R.id.action_edit_contact);
+		MenuItem delete = menu.findItem(R.id.action_delete_contact);
+		final XmppConnection connection = contact.getAccount().getXmppConnection();
+		if (connection != null && connection.getFeatures().blocking()) {
+			if (this.contact.isBlocked()) {
+				menu.findItem(R.id.action_block).setVisible(false);
+			} else {
+				menu.findItem(R.id.action_unblock).setVisible(false);
+			}
 		} else {
 			menu.findItem(R.id.action_unblock).setVisible(false);
+			menu.findItem(R.id.action_block).setVisible(false);
+		}
+		if (!contact.showInRoster()) {
+			edit.setVisible(false);
+			delete.setVisible(false);
 		}
-
 		return true;
 	}
 
 	private void populateView() {
-		send.setOnCheckedChangeListener(null);
-		receive.setOnCheckedChangeListener(null);
 		setTitle(contact.getDisplayName());
-		if (contact.getOption(Contact.Options.FROM)) {
-			send.setText(R.string.send_presence_updates);
-			send.setChecked(true);
-		} else if (contact
-				.getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
-			send.setChecked(false);
-			send.setText(R.string.send_presence_updates);
-		} else {
-			send.setText(R.string.preemptively_grant);
-			if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
+		if (contact.showInRoster()) {
+			send.setVisibility(View.VISIBLE);
+			receive.setVisibility(View.VISIBLE);
+			addContactButton.setVisibility(View.GONE);
+			send.setOnCheckedChangeListener(null);
+			receive.setOnCheckedChangeListener(null);
+
+			if (contact.getOption(Contact.Options.FROM)) {
+				send.setText(R.string.send_presence_updates);
 				send.setChecked(true);
-			} else {
+			} else if (contact.getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) {
 				send.setChecked(false);
+				send.setText(R.string.send_presence_updates);
+			} else {
+				send.setText(R.string.preemptively_grant);
+				if (contact.getOption(Contact.Options.PREEMPTIVE_GRANT)) {
+					send.setChecked(true);
+				} else {
+					send.setChecked(false);
+				}
 			}
-		}
-		if (contact.getOption(Contact.Options.TO)) {
-			receive.setText(R.string.receive_presence_updates);
-			receive.setChecked(true);
-		} else {
-			receive.setText(R.string.ask_for_presence_updates);
-			if (contact.getOption(Contact.Options.ASKING)) {
+			if (contact.getOption(Contact.Options.TO)) {
+				receive.setText(R.string.receive_presence_updates);
 				receive.setChecked(true);
 			} else {
-				receive.setChecked(false);
+				receive.setText(R.string.ask_for_presence_updates);
+				if (contact.getOption(Contact.Options.ASKING)) {
+					receive.setChecked(true);
+				} else {
+					receive.setChecked(false);
+				}
 			}
-		}
-		if (contact.getAccount().getStatus() == Account.State.ONLINE) {
-			receive.setEnabled(true);
-			send.setEnabled(true);
+			if (contact.getAccount().isOnlineAndConnected()) {
+				receive.setEnabled(true);
+				send.setEnabled(true);
+			} else {
+				receive.setEnabled(false);
+				send.setEnabled(false);
+			}
+
+			send.setOnCheckedChangeListener(this.mOnSendCheckedChange);
+			receive.setOnCheckedChangeListener(this.mOnReceiveCheckedChange);
 		} else {
-			receive.setEnabled(false);
-			send.setEnabled(false);
+			addContactButton.setVisibility(View.VISIBLE);
+			send.setVisibility(View.GONE);
+			receive.setVisibility(View.GONE);
 		}
 
-		send.setOnCheckedChangeListener(this.mOnSendCheckedChange);
-		receive.setOnCheckedChangeListener(this.mOnReceiveCheckedChange);
-
-		lastseen.setText(UIHelper.lastseen(getApplicationContext(),
-					contact.lastseen.time));
+		if (contact.isBlocked() && !this.showDynamicTags) {
+			lastseen.setText(R.string.contact_blocked);
+		} else {
+			lastseen.setText(UIHelper.lastseen(getApplicationContext(), contact.lastseen.time));
+		}
 
 		if (contact.getPresences().size() > 1) {
 			contactJidTv.setText(contact.getJid() + " ("

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

@@ -280,8 +280,6 @@ public class ConversationActivity extends XmppActivity
 		final MenuItem menuInviteContact = menu.findItem(R.id.action_invite);
 		final MenuItem menuMute = menu.findItem(R.id.action_mute);
 		final MenuItem menuUnmute = menu.findItem(R.id.action_unmute);
-		final MenuItem menuBlock = menu.findItem(R.id.action_block);
-		final MenuItem menuUnblock = menu.findItem(R.id.action_unblock);
 
 		if (isConversationsOverviewVisable() && isConversationsOverviewHideable()) {
 			menuArchive.setVisible(false);
@@ -293,8 +291,6 @@ public class ConversationActivity extends XmppActivity
 			menuClearHistory.setVisible(false);
 			menuMute.setVisible(false);
 			menuUnmute.setVisible(false);
-			menuBlock.setVisible(false);
-			menuUnblock.setVisible(false);
 		} else {
 			menuAdd.setVisible(!isConversationsOverviewHideable());
 			if (this.getSelectedConversation() != null) {
@@ -305,21 +301,10 @@ public class ConversationActivity extends XmppActivity
 				if (this.getSelectedConversation().getMode() == Conversation.MODE_MULTI) {
 					menuContactDetails.setVisible(false);
 					menuAttach.setVisible(false);
-					menuBlock.setVisible(false);
-					menuUnblock.setVisible(false);
 					menuInviteContact.setVisible(getSelectedConversation().getMucOptions().canInvite());
 				} else {
 					menuMucDetails.setVisible(false);
-					if (this.getSelectedConversation().isBlocked()) {
-						menuBlock.setVisible(false);
-					} else {
-						menuUnblock.setVisible(false);
-					}
 					final Account account = this.getSelectedConversation().getAccount();
-					if (!(account.isOnlineAndConnected() && account.getXmppConnection().getFeatures().blocking())) {
-						menuBlock.setVisible(false);
-						menuUnblock.setVisible(false);
-					}
 				}
 				if (this.getSelectedConversation().isMuted()) {
 					menuMute.setVisible(false);
@@ -445,12 +430,7 @@ public class ConversationActivity extends XmppActivity
 					this.endConversation(getSelectedConversation());
 					break;
 				case R.id.action_contact_details:
-					Contact contact = this.getSelectedConversation().getContact();
-					if (contact.showInRoster()) {
-						switchToContactDetails(contact);
-					} else {
-						showAddToRosterDialog(getSelectedConversation());
-					}
+					switchToContactDetails(getSelectedConversation().getContact());
 					break;
 				case R.id.action_muc_details:
 					Intent intent = new Intent(this,

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

@@ -362,14 +362,7 @@ public class ConversationFragment extends Fragment {
 							}
 						}
 					} else {
-						Contact contact = message.getConversation()
-							.getContact();
-						if (contact.showInRoster()) {
-							activity.switchToContactDetails(contact);
-						} else {
-							activity.showAddToRosterDialog(message
-									.getConversation());
-						}
+						activity.switchToContactDetails(message.getContact());
 					}
 				} else {
 					Account account = message.getConversation().getAccount();

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

@@ -438,9 +438,12 @@ public abstract class XmppActivity extends Activity {
 	}
 
 	protected void showAddToRosterDialog(final Conversation conversation) {
-		final Jid jid = conversation.getJid();
+		showAddToRosterDialog(conversation.getContact());
+	}
+
+	protected void showAddToRosterDialog(final Contact contact) {
 		AlertDialog.Builder builder = new AlertDialog.Builder(this);
-		builder.setTitle(jid.toString());
+		builder.setTitle(contact.getJid().toString());
 		builder.setMessage(getString(R.string.not_in_roster));
 		builder.setNegativeButton(getString(R.string.cancel), null);
 		builder.setPositiveButton(getString(R.string.add_contact),
@@ -448,11 +451,10 @@ public abstract class XmppActivity extends Activity {
 
 					@Override
 					public void onClick(DialogInterface dialog, int which) {
-						final Jid jid = conversation.getJid();
-						Account account = conversation.getAccount();
+						final Jid jid = contact.getJid();
+						Account account = contact.getAccount();
 						Contact contact = account.getRoster().getContact(jid);
 						xmppConnectionService.createContact(contact);
-						switchToContactDetails(contact);
 					}
 				});
 		builder.create().show();

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

@@ -65,6 +65,13 @@
                         android:textSize="?attr/TextSizeBody" />
                 </LinearLayout>
 
+                <Button
+                    android:id="@+id/add_contact_button"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="8dp"
+                    android:text="@string/add_contact"/>
+
                 <CheckBox
                     android:id="@+id/details_send_presence"
                     android:layout_width="wrap_content"

src/main/res/menu/conversations.xml 🔗

@@ -56,18 +56,6 @@
         android:showAsAction="never"
         android:title="@string/enable_notifications"/>
 
-    <item
-        android:id="@+id/action_block"
-        android:orderInCategory="72"
-        android:showAsAction="never"
-        android:title="@string/action_block_contact"/>
-
-    <item
-        android:id="@+id/action_unblock"
-        android:orderInCategory="73"
-        android:showAsAction="never"
-        android:title="@string/action_unblock_contact"/>
-
     <item
         android:id="@+id/action_accounts"
         android:orderInCategory="90"