From 6e656d10938c1bbd86b5f40a40099d5c24fe24d9 Mon Sep 17 00:00:00 2001 From: Alex Baker Date: Tue, 10 Mar 2020 16:02:57 -0500 Subject: [PATCH] Add chip configuration options * Filled or outlined * Text and icon, text only, or icon only --- .../preferences/fragments/LookAndFeel.kt | 12 ++ .../main/java/org/tasks/ui/ChipProvider.java | 111 ++++++++++++++---- .../java/org/tasks/ui/RemoteListFragment.java | 25 ++-- app/src/main/res/layout/chip_button.xml | 2 - app/src/main/res/layout/chip_closable.xml | 3 - app/src/main/res/layout/chip_filled.xml | 2 + app/src/main/res/layout/chip_outlined.xml | 2 + .../res/layout/control_set_remote_list.xml | 11 +- app/src/main/res/values/arrays.xml | 25 ++++ app/src/main/res/values/colors.xml | 2 + app/src/main/res/values/keys.xml | 2 + app/src/main/res/values/strings.xml | 5 + app/src/main/res/values/styles.xml | 21 +++- .../res/xml/preferences_look_and_feel.xml | 21 ++++ 14 files changed, 196 insertions(+), 48 deletions(-) delete mode 100644 app/src/main/res/layout/chip_button.xml delete mode 100644 app/src/main/res/layout/chip_closable.xml create mode 100644 app/src/main/res/layout/chip_filled.xml create mode 100644 app/src/main/res/layout/chip_outlined.xml 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 b8d82504b..e7a56da22 100644 --- a/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt +++ b/app/src/main/java/org/tasks/preferences/fragments/LookAndFeel.kt @@ -42,6 +42,7 @@ import org.tasks.themes.ThemeBase.EXTRA_THEME_OVERRIDE import org.tasks.themes.ThemeColor import org.tasks.themes.ThemeColor.getLauncherColor import org.tasks.time.DateTime +import org.tasks.ui.ChipProvider import org.tasks.ui.NavigationDrawerFragment.REQUEST_PURCHASE import org.tasks.ui.SingleCheckedArrayAdapter import org.tasks.ui.TimePreference @@ -76,6 +77,7 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange @Inject lateinit var playServices: PlayServices @Inject lateinit var inventory: Inventory @Inject lateinit var toaster: Toaster + @Inject lateinit var chipProvider: ChipProvider override fun getPreferenceXml() = R.xml.preferences_look_and_feel @@ -95,6 +97,16 @@ class LookAndFeel : InjectingPreferenceFragment(), Preference.OnPreferenceChange false } + findPreference(R.string.p_chip_style).setOnPreferenceChangeListener { _, newValue -> + chipProvider.setStyle(Integer.parseInt(newValue as String)) + true + } + + findPreference(R.string.p_chip_appearance).setOnPreferenceChangeListener { _, newValue -> + chipProvider.setAppearance(Integer.parseInt(newValue as String)) + true + } + val defaultList = findPreference(R.string.p_default_list) val filter: Filter = defaultFilterProvider.defaultFilter defaultList.summary = filter.listingTitle diff --git a/app/src/main/java/org/tasks/ui/ChipProvider.java b/app/src/main/java/org/tasks/ui/ChipProvider.java index 04674ed75..d412d73ee 100644 --- a/app/src/main/java/org/tasks/ui/ChipProvider.java +++ b/app/src/main/java/org/tasks/ui/ChipProvider.java @@ -11,7 +11,6 @@ import static org.tasks.themes.ThemeColor.newThemeColor; import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; -import androidx.annotation.ColorInt; import androidx.annotation.DrawableRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -42,6 +41,7 @@ import org.tasks.data.TagDataDao; import org.tasks.data.TaskContainer; import org.tasks.injection.ApplicationScope; import org.tasks.injection.ForApplication; +import org.tasks.preferences.Preferences; import org.tasks.themes.CustomIcons; import org.tasks.themes.ThemeColor; @@ -61,6 +61,9 @@ public class ChipProvider { return left.listingTitle.compareTo(right.listingTitle); } }; + private boolean filled; + private boolean showIcon; + private boolean showText; @Inject public ChipProvider( @@ -69,7 +72,8 @@ public class ChipProvider { GoogleTaskListDao googleTaskListDao, CaldavDao caldavDao, TagDataDao tagDataDao, - LocalBroadcastManager localBroadcastManager) { + LocalBroadcastManager localBroadcastManager, + Preferences preferences) { this.inventory = inventory; this.localBroadcastManager = localBroadcastManager; iconAlpha = @@ -78,6 +82,17 @@ public class ChipProvider { googleTaskListDao.subscribeToLists().observeForever(this::updateGoogleTaskLists); caldavDao.subscribeToCalendars().observeForever(this::updateCaldavCalendars); tagDataDao.subscribeToTags().observeForever(this::updateTags); + setStyle(preferences.getIntegerFromString(R.string.p_chip_style, 0)); + setAppearance(preferences.getIntegerFromString(R.string.p_chip_appearance, 0)); + } + + public void setStyle(int style) { + filled = style == 1; + } + + public void setAppearance(int appearance) { + showText = appearance != 2; + showIcon = appearance != 1; } private void updateGoogleTaskLists(List updated) { @@ -124,25 +139,27 @@ public class ChipProvider { activity .getResources() .getQuantityString(R.plurals.subtask_count, task.children, task.children), - 0); + 0, + true, + true); chips.add(chip); } if (task.hasLocation()) { Chip chip = newChip(activity, task.getLocation()); apply( - activity, chip, R.drawable.ic_outline_place_24px, task.getLocation().getDisplayName(), 0); + activity, chip, R.drawable.ic_outline_place_24px, task.getLocation().getDisplayName(), 0, showText, showIcon); chips.add(chip); } if (!isSubtask) { if (!Strings.isNullOrEmpty(task.getGoogleTaskList()) && !(filter instanceof GtasksFilter)) { chips.add( - newTagChip( + newChip( activity, googleTaskLists.get(task.getGoogleTaskList()), R.drawable.ic_outline_cloud_24px)); } else if (!Strings.isNullOrEmpty(task.getCaldav()) && !(filter instanceof CaldavFilter)) { chips.add( - newTagChip( + newChip( activity, caldavCalendars.get(task.getCaldav()), R.drawable.ic_outline_cloud_24px)); } } @@ -155,7 +172,7 @@ public class ChipProvider { chips.addAll( transform( orderByName.sortedCopy(filter(transform(tags, tagDatas::get), Predicates.notNull())), - tag -> newTagChip(activity, tag, R.drawable.ic_outline_label_24px))); + tag -> newChip(activity, tag, R.drawable.ic_outline_label_24px))); } removeIf(chips, Predicates.isNull()); @@ -168,7 +185,9 @@ public class ChipProvider { chip, getIcon(filter.icon, R.drawable.ic_outline_cloud_24px), filter.listingTitle, - filter.tint); + filter.tint, + true, + true); } public void apply(Chip chip, @NonNull TagData tagData) { @@ -177,42 +196,82 @@ public class ChipProvider { chip, getIcon(tagData.getIcon(), R.drawable.ic_outline_label_24px), tagData.getName(), - tagData.getColor()); + tagData.getColor(), + true, + true); + } + + private @Nullable Chip newChip(Activity activity, Filter filter, int defIcon) { + return newChip(activity, filter, defIcon, showText, showIcon); } - private @Nullable Chip newTagChip(Activity activity, Filter filter, int defIcon) { + Chip newChip(Activity activity, Filter filter, int defIcon, boolean showText, boolean showIcon) { if (filter == null) { return null; } Chip chip = newChip(activity, filter); - apply(activity, chip, getIcon(filter.icon, defIcon), filter.listingTitle, filter.tint); + apply(activity, chip, getIcon(filter.icon, defIcon), filter.listingTitle, filter.tint, showText, showIcon); return chip; } public Chip newClosableChip(Activity activity, Object tag) { - Chip chip = (Chip) activity.getLayoutInflater().inflate(R.layout.chip_closable, null); + Chip chip = getChip(activity); chip.setCloseIconVisible(true); chip.setTag(tag); return chip; } private Chip newChip(Activity activity, Object tag) { - Chip chip = (Chip) activity.getLayoutInflater().inflate(R.layout.chip_button, null); + Chip chip = getChip(activity); chip.setTag(tag); return chip; } - private void apply(Context context, Chip chip, @Nullable @DrawableRes Integer icon, String name, int theme) { - chip.setText(name); - @ColorInt int color = getColor(context, theme); - if (color != 0) { - ColorStateList colorStateList = new ColorStateList(new int[][]{new int[]{}}, new int[]{color}); - chip.setCloseIconTint(colorStateList); - chip.setTextColor(color); - chip.setChipIconTint(colorStateList); - chip.setChipStrokeColor(colorStateList); + private Chip getChip(Activity activity) { + return (Chip) + activity + .getLayoutInflater() + .inflate(filled ? R.layout.chip_filled : R.layout.chip_outlined, null); + } + + private void apply( + Context context, + Chip chip, + @Nullable @DrawableRes Integer icon, + String name, + int theme, + boolean showText, + boolean showIcon) { + if (showText) { + chip.setText(name); + chip.setIconEndPadding(0f); + } else { + chip.setText(null); + chip.setContentDescription(name); + chip.setTextStartPadding(0f); + chip.setChipEndPadding(0f); + } + ThemeColor themeColor = getColor(context, theme); + if (themeColor != null) { + int primaryColor = themeColor.getPrimaryColor(); + ColorStateList primaryColorSL = + new ColorStateList(new int[][] {new int[] {}}, new int[] {primaryColor}); + if (filled) { + int colorOnPrimary = themeColor.getColorOnPrimary(); + ColorStateList colorOnPrimarySL = + new ColorStateList(new int[][] {new int[] {}}, new int[] {colorOnPrimary}); + chip.setChipBackgroundColor(primaryColorSL); + chip.setTextColor(colorOnPrimary); + chip.setCloseIconTint(colorOnPrimarySL); + chip.setChipIconTint(colorOnPrimarySL); + } else { + chip.setTextColor(primaryColor); + chip.setCloseIconTint(primaryColorSL); + chip.setChipIconTint(primaryColorSL); + chip.setChipStrokeColor(primaryColorSL); + } } - if (icon != null) { + if (showIcon && icon != null) { chip.setChipIconResource(icon); chip.getChipDrawable().setAlpha(iconAlpha); } @@ -223,13 +282,13 @@ public class ChipProvider { return icon != null ? icon : def; } - private @ColorInt int getColor(Context context, int theme) { + private @Nullable ThemeColor getColor(Context context, int theme) { if (theme != 0) { ThemeColor color = newThemeColor(context, theme); if (color.isFree() || inventory.purchasedThemes()) { - return color.getPrimaryColor(); + return color; } } - return 0; + return null; } } diff --git a/app/src/main/java/org/tasks/ui/RemoteListFragment.java b/app/src/main/java/org/tasks/ui/RemoteListFragment.java index 608c5a3bb..78a8cfb03 100644 --- a/app/src/main/java/org/tasks/ui/RemoteListFragment.java +++ b/app/src/main/java/org/tasks/ui/RemoteListFragment.java @@ -14,6 +14,7 @@ import androidx.annotation.Nullable; import butterknife.BindView; import butterknife.OnClick; import com.google.android.material.chip.Chip; +import com.google.android.material.chip.ChipGroup; import com.google.common.base.Objects; import com.google.common.collect.ImmutableList; import com.todoroo.astrid.api.CaldavFilter; @@ -46,8 +47,8 @@ public class RemoteListFragment extends TaskEditControlFragment { @BindView(R.id.dont_sync) TextView textView; - @BindView(R.id.chip) - Chip chip; + @BindView(R.id.chip_group) + ChipGroup chipGroup; @Inject GtasksListService gtasksListService; @Inject GoogleTaskDao googleTaskDao; @@ -114,8 +115,6 @@ public class RemoteListFragment extends TaskEditControlFragment { setSelected(originalList); } - chip.setOnCloseIconClickListener(v -> setSelected(null)); - return view; } @@ -152,8 +151,12 @@ public class RemoteListFragment extends TaskEditControlFragment { return TAG; } - @OnClick({R.id.remote_list_row, R.id.chip}) + @OnClick({R.id.remote_list_row, R.id.chip_group}) void clickGoogleTaskList(View view) { + openPicker(); + } + + private void openPicker() { newRemoteListSupportPicker(selectedList, this, REQUEST_CODE_SELECT_LIST) .show(getFragmentManager(), FRAG_TAG_GOOGLE_TASK_LIST_SELECTION); } @@ -210,11 +213,17 @@ public class RemoteListFragment extends TaskEditControlFragment { private void refreshView() { if (selectedList == null) { textView.setVisibility(View.VISIBLE); - chip.setVisibility(View.GONE); + chipGroup.setVisibility(View.GONE); } else { textView.setVisibility(View.GONE); - chip.setVisibility(View.VISIBLE); - chipProvider.apply(chip, selectedList); + chipGroup.setVisibility(View.VISIBLE); + chipGroup.removeAllViews(); + Chip chip = + chipProvider.newChip(getActivity(), selectedList, R.drawable.ic_outline_cloud_24px, true, true); + chip.setCloseIconVisible(true); + chip.setOnClickListener(v -> openPicker()); + chip.setOnCloseIconClickListener(v -> setSelected(null)); + chipGroup.addView(chip); } } } diff --git a/app/src/main/res/layout/chip_button.xml b/app/src/main/res/layout/chip_button.xml deleted file mode 100644 index 44f32f220..000000000 --- a/app/src/main/res/layout/chip_button.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/app/src/main/res/layout/chip_closable.xml b/app/src/main/res/layout/chip_closable.xml deleted file mode 100644 index 04151bcea..000000000 --- a/app/src/main/res/layout/chip_closable.xml +++ /dev/null @@ -1,3 +0,0 @@ - - diff --git a/app/src/main/res/layout/chip_filled.xml b/app/src/main/res/layout/chip_filled.xml new file mode 100644 index 000000000..5bb701234 --- /dev/null +++ b/app/src/main/res/layout/chip_filled.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/layout/chip_outlined.xml b/app/src/main/res/layout/chip_outlined.xml new file mode 100644 index 000000000..a13135424 --- /dev/null +++ b/app/src/main/res/layout/chip_outlined.xml @@ -0,0 +1,2 @@ + + diff --git a/app/src/main/res/layout/control_set_remote_list.xml b/app/src/main/res/layout/control_set_remote_list.xml index a7c81726b..7e61035a5 100644 --- a/app/src/main/res/layout/control_set_remote_list.xml +++ b/app/src/main/res/layout/control_set_remote_list.xml @@ -1,6 +1,7 @@ - + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9f139f1b3..272a29a24 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -186,4 +186,29 @@ @drawable/ic_etesync + + @string/chip_style_outlined + @string/chip_style_filled + + + + 0 + 1 + + + + @string/chip_appearance_text_and_icon + @string/chip_appearance_text_only + @string/chip_appearance_icon_only + + + + 0 + 1 + 2 + + + Text and icon + Text only + Icon only \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 34cf875df..2851161d1 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -162,6 +162,8 @@ @color/black_38 @color/black_100 @color/black_12 + @color/grey_300 + @color/black_87 diff --git a/app/src/main/res/values/keys.xml b/app/src/main/res/values/keys.xml index 2c647ddff..22a1d4926 100644 --- a/app/src/main/res/values/keys.xml +++ b/app/src/main/res/values/keys.xml @@ -288,4 +288,6 @@ show_subtasks wearable_notifications notified_oauth_error_%s_%s + chip_style + chip_appearance diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4f28cf0b5..b9d946eb8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -558,4 +558,9 @@ File %1$s contained %2$s.\n\n Your support means a lot to me, thank you! Back Requires Android %s+ + Chip style + Outlined + Filled + Chips + Chip appearance diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 85be7eb5c..5731d45a4 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -156,18 +156,27 @@ @dimen/chip_min_height false false - @dimen/chip_stroke @android:color/transparent + 5dp + 2dp + 5dp + 4dp + + + -