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
-
-
-
diff --git a/android/uhabits-android/src/main/res/xml/preferences.xml b/android/uhabits-android/src/main/res/xml/preferences.xml
index 3251fe4c8..ecb67d30e 100644
--- a/android/uhabits-android/src/main/res/xml/preferences.xml
+++ b/android/uhabits-android/src/main/res/xml/preferences.xml
@@ -43,6 +43,15 @@
android:summary="@string/pure_black_description"
android:title="@string/use_pure_black"/>
+
+