changed some of the jid entering dialogs to textinputlayout

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java            | 64 
src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java |  5 
src/main/java/eu/siacs/conversations/ui/util/DelayedHintHelper.java    | 48 
src/main/res/layout/activity_change_password.xml                       | 10 
src/main/res/layout/activity_edit_account.xml                          | 24 
src/main/res/layout/create_conference_dialog.xml                       | 44 
src/main/res/layout/enter_jid_dialog.xml                               | 48 
src/main/res/layout/join_conference_dialog.xml                         | 38 
src/main/res/layout/simple_list_item.xml                               |  3 
src/main/res/values/dimens.xml                                         |  3 
src/main/res/values/styles.xml                                         |  5 
11 files changed, 151 insertions(+), 141 deletions(-)

Detailed changes

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

@@ -15,6 +15,7 @@ import java.util.List;
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
+import eu.siacs.conversations.ui.util.DelayedHintHelper;
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
 
@@ -47,10 +48,8 @@ public class EnterJidDialog {
 		AlertDialog.Builder builder = new AlertDialog.Builder(context);
 		builder.setTitle(title);
 		View dialogView = LayoutInflater.from(context).inflate(R.layout.enter_jid_dialog, null);
-		final TextView jabberIdDesc = (TextView) dialogView.findViewById(R.id.jabber_id);
-		jabberIdDesc.setText(R.string.account_settings_jabber_id);
-		final Spinner spinner = (Spinner) dialogView.findViewById(R.id.account);
-		final AutoCompleteTextView jid = (AutoCompleteTextView) dialogView.findViewById(R.id.jid);
+		final Spinner spinner = dialogView.findViewById(R.id.account);
+		final AutoCompleteTextView jid = dialogView.findViewById(R.id.jid);
 		jid.setAdapter(new KnownHostsAdapter(context, R.layout.simple_list_item, knownHosts));
 		if (prefilledJid != null) {
 			jid.append(prefilledJid);
@@ -62,7 +61,7 @@ public class EnterJidDialog {
 			}
 		}
 
-		jid.setHint(R.string.account_settings_example_jabber_id);
+		DelayedHintHelper.setHint(R.string.account_settings_example_jabber_id,jid);
 
 		if (account == null) {
 			StartConversationActivity.populateAccountSpinner(context, activatedAccounts, spinner);
@@ -80,38 +79,35 @@ public class EnterJidDialog {
 		builder.setPositiveButton(positiveButton, null);
 		this.dialog = builder.create();
 
-		this.dialogOnClick = new View.OnClickListener() {
-			@Override
-			public void onClick(final View v) {
-				final Jid accountJid;
-				if (!spinner.isEnabled() && account == null) {
-					return;
-				}
-				try {
-					if (Config.DOMAIN_LOCK != null) {
-						accountJid = Jid.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null);
-					} else {
-						accountJid = Jid.fromString((String) spinner.getSelectedItem());
-					}
-				} catch (final InvalidJidException e) {
-					return;
-				}
-				final Jid contactJid;
-				try {
-					contactJid = Jid.fromString(jid.getText().toString());
-				} catch (final InvalidJidException e) {
-					jid.setError(context.getString(R.string.invalid_jid));
-					return;
+		this.dialogOnClick = v -> {
+			final Jid accountJid;
+			if (!spinner.isEnabled() && account == null) {
+				return;
+			}
+			try {
+				if (Config.DOMAIN_LOCK != null) {
+					accountJid = Jid.fromParts((String) spinner.getSelectedItem(), Config.DOMAIN_LOCK, null);
+				} else {
+					accountJid = Jid.fromString((String) spinner.getSelectedItem());
 				}
+			} catch (final InvalidJidException e) {
+				return;
+			}
+			final Jid contactJid;
+			try {
+				contactJid = Jid.fromString(jid.getText().toString());
+			} catch (final InvalidJidException e) {
+				jid.setError(context.getString(R.string.invalid_jid));
+				return;
+			}
 
-				if(listener != null) {
-					try {
-						if(listener.onEnterJidDialogPositive(accountJid, contactJid)) {
-							dialog.dismiss();
-						}
-					} catch(JidError error) {
-						jid.setError(error.toString());
+			if(listener != null) {
+				try {
+					if(listener.onEnterJidDialogPositive(accountJid, contactJid)) {
+						dialog.dismiss();
 					}
+				} catch(JidError error) {
+					jid.setError(error.toString());
 				}
 			}
 		};

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

@@ -76,6 +76,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate;
 import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
 import eu.siacs.conversations.ui.adapter.ListItemAdapter;
 import eu.siacs.conversations.ui.service.EmojiService;
+import eu.siacs.conversations.ui.util.DelayedHintHelper;
 import eu.siacs.conversations.utils.XmppUri;
 import eu.siacs.conversations.xmpp.OnUpdateBlocklist;
 import eu.siacs.conversations.xmpp.XmppConnection;
@@ -493,9 +494,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
 		final View dialogView = getLayoutInflater().inflate(R.layout.join_conference_dialog, null);
 		final Spinner spinner = dialogView.findViewById(R.id.account);
 		final AutoCompleteTextView jid = dialogView.findViewById(R.id.jid);
-		final TextView jabberIdDesc = dialogView.findViewById(R.id.jabber_id);
-		jabberIdDesc.setText(R.string.conference_address);
-		jid.setHint(R.string.conference_address_example);
+		DelayedHintHelper.setHint(R.string.conference_address_example,jid);
 		jid.setAdapter(new KnownHostsAdapter(this, R.layout.simple_list_item, mKnownConferenceHosts));
 		if (prefilledJid != null) {
 			jid.append(prefilledJid);

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

@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2018, Daniel Gultsch All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation and/or
+ * other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its contributors
+ * may be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
+ * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package eu.siacs.conversations.ui.util;
+
+import android.os.Handler;
+import android.support.annotation.StringRes;
+import android.widget.EditText;
+
+public class DelayedHintHelper {
+
+	public static void setHint(@StringRes final int res, EditText editText) {
+		editText.setOnFocusChangeListener((v, hasFocus) -> {
+			if (hasFocus) {
+				new Handler().postDelayed(() -> editText.setHint(res), 200);
+			} else {
+				editText.setHint(null);
+			}
+		});
+	}
+
+}

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

@@ -39,10 +39,7 @@
                         android:layout_height="wrap_content"
                         android:layout_alignParentTop="true"
                         android:hint="@string/current_password"
-                        android:inputType="textPassword"
-                        android:textColor="?attr/color_text_primary"
-                        android:textColorHint="?attr/color_text_secondary"
-                        android:textSize="?attr/TextSizeBody"/>
+                        android:inputType="textPassword"/>
                 </android.support.design.widget.TextInputLayout>
 
                 <android.support.design.widget.TextInputLayout
@@ -59,10 +56,7 @@
                         android:layout_height="wrap_content"
                         android:layout_alignParentTop="true"
                         android:hint="@string/new_password"
-                        android:inputType="textPassword"
-                        android:textColor="?attr/color_text_primary"
-                        android:textColorHint="?attr/color_text_secondary"
-                        android:textSize="?attr/TextSizeBody"/>
+                        android:inputType="textPassword"/>
                 </android.support.design.widget.TextInputLayout>
             </LinearLayout>
         </android.support.v7.widget.CardView>

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

@@ -61,10 +61,7 @@
                                     android:layout_width="match_parent"
                                     android:layout_height="wrap_content"
                                     android:imeOptions="actionNext"
-                                    android:inputType="textEmailAddress"
-                                    android:textColor="?attr/color_text_primary"
-                                    android:textColorHint="?attr/color_text_secondary"
-                                    android:textSize="?attr/TextSizeBody"/>
+                                    android:inputType="textEmailAddress"/>
                             </android.support.design.widget.TextInputLayout>
 
 
@@ -82,10 +79,7 @@
                                     android:layout_height="wrap_content"
                                     android:layout_alignParentTop="true"
                                     android:hint="@string/password"
-                                    android:inputType="textPassword"
-                                    android:textColor="?attr/color_text_primary"
-                                    android:textColorHint="?attr/color_text_secondary"
-                                    android:textSize="?attr/TextSizeBody"/>
+                                    android:inputType="textPassword"/>
                             </android.support.design.widget.TextInputLayout>
 
                             <LinearLayout
@@ -112,10 +106,7 @@
                                             android:id="@+id/hostname"
                                             android:layout_width="fill_parent"
                                             android:layout_height="wrap_content"
-                                            android:inputType="textNoSuggestions"
-                                            android:textColor="?attr/color_text_primary"
-                                            android:textColorHint="?attr/color_text_secondary"
-                                            android:textSize="?attr/TextSizeBody"/>
+                                            android:inputType="textNoSuggestions"/>
                                     </android.support.design.widget.TextInputLayout>
                                 </LinearLayout>
 
@@ -136,10 +127,7 @@
                                             android:layout_width="match_parent"
                                             android:layout_height="match_parent"
                                             android:inputType="number"
-                                            android:maxLength="5"
-                                            android:textColor="?attr/color_text_primary"
-                                            android:textColorHint="?attr/color_text_secondary"
-                                            android:textSize="?attr/TextSizeBody"/>
+                                            android:maxLength="5"/>
                                     </android.support.design.widget.TextInputLayout>
                                 </LinearLayout>
                             </LinearLayout>
@@ -149,9 +137,7 @@
                                 android:layout_width="wrap_content"
                                 android:layout_height="wrap_content"
                                 android:layout_marginTop="8dp"
-                                android:text="@string/register_account"
-                                android:textColor="?attr/color_text_primary"
-                                android:textSize="?attr/TextSizeBody"/>
+                                android:text="@string/register_account"/>
                         </LinearLayout>
                     </RelativeLayout>
                 </android.support.v7.widget.CardView>

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

@@ -7,36 +7,34 @@
     android:paddingLeft="?attr/dialog_horizontal_padding"
     android:paddingRight="?attr/dialog_horizontal_padding"
     android:paddingTop="?attr/dialog_vertical_padding">
-
     <TextView
-        android:id="@+id/your_account"
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:text="@string/your_account"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
-
+        style="@style/InputLabel" />
     <Spinner
         android:id="@+id/account"
         android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"/>
 
-    <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="@string/conference_subject"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
+    <View
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:layout_width="0dp"
+        android:layout_height="0dp"/>
 
-    <EditText
-        android:id="@+id/subject"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/edit_subject_hint"
-        android:inputType="textAutoComplete"
-        android:textColor="?attr/color_text_primary"
-        android:textColorHint="?attr/color_text_secondary"
-        android:textSize="?attr/TextSizeBody" />
+    <android.support.design.widget.TextInputLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <android.support.design.widget.TextInputEditText
+            android:id="@+id/subject"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:nextFocusUp="@+id/subject"
+            android:nextFocusDown="@+id/subject"
+            android:hint="@string/edit_subject_hint"/>
+
+    </android.support.design.widget.TextInputLayout>
 
 </LinearLayout>

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

@@ -1,43 +1,35 @@
 <?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:paddingBottom="?attr/dialog_vertical_padding"
-    android:paddingLeft="?attr/dialog_horizontal_padding"
-    android:paddingRight="?attr/dialog_horizontal_padding"
-    android:paddingTop="?attr/dialog_vertical_padding">
+              android:layout_width="match_parent"
+              android:layout_height="match_parent"
+              android:orientation="vertical"
+              android:paddingBottom="?attr/dialog_vertical_padding"
+              android:paddingLeft="?attr/dialog_horizontal_padding"
+              android:paddingRight="?attr/dialog_horizontal_padding"
+              android:paddingTop="?attr/dialog_vertical_padding">
 
     <TextView
-        android:id="@+id/your_account"
+        style="@style/InputLabel"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/your_account"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
+        android:text="@string/your_account"/>
 
     <Spinner
         android:id="@+id/account"
         android:layout_width="fill_parent"
-        android:layout_height="wrap_content" />
+        android:layout_height="wrap_content"/>
 
-    <TextView
-        android:id="@+id/jabber_id"
-        android:layout_width="wrap_content"
+    <android.support.design.widget.TextInputLayout
+        android:id="@+id/account_jid_layout"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="@string/account_settings_jabber_id"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
+        android:hint="@string/account_settings_jabber_id">
 
-    <AutoCompleteTextView
-        android:id="@+id/jid"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/account_settings_example_jabber_id"
-        android:inputType="textEmailAddress"
-        android:textColor="?attr/color_text_primary"
-        android:textColorHint="?attr/color_text_secondary"
-        android:textSize="?attr/TextSizeBody" />
+        <AutoCompleteTextView
+            android:id="@+id/jid"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textEmailAddress"/>
+    </android.support.design.widget.TextInputLayout>
 
 </LinearLayout>

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

@@ -7,38 +7,30 @@
               android:paddingLeft="24dp"
               android:paddingRight="24dp"
               android:paddingTop="16dp">
-
     <TextView
-        android:id="@+id/your_account"
+        style="@style/InputLabel"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="@string/your_account"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
+        android:text="@string/your_account"/>
 
     <Spinner
         android:id="@+id/account"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content" />
 
-    <TextView
-        android:id="@+id/jabber_id"
-        android:layout_width="wrap_content"
+    <android.support.design.widget.TextInputLayout
+        android:id="@+id/account_jid_layout"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_marginTop="8dp"
-        android:text="@string/conference_address"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody" />
+        android:hint="@string/conference_address">
+
+        <AutoCompleteTextView
+            android:id="@+id/jid"
+            android:layout_width="fill_parent"
+            android:layout_height="wrap_content"
+            android:inputType="textEmailAddress"/>
+    </android.support.design.widget.TextInputLayout>
 
-    <AutoCompleteTextView
-        android:id="@+id/jid"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content"
-        android:hint="@string/conference_address_example"
-        android:inputType="textEmailAddress"
-        android:textColor="?attr/color_text_primary"
-        android:textColorHint="?attr/color_text_secondary"
-        android:textSize="?attr/TextSizeBody"/>
 
     <CheckBox
         android:id="@+id/bookmark"
@@ -46,8 +38,6 @@
         android:layout_height="wrap_content"
         android:layout_marginTop="8dp"
         android:checked="true"
-        android:text="@string/save_as_bookmark"
-        android:textColor="?attr/color_text_primary"
-        android:textSize="?attr/TextSizeBody"/>
+        android:text="@string/save_as_bookmark"/>
 
 </LinearLayout>

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

@@ -18,8 +18,7 @@
           android:id="@android:id/text1"
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
-          android:textColor="?attr/color_text_primary"
-          android:textSize="?attr/TextSizeBody"
+          android:textAppearance="@style/TextAppearance.AppCompat.Body1"
           android:gravity="center_vertical"
           android:paddingLeft="8dp"
           android:paddingRight="8dp"

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

@@ -15,6 +15,9 @@
 	<dimen name="publish_avatar_top_margin">8dp</dimen>
 	<dimen name="publish_avatar_size">96dp</dimen>
 
+	<dimen name="input_label_vertical_spacing">4dp</dimen>
+	<dimen name="input_label_horizontal_spacing">4dp</dimen>
+
 	<!-- scanner -->
 	<dimen name="scan_laser_width">4dp</dimen>
 	<dimen name="scan_dot_size">8dp</dimen>

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

@@ -2,4 +2,9 @@
     <style name="TextAppearance.Conversations.Body1.Secondary" parent="TextAppearance.AppCompat.Body1">
         <item name="android:textColor">?android:textColorSecondary</item>
     </style>
+    <style name="InputLabel" parent="TextAppearance.AppCompat.Caption">
+        <item name="android:paddingBottom">@dimen/input_label_vertical_spacing</item>
+        <item name="android:paddingLeft">@dimen/input_label_horizontal_spacing</item>
+        <item name="android:paddingRight">@dimen/input_label_horizontal_spacing</item>
+    </style>
 </resources>