Browse Source

Fine tuned themeing
The main activity's search view and various edittext views now show the
server set theme colour for highlighted text, highlighted text selector
handles and focus underline.

Signed-off-by: Daniel Bailey <daniel.bailey@grappleIT.co.uk>

Daniel Bailey 6 years ago
parent
commit
7df8f8ba45

+ 5 - 0
src/main/java/com/owncloud/android/ui/activity/PassCodeActivity.java

@@ -39,6 +39,7 @@ import android.widget.EditText;
 import android.widget.TextView;
 
 import com.google.android.material.snackbar.Snackbar;
+import com.owncloud.android.MainApp;
 import com.owncloud.android.R;
 import com.owncloud.android.lib.common.utils.Log_OC;
 import com.owncloud.android.utils.ThemeUtils;
@@ -99,16 +100,20 @@ public class    PassCodeActivity extends AppCompatActivity {
 
         mPassCodeEditTexts[0] = findViewById(R.id.txt0);
         ThemeUtils.colorEditText(mPassCodeEditTexts[0], elementColor);
+        ThemeUtils.themeEditText(mPassCodeEditTexts[0], ThemeUtils.primaryColor(MainApp.getAppContext()));
         mPassCodeEditTexts[0].requestFocus();
 
         mPassCodeEditTexts[1] = findViewById(R.id.txt1);
         ThemeUtils.colorEditText(mPassCodeEditTexts[1], elementColor);
+        ThemeUtils.themeEditText(mPassCodeEditTexts[1], ThemeUtils.primaryColor(MainApp.getAppContext()));
 
         mPassCodeEditTexts[2] = findViewById(R.id.txt2);
         ThemeUtils.colorEditText(mPassCodeEditTexts[2], elementColor);
+        ThemeUtils.themeEditText(mPassCodeEditTexts[2], ThemeUtils.primaryColor(MainApp.getAppContext()));
 
         mPassCodeEditTexts[3] = findViewById(R.id.txt3);
         ThemeUtils.colorEditText(mPassCodeEditTexts[3], elementColor);
+        ThemeUtils.themeEditText(mPassCodeEditTexts[3], ThemeUtils.primaryColor(MainApp.getAppContext()));
 
         Window window = getWindow();
         if (window != null) {

+ 1 - 0
src/main/java/com/owncloud/android/ui/dialog/RenameFileDialogFragment.java

@@ -102,6 +102,7 @@ public class RenameFileDialogFragment
         String currentName = mTargetFile.getFileName();
         EditText inputText = v.findViewById(R.id.user_input);
         inputText.setText(currentName);
+        ThemeUtils.themeEditText(inputText, ThemeUtils.primaryColor(getContext()));
         int selectionStart = 0;
         int extensionStart = mTargetFile.isFolder() ? -1 : currentName.lastIndexOf('.');
         int selectionEnd = extensionStart >= 0 ? extensionStart : currentName.length();

+ 3 - 0
src/main/java/com/owncloud/android/ui/fragment/ExtendedListFragment.java

@@ -83,6 +83,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
+import static com.owncloud.android.utils.ThemeUtils.themeSearchView;
+
 public class ExtendedListFragment extends Fragment
         implements OnItemClickListener, OnEnforceableRefreshListener, SearchView.OnQueryTextListener,
         SearchView.OnCloseListener {
@@ -181,6 +183,7 @@ public class ExtendedListFragment extends Fragment
         searchView = (SearchView) MenuItemCompat.getActionView(item);
         searchView.setOnQueryTextListener(this);
         searchView.setOnCloseListener(this);
+        themeSearchView(searchView, ThemeUtils.primaryAccentColor(getContext()));
 
         final Handler handler = new Handler();
 

+ 2 - 0
src/main/java/com/owncloud/android/ui/fragment/FileDetailActivitiesFragment.java

@@ -196,6 +196,8 @@ public class FileDetailActivitiesFragment extends Fragment implements ActivityLi
                 ThemeUtils.primaryAccentColor(getContext()),
                 PorterDuff.Mode.SRC_ATOP
         );
+//        ThemeUtils.colorEditText(commentInput, ThemeUtils.primaryAccentColor(getContext()));
+        ThemeUtils.themeEditText(commentInput, ThemeUtils.primaryColor(getContext()));
 
         return view;
     }

+ 1 - 0
src/main/java/com/owncloud/android/ui/fragment/FileDetailSharingFragment.java

@@ -201,6 +201,7 @@ public class FileDetailSharingFragment extends Fragment implements UserListAdapt
         FileDetailSharingFragmentHelper.setupSearchView(
             (SearchManager) fileDisplayActivity.getSystemService(Context.SEARCH_SERVICE), searchView,
             fileDisplayActivity.getComponentName());
+        ThemeUtils.themeSearchView(searchView, ThemeUtils.primaryColor(getContext()));
     }
 
     /**

+ 103 - 0
src/main/java/com/owncloud/android/utils/ThemeUtils.java

@@ -32,11 +32,13 @@ import android.graphics.drawable.Drawable;
 import android.os.Build;
 import android.text.Html;
 import android.text.Spanned;
+import android.view.View;
 import android.view.Window;
 import android.widget.EditText;
 import android.widget.ImageButton;
 import android.widget.ProgressBar;
 import android.widget.SeekBar;
+import android.widget.TextView;
 
 import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.snackbar.Snackbar;
@@ -48,11 +50,14 @@ import com.owncloud.android.datamodel.FileDataStorageManager;
 import com.owncloud.android.lib.resources.status.OCCapability;
 import com.owncloud.android.ui.activity.ToolbarActivity;
 
+import java.lang.reflect.Field;
+
 import androidx.annotation.ColorInt;
 import androidx.annotation.DrawableRes;
 import androidx.annotation.Nullable;
 import androidx.appcompat.app.ActionBar;
 import androidx.appcompat.widget.AppCompatCheckBox;
+import androidx.appcompat.widget.SearchView;
 import androidx.appcompat.widget.SwitchCompat;
 import androidx.core.content.ContextCompat;
 import androidx.core.content.res.ResourcesCompat;
@@ -388,6 +393,20 @@ public final class ThemeUtils {
         ));
     }
 
+    public static void themeEditText(EditText editText, int color) {
+        editText.setHighlightColor(color);
+        setTextViewCursorColor(editText, color);
+        setTextViewHandlesColor(editText, color);
+    }
+
+    public static void themeSearchView(SearchView searchView, int color) {
+        SearchView.SearchAutoComplete editText = searchView.findViewById(R.id.search_src_text);
+
+        editText.setHighlightColor(color);
+        ThemeUtils.setTextViewCursorColor(editText, color);
+        ThemeUtils.setTextViewHandlesColor(editText, color);
+    }
+
     public static void tintCheckbox(AppCompatCheckBox checkBox, int color) {
         CompoundButtonCompat.setButtonTintList(checkBox, new ColorStateList(
                 new int[][]{
@@ -472,4 +491,88 @@ public final class ThemeUtils {
             return new OCCapability();
         }
     }
+
+    /**
+     * Lifted from SO.
+     * @see             https://stackoverflow.com/questions/25996032/how-to-change-programmatically-edittext-cursor-color-in-android#26543290
+     * @param view      TextView to be styled
+     * @param color     The desired cursor colour
+     */
+    public static void setTextViewCursorColor(EditText view, @ColorInt int color) {
+        try {
+            // Get the cursor resource id
+            Field field = TextView.class.getDeclaredField("mCursorDrawableRes");
+            field.setAccessible(true);
+            int drawableResId = field.getInt(view);
+
+            // Get the editor
+            // TODO check this in API 15
+            field = TextView.class.getDeclaredField("mEditor");
+            field.setAccessible(true);
+            Object editor = field.get(view);
+
+            // Get the drawable and set a color filter
+            Drawable drawable = ContextCompat.getDrawable(view.getContext(), drawableResId);
+            drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
+            Drawable[] drawables = {drawable, drawable};
+
+            // Set the drawables
+            field = editor.getClass().getDeclaredField("mCursorDrawable");
+            field.setAccessible(true);
+            field.set(editor, drawables);
+        } catch (Exception ignored) { }
+    }
+
+
+    /**
+     * Set the color of the handles when you select text in a
+     * {@link android.widget.EditText} or other view that extends {@link TextView}.
+     *
+     * @param view
+     *     The {@link TextView} or a {@link View} that extends {@link TextView}.
+     * @param color
+     *     The color to set for the text handles
+     *
+     * @see https://gist.github.com/jaredrummler/2317620559d10ac39b8218a1152ec9d4
+     */
+    public static void setTextViewHandlesColor(TextView view, int color) {
+        try {
+            Field editorField = TextView.class.getDeclaredField("mEditor");
+            if (!editorField.isAccessible()) {
+                editorField.setAccessible(true);
+            }
+
+            Object editor = editorField.get(view);
+            Class<?> editorClass = editor.getClass();
+
+            String[] handleNames = {"mSelectHandleLeft", "mSelectHandleRight", "mSelectHandleCenter"};
+            String[] resNames = {"mTextSelectHandleLeftRes", "mTextSelectHandleRightRes", "mTextSelectHandleRes"};
+
+            for (int i = 0; i < handleNames.length; i++) {
+                Field handleField = editorClass.getDeclaredField(handleNames[i]);
+                if (!handleField.isAccessible()) {
+                    handleField.setAccessible(true);
+                }
+
+                Drawable handleDrawable = (Drawable) handleField.get(editor);
+
+                if (handleDrawable == null) {
+                    Field resField = TextView.class.getDeclaredField(resNames[i]);
+                    if (!resField.isAccessible()) {
+                        resField.setAccessible(true);
+                    }
+                    int resId = resField.getInt(view);
+                    handleDrawable = view.getResources().getDrawable(resId);
+                }
+
+                if (handleDrawable != null) {
+                    Drawable drawable = handleDrawable.mutate();
+                    drawable.setColorFilter(color, PorterDuff.Mode.SRC_IN);
+                    handleField.set(editor, drawable);
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
 }

+ 4 - 8
src/main/res/layout/passcodelock.xml

@@ -58,8 +58,7 @@
             android:cursorVisible="true"
             android:imeOptions="flagNoExtractUi"
             android:importantForAutofill="no"
-            android:hint="@string/hidden_character"
-            android:textCursorDrawable="@null">
+            android:hint="@string/hidden_character">
             <requestFocus/>
         </com.google.android.material.textfield.TextInputEditText>
 
@@ -69,8 +68,7 @@
             android:cursorVisible="true"
             android:imeOptions="flagNoExtractUi"
             android:importantForAutofill="no"
-            android:hint="@string/hidden_character"
-            android:textCursorDrawable="@null" />
+            android:hint="@string/hidden_character" />
 
         <com.google.android.material.textfield.TextInputEditText
             android:id="@+id/txt2"
@@ -78,8 +76,7 @@
             android:cursorVisible="true"
             android:imeOptions="flagNoExtractUi"
             android:importantForAutofill="no"
-            android:hint="@string/hidden_character"
-            android:textCursorDrawable="@null" />
+            android:hint="@string/hidden_character" />
 
         <com.google.android.material.textfield.TextInputEditText
             android:id="@+id/txt3"
@@ -87,8 +84,7 @@
             android:cursorVisible="true"
             android:imeOptions="flagNoExtractUi"
             android:importantForAutofill="no"
-            android:hint="@string/hidden_character"
-            android:textCursorDrawable="@null" />
+            android:hint="@string/hidden_character" />
     </LinearLayout>
 
     <com.google.android.material.button.MaterialButton