code cleanup for group chat user context menu
This commit is contained in:
		
							parent
							
								
									ffc5d47091
								
							
						
					
					
						commit
						516b6dcc1f
					
				| @ -564,7 +564,6 @@ public class MucOptions { | ||||
| 		if (user == null) { | ||||
| 			user = new User(this, null); | ||||
| 			user.setRealJid(jid); | ||||
| 			user.setRole("visitor"); | ||||
| 		} | ||||
| 		return user; | ||||
| 	} | ||||
|  | ||||
| @ -418,7 +418,6 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers | ||||
|         if (tag instanceof User) { | ||||
|             getMenuInflater().inflate(R.menu.muc_details_context, menu); | ||||
|             final User user = (User) tag; | ||||
|             final User self = mConversation.getMucOptions().getSelf(); | ||||
|             this.mSelectedUser = user; | ||||
|             String name; | ||||
|             final Contact contact = user.getContact(); | ||||
| @ -430,26 +429,19 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers | ||||
|                 name = user.getName(); | ||||
|             } | ||||
|             menu.setHeaderTitle(name); | ||||
|             MucDetailsContextMenuHelper.configureMucDetailsContextMenu(menu, mConversation, user, mAdvancedMode); | ||||
|             MucDetailsContextMenuHelper.configureMucDetailsContextMenu(this, menu, mConversation, user); | ||||
|         } | ||||
|         super.onCreateContextMenu(menu, v, menuInfo); | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public boolean onContextItemSelected(MenuItem item) { | ||||
|         if (!MucDetailsContextMenuHelper.onContextItemSelected(item, mSelectedUser, mConversation, this, this, this)) { | ||||
|         if (!MucDetailsContextMenuHelper.onContextItemSelected(item, mSelectedUser, mConversation, this)) { | ||||
|             return super.onContextItemSelected(item); | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     private void removeFromRoom(final User user) { | ||||
|         MucDetailsContextMenuHelper.removeFromRoom(user, mConversation, this, this, this); | ||||
|     } | ||||
| 
 | ||||
|     protected void startConversation(User user) { | ||||
|         MucDetailsContextMenuHelper.startConversation(user, this.mConversation, this); | ||||
|     } | ||||
| 
 | ||||
|     protected void saveAsBookmark() { | ||||
|         xmppConnectionService.saveConversationAsBookmark(mConversation, mConversation.getMucOptions().getName()); | ||||
|  | ||||
| @ -3,6 +3,7 @@ package eu.siacs.conversations.ui; | ||||
| import android.Manifest; | ||||
| import android.annotation.SuppressLint; | ||||
| import android.app.Activity; | ||||
| import android.app.FragmentManager; | ||||
| import android.content.SharedPreferences; | ||||
| import android.content.pm.PackageManager; | ||||
| import android.databinding.DataBindingUtil; | ||||
| @ -485,6 +486,17 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static ConversationFragment get(Activity activity) { | ||||
| 		FragmentManager fragmentManager = activity.getFragmentManager(); | ||||
| 		Fragment fragment = fragmentManager.findFragmentById(R.id.main_fragment); | ||||
| 		if (fragment != null && fragment instanceof ConversationFragment) { | ||||
| 			return (ConversationFragment) fragment; | ||||
| 		} else { | ||||
| 			fragment = fragmentManager.findFragmentById(R.id.secondary_fragment); | ||||
| 			return fragment != null && fragment instanceof ConversationFragment ? (ConversationFragment) fragment : null; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	public static Conversation getConversationReliable(Activity activity) { | ||||
| 		final Conversation conversation = getConversation(activity, R.id.secondary_fragment); | ||||
| 		if (conversation != null) { | ||||
| @ -986,21 +998,13 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke | ||||
| 					Jid tcp = message.getTrueCounterpart(); | ||||
| 					Jid cp = message.getCounterpart(); | ||||
| 					if (cp != null && !cp.isBareJid()) { | ||||
| 						User userByRealJid = conversation.getMucOptions().findOrCreateUserByRealJid(tcp); | ||||
| 						User userByRealJid = tcp != null ? conversation.getMucOptions().findOrCreateUserByRealJid(tcp) : null; | ||||
| 						final User user = userByRealJid != null ? userByRealJid : conversation.getMucOptions().findUserByFullJid(cp); | ||||
| 						final PopupMenu popupMenu = new PopupMenu(getActivity(), v); | ||||
| 						popupMenu.inflate(R.menu.muc_details_context); | ||||
| 						final Menu menu = popupMenu.getMenu(); | ||||
| 						final boolean advancedMode = activity.getPreferences().getBoolean("advanced_muc_mode", false); | ||||
| 						MucDetailsContextMenuHelper.configureMucDetailsContextMenu(menu, conversation, user, advancedMode); | ||||
| 						final MucOptions mucOptions = ((Conversation) message.getConversation()).getMucOptions(); | ||||
| 						popupMenu.setOnMenuItemClickListener(menuItem -> { | ||||
| 							if (menuItem.getItemId() == R.id.send_private_message) { | ||||
| 								privateMessageWith(cp); | ||||
| 								return true; | ||||
| 							} | ||||
| 							return MucDetailsContextMenuHelper.onContextItemSelected(menuItem, user, conversation, activity, activity, activity); | ||||
| 						}); | ||||
| 						MucDetailsContextMenuHelper.configureMucDetailsContextMenu(activity, menu, conversation, user); | ||||
| 						popupMenu.setOnMenuItemClickListener(menuItem -> MucDetailsContextMenuHelper.onContextItemSelected(menuItem, user, conversation, activity)); | ||||
| 						popupMenu.show(); | ||||
| 					} | ||||
| 				} | ||||
| @ -1673,7 +1677,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke | ||||
| 		conversation.getAccount().getPgpDecryptionService().decrypt(message, false); | ||||
| 	} | ||||
| 
 | ||||
| 	private void privateMessageWith(final Jid counterpart) { | ||||
| 	public void privateMessageWith(final Jid counterpart) { | ||||
| 		if (conversation.setOutgoingChatState(Config.DEFAULT_CHATSTATE)) { | ||||
| 			activity.xmppConnectionService.sendChatState(conversation); | ||||
| 		} | ||||
|  | ||||
| @ -1,9 +1,14 @@ | ||||
| package eu.siacs.conversations.ui.util; | ||||
| 
 | ||||
| import android.app.Activity; | ||||
| import android.content.SharedPreferences; | ||||
| import android.preference.PreferenceManager; | ||||
| import android.support.v7.app.AlertDialog; | ||||
| import android.text.SpannableString; | ||||
| import android.text.Spanned; | ||||
| import android.text.style.TypefaceSpan; | ||||
| import android.view.Menu; | ||||
| import android.view.MenuItem; | ||||
| import android.widget.Toast; | ||||
| 
 | ||||
| import eu.siacs.conversations.Config; | ||||
| import eu.siacs.conversations.entities.Contact; | ||||
| @ -12,67 +17,68 @@ import eu.siacs.conversations.entities.MucOptions; | ||||
| import eu.siacs.conversations.entities.MucOptions.User; | ||||
| import eu.siacs.conversations.R; | ||||
| import eu.siacs.conversations.services.XmppConnectionService; | ||||
| import eu.siacs.conversations.ui.ConferenceDetailsActivity; | ||||
| import eu.siacs.conversations.ui.ConversationFragment; | ||||
| import eu.siacs.conversations.ui.ConversationsActivity; | ||||
| import eu.siacs.conversations.ui.XmppActivity; | ||||
| import rocks.xmpp.addr.Jid; | ||||
| 
 | ||||
| 
 | ||||
| public final class MucDetailsContextMenuHelper { | ||||
|     public static void configureMucDetailsContextMenu(Menu menu, Conversation conversation, User user, boolean advancedMode) { | ||||
|         if (user != null) { | ||||
|             if (user.getRealJid() != null) { | ||||
|                 MenuItem showContactDetails = menu.findItem(R.id.action_contact_details); | ||||
|                 MenuItem startConversation = menu.findItem(R.id.start_conversation); | ||||
|                 MenuItem giveMembership = menu.findItem(R.id.give_membership); | ||||
|                 MenuItem removeMembership = menu.findItem(R.id.remove_membership); | ||||
|                 MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); | ||||
|                 MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); | ||||
|                 MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); | ||||
|                 MenuItem banFromConference = menu.findItem(R.id.ban_from_conference); | ||||
|                 MenuItem invite = menu.findItem(R.id.invite); | ||||
|                 startConversation.setVisible(true); | ||||
|                 final Contact contact = user.getContact(); | ||||
|                 final User self = conversation.getMucOptions().getSelf(); | ||||
|                 if (contact != null && contact.showInRoster()) { | ||||
|                     showContactDetails.setVisible(!contact.isSelf()); | ||||
|                 } | ||||
|                 if (user.getRole() == MucOptions.Role.NONE) { | ||||
|                     invite.setVisible(true); | ||||
|                 } | ||||
|                 if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && | ||||
|                         self.getAffiliation().outranks(user.getAffiliation())) { | ||||
|                     if (advancedMode) { | ||||
|                         if (user.getAffiliation() == MucOptions.Affiliation.NONE) { | ||||
|                             giveMembership.setVisible(true); | ||||
|                         } else { | ||||
|                             removeMembership.setVisible(true); | ||||
|                         } | ||||
|                         if (!Config.DISABLE_BAN) { | ||||
|                             banFromConference.setVisible(true); | ||||
|                         } | ||||
|     public static void configureMucDetailsContextMenu(Activity activity, Menu menu, Conversation conversation, User user) { | ||||
|         final boolean advancedMode = PreferenceManager.getDefaultSharedPreferences(activity).getBoolean("advanced_muc_mode", false); | ||||
|         if (user != null && user.getRealJid() != null) { | ||||
|             MenuItem showContactDetails = menu.findItem(R.id.action_contact_details); | ||||
|             MenuItem startConversation = menu.findItem(R.id.start_conversation); | ||||
|             MenuItem giveMembership = menu.findItem(R.id.give_membership); | ||||
|             MenuItem removeMembership = menu.findItem(R.id.remove_membership); | ||||
|             MenuItem giveAdminPrivileges = menu.findItem(R.id.give_admin_privileges); | ||||
|             MenuItem removeAdminPrivileges = menu.findItem(R.id.remove_admin_privileges); | ||||
|             MenuItem removeFromRoom = menu.findItem(R.id.remove_from_room); | ||||
|             MenuItem banFromConference = menu.findItem(R.id.ban_from_conference); | ||||
|             MenuItem invite = menu.findItem(R.id.invite); | ||||
|             startConversation.setVisible(true); | ||||
|             final Contact contact = user.getContact(); | ||||
|             final User self = conversation.getMucOptions().getSelf(); | ||||
|             if (contact != null && contact.showInRoster()) { | ||||
|                 showContactDetails.setVisible(!contact.isSelf()); | ||||
|             } | ||||
|             if (activity instanceof ConferenceDetailsActivity && user.getRole() == MucOptions.Role.NONE) { | ||||
|                 invite.setVisible(true); | ||||
|             } | ||||
|             if (self.getAffiliation().ranks(MucOptions.Affiliation.ADMIN) && | ||||
|                     self.getAffiliation().outranks(user.getAffiliation())) { | ||||
|                 if (advancedMode) { | ||||
|                     if (user.getAffiliation() == MucOptions.Affiliation.NONE) { | ||||
|                         giveMembership.setVisible(true); | ||||
|                     } else { | ||||
|                         if (!Config.DISABLE_BAN || conversation.getMucOptions().membersOnly()) { | ||||
|                             removeFromRoom.setVisible(true); | ||||
|                         } | ||||
|                         removeMembership.setVisible(true); | ||||
|                     } | ||||
|                     if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { | ||||
|                         giveAdminPrivileges.setVisible(true); | ||||
|                     } else { | ||||
|                         removeAdminPrivileges.setVisible(true); | ||||
|                     if (!Config.DISABLE_BAN) { | ||||
|                         banFromConference.setVisible(true); | ||||
|                     } | ||||
|                 } else { | ||||
|                     if (!Config.DISABLE_BAN || conversation.getMucOptions().membersOnly()) { | ||||
|                         removeFromRoom.setVisible(true); | ||||
|                     } | ||||
|                 } | ||||
|             } else { | ||||
|                 MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message); | ||||
|                 sendPrivateMessage.setVisible(true); | ||||
|                 sendPrivateMessage.setEnabled(user.getRole().ranks(MucOptions.Role.VISITOR)); | ||||
|                 if (user.getAffiliation() != MucOptions.Affiliation.ADMIN) { | ||||
|                     giveAdminPrivileges.setVisible(true); | ||||
|                 } else { | ||||
|                     removeAdminPrivileges.setVisible(true); | ||||
|                 } | ||||
|             } | ||||
|         } else { | ||||
|             final MucOptions mucOptions = conversation.getMucOptions(); | ||||
|             MenuItem sendPrivateMessage = menu.findItem(R.id.send_private_message); | ||||
|             sendPrivateMessage.setVisible(true); | ||||
|             sendPrivateMessage.setEnabled(false); | ||||
|             sendPrivateMessage.setEnabled(user != null && mucOptions.allowPm() && user.getRole().ranks(MucOptions.Role.VISITOR)); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public static boolean onContextItemSelected(MenuItem item, User user, Conversation conversation, XmppActivity activity, XmppConnectionService.OnAffiliationChanged onAffiliationChanged, XmppConnectionService.OnRoleChanged onRoleChanged) { | ||||
|     public static boolean onContextItemSelected(MenuItem item, User user, Conversation conversation, XmppActivity activity) { | ||||
|         final XmppConnectionService.OnAffiliationChanged onAffiliationChanged = activity instanceof XmppConnectionService.OnAffiliationChanged ? (XmppConnectionService.OnAffiliationChanged) activity : null; | ||||
|         final XmppConnectionService.OnRoleChanged onRoleChanged = activity instanceof XmppConnectionService.OnRoleChanged ? (XmppConnectionService.OnRoleChanged) activity : null; | ||||
|         Jid jid = user.getRealJid(); | ||||
|         switch (item.getItemId()) { | ||||
|             case R.id.action_contact_details: | ||||
| @ -106,11 +112,14 @@ public final class MucDetailsContextMenuHelper { | ||||
|                 } | ||||
|                 return true; | ||||
|             case R.id.send_private_message: | ||||
|                 if (conversation.getMucOptions().allowPm()) { | ||||
|                     activity.privateMsgInMuc(conversation, user.getName()); | ||||
|                 } else { | ||||
|                     Toast.makeText(activity, R.string.private_messages_are_disabled, Toast.LENGTH_SHORT).show(); | ||||
|                 if (activity instanceof ConversationsActivity) { | ||||
|                     ConversationFragment conversationFragment = ConversationFragment.get(activity); | ||||
|                     if (conversationFragment != null) { | ||||
|                         conversationFragment.privateMessageWith(user.getFullJid()); | ||||
|                         return true; | ||||
|                     } | ||||
|                 } | ||||
|                 activity.privateMsgInMuc(conversation, user.getName()); | ||||
|                 return true; | ||||
|             case R.id.invite: | ||||
|                 activity.xmppConnectionService.directInvite(conversation, jid); | ||||
| @ -129,7 +138,13 @@ public final class MucDetailsContextMenuHelper { | ||||
|         } else { | ||||
|             AlertDialog.Builder builder = new AlertDialog.Builder(activity); | ||||
|             builder.setTitle(R.string.ban_from_conference); | ||||
|             builder.setMessage(activity.getString(R.string.removing_from_public_conference, user.getName())); | ||||
|             String jid = user.getRealJid().asBareJid().toString(); | ||||
|             SpannableString message = new SpannableString(activity.getString(R.string.removing_from_public_conference, jid)); | ||||
|             int start = message.toString().indexOf(jid); | ||||
|             if (start >= 0) { | ||||
|                 message.setSpan(new TypefaceSpan("monospace"), start, start + jid.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); | ||||
|             } | ||||
|             builder.setMessage(message); | ||||
|             builder.setNegativeButton(R.string.cancel, null); | ||||
|             builder.setPositiveButton(R.string.ban_now, (dialog, which) -> { | ||||
|                 activity.xmppConnectionService.changeAffiliationInConference(conversation, user.getRealJid(), MucOptions.Affiliation.OUTCAST, onAffiliationChanged); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Daniel Gultsch
						Daniel Gultsch