diff --git a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java index 49368f3d8..1cdf61dba 100644 --- a/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java +++ b/src/main/java/com/todoroo/astrid/activity/TaskListActivity.java @@ -11,6 +11,7 @@ import android.app.FragmentTransaction; import android.content.ContentValues; import android.content.Intent; import android.content.IntentFilter; +import android.content.res.Configuration; import android.os.Bundle; import android.provider.Settings; import android.support.design.widget.Snackbar; @@ -111,6 +112,7 @@ public class TaskListActivity extends InjectingAppCompatActivity implements public static final String OPEN_FILTER = "open_filter"; //$NON-NLS-1$ public static final String LOAD_FILTER = "load_filter"; public static final String OPEN_TASK = "open_task"; //$NON-NLS-1$ + private int currentNightMode; private Filter filter; @@ -121,7 +123,9 @@ public class TaskListActivity extends InjectingAppCompatActivity implements protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - theme.applyTheme(this); + theme.applyTheme(this, getDelegate()); + + currentNightMode = getNightMode(); startupService.onStartupApplication(this); @@ -234,6 +238,12 @@ public class TaskListActivity extends InjectingAppCompatActivity implements protected void onResume() { super.onResume(); + getDelegate().applyDayNight(); + if (currentNightMode != getNightMode()) { + recreate(); + return; + } + registerReceiver( repeatConfirmationReceiver, new IntentFilter(AstridApiConstants.BROADCAST_EVENT_TASK_REPEATED)); @@ -261,6 +271,10 @@ public class TaskListActivity extends InjectingAppCompatActivity implements } } + private int getNightMode() { + return getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK; + } + @Override public void inject(ActivityComponent component) { component.inject(this); diff --git a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java index 1e4766f7c..2b2cdb859 100644 --- a/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java +++ b/src/main/java/com/todoroo/astrid/ui/HideUntilControlSet.java @@ -102,14 +102,14 @@ public class HideUntilControlSet extends TaskEditControlFragment implements OnIt if (value.setting == Task.HIDE_UNTIL_NONE) { clearButton.setVisibility(View.GONE); tv.setText(value.label); - tv.setTextColor(getContext().getColor(R.color.text_tertiary)); + tv.setTextColor(getContext().getResources().getColor(R.color.text_tertiary)); } else { String display = value.label; if (value.setting != Task.HIDE_UNTIL_SPECIFIC_DAY && value.setting != Task.HIDE_UNTIL_SPECIFIC_DAY_TIME) { display = display.toLowerCase(); } tv.setText(getString(R.string.TEA_hideUntil_display, display)); - tv.setTextColor(getContext().getColor(R.color.text_primary)); + tv.setTextColor(getContext().getResources().getColor(R.color.text_primary)); } return tv; } diff --git a/src/main/java/org/tasks/Tasks.java b/src/main/java/org/tasks/Tasks.java index eaec5b4cb..70c64a051 100644 --- a/src/main/java/org/tasks/Tasks.java +++ b/src/main/java/org/tasks/Tasks.java @@ -48,7 +48,7 @@ public class Tasks extends InjectingApplication { tracker.setTrackingEnabled(preferences.isTrackingEnabled()); - themeCache.getThemeBase(preferences.getInt(R.string.p_theme, 0)).applyDayNightMode(); + themeCache.getThemeBase(preferences.getInt(R.string.p_theme, 0)).setDefaultNightMode(); } @Override diff --git a/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java b/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java index a12b666ba..9671d039e 100644 --- a/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java +++ b/src/main/java/org/tasks/activities/DateAndTimePickerActivity.java @@ -49,7 +49,7 @@ public class DateAndTimePickerActivity extends InjectingAppCompatActivity implem if (datePickerDialog == null) { datePickerDialog = new MyDatePickerDialog(); datePickerDialog.initialize(null, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth()); - datePickerDialog.setThemeDark(themeBase.isDarkTheme()); + datePickerDialog.setThemeDark(themeBase.isDarkTheme(this)); datePickerDialog.setAccentColor(themeAccent.getAccentColor()); datePickerDialog.show(fragmentManager, FRAG_TAG_DATE_PICKER); } diff --git a/src/main/java/org/tasks/activities/DatePickerActivity.java b/src/main/java/org/tasks/activities/DatePickerActivity.java index b2db9ce62..4d458f1b7 100644 --- a/src/main/java/org/tasks/activities/DatePickerActivity.java +++ b/src/main/java/org/tasks/activities/DatePickerActivity.java @@ -40,7 +40,7 @@ public class DatePickerActivity extends InjectingAppCompatActivity if (dialog == null) { dialog = new MyDatePickerDialog(); dialog.initialize(null, initial.getYear(), initial.getMonthOfYear() - 1, initial.getDayOfMonth()); - dialog.setThemeDark(themeBase.isDarkTheme()); + dialog.setThemeDark(themeBase.isDarkTheme(this)); dialog.setAccentColor(themeAccent.getAccentColor()); dialog.show(fragmentManager, FRAG_TAG_DATE_PICKER); } diff --git a/src/main/java/org/tasks/activities/TimePickerActivity.java b/src/main/java/org/tasks/activities/TimePickerActivity.java index eee5020ac..71fe36bef 100644 --- a/src/main/java/org/tasks/activities/TimePickerActivity.java +++ b/src/main/java/org/tasks/activities/TimePickerActivity.java @@ -44,7 +44,7 @@ public class TimePickerActivity extends InjectingAppCompatActivity implements Ti if (dialog == null) { dialog = new MyTimePickerDialog(); dialog.initialize(null, initial.getHourOfDay(), initial.getMinuteOfHour(), 0, DateFormat.is24HourFormat(this)); - dialog.setThemeDark(themeBase.isDarkTheme()); + dialog.setThemeDark(themeBase.isDarkTheme(this)); dialog.setAccentColor(themeAccent.getAccentColor()); dialog.show(fragmentManager, FRAG_TAG_TIME_PICKER); } diff --git a/src/main/java/org/tasks/dialogs/DialogBuilder.java b/src/main/java/org/tasks/dialogs/DialogBuilder.java index d5fa5eb5d..ab53e49cb 100644 --- a/src/main/java/org/tasks/dialogs/DialogBuilder.java +++ b/src/main/java/org/tasks/dialogs/DialogBuilder.java @@ -37,7 +37,7 @@ public class DialogBuilder { } public ProgressDialog newProgressDialog() { - ProgressDialog progressDialog = new ProgressDialog(activity, theme.getDialogStyle()); + ProgressDialog progressDialog = new ProgressDialog(activity, theme.getThemeBase().getDialogStyle()); theme.applyToContext(progressDialog.getContext()); if (AndroidUtilities.preLollipop()) { progressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.R.color.transparent)); diff --git a/src/main/java/org/tasks/files/MyFilePickerActivity.java b/src/main/java/org/tasks/files/MyFilePickerActivity.java index 427472339..db6d93042 100644 --- a/src/main/java/org/tasks/files/MyFilePickerActivity.java +++ b/src/main/java/org/tasks/files/MyFilePickerActivity.java @@ -22,7 +22,7 @@ public class MyFilePickerActivity extends FilePickerActivity { .getComponent() .plus(new ActivityModule(this)) .inject(this); - theme.applyThemeAndStatusBarColor(this); + theme.applyThemeAndStatusBarColor(this, getDelegate()); setTitle(null); super.onCreate(savedInstanceState); } diff --git a/src/main/java/org/tasks/injection/InjectingPreferenceActivity.java b/src/main/java/org/tasks/injection/InjectingPreferenceActivity.java index db6f64b78..99cce9bd2 100644 --- a/src/main/java/org/tasks/injection/InjectingPreferenceActivity.java +++ b/src/main/java/org/tasks/injection/InjectingPreferenceActivity.java @@ -42,7 +42,7 @@ public abstract class InjectingPreferenceActivity extends AppCompatPreferenceAct .plus(new ActivityModule(this)); inject(activityComponent); - theme.applyThemeAndStatusBarColor(this); + theme.applyThemeAndStatusBarColor(this, getDelegate()); super.onCreate(savedInstanceState); diff --git a/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java b/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java index 0f88ffbdd..1d23ea7f9 100644 --- a/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java +++ b/src/main/java/org/tasks/injection/ThemedInjectingAppCompatActivity.java @@ -14,6 +14,6 @@ public abstract class ThemedInjectingAppCompatActivity extends InjectingAppCompa protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - theme.applyThemeAndStatusBarColor(this); + theme.applyThemeAndStatusBarColor(this, getDelegate()); } } diff --git a/src/main/java/org/tasks/preferences/AppCompatPreferenceActivity.java b/src/main/java/org/tasks/preferences/AppCompatPreferenceActivity.java index 20864c968..a223430e8 100644 --- a/src/main/java/org/tasks/preferences/AppCompatPreferenceActivity.java +++ b/src/main/java/org/tasks/preferences/AppCompatPreferenceActivity.java @@ -42,7 +42,6 @@ public abstract class AppCompatPreferenceActivity extends PreferenceActivity { protected void onCreate(Bundle savedInstanceState) { getDelegate().installViewFactory(); getDelegate().onCreate(savedInstanceState); - getDelegate().applyDayNight(); super.onCreate(savedInstanceState); } diff --git a/src/main/java/org/tasks/preferences/BaseBasicPreferences.java b/src/main/java/org/tasks/preferences/BaseBasicPreferences.java index e3a1e3d9e..c4d37fabd 100644 --- a/src/main/java/org/tasks/preferences/BaseBasicPreferences.java +++ b/src/main/java/org/tasks/preferences/BaseBasicPreferences.java @@ -4,7 +4,6 @@ import android.app.Activity; import android.app.FragmentManager; import android.content.DialogInterface; import android.content.Intent; -import android.content.res.Configuration; import android.os.Bundle; import android.preference.Preference; @@ -176,8 +175,7 @@ public abstract class BaseBasicPreferences extends InjectingPreferenceActivity i switch (palette) { case THEMES: preferences.setInt(R.string.p_theme, index); - themeBase = themeCache.getThemeBase(index); - themeBase.applyDayNightMode(getDelegate()); + themeCache.getThemeBase(index).setDefaultNightMode(); tracker.reportEvent(Tracking.Events.SET_THEME, Integer.toString(index)); break; case COLORS: diff --git a/src/main/java/org/tasks/themes/Theme.java b/src/main/java/org/tasks/themes/Theme.java index 3ad1d5f63..182adf657 100644 --- a/src/main/java/org/tasks/themes/Theme.java +++ b/src/main/java/org/tasks/themes/Theme.java @@ -4,6 +4,7 @@ import android.app.Activity; import android.content.Context; import android.content.res.Resources; import android.graphics.PixelFormat; +import android.support.v7.app.AppCompatDelegate; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; @@ -35,25 +36,22 @@ public class Theme { return themeColor; } - public int getDialogStyle() { - return R.style.TasksDialog; - } - public LayoutInflater getLayoutInflater(Context context) { return (LayoutInflater) wrap(context).getSystemService(Context.LAYOUT_INFLATER_SERVICE); } public ContextThemeWrapper getThemedDialog(Context context) { - return new ContextThemeWrapper(context, getDialogStyle()); + return new ContextThemeWrapper(context, themeBase.getDialogStyle()); } - public void applyThemeAndStatusBarColor(Activity activity) { - applyTheme(activity); + public void applyThemeAndStatusBarColor(Activity activity, AppCompatDelegate delegate) { + applyTheme(activity, delegate); themeColor.applyStatusBarColor(activity); themeColor.applyTaskDescription(activity, activity.getString(R.string.app_name)); } - public void applyTheme(Activity activity) { + public void applyTheme(Activity activity, AppCompatDelegate delegate) { + delegate.applyDayNight(); themeBase.set(activity); applyToContext(activity); activity.getWindow().setFormat(PixelFormat.RGBA_8888); diff --git a/src/main/java/org/tasks/themes/ThemeBase.java b/src/main/java/org/tasks/themes/ThemeBase.java index 4fceffabb..fbd432996 100644 --- a/src/main/java/org/tasks/themes/ThemeBase.java +++ b/src/main/java/org/tasks/themes/ThemeBase.java @@ -2,6 +2,7 @@ package org.tasks.themes; import android.app.Activity; import android.content.Context; +import android.content.res.Configuration; import android.support.v7.app.AppCompatDelegate; import android.view.ContextThemeWrapper; @@ -23,12 +24,16 @@ public class ThemeBase { private final int contentBackground; private final int dayNightMode; - public ThemeBase(String name, int index, int dayNightMode) { + public ThemeBase(String name, int index, int contentBackground, int dayNightMode) { this.name = name; this.index = index; this.dayNightMode = dayNightMode; this.style = THEMES[index]; - this.contentBackground = 0; + this.contentBackground = contentBackground; + } + + public int getDialogStyle() { + return R.style.TasksDialog; } public String getName() { @@ -43,8 +48,10 @@ public class ThemeBase { return contentBackground; } - public boolean isDarkTheme() { - return index > 0; + public boolean isDarkTheme(Activity activity) { + return index == 4 + ? Configuration.UI_MODE_NIGHT_YES == (activity.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) + : index > 0; } public ContextThemeWrapper wrap(Context context) { @@ -55,12 +62,7 @@ public class ThemeBase { activity.setTheme(style); } - public void applyDayNightMode() { + public void setDefaultNightMode() { AppCompatDelegate.setDefaultNightMode(dayNightMode); } - - public void applyDayNightMode(AppCompatDelegate delegate) { - applyDayNightMode(); - delegate.setLocalNightMode(dayNightMode); - } } diff --git a/src/main/java/org/tasks/themes/ThemeCache.java b/src/main/java/org/tasks/themes/ThemeCache.java index 0f9bbae98..61f194bcd 100644 --- a/src/main/java/org/tasks/themes/ThemeCache.java +++ b/src/main/java/org/tasks/themes/ThemeCache.java @@ -22,11 +22,11 @@ public class ThemeCache { public ThemeCache(Context context) { Resources resources = context.getResources(); - themes.add(new ThemeBase(context.getString(R.string.theme_light), 0, AppCompatDelegate.MODE_NIGHT_NO)); - themes.add(new ThemeBase(context.getString(R.string.theme_black), 1, AppCompatDelegate.MODE_NIGHT_YES)); - themes.add(new ThemeBase(context.getString(R.string.theme_dark), 2, AppCompatDelegate.MODE_NIGHT_YES)); - themes.add(new ThemeBase(context.getString(R.string.theme_wallpaper), 3, AppCompatDelegate.MODE_NIGHT_YES)); - themes.add(new ThemeBase(context.getString(R.string.theme_day_night), 4, AppCompatDelegate.MODE_NIGHT_AUTO)); + themes.add(new ThemeBase(context.getString(R.string.theme_light), 0, resources.getColor(R.color.md_background_light), AppCompatDelegate.MODE_NIGHT_NO)); + themes.add(new ThemeBase(context.getString(R.string.theme_black), 1, resources.getColor(R.color.widget_background_black), AppCompatDelegate.MODE_NIGHT_YES)); + themes.add(new ThemeBase(context.getString(R.string.theme_dark), 2, resources.getColor(R.color.md_background_dark), AppCompatDelegate.MODE_NIGHT_YES)); + themes.add(new ThemeBase(context.getString(R.string.theme_wallpaper), 3, resources.getColor(R.color.black_38), AppCompatDelegate.MODE_NIGHT_YES)); + themes.add(new ThemeBase(context.getString(R.string.theme_day_night), 4, resources.getColor(R.color.md_background_light), AppCompatDelegate.MODE_NIGHT_AUTO)); String[] colorNames = resources.getStringArray(R.array.colors); for (int i = 0 ; i < ThemeColor.COLORS.length ; i++) { diff --git a/src/main/java/org/tasks/themes/WidgetTheme.java b/src/main/java/org/tasks/themes/WidgetTheme.java index ee6b99d58..71d2fea83 100644 --- a/src/main/java/org/tasks/themes/WidgetTheme.java +++ b/src/main/java/org/tasks/themes/WidgetTheme.java @@ -4,9 +4,9 @@ import org.tasks.R; public class WidgetTheme { public static final int[] BACKGROUNDS = new int[] { - R.color.widget_background_light, + R.color.md_background_light, R.color.widget_background_black, - R.color.widget_background_dark + R.color.md_background_dark }; private final String name; private final int index; diff --git a/src/main/res/values-night/colors.xml b/src/main/res/values-night/colors.xml index 1c93690a1..6aaf111bc 100644 --- a/src/main/res/values-night/colors.xml +++ b/src/main/res/values-night/colors.xml @@ -1,12 +1,12 @@ - #303030 - #424242 - #ffffff - #303030 - #202020 - #ffffffff - #b3ffffff - #80ffffff - #1fffffff + @color/md_background_dark + @color/md_background_dark_dialog + @color/icon_tint_dark + @color/drawer_background_dark + @color/drawer_background_dark_selected + @color/white_100 + @color/white_70 + @color/white_50 + @color/white_12 \ No newline at end of file diff --git a/src/main/res/values-notnight/colors.xml b/src/main/res/values-notnight/colors.xml new file mode 100644 index 000000000..5836559e7 --- /dev/null +++ b/src/main/res/values-notnight/colors.xml @@ -0,0 +1,12 @@ + + + @color/md_background_light + @color/md_background_light_dialog + @color/icon_tint_light + @color/drawer_background_light + @color/drawer_background_light_selected + @color/black_87 + @color/black_54 + @color/black_38 + @color/black_12 + \ No newline at end of file diff --git a/src/main/res/values/colors.xml b/src/main/res/values/colors.xml index 494bee9d1..5abf3534e 100644 --- a/src/main/res/values/colors.xml +++ b/src/main/res/values/colors.xml @@ -90,28 +90,28 @@ #ff777777 #888888 - #fafafa - #ffffff - #000000 - #de000000 - #8a000000 - #61000000 - #1f000000 - - #de000000 - #8a000000 - #61000000 - - #ffffffff - #b3ffffff - #80ffffff - - #fafafa + #de000000 + #8a000000 + #61000000 + #1f000000 + + #ffffffff + #b3ffffff + #80ffffff + #1fffffff + + #fafafa + #ffffff + #303030 + #424242 #000000 - #303030 + @android:color/black + @android:color/white - #f9f9f9 - #e8e8e8 + #f9f9f9 + #e8e8e8 + #303030 + #202020 @color/red_500 @color/amber_500