From 3f002efb53f2431401c2d942633e2285d5ce3843 Mon Sep 17 00:00:00 2001 From: Alinson Xavier Date: Mon, 30 Dec 2019 15:51:06 -0600 Subject: [PATCH] Allow user to change transparency of widgets Closes #376 --- CHANGELOG.md | 3 ++- .../uhabits/widgets/CheckmarkWidgetTest.java | 2 +- .../uhabits/widgets/FrequencyWidgetTest.java | 2 +- .../uhabits/widgets/HistoryWidgetTest.java | 2 +- .../uhabits/widgets/ScoreWidgetTest.java | 2 +- .../uhabits/widgets/StreakWidgetTest.java | 2 +- .../widgets/views/CheckmarkWidgetViewTest.java | 2 +- .../activities/settings/SettingsFragment.java | 11 +++++++++++ .../org/isoron/uhabits/widgets/BaseWidget.java | 5 +++++ .../uhabits/widgets/BaseWidgetProvider.java | 12 +++--------- .../isoron/uhabits/widgets/CheckmarkWidget.kt | 1 + .../isoron/uhabits/widgets/FrequencyWidget.kt | 1 + .../isoron/uhabits/widgets/HistoryWidget.kt | 1 + .../org/isoron/uhabits/widgets/ScoreWidget.kt | 1 + .../org/isoron/uhabits/widgets/StreakWidget.kt | 1 + .../widgets/views/CheckmarkWidgetView.java | 9 --------- .../uhabits/widgets/views/HabitWidgetView.java | 14 ++++++++++---- .../src/main/res/values/constants.xml | 18 ++++++++++++++++++ .../src/main/res/values/strings.xml | 2 ++ .../src/main/res/values/styles.xml | 8 +------- .../src/main/res/xml/preferences.xml | 9 +++++++++ .../uhabits/core/preferences/Preferences.java | 5 +++++ 22 files changed, 77 insertions(+), 36 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a3433006d..eae3575cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,9 +4,10 @@ * New bar chart showing number of repetition per week, month, quarter or year. * Improved calculation of streaks for non-daily habits: performing habits on irregular weekdays will no longer break your streak. -* Automatically switch to dark theme, according to phone settings (Android 10). +* Automatically switch to dark theme according to phone settings (Android 10). * Yes/No buttons on notifications, instead of just "Check". * More color choices. +* Customizable widget opacity. * Significantly smaller backup files. * Many internal code changes improving performance and stability. diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java index e7da51e49..d0b14553b 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/CheckmarkWidgetTest.java @@ -48,7 +48,7 @@ public class CheckmarkWidgetTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); habit = fixtures.createShortHabit(); checkmarks = habit.getCheckmarks(); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java index 7dccac3f2..482d06a32 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/FrequencyWidgetTest.java @@ -42,7 +42,7 @@ public class FrequencyWidgetTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); habit = fixtures.createLongHabit(); FrequencyWidget widget = new FrequencyWidget(targetContext, 0, habit); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java index b6f19b4e9..b0fcea14c 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/HistoryWidgetTest.java @@ -42,7 +42,7 @@ public class HistoryWidgetTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); habit = fixtures.createLongHabit(); HistoryWidget widget = new HistoryWidget(targetContext, 0, habit); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java index fbf79770a..7af5ea3fb 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/ScoreWidgetTest.java @@ -42,7 +42,7 @@ public class ScoreWidgetTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); habit = fixtures.createLongHabit(); ScoreWidget widget = new ScoreWidget(targetContext, 0, habit); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java index 338eceb53..91d0cf696 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/StreakWidgetTest.java @@ -42,7 +42,7 @@ public class StreakWidgetTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); habit = fixtures.createLongHabit(); StreakWidget widget = new StreakWidget(targetContext, 0, habit); diff --git a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java index d117372fa..a40ac45c9 100644 --- a/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java +++ b/android/uhabits-android/src/androidTest/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetViewTest.java @@ -43,7 +43,7 @@ public class CheckmarkWidgetViewTest extends BaseViewTest public void setUp() { super.setUp(); - setTheme(R.style.TransparentWidgetTheme); + setTheme(R.style.WidgetTheme); Habit habit = fixtures.createShortHabit(); view = new CheckmarkWidgetView(targetContext); diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java index 2f9150cab..6d30282b6 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/activities/settings/SettingsFragment.java @@ -26,12 +26,14 @@ import android.os.*; import android.provider.*; import android.support.annotation.*; import android.support.v7.preference.*; +import android.util.*; import org.isoron.uhabits.R; import org.isoron.uhabits.*; import org.isoron.uhabits.core.preferences.*; import org.isoron.uhabits.core.ui.*; import org.isoron.uhabits.notifications.*; +import org.isoron.uhabits.widgets.*; import static android.media.RingtoneManager.*; import static android.os.Build.VERSION.*; @@ -49,6 +51,9 @@ public class SettingsFragment extends PreferenceFragmentCompat @Nullable private Preferences prefs; + @Nullable + private WidgetUpdater widgetUpdater; + @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { @@ -73,6 +78,7 @@ public class SettingsFragment extends PreferenceFragmentCompat { HabitsApplication app = (HabitsApplication) appContext; prefs = app.getComponent().getPreferences(); + widgetUpdater = app.getComponent().getWidgetUpdater(); } setResultOnPreferenceClick("importData", RESULT_IMPORT_DATA); @@ -152,6 +158,11 @@ public class SettingsFragment extends PreferenceFragmentCompat public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { + if (key.equals("pref_widget_opacity") && widgetUpdater != null) + { + Log.d("SettingsFragment", "updating widgets"); + widgetUpdater.updateWidgets(); + } BackupManager.dataChanged("org.isoron.uhabits"); updateSync(); } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java index af99d4a3a..3ada71b50 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidget.java @@ -23,6 +23,7 @@ import android.app.*; import android.content.*; import android.graphics.*; import android.support.annotation.*; +import android.util.*; import android.view.*; import android.widget.*; @@ -201,4 +202,8 @@ public abstract class BaseWidget view.measure(specWidth, specHeight); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); } + + protected int getPreferedBackgroundAlpha() { + return prefs.getWidgetOpacity(); + } } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java index edd2ce29f..a4e9bc5da 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/BaseWidgetProvider.java @@ -23,6 +23,7 @@ import android.appwidget.*; import android.content.*; import android.os.*; import android.support.annotation.*; +import android.util.*; import android.widget.*; import org.isoron.uhabits.*; @@ -77,9 +78,8 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider if (context == null) throw new RuntimeException("context is null"); if (manager == null) throw new RuntimeException("manager is null"); if (options == null) throw new RuntimeException("options is null"); - context.setTheme(R.style.OpaqueWidgetTheme); - updateDependencies(context); + context.setTheme(R.style.WidgetTheme); BaseWidget widget = getWidgetFromId(context, widgetId); WidgetDimensions dims = getDimensionsFromOptions(context, options); @@ -124,12 +124,7 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider if (manager == null) throw new RuntimeException("manager is null"); if (widgetIds == null) throw new RuntimeException("widgetIds is null"); updateDependencies(context); - - if(preferences.isWidgetStackEnabled()) { - context.setTheme(R.style.OpaqueWidgetTheme); - } else { - context.setTheme(R.style.TransparentWidgetTheme); - } + context.setTheme(R.style.WidgetTheme); new Thread(() -> { @@ -183,7 +178,6 @@ public abstract class BaseWidgetProvider extends AppWidgetProvider BaseWidget widget = getWidgetFromId(context, widgetId); Bundle options = manager.getAppWidgetOptions(widgetId); widget.setDimensions(getDimensionsFromOptions(context, options)); - updateAppWidget(manager, widget); } catch (RuntimeException e) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt index 53316ad9c..ad159eab6 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/CheckmarkWidget.kt @@ -36,6 +36,7 @@ class CheckmarkWidget( override fun refreshData(v: View) { (v as CheckmarkWidgetView).apply { + setBackgroundAlpha(preferedBackgroundAlpha) setPercentage(habit.scores.todayValue.toFloat()) setActiveColor(PaletteUtils.getColor(context, habit.color)) setName(habit.name) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt index 5516f2bc9..976783b0e 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/FrequencyWidget.kt @@ -38,6 +38,7 @@ class FrequencyWidget( override fun refreshData(v: View) { val widgetView = v as GraphWidgetView widgetView.setTitle(habit.name) + widgetView.setBackgroundAlpha(preferedBackgroundAlpha) (widgetView.dataView as FrequencyChart).apply { setColor(PaletteUtils.getColor(context, habit.color)) setFrequency(habit.repetitions.weekdayFrequency) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt index b9f4df952..621df2a4d 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/HistoryWidget.kt @@ -39,6 +39,7 @@ class HistoryWidget( override fun refreshData(view: View) { val widgetView = view as GraphWidgetView + widgetView.setBackgroundAlpha(preferedBackgroundAlpha) (widgetView.dataView as HistoryChart).apply { setColor(PaletteUtils.getColor(context, habit.color)) setCheckmarks(habit.checkmarks.allValues) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt index 54ddabaa1..42083a353 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/ScoreWidget.kt @@ -44,6 +44,7 @@ class ScoreWidget( } val widgetView = view as GraphWidgetView + widgetView.setBackgroundAlpha(preferedBackgroundAlpha) (widgetView.dataView as ScoreChart).apply { setIsTransparencyEnabled(true) setBucketSize(size) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt index f8795e297..73d823c31 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/StreakWidget.kt @@ -39,6 +39,7 @@ class StreakWidget( override fun refreshData(view: View) { val widgetView = view as GraphWidgetView + widgetView.setBackgroundAlpha(preferedBackgroundAlpha) (widgetView.dataView as StreakChart).apply { setColor(PaletteUtils.getColor(context, habit.color)) setStreaks(habit.streaks.getBest(maxStreakCount)) diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java index a7dcdd82b..b22b515a0 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/CheckmarkWidgetView.java @@ -75,10 +75,7 @@ public class CheckmarkWidgetView extends HabitWidgetView text = getResources().getString(R.string.fa_check); bgColor = activeColor; fgColor = res.getColor(R.attr.highContrastReverseTextColor); - setShadowAlpha(0x4f); - rebuildBackground(); - backgroundPaint.setColor(bgColor); frame.setBackgroundDrawable(background); break; @@ -87,10 +84,7 @@ public class CheckmarkWidgetView extends HabitWidgetView text = getResources().getString(R.string.fa_check); bgColor = res.getColor(R.attr.cardBgColor); fgColor = res.getColor(R.attr.mediumContrastTextColor); - setShadowAlpha(0x00); - rebuildBackground(); - break; case Checkmark.UNCHECKED: @@ -98,10 +92,7 @@ public class CheckmarkWidgetView extends HabitWidgetView text = getResources().getString(R.string.fa_times); bgColor = res.getColor(R.attr.cardBgColor); fgColor = res.getColor(R.attr.mediumContrastTextColor); - setShadowAlpha(0x00); - rebuildBackground(); - break; } diff --git a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java index 034a469d0..2601192fc 100644 --- a/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java +++ b/android/uhabits-android/src/main/java/org/isoron/uhabits/widgets/views/HabitWidgetView.java @@ -49,6 +49,8 @@ public abstract class HabitWidgetView extends FrameLayout private StyledResources res; + private int backgroundAlpha; + public HabitWidgetView(Context context) { super(context); @@ -64,19 +66,23 @@ public abstract class HabitWidgetView extends FrameLayout public void setShadowAlpha(int shadowAlpha) { this.shadowAlpha = shadowAlpha; + rebuildBackground(); + } + + public void setBackgroundAlpha(int backgroundAlpha) + { + this.backgroundAlpha = backgroundAlpha; + rebuildBackground(); } protected abstract @NonNull Integer getInnerLayoutId(); - protected void rebuildBackground() + public void rebuildBackground() { Context context = getContext(); - int backgroundAlpha = - (int) (255 * res.getFloat(R.attr.widgetBackgroundAlpha)); - int shadowRadius = (int) dpToPixels(context, 2); int shadowOffset = (int) dpToPixels(context, 1); int shadowColor = Color.argb(shadowAlpha, 0, 0, 0); diff --git a/android/uhabits-android/src/main/res/values/constants.xml b/android/uhabits-android/src/main/res/values/constants.xml index 97ea9d75f..ebb658dac 100644 --- a/android/uhabits-android/src/main/res/values/constants.xml +++ b/android/uhabits-android/src/main/res/values/constants.xml @@ -128,4 +128,22 @@ 15 100 + + + 100% + 80% + 60% + 40% + 20% + 0% + + + + 255 + 204 + 153 + 102 + 51 + 0 + \ No newline at end of file diff --git a/android/uhabits-android/src/main/res/values/strings.xml b/android/uhabits-android/src/main/res/values/strings.xml index e98fd300e..977228906 100644 --- a/android/uhabits-android/src/main/res/values/strings.xml +++ b/android/uhabits-android/src/main/res/values/strings.xml @@ -239,5 +239,7 @@ View privacy policy View all contributors… Database + Widget opacity + Makes widgets more transparent or more opaque in your home screen. \ No newline at end of file diff --git a/android/uhabits-android/src/main/res/values/styles.xml b/android/uhabits-android/src/main/res/values/styles.xml index 9b3df185b..0e7b5a5a0 100644 --- a/android/uhabits-android/src/main/res/values/styles.xml +++ b/android/uhabits-android/src/main/res/values/styles.xml @@ -141,7 +141,7 @@ @color/black - - -