open/close soft keyboard in quick edit

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java   | 48 
src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java           |  2 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java   |  2 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java                | 20 
src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java | 12 
src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java      | 11 
src/main/res/drawable-hdpi/ic_cancel_black_24dp.png                      |  0 
src/main/res/drawable-mdpi/ic_cancel_black_24dp.png                      |  0 
src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png                     |  0 
src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png                    |  0 
src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png                   |  0 
src/main/res/layout/activity_edit_account.xml                            |  2 
src/main/res/values/defaults.xml                                         |  1 
src/main/res/values/strings.xml                                          |  2 
src/main/res/values/themes.xml                                           |  2 
src/main/res/xml/preferences.xml                                         |  5 
16 files changed, 69 insertions(+), 38 deletions(-)

Detailed changes

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

@@ -13,7 +13,9 @@ import android.os.AsyncTask;
 import android.os.Bundle;
 import android.support.v7.app.AlertDialog;
 import android.support.v7.widget.Toolbar;
+import android.text.Editable;
 import android.text.SpannableStringBuilder;
+import android.text.TextWatcher;
 import android.util.Log;
 import android.view.ContextMenu;
 import android.view.LayoutInflater;
@@ -48,13 +50,14 @@ import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdat
 import eu.siacs.conversations.services.XmppConnectionService.OnMucRosterUpdate;
 import eu.siacs.conversations.ui.util.MenuDoubleTabUtil;
 import eu.siacs.conversations.ui.util.MyLinkify;
+import eu.siacs.conversations.ui.util.SoftKeyboardUtils;
 import eu.siacs.conversations.utils.UIHelper;
 import eu.siacs.conversations.utils.XmppUri;
 import rocks.xmpp.addr.Jid;
 
 import static eu.siacs.conversations.entities.Bookmark.printableValue;
 
-public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed {
+public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed, TextWatcher {
     public static final String ACTION_VIEW_MUC = "view_muc";
 
     private static final float INACTIVE_ALPHA = 0.4684f; //compromise between dark and light theme
@@ -260,6 +263,8 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
             startActivity(intent);
         });
         this.binding.editMucNameButton.setOnClickListener(this::onMucEditButtonClicked);
+        this.binding.mucEditTitle.addTextChangedListener(this);
+        this.binding.mucEditSubject.addTextChangedListener(this);
     }
 
     @Override
@@ -310,7 +315,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
             final MucOptions mucOptions = mConversation.getMucOptions();
             this.binding.mucEditor.setVisibility(View.VISIBLE);
             this.binding.mucDisplay.setVisibility(View.GONE);
-            this.binding.editMucNameButton.setImageResource(getThemeResource(R.attr.icon_save, R.drawable.ic_save_black_24dp));
+            this.binding.editMucNameButton.setImageResource(getThemeResource(R.attr.icon_cancel, R.drawable.ic_cancel_black_24dp));
             final String name = mucOptions.getName();
             this.binding.mucEditTitle.setText("");
             final boolean owner = mucOptions.getSelf().getAffiliation().ranks(MucOptions.Affiliation.OWNER);
@@ -332,11 +337,11 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
             if (!owner) {
                 this.binding.mucEditSubject.requestFocus();
             }
-            this.binding.yourPhoto.setVisibility(View.GONE);
         } else {
             String subject = this.binding.mucEditSubject.isEnabled() ? this.binding.mucEditSubject.getEditableText().toString().trim() : null;
             String name = this.binding.mucEditTitle.isEnabled() ? this.binding.mucEditTitle.getEditableText().toString().trim() : null;
             onMucInfoUpdated(subject, name);
+            SoftKeyboardUtils.hideSoftKeyboard(this);
             hideEditor();
         }
     }
@@ -345,21 +350,18 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
         this.binding.mucEditor.setVisibility(View.GONE);
         this.binding.mucDisplay.setVisibility(View.VISIBLE);
         this.binding.editMucNameButton.setImageResource(getThemeResource(R.attr.icon_edit_body, R.drawable.ic_edit_black_24dp));
-        this.binding.yourPhoto.setVisibility(View.VISIBLE);
     }
 
     private void onMucInfoUpdated(String subject, String name) {
         final MucOptions mucOptions = mConversation.getMucOptions();
-        if (mucOptions.canChangeSubject() && !blankOnNull(mucOptions.getSubject()).equals(subject)) {
-            Log.d(Config.LOGTAG,"subject changed");
+        if (mucOptions.canChangeSubject() && changed(mucOptions.getSubject(), subject)) {
             xmppConnectionService.pushSubjectToConference(mConversation, subject);
         }
-        if (mucOptions.getSelf().getAffiliation().ranks(MucOptions.Affiliation.OWNER) && !blankOnNull(mucOptions.getName()).equals(name)) {
-            Log.d(Config.LOGTAG,"name changed");
+        if (mucOptions.getSelf().getAffiliation().ranks(MucOptions.Affiliation.OWNER) && changed(mucOptions.getName(), name)) {
             Bundle options = new Bundle();
             options.putString("muc#roomconfig_persistentroom", "1");
             options.putString("muc#roomconfig_roomname", name);
-            xmppConnectionService.pushConferenceConfiguration(mConversation, options, null);
+            xmppConnectionService.pushConferenceConfiguration(mConversation, options, this);
         }
     }
 
@@ -367,6 +369,10 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
         return input == null ? "" : input;
     }
 
+    private static boolean changed(String one, String two) {
+        return !blankOnNull(one).equals(blankOnNull(two));
+    }
+
     @Override
     protected String getShareableUri(boolean http) {
         if (mConversation != null) {
@@ -793,6 +799,30 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
         }
     }
 
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
+
+    }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+        final MucOptions mucOptions = mConversation.getMucOptions();
+        if (this.binding.mucEditor.getVisibility() == View.VISIBLE) {
+            boolean subjectChanged = changed(binding.mucEditSubject.getEditableText().toString(), mucOptions.getSubject());
+            boolean nameChanged = changed(binding.mucEditTitle.getEditableText().toString(), mucOptions.getName());
+            if (subjectChanged || nameChanged) {
+                this.binding.editMucNameButton.setImageResource(getThemeResource(R.attr.icon_save, R.drawable.ic_save_black_24dp));
+            } else {
+                this.binding.editMucNameButton.setImageResource(getThemeResource(R.attr.icon_cancel, R.drawable.ic_cancel_black_24dp));
+            }
+        }
+    }
+
     static class AsyncDrawable extends BitmapDrawable {
         private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;
 

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

@@ -199,7 +199,7 @@ public class ShareWithActivity extends XmppActivity implements XmppConnectionSer
 		if (intent == null) {
 			return;
 		}
-		this.mReturnToPrevious = getPreferences().getBoolean("return_to_previous", getResources().getBoolean(R.bool.return_to_previous));
+		this.mReturnToPrevious = getBooleanPreference("return_to_previous", R.bool.return_to_previous);
 		final String type = intent.getType();
 		final String action = intent.getAction();
 		Log.d(Config.LOGTAG, "action: "+action+ ", type:"+type);

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

@@ -984,7 +984,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne
 				jid.setError(getString(R.string.bookmark_already_exists));
 			} else {
 				final Bookmark bookmark = new Bookmark(account, conferenceJid.asBareJid());
-				bookmark.setAutojoin(getPreferences().getBoolean("autojoin", getResources().getBoolean(R.bool.autojoin)));
+				bookmark.setAutojoin(getBooleanPreference("autojoin", R.bool.autojoin));
 				String nick = conferenceJid.getResource();
 				if (nick != null && !nick.isEmpty()) {
 					bookmark.setNick(nick);

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

@@ -72,6 +72,7 @@ import eu.siacs.conversations.services.XmppConnectionService;
 import eu.siacs.conversations.services.XmppConnectionService.XmppConnectionBinder;
 import eu.siacs.conversations.ui.util.MenuDoubleTabUtil;
 import eu.siacs.conversations.ui.util.PresenceSelector;
+import eu.siacs.conversations.ui.util.SoftKeyboardUtils;
 import eu.siacs.conversations.utils.ExceptionHelper;
 import eu.siacs.conversations.utils.ThemeHelper;
 import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
@@ -95,7 +96,6 @@ public abstract class XmppActivity extends ActionBarActivity {
 
 	private boolean isCameraFeatureAvailable = false;
 
-	protected boolean mUseSubject = true;
 	protected int mTheme;
 	protected boolean mUsingEnterKey = false;
 	protected Toast mToast;
@@ -402,7 +402,6 @@ public abstract class XmppActivity extends ActionBarActivity {
 		setTheme(this.mTheme);
 
 		this.mUsingEnterKey = usingEnterKey();
-		mUseSubject = getBooleanPreference("use_subject", R.bool.use_subject);
 	}
 
 	protected boolean isCameraFeatureAvailable() {
@@ -445,7 +444,7 @@ public abstract class XmppActivity extends ActionBarActivity {
 	}
 
 	protected boolean usingEnterKey() {
-		return getPreferences().getBoolean("display_enter_key", getResources().getBoolean(R.bool.display_enter_key));
+		return getBooleanPreference("display_enter_key", R.bool.display_enter_key);
 	}
 
 	protected SharedPreferences getPreferences() {
@@ -456,10 +455,6 @@ public abstract class XmppActivity extends ActionBarActivity {
 		return getPreferences().getBoolean(name, getResources().getBoolean(res));
 	}
 
-	public boolean useSubjectToIdentifyConference() {
-		return mUseSubject;
-	}
-
 	public void switchToConversation(Conversation conversation) {
 		switchToConversation(conversation, null, false);
 	}
@@ -723,6 +718,7 @@ public abstract class XmppActivity extends ActionBarActivity {
 		builder.setView(binding.getRoot());
 		builder.setNegativeButton(R.string.cancel, null);
 		final AlertDialog dialog = builder.create();
+		dialog.setOnShowListener(d -> SoftKeyboardUtils.showKeyboard(binding.inputEditText));
 		dialog.show();
 		View.OnClickListener clickListener = v -> {
 			String value = binding.inputEditText.getText().toString();
@@ -733,9 +729,17 @@ public abstract class XmppActivity extends ActionBarActivity {
 					return;
 				}
 			}
+			SoftKeyboardUtils.hideSoftKeyboard(binding.inputEditText);
 			dialog.dismiss();
 		};
 		dialog.getButton(DialogInterface.BUTTON_POSITIVE).setOnClickListener(clickListener);
+		dialog.getButton(DialogInterface.BUTTON_NEGATIVE).setOnClickListener((v -> {
+			SoftKeyboardUtils.hideSoftKeyboard(binding.inputEditText);
+			dialog.dismiss();
+		}));
+		dialog.setOnDismissListener(dialog1 -> {
+			SoftKeyboardUtils.hideSoftKeyboard(binding.inputEditText);
+        });
 	}
 
 	protected boolean hasStoragePermission(int requestCode) {
@@ -790,7 +794,7 @@ public abstract class XmppActivity extends ActionBarActivity {
 	}
 
 	protected boolean manuallyChangePresence() {
-		return getPreferences().getBoolean(SettingsActivity.MANUALLY_CHANGE_PRESENCE, getResources().getBoolean(R.bool.manually_change_presence));
+		return getBooleanPreference(SettingsActivity.MANUALLY_CHANGE_PRESENCE, R.bool.manually_change_presence);
 	}
 
 	protected String getShareableUri() {

src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java 🔗

@@ -84,15 +84,11 @@ public class ConversationAdapter extends RecyclerView.Adapter<ConversationAdapte
 		if (conversation == null) {
 			return;
 		}
-		if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) {
-			CharSequence name = conversation.getName();
-			if (name instanceof Jid) {
-				viewHolder.name.setText(IrregularUnicodeDetector.style(activity, (Jid) name));
-			} else {
-				viewHolder.name.setText(EmojiWrapper.transform(name));
-			}
+		CharSequence name = conversation.getName();
+		if (name instanceof Jid) {
+			viewHolder.name.setText(IrregularUnicodeDetector.style(activity, (Jid) name));
 		} else {
-			viewHolder.name.setText(conversation.getJid().asBareJid().toString());
+			viewHolder.name.setText(EmojiWrapper.transform(name));
 		}
 
 		viewHolder.frame.setBackgroundColor(Color.get(activity, conversation == ConversationFragment.getConversation(activity) ? R.attr.color_background_secondary : R.attr.color_background_primary));

src/main/java/eu/siacs/conversations/ui/util/SoftKeyboardUtils.java 🔗

@@ -31,6 +31,7 @@ package eu.siacs.conversations.ui.util;
 
 import android.app.Activity;
 import android.content.Context;
+import android.support.annotation.NonNull;
 import android.view.View;
 import android.view.inputmethod.InputMethodManager;
 import android.widget.EditText;
@@ -48,7 +49,15 @@ public class SoftKeyboardUtils {
 		if (view == null) {
 			view = new View(activity);
 		}
-		imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
+		imm.hideSoftInputFromWindow(view.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
+	}
+
+	public static void hideSoftKeyboard(@NonNull  final EditText editText) {
+		InputMethodManager imm = (InputMethodManager) editText.getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
+		if (imm == null) {
+			return;
+		}
+		imm.hideSoftInputFromWindow(editText.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
 	}
 
 	public static void showKeyboard(EditText editText) {

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

@@ -43,7 +43,7 @@
                             android:layout_width="72dp"
                             android:layout_height="72dp"
                             android:layout_alignParentTop="true"
-                            android:layout_marginRight="16dp"
+                            android:layout_marginRight="@dimen/avatar_item_distance"
                             android:contentDescription="@string/account_image_description"
                             app:riv_corner_radius="2dp"/>
 

src/main/res/values/defaults.xml 🔗

@@ -19,7 +19,6 @@
     <integer name="auto_accept_filesize">524288</integer>
     <string name="picture_compression">auto</string>
     <string name="theme">light</string>
-    <bool name="use_subject">true</bool>
     <bool name="use_green_background">true</bool>
     <bool name="send_button_status">false</bool>
     <string name="quick_action">recent</string>

src/main/res/values/strings.xml 🔗

@@ -277,8 +277,6 @@
     <string name="pref_use_indicate_received_summary">Received messages will be marked with a green tick if supported</string>
     <string name="pref_use_send_button_to_indicate_status_summary">Colorize send button to indicate contact status</string>
     <string name="pref_expert_options_other">Other</string>
-    <string name="pref_conference_name">Group chat name</string>
-    <string name="pref_conference_name_summary">Use subject instead of JID to identify group chats</string>
     <string name="pref_autojoin">Automatically join group chats</string>
     <string name="pref_autojoin_summary">Respect the autojoin flag in group chat bookmarks</string>
     <string name="toast_message_omemo_fingerprint">OMEMO fingerprint copied to clipboard!</string>

src/main/res/values/themes.xml 🔗

@@ -62,7 +62,7 @@
 
         <item type="reference" name="icon_add_group">@drawable/ic_group_add_white_24dp</item>
         <item type="reference" name="icon_add_person">@drawable/ic_person_add_white_24dp</item>
-        <item type="reference" name="icon_cancel">@drawable/ic_cancel_white_24dp</item>
+        <item type="reference" name="icon_cancel">@drawable/ic_cancel_black_24dp</item>
         <item type="reference" name="icon_copy">@drawable/ic_content_copy_black_24dp</item>
         <item type="reference" name="icon_discard">@drawable/ic_delete_white_24dp</item>
         <item type="reference" name="icon_download">@drawable/ic_file_download_white_24dp</item>

src/main/res/xml/preferences.xml 🔗

@@ -169,11 +169,6 @@
             android:key="font_size"
             android:summary="@string/pref_font_size_summary"
             android:title="@string/pref_font_size"/>
-        <CheckBoxPreference
-            android:defaultValue="@bool/use_subject"
-            android:key="use_subject"
-            android:summary="@string/pref_conference_name_summary"
-            android:title="@string/pref_conference_name"/>
         <CheckBoxPreference
             android:defaultValue="@bool/send_button_status"
             android:key="send_button_status"