diff --git a/src/main/java/com/nextcloud/client/preferences/AppPreferences.java b/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
index 5c6d9107a6ef..241a7ec03254 100644
--- a/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
+++ b/src/main/java/com/nextcloud/client/preferences/AppPreferences.java
@@ -39,7 +39,7 @@ public interface AppPreferences {
* events.
*/
interface Listener {
- default void onDarkThemeEnabledChanged(boolean enabled) {
+ default void onDarkThemeModeChanged(DarkMode mode) {
/* default empty implementation */
};
}
@@ -274,18 +274,18 @@ default void onDarkThemeEnabledChanged(boolean enabled) {
int getUploaderBehaviour();
/**
- * Enable dark theme.
+ * Changes dark theme mode
*
* This is reactive property. Listeners will be invoked if registered.
*
- * @param enabled true to turn dark theme on, false to turn it off
+ * @param mode dark mode setting: on, off, system
*/
- void setDarkThemeEnabled(boolean enabled);
+ void setDarkThemeMode(DarkMode mode);
/**
- * @return true if application uses dark UI theme, false otherwise
+ * @return dark mode setting: on, off, system
*/
- boolean isDarkThemeEnabled();
+ DarkMode getDarkThemeMode();
/**
* Saves the uploader behavior which the user has set last.
diff --git a/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java b/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
index 60867fabf047..a231116b182a 100644
--- a/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
+++ b/src/main/java/com/nextcloud/client/preferences/AppPreferencesImpl.java
@@ -21,7 +21,6 @@
package com.nextcloud.client.preferences;
-import android.accounts.Account;
import android.annotation.SuppressLint;
import android.content.Context;
import android.content.SharedPreferences;
@@ -57,6 +56,7 @@ public final class AppPreferencesImpl implements AppPreferences {
*/
public static final String AUTO_PREF__LAST_SEEN_VERSION_CODE = "lastSeenVersionCode";
public static final String STORAGE_PATH = "storage_path";
+ public static final String PREF__DARK_THEME = "dark_theme_mode";
public static final float DEFAULT_GRID_COLUMN = 4.0f;
private static final String AUTO_PREF__LAST_UPLOAD_PATH = "last_upload_path";
@@ -79,7 +79,6 @@ public final class AppPreferencesImpl implements AppPreferences {
private static final String PREF__AUTO_UPLOAD_INIT = "autoUploadInit";
private static final String PREF__FOLDER_SORT_ORDER = "folder_sort_order";
private static final String PREF__FOLDER_LAYOUT = "folder_layout";
- static final String PREF__DARK_THEME_ENABLED = "dark_theme_enabled";
private static final String PREF__LOCK_TIMESTAMP = "lock_timestamp";
private static final String PREF__SHOW_MEDIA_SCAN_NOTIFICATIONS = "show_media_scan_notifications";
@@ -121,10 +120,10 @@ void remove(@Nullable final Listener listener) {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
- if(PREF__DARK_THEME_ENABLED.equals(key)) {
- boolean enabled = preferences.isDarkThemeEnabled();
+ if (PREF__DARK_THEME.equals(key)) {
+ DarkMode mode = preferences.getDarkThemeMode();
for(Listener l : listeners) {
- l.onDarkThemeEnabledChanged(enabled);
+ l.onDarkThemeModeChanged(mode);
}
}
}
@@ -408,13 +407,18 @@ public int getUploaderBehaviour() {
}
@Override
- public void setDarkThemeEnabled(boolean enabled) {
- preferences.edit().putBoolean(PREF__DARK_THEME_ENABLED, enabled).apply();
+ public void setDarkThemeMode(DarkMode mode) {
+ preferences.edit().putString(PREF__DARK_THEME, mode.name()).apply();
}
@Override
- public boolean isDarkThemeEnabled() {
- return preferences.getBoolean(PREF__DARK_THEME_ENABLED, false);
+ public DarkMode getDarkThemeMode() {
+ try {
+ return DarkMode.valueOf(preferences.getString(PREF__DARK_THEME, DarkMode.LIGHT.name()));
+ } catch (ClassCastException e) {
+ preferences.edit().putString(PREF__DARK_THEME, DarkMode.LIGHT.name()).apply();
+ return DarkMode.DARK;
+ }
}
@Override
diff --git a/src/main/java/com/nextcloud/client/preferences/DarkMode.java b/src/main/java/com/nextcloud/client/preferences/DarkMode.java
new file mode 100644
index 000000000000..3437e0ac7da9
--- /dev/null
+++ b/src/main/java/com/nextcloud/client/preferences/DarkMode.java
@@ -0,0 +1,27 @@
+/*
+ *
+ * Nextcloud Android client application
+ *
+ * @author Tobias Kaminsky
+ * Copyright (C) 2019 Tobias Kaminsky
+ * Copyright (C) 2019 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.nextcloud.client.preferences;
+
+public enum DarkMode {
+ DARK, LIGHT, SYSTEM
+}
diff --git a/src/main/java/com/owncloud/android/MainApp.java b/src/main/java/com/owncloud/android/MainApp.java
index 3b7f088efed5..b78d6ef6283c 100644
--- a/src/main/java/com/owncloud/android/MainApp.java
+++ b/src/main/java/com/owncloud/android/MainApp.java
@@ -57,6 +57,7 @@
import com.nextcloud.client.onboarding.OnboardingService;
import com.nextcloud.client.preferences.AppPreferences;
import com.nextcloud.client.preferences.AppPreferencesImpl;
+import com.nextcloud.client.preferences.DarkMode;
import com.owncloud.android.authentication.PassCodeManager;
import com.owncloud.android.datamodel.ArbitraryDataProvider;
import com.owncloud.android.datamodel.MediaFolder;
@@ -247,7 +248,7 @@ protected void attachBaseContext(Context base) {
@SuppressFBWarnings("ST")
@Override
public void onCreate() {
- setAppTheme(preferences.isDarkThemeEnabled());
+ setAppTheme(preferences.getDarkThemeMode());
super.onCreate();
insertConscrypt();
@@ -821,11 +822,17 @@ public AndroidInjector