diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt index 31e982745..96305af66 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsActivity.kt @@ -75,8 +75,12 @@ class ListHabitsActivity : AppCompatActivity(), Preferences.Listener { private lateinit var menu: ListHabitsMenu override fun onQuestionMarksChanged() { - invalidateOptionsMenu() - menu.behavior.onPreferencesChanged() + if (prefs.greyCompleted) { + restartWithFade(this::class.java) + } else { + invalidateOptionsMenu() + menu.behavior.onPreferencesChanged() + } } override fun onCreate(savedInstanceState: Bundle?) { diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt index 59a31c6d6..653503805 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/ListHabitsMenu.kt @@ -49,13 +49,17 @@ class ListHabitsMenu @Inject constructor( val nightModeItem = menu.findItem(R.id.actionToggleNightMode) val hideArchivedItem = menu.findItem(R.id.actionHideArchived) val hideCompletedItem = menu.findItem(R.id.actionHideCompleted) + val greyCompletedItem = menu.findItem(R.id.actionGreyCompleted) nightModeItem.isChecked = themeSwitcher.isNightMode hideArchivedItem.isChecked = !preferences.showArchived hideCompletedItem.isChecked = !preferences.showCompleted + greyCompletedItem.isChecked = preferences.greyCompleted if (preferences.areQuestionMarksEnabled || preferences.isSkipEnabled) { hideCompletedItem.title = activity.resources.getString(R.string.hide_entered) + greyCompletedItem.title = activity.resources.getString(R.string.grey_entered) } else { hideCompletedItem.title = activity.resources.getString(R.string.hide_completed) + greyCompletedItem.title = activity.resources.getString(R.string.grey_completed) } updateArrows(menu) } @@ -121,6 +125,12 @@ class ListHabitsMenu @Inject constructor( return true } + R.id.actionGreyCompleted -> { + behavior.onToggleGreyCompleted() + activity.invalidateOptionsMenu() + return true + } + R.id.actionSortColor -> { behavior.onSortByColor() return true diff --git a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt index 664044401..3d25cb3a8 100644 --- a/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt +++ b/uhabits-android/src/main/java/org/isoron/uhabits/activities/habits/list/views/HabitCardView.kt @@ -35,14 +35,17 @@ import android.widget.FrameLayout import android.widget.LinearLayout import android.widget.TextView import org.isoron.platform.gui.toInt +import org.isoron.uhabits.HabitsApplication import org.isoron.uhabits.R import org.isoron.uhabits.activities.common.views.RingView import org.isoron.uhabits.core.models.Habit import org.isoron.uhabits.core.models.ModelObservable import org.isoron.uhabits.core.models.Timestamp +import org.isoron.uhabits.core.preferences.Preferences import org.isoron.uhabits.core.ui.screens.habits.list.ListHabitsBehavior import org.isoron.uhabits.core.utils.DateUtils import org.isoron.uhabits.inject.ActivityContext +import org.isoron.uhabits.inject.HabitsApplicationComponent import org.isoron.uhabits.utils.currentTheme import org.isoron.uhabits.utils.dp import org.isoron.uhabits.utils.sres @@ -123,7 +126,12 @@ class HabitCardView( numberPanel.notes = values } + private val appComponent: HabitsApplicationComponent = + (context.applicationContext as HabitsApplication).component + private val prefs: Preferences = appComponent.preferences + var checkmarkPanel: CheckmarkPanelView + private var numberPanel: NumberPanelView private var innerFrame: LinearLayout private var label: TextView @@ -265,10 +273,19 @@ class HabitCardView( private fun copyAttributesFrom(h: Habit) { fun getActiveColor(habit: Habit): Int { - return when (habit.isArchived) { - true -> sres.getColor(R.attr.contrast60) - false -> currentTheme().color(habit.color).toInt() + var retCol: Int = currentTheme().color(habit.color).toInt() + + if (habit.isArchived) { + retCol = sres.getColor(R.attr.contrast60) + } else if (prefs.greyCompleted) { + if (prefs.areQuestionMarksEnabled && habit.isEnteredToday()) { + retCol = sres.getColor(R.attr.contrast40) + } else if (!prefs.areQuestionMarksEnabled && habit.isCompletedToday()) { + retCol = sres.getColor(R.attr.contrast40) + } } + + return retCol } val c = getActiveColor(h) diff --git a/uhabits-android/src/main/res/menu/list_habits.xml b/uhabits-android/src/main/res/menu/list_habits.xml index caf875e67..c25576cc7 100644 --- a/uhabits-android/src/main/res/menu/list_habits.xml +++ b/uhabits-android/src/main/res/menu/list_habits.xml @@ -48,6 +48,12 @@ android:enabled="true" android:title="@string/hide_completed"/> + + None Filter Hide completed + Grey completed Hide entered + Grey entered Hide archived Make notifications sticky Prevents notifications from being swiped away. diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.kt index 491790c82..ed3ea219f 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/preferences/Preferences.kt @@ -101,6 +101,11 @@ open class Preferences(private val storage: Storage) { set(showCompleted) { storage.putBoolean("pref_show_completed", showCompleted) } + var greyCompleted: Boolean + get() = storage.getBoolean("pref_grey_completed", false) + set(greyCompleted) { + storage.putBoolean("pref_grey_completed", greyCompleted) + } var theme: Int get() = storage.getInt("pref_theme", ThemeSwitcher.THEME_AUTOMATIC) diff --git a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt index 42d5dea14..5e186dc70 100644 --- a/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt +++ b/uhabits-core/src/jvmMain/java/org/isoron/uhabits/core/ui/screens/habits/list/ListHabitsMenuBehavior.kt @@ -31,6 +31,7 @@ class ListHabitsMenuBehavior @Inject constructor( private val themeSwitcher: ThemeSwitcher ) { private var showCompleted: Boolean + private var greyCompleted: Boolean private var showArchived: Boolean fun onCreateHabit() { @@ -61,6 +62,12 @@ class ListHabitsMenuBehavior @Inject constructor( updateAdapterFilter() } + fun onToggleGreyCompleted() { + greyCompleted = !greyCompleted + preferences.greyCompleted = greyCompleted + screen.applyTheme() + } + fun onSortByManually() { adapter.primaryOrder = HabitList.Order.BY_POSITION } @@ -137,6 +144,7 @@ class ListHabitsMenuBehavior @Inject constructor( init { showCompleted = preferences.showCompleted + greyCompleted = preferences.greyCompleted showArchived = preferences.showArchived updateAdapterFilter() } diff --git a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.kt b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.kt index 6c3a4cfce..0439a3358 100644 --- a/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.kt +++ b/uhabits-core/src/jvmTest/java/org/isoron/uhabits/core/preferences/PreferencesTest.kt @@ -156,10 +156,13 @@ class PreferencesTest : BaseUnitTest() { fun testFiltering() { assertFalse(prefs.showArchived) assertTrue(prefs.showCompleted) + assertFalse(prefs.greyCompleted) prefs.showArchived = true prefs.showCompleted = false + prefs.greyCompleted = true assertTrue(prefs.showArchived) assertFalse(prefs.showCompleted) + assertTrue(prefs.greyCompleted) } @Test