From 8fd3ff4ea888f5a9af5203321ad14650967d510b Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Fri, 28 Feb 2020 13:57:05 -0600 Subject: [PATCH] Fix theming issues on pre-lollipop devices --- .../astrid/adapter/FilterViewHolder.java | 6 ++-- .../activities/BaseListSettingsActivity.java | 8 +++-- .../org/tasks/dialogs/IconPickerHolder.java | 11 ++----- .../injection/InjectingPreferenceFragment.kt | 16 +++++----- .../preferences/fragments/LookAndFeel.kt | 2 +- .../preferences/fragments/ScrollableWidget.kt | 2 +- .../java/org/tasks/sync/AddAccountDialog.java | 3 +- .../org/tasks/tags/TagPickerViewHolder.java | 16 ++-------- .../java/org/tasks/themes/DrawableUtil.java | 14 ++++++++- .../tasks/widget/ShortcutConfigActivity.java | 16 ++++++---- .../main/res/drawable-v23/color_picker.xml | 27 ++++++++++++++++ app/src/main/res/drawable/color_picker.xml | 31 +++++-------------- .../activity_widget_shortcut_content.xml | 15 ++------- .../res/layout/dialog_icon_picker_cell.xml | 3 -- .../main/res/layout/filter_adapter_row.xml | 3 +- .../res/xml/preferences_look_and_feel.xml | 3 -- app/src/main/res/xml/preferences_widget.xml | 1 - 17 files changed, 87 insertions(+), 90 deletions(-) create mode 100644 app/src/main/res/drawable-v23/color_picker.xml diff --git a/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java b/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java index 7929ae62b..ca93f8338 100644 --- a/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java +++ b/app/src/main/java/com/todoroo/astrid/adapter/FilterViewHolder.java @@ -30,6 +30,7 @@ import org.tasks.filters.NavigationDrawerSubheader; import org.tasks.locale.Locale; import org.tasks.preferences.SyncPreferences; import org.tasks.themes.CustomIcons; +import org.tasks.themes.DrawableUtil; import org.tasks.themes.ThemeAccent; import org.tasks.themes.ThemeColor; @@ -115,8 +116,9 @@ public class FilterViewHolder extends RecyclerView.ViewHolder { text.setChecked(selected); } - icon.setImageResource(getIcon(filter)); - icon.setColorFilter(getColor(filter)); + int icon = getIcon(filter); + this.icon.setImageDrawable(DrawableUtil.getWrapped(activity, icon)); + DrawableCompat.setTint(this.icon.getDrawable(), getColor(filter)); text.setText(filter.listingTitle); if (count == null || count == 0) { diff --git a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java index d42e51b70..72080f769 100644 --- a/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java +++ b/app/src/main/java/org/tasks/activities/BaseListSettingsActivity.java @@ -168,12 +168,16 @@ public abstract class BaseListSettingsActivity extends ThemedInjectingAppCompatA Drawable leftDrawable = getLeftDrawable(color); if (selectedColor == 0) { themeColor = this.themeColor; - DrawableCompat.setTint(leftDrawable, ContextCompat.getColor(this, android.R.color.transparent)); + DrawableCompat.setTint( + leftDrawable, ContextCompat.getColor(this, android.R.color.transparent)); clear.setVisibility(View.GONE); } else { themeColor = newThemeColor(this, selectedColor); DrawableCompat.setTint( - ((LayerDrawable) leftDrawable).getDrawable(0), themeColor.getPrimaryColor()); + leftDrawable instanceof LayerDrawable + ? ((LayerDrawable) leftDrawable).getDrawable(0) + : leftDrawable, + themeColor.getPrimaryColor()); clear.setVisibility(View.VISIBLE); } themeColor.apply(toolbar); diff --git a/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java b/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java index 84101361d..3f3387849 100644 --- a/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java +++ b/app/src/main/java/org/tasks/dialogs/IconPickerHolder.java @@ -1,19 +1,17 @@ package org.tasks.dialogs; import android.content.Context; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; import android.view.View; import android.widget.Toast; import androidx.annotation.NonNull; import androidx.appcompat.widget.AppCompatImageView; -import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; import org.tasks.Callback; import org.tasks.R; +import org.tasks.themes.DrawableUtil; public class IconPickerHolder extends RecyclerView.ViewHolder { @@ -47,11 +45,8 @@ public class IconPickerHolder extends RecyclerView.ViewHolder { public void bind(int index, int icon, int tint, float alpha, boolean isEnabled) { this.index = index; this.isEnabled = isEnabled; - imageView.setImageResource(icon); imageView.setAlpha(alpha); - Drawable drawable = imageView.getDrawable(); - DrawableCompat.setTint( - drawable instanceof LayerDrawable ? ((LayerDrawable) drawable).getDrawable(0) : drawable, - tint); + imageView.setImageDrawable(DrawableUtil.getWrapped(context, icon)); + DrawableUtil.setTint(imageView.getDrawable(), tint); } } diff --git a/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt b/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt index 3460e29fb..2c9204caf 100644 --- a/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt +++ b/app/src/main/java/org/tasks/injection/InjectingPreferenceFragment.kt @@ -3,8 +3,6 @@ package org.tasks.injection import android.app.Activity import android.content.DialogInterface import android.content.Intent -import android.graphics.drawable.Drawable -import android.graphics.drawable.LayerDrawable import android.os.Bundle import androidx.annotation.StringRes import androidx.core.content.ContextCompat @@ -19,6 +17,7 @@ import com.todoroo.astrid.api.Filter import org.tasks.R import org.tasks.dialogs.DialogBuilder import org.tasks.preferences.Device +import org.tasks.themes.DrawableUtil import javax.inject.Inject @@ -33,9 +32,9 @@ abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() { tintIcons(pref.getPreference(i), color) } } else { - val icon: Drawable? = pref.icon - if (icon != null) { - DrawableCompat.setTint(icon, color) + if (pref.icon != null) { + pref.icon = DrawableUtil.wrap(pref.icon); + DrawableCompat.setTint(pref.icon, color) } } } @@ -75,11 +74,10 @@ abstract class InjectingPreferenceFragment : PreferenceFragmentCompat() { .show() } - protected fun tintIcon(resId: Int, tint: Int) { + protected fun tintColorPreference(resId: Int, tint: Int) { val pref = findPreference(resId) - val icon = DrawableCompat.wrap(pref.icon.mutate()) - DrawableCompat.setTint(if (icon is LayerDrawable) icon.getDrawable(0) else icon, tint) - pref.icon = icon + pref.icon = DrawableUtil.getWrapped(context!!, R.drawable.color_picker) + DrawableUtil.setTint(pref.icon, tint) } protected fun requires(@StringRes prefGroup: Int, check: Boolean, vararg resIds: Int) { diff --git a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt index 77bb996c7..aca10a975 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt @@ -386,7 +386,7 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange palette: ColorPickerAdapter.Palette, requestCode: Int ) { - tintIcon(prefId, color) + tintColorPreference(prefId, color) findPreference(prefId).setOnPreferenceClickListener { if (palette == ColorPickerAdapter.Palette.COLORS) { newColorWheel(this, requestCode, color) diff --git a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt index 5a4fdc5e8..973cd2ab3 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/ScrollableWidget.kt @@ -147,7 +147,7 @@ class ScrollableWidget : InjectingPreferenceFragment() { } private fun updateColor() { - tintIcon(R.string.p_widget_color_v2, widgetPreferences.color) + tintColorPreference(R.string.p_widget_color_v2, widgetPreferences.color) } private fun updateFilter() { diff --git a/app/src/main/java/org/tasks/sync/AddAccountDialog.java b/app/src/main/java/org/tasks/sync/AddAccountDialog.java index 070618739..1e8b4dca4 100644 --- a/app/src/main/java/org/tasks/sync/AddAccountDialog.java +++ b/app/src/main/java/org/tasks/sync/AddAccountDialog.java @@ -19,6 +19,7 @@ import org.tasks.caldav.CaldavAccountSettingsActivity; import org.tasks.dialogs.DialogBuilder; import org.tasks.etesync.EteSyncAccountSettingsActivity; import org.tasks.preferences.fragments.SynchronizationKt; +import org.tasks.themes.DrawableUtil; public class AddAccountDialog { public static void showAddAccountDialog(Activity activity, DialogBuilder dialogBuilder) { @@ -42,7 +43,7 @@ public class AddAccountDialog { view.findViewById(R.id.text1).setText(services[position]); view.findViewById(R.id.text2).setText(descriptions[position]); ImageView icon = view.findViewById(R.id.image_view); - icon.setImageResource(icons[position]); + icon.setImageDrawable(DrawableUtil.getWrapped(getContext(), icons[position])); if (position == 1) { DrawableCompat.setTint( icon.getDrawable(), ContextCompat.getColor(getContext(), R.color.icon_tint)); diff --git a/app/src/main/java/org/tasks/tags/TagPickerViewHolder.java b/app/src/main/java/org/tasks/tags/TagPickerViewHolder.java index d8de7dca9..f6ac45dc8 100644 --- a/app/src/main/java/org/tasks/tags/TagPickerViewHolder.java +++ b/app/src/main/java/org/tasks/tags/TagPickerViewHolder.java @@ -1,15 +1,10 @@ package org.tasks.tags; -import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; - import android.content.Context; -import android.graphics.drawable.Drawable; import android.view.View; import android.widget.TextView; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; import androidx.recyclerview.widget.RecyclerView; import butterknife.BindView; import butterknife.ButterKnife; @@ -19,6 +14,7 @@ import kotlin.jvm.functions.Function2; import org.tasks.R; import org.tasks.data.TagData; import org.tasks.tags.CheckBoxTriStates.State; +import org.tasks.themes.DrawableUtil; public class TagPickerViewHolder extends RecyclerView.ViewHolder { @@ -76,14 +72,8 @@ public class TagPickerViewHolder extends RecyclerView.ViewHolder { icon = R.drawable.ic_outline_label_24px; } } - Drawable original = ContextCompat.getDrawable(context, icon); - Drawable wrapped = DrawableCompat.wrap(original.mutate()); - DrawableCompat.setTint(wrapped, color); - if (atLeastJellybeanMR1()) { - text.setCompoundDrawablesRelativeWithIntrinsicBounds(wrapped, null, null, null); - } else { - text.setCompoundDrawablesWithIntrinsicBounds(wrapped, null, null, null); - } + DrawableUtil.setLeftDrawable(context, text, icon); + DrawableUtil.setTint(DrawableUtil.getLeftDrawable(text), color); } private void updateCheckbox(State state) { diff --git a/app/src/main/java/org/tasks/themes/DrawableUtil.java b/app/src/main/java/org/tasks/themes/DrawableUtil.java index aef55d4d9..f8a950e96 100644 --- a/app/src/main/java/org/tasks/themes/DrawableUtil.java +++ b/app/src/main/java/org/tasks/themes/DrawableUtil.java @@ -4,14 +4,16 @@ import static com.todoroo.andlib.utility.AndroidUtilities.atLeastJellybeanMR1; import android.content.Context; import android.graphics.drawable.Drawable; +import android.graphics.drawable.LayerDrawable; import android.widget.TextView; import androidx.annotation.DrawableRes; import androidx.core.content.ContextCompat; import androidx.core.graphics.drawable.DrawableCompat; +import org.jetbrains.annotations.NotNull; public class DrawableUtil { public static Drawable getWrapped(Context context, @DrawableRes int resId) { - return DrawableCompat.wrap(ContextCompat.getDrawable(context, resId).mutate()); + return wrap(ContextCompat.getDrawable(context, resId)); } public static void setLeftDrawable(Context context, TextView tv, @DrawableRes int resId) { @@ -28,4 +30,14 @@ public class DrawableUtil { ? tv.getCompoundDrawablesRelative()[0] : tv.getCompoundDrawables()[0]; } + + public static Drawable wrap(@NotNull Drawable icon) { + return DrawableCompat.wrap(icon.mutate()); + } + + public static void setTint(Drawable drawable, int tint) { + DrawableCompat.setTint( + drawable instanceof LayerDrawable ? ((LayerDrawable) drawable).getDrawable(0) : drawable, + tint); + } } diff --git a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java index 704b67d9c..977f7f255 100644 --- a/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java +++ b/app/src/main/java/org/tasks/widget/ShortcutConfigActivity.java @@ -3,13 +3,12 @@ package org.tasks.widget; import android.app.Activity; import android.content.Intent; import android.content.Intent.ShortcutIconResource; -import android.graphics.drawable.LayerDrawable; import android.os.Bundle; import android.os.Parcelable; -import android.widget.ImageView; +import android.view.View; +import android.widget.TextView; import androidx.appcompat.widget.Toolbar; import androidx.core.content.ContextCompat; -import androidx.core.graphics.drawable.DrawableCompat; import butterknife.BindView; import butterknife.ButterKnife; import butterknife.OnClick; @@ -27,6 +26,7 @@ import org.tasks.injection.ActivityComponent; import org.tasks.injection.ThemedInjectingAppCompatActivity; import org.tasks.intents.TaskIntents; import org.tasks.preferences.DefaultFilterProvider; +import org.tasks.themes.DrawableUtil; import org.tasks.themes.ThemeCache; import org.tasks.themes.ThemeColor; @@ -55,7 +55,10 @@ public class ShortcutConfigActivity extends ThemedInjectingAppCompatActivity TextInputEditText shortcutName; @BindView(R.id.color) - ImageView colorIcon; + TextView colorIcon; + + @BindView(R.id.clear) + View clear; private Filter selectedFilter; private int selectedTheme; @@ -139,9 +142,10 @@ public class ShortcutConfigActivity extends ThemedInjectingAppCompatActivity } private void updateTheme() { + clear.setVisibility(View.GONE); ThemeColor color = themeCache.getThemeColor(getThemeIndex()); - DrawableCompat.setTint( - ((LayerDrawable) colorIcon.getDrawable()).getDrawable(0), color.getPrimaryColor()); + DrawableUtil.setLeftDrawable(this, colorIcon, R.drawable.color_picker); + DrawableUtil.setTint(DrawableUtil.getLeftDrawable(colorIcon), color.getPrimaryColor()); color.apply(toolbar); color.applyToSystemBars(this); } diff --git a/app/src/main/res/drawable-v23/color_picker.xml b/app/src/main/res/drawable-v23/color_picker.xml new file mode 100644 index 000000000..4c9e85af1 --- /dev/null +++ b/app/src/main/res/drawable-v23/color_picker.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/color_picker.xml b/app/src/main/res/drawable/color_picker.xml index 4c9e85af1..77f4a6587 100644 --- a/app/src/main/res/drawable/color_picker.xml +++ b/app/src/main/res/drawable/color_picker.xml @@ -1,27 +1,10 @@ - - - + - + - - - - - - - - - - - - - - \ No newline at end of file + + diff --git a/app/src/main/res/layout/activity_widget_shortcut_content.xml b/app/src/main/res/layout/activity_widget_shortcut_content.xml index efabf72b4..1609ee9cd 100644 --- a/app/src/main/res/layout/activity_widget_shortcut_content.xml +++ b/app/src/main/res/layout/activity_widget_shortcut_content.xml @@ -2,15 +2,14 @@ + android:layout_height="match_parent"> @@ -22,11 +21,6 @@ style="@style/TagSettingsRow" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="8dp" - android:layout_marginStart="@dimen/keyline_first" - android:layout_marginEnd="@dimen/keyline_first" - android:layout_marginLeft="@dimen/keyline_first" - android:layout_marginRight="@dimen/keyline_first" android:hint="@string/display_name" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@+id/shortcut_list_layout" @@ -44,11 +38,6 @@ style="@style/TagSettingsRow" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginTop="16dp" - android:layout_marginStart="@dimen/keyline_first" - android:layout_marginEnd="@dimen/keyline_first" - android:layout_marginLeft="@dimen/keyline_first" - android:layout_marginRight="@dimen/keyline_first" android:hint="@string/list" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" diff --git a/app/src/main/res/layout/dialog_icon_picker_cell.xml b/app/src/main/res/layout/dialog_icon_picker_cell.xml index 573c1f7e4..3e5d40af3 100644 --- a/app/src/main/res/layout/dialog_icon_picker_cell.xml +++ b/app/src/main/res/layout/dialog_icon_picker_cell.xml @@ -6,10 +6,7 @@ android:layout_width="@dimen/icon_picker_size" android:layout_height="@dimen/icon_picker_size" android:padding="8dp" - android:tint="@color/icon_tint" - android:alpha="@dimen/alpha_secondary" android:clickable="true" android:focusable="true" - android:src="@drawable/ic_outline_label_24px" android:background="?attr/selectableItemBackgroundBorderless" tools:ignore="ContentDescription"/> diff --git a/app/src/main/res/layout/filter_adapter_row.xml b/app/src/main/res/layout/filter_adapter_row.xml index 953ba870d..ce253d8ac 100644 --- a/app/src/main/res/layout/filter_adapter_row.xml +++ b/app/src/main/res/layout/filter_adapter_row.xml @@ -37,8 +37,7 @@ android:layout_alignParentStart="true" android:layout_gravity="center_vertical" android:alpha="@dimen/alpha_secondary" - android:scaleType="center" - android:tint="@color/icon_tint"/> + android:scaleType="center"/>