Skip to content

Commit f297766

Browse files
author
Catfriend1
authored
Add dark theme (fixes #400) (#399) (#401)
* Squash-merge from darkTheme1 * Imported de translation
1 parent b401a8c commit f297766

22 files changed

+179
-51
lines changed

app/src/main/java/com/nutomic/syncthingandroid/activities/FolderTypeDialogActivity.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.app.Activity;
44
import android.content.Intent;
55
import android.os.Bundle;
6-
import android.support.v7.app.AppCompatActivity;
76
import android.view.View;
87
import android.widget.AdapterView;
98
import android.widget.Button;
@@ -14,7 +13,7 @@
1413
import java.util.Arrays;
1514
import java.util.List;
1615

17-
public class FolderTypeDialogActivity extends AppCompatActivity {
16+
public class FolderTypeDialogActivity extends ThemedAppCompatActivity {
1817

1918
public static final String EXTRA_FOLDER_TYPE = "com.github.catfriend1.syncthingandroid.activities.FolderTypeDialogActivity.FOLDER_TYPE";
2019
public static final String EXTRA_RESULT_FOLDER_TYPE = "com.github.catfriend1.syncthingandroid.activities.FolderTypeDialogActivity.EXTRA_RESULT_FOLDER_TYPE";

app/src/main/java/com/nutomic/syncthingandroid/activities/PullOrderDialogActivity.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import android.app.Activity;
44
import android.content.Intent;
55
import android.os.Bundle;
6-
import android.support.v7.app.AppCompatActivity;
76
import android.view.View;
87
import android.widget.AdapterView;
98
import android.widget.Button;
@@ -13,7 +12,7 @@
1312
import java.util.Arrays;
1413
import java.util.List;
1514

16-
public class PullOrderDialogActivity extends AppCompatActivity {
15+
public class PullOrderDialogActivity extends ThemedAppCompatActivity {
1716

1817
public static final String EXTRA_PULL_ORDER = "com.github.catfriend1.syncthingandroid.activities.PullOrderDialogActivity.PULL_ORDER";
1918
public static final String EXTRA_RESULT_PULL_ORDER = "com.github.catfriend1.syncthingandroid.activities.PullOrderDialogActivity.EXTRA_RESULT_PULL_ORDER";

app/src/main/java/com/nutomic/syncthingandroid/activities/SettingsActivity.java

+49-13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.nutomic.syncthingandroid.activities;
22

33
import android.Manifest;
4+
import android.app.Activity;
45
import android.app.AlertDialog;
56
import android.app.Dialog;
67
import android.content.ClipData;
@@ -51,6 +52,7 @@
5152
import com.nutomic.syncthingandroid.service.RestApi;
5253
import com.nutomic.syncthingandroid.service.SyncthingService;
5354
import com.nutomic.syncthingandroid.service.SyncthingServiceBinder;
55+
import com.nutomic.syncthingandroid.util.ConfigRouter;
5456
import com.nutomic.syncthingandroid.util.FileUtils;
5557
import com.nutomic.syncthingandroid.util.Languages;
5658
import com.nutomic.syncthingandroid.util.Util;
@@ -170,11 +172,13 @@ public static class SettingsFragment extends PreferenceFragment
170172
private WifiSsidPreference mWifiSsidWhitelist;
171173
private CheckBoxPreference mRunInFlightMode;
172174

175+
/* User Interface */
176+
private Languages mLanguages;
177+
173178
/* Behaviour */
174179
private CheckBoxPreference mStartServiceOnBoot;
175180
private CheckBoxPreference mUseRoot;
176181
private ListPreference mSuggestNewFolderRoot;
177-
private Languages mLanguages;
178182

179183
/* Syncthing Options */
180184
private PreferenceScreen mCategorySyncthingOptions;
@@ -259,9 +263,9 @@ public void onActivityCreated(Bundle savedInstanceState) {
259263
mPreferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
260264

261265
ListPreference languagePref = (ListPreference) findPreference(Languages.PREFERENCE_LANGUAGE);
262-
PreferenceScreen categoryBehaviour = (PreferenceScreen) findPreference("category_behaviour");
266+
PreferenceScreen categoryUserInterface = (PreferenceScreen) findPreference("category_user_interface");
263267
if (Build.VERSION.SDK_INT >= 24) {
264-
categoryBehaviour.removePreference(languagePref);
268+
categoryUserInterface.removePreference(languagePref);
265269
} else {
266270
mLanguages = new Languages(getActivity());
267271
languagePref.setDefaultValue(mLanguages.USE_SYSTEM_DEFAULT);
@@ -305,7 +309,11 @@ public void onActivityCreated(Bundle savedInstanceState) {
305309
}
306310
setPreferenceCategoryChangeListener(mCategoryRunConditions, this::onRunConditionPreferenceChange);
307311

312+
/* User Interface */
313+
setPreferenceCategoryChangeListener(categoryUserInterface, this::onUserInterfacePreferenceChange);
314+
308315
/* Behaviour */
316+
PreferenceScreen categoryBehaviour = (PreferenceScreen) findPreference("category_behaviour");
309317
mStartServiceOnBoot =
310318
(CheckBoxPreference) findPreference(Constants.PREF_START_SERVICE_ON_BOOT);
311319
mUseRoot =
@@ -587,6 +595,27 @@ public boolean onRunConditionPreferenceChange(Preference preference, Object o) {
587595
return true;
588596
}
589597

598+
public boolean onUserInterfacePreferenceChange(Preference preference, Object o) {
599+
switch (preference.getKey()) {
600+
case Constants.PREF_APP_THEME:
601+
String newTheme = (String) o;
602+
String prevTheme = mPreferences.getString(Constants.PREF_APP_THEME, Constants.APP_THEME_LIGHT);
603+
if (!newTheme.equals(prevTheme)) {
604+
ConfigRouter config = new ConfigRouter(getActivity());
605+
Gui gui = config.getGui(mRestApi);
606+
gui.theme = newTheme.equals(Constants.APP_THEME_LIGHT) ? "default" : "dark";
607+
config.updateGui(mRestApi, gui);
608+
getAppRestartConfirmationDialog(getActivity())
609+
.show();
610+
}
611+
break;
612+
case Languages.PREFERENCE_LANGUAGE:
613+
mLanguages.forceChangeLanguage(getActivity(), (String) o);
614+
return false;
615+
}
616+
return true;
617+
}
618+
590619
public boolean onBehaviourPreferenceChange(Preference preference, Object o) {
591620
switch (preference.getKey()) {
592621
case Constants.PREF_USE_ROOT:
@@ -601,9 +630,6 @@ public boolean onBehaviourPreferenceChange(Preference preference, Object o) {
601630
mSuggestNewFolderRoot.setValue(o.toString());
602631
preference.setSummary(mSuggestNewFolderRoot.getEntry());
603632
break;
604-
case Languages.PREFERENCE_LANGUAGE:
605-
mLanguages.forceChangeLanguage(getActivity(), (String) o);
606-
return false;
607633
}
608634
return true;
609635
}
@@ -773,13 +799,7 @@ public boolean onPreferenceClick(Preference preference) {
773799
final Intent intent;
774800
switch (preference.getKey()) {
775801
case Constants.PREF_VERBOSE_LOG:
776-
new AlertDialog.Builder(getActivity())
777-
.setTitle(R.string.dialog_settings_restart_app_title)
778-
.setMessage(R.string.dialog_settings_restart_app_question)
779-
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
780-
getActivity().setResult(RESULT_RESTART_APP);
781-
getActivity().finish();
782-
})
802+
getAppRestartConfirmationDialog(getActivity())
783803
.setNegativeButton(android.R.string.no, (dialogInterface, i) -> {
784804
// Revert.
785805
((CheckBoxPreference) preference).setChecked(!((CheckBoxPreference) preference).isChecked());
@@ -900,6 +920,22 @@ private void onDownloadSupportBundleClick() {
900920
});
901921
}
902922

923+
/**
924+
* Provides a template for an AlertDialog which quits and restarts the
925+
* whole app including all of its activities and services.
926+
* Use rarely as it's annoying for a user having to restart the whole app.
927+
*/
928+
private static AlertDialog.Builder getAppRestartConfirmationDialog(Activity activity) {
929+
return new AlertDialog.Builder(activity)
930+
.setTitle(R.string.dialog_settings_restart_app_title)
931+
.setMessage(R.string.dialog_settings_restart_app_question)
932+
.setPositiveButton(android.R.string.ok, (dialogInterface, i) -> {
933+
activity.setResult(RESULT_RESTART_APP);
934+
activity.finish();
935+
})
936+
.setNegativeButton(android.R.string.no, (dialogInterface, i) -> {});
937+
}
938+
903939
/**
904940
* Enables or disables {@link #mUseRoot} preference depending whether root is available.
905941
*/

app/src/main/java/com/nutomic/syncthingandroid/activities/SyncthingActivity.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import android.os.Bundle;
99
import android.os.IBinder;
1010
import android.support.v7.app.ActionBar;
11-
import android.support.v7.app.AppCompatActivity;
1211
import android.support.v7.widget.Toolbar;
1312
// import android.util.Log;
1413

@@ -20,7 +19,7 @@
2019
/**
2120
* Connects to {@link SyncthingService} and provides access to it.
2221
*/
23-
public abstract class SyncthingActivity extends AppCompatActivity implements ServiceConnection {
22+
public abstract class SyncthingActivity extends ThemedAppCompatActivity implements ServiceConnection {
2423

2524
private static final String TAG = "SyncthingActivity";
2625

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.nutomic.syncthingandroid.activities;
2+
3+
import android.content.SharedPreferences;
4+
import android.os.Bundle;
5+
import android.preference.PreferenceManager;
6+
import android.support.v7.app.AppCompatActivity;
7+
import android.support.v7.app.AppCompatDelegate;
8+
// import android.util.Log;
9+
10+
import com.nutomic.syncthingandroid.service.Constants;
11+
12+
/**
13+
* Provides a themed instance of AppCompatActivity.
14+
*/
15+
public abstract class ThemedAppCompatActivity extends AppCompatActivity {
16+
17+
// private static final String TAG = "ThemedAppCompatActivity";
18+
19+
@Override
20+
protected void onCreate(Bundle savedInstanceState) {
21+
// Load theme.
22+
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
23+
Integer prefAppTheme = Integer.parseInt(sharedPreferences.getString(Constants.PREF_APP_THEME, Constants.APP_THEME_LIGHT));
24+
AppCompatDelegate.setDefaultNightMode(prefAppTheme);
25+
super.onCreate(savedInstanceState);
26+
}
27+
}

app/src/main/java/com/nutomic/syncthingandroid/activities/VersioningDialogActivity.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import android.os.Bundle;
66
import android.support.v4.app.Fragment;
77
import android.support.v4.app.FragmentTransaction;
8-
import android.support.v7.app.AppCompatActivity;
98
import android.view.View;
109
import android.widget.AdapterView;
1110
import android.widget.Button;
@@ -20,7 +19,7 @@
2019
import java.util.Arrays;
2120
import java.util.List;
2221

23-
public class VersioningDialogActivity extends AppCompatActivity {
22+
public class VersioningDialogActivity extends ThemedAppCompatActivity {
2423

2524
private Fragment mCurrentFragment;
2625

@@ -131,4 +130,4 @@ public void onBackPressed() {
131130
saveConfiguration();
132131
super.onBackPressed();
133132
}
134-
}
133+
}

app/src/main/java/com/nutomic/syncthingandroid/service/Constants.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,17 @@ public class Constants {
2929
public static final String PREF_RUN_IN_FLIGHT_MODE = "run_in_flight_mode";
3030
public static final String PREF_RUN_ON_TIME_SCHEDULE = "run_on_time_schedule";
3131

32+
// Preferences - User Interface
33+
public static final String PREF_APP_THEME = "app_theme";
34+
public static final String PREF_EXPERT_MODE = "expert_mode";
35+
3236
// Preferences - Behaviour
3337
public static final String PREF_USE_ROOT = "use_root";
3438

3539
public static final String PREF_SUGGEST_NEW_FOLDER_ROOT = "suggest_new_folder_root";
3640
public static final String PREF_SUGGEST_NEW_FOLDER_ROOT_DATA = "external_android_data";
3741
public static final String PREF_SUGGEST_NEW_FOLDER_ROOT_MEDIA = "external_android_media";
3842

39-
public static final String PREF_EXPERT_MODE = "expert_mode";
40-
4143
// Preferences - Troubleshooting
4244
public static final String PREF_VERBOSE_LOG = "verbose_log";
4345
public static final String PREF_ENVIRONMENT_VARIABLES = "environment_variables";
@@ -95,6 +97,12 @@ public static String DYN_PREF_OBJECT_SYNC_ON_MOBILE_DATA(String objectPrefixAndI
9597
*/
9698
public static final String PREF_DEBUG_FACILITIES_AVAILABLE = "debug_facilities_available";
9799

100+
/**
101+
* Available app themes
102+
*/
103+
public static final String APP_THEME_LIGHT = "1";
104+
public static final String APP_THEME_DARK = "2";
105+
98106
/**
99107
* Available folder types.
100108
*/

app/src/main/res/layout/fragment_external_versioning.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
android:layout_margin="10dp"
1010
android:text="@string/command"
1111
android:textAlignment="center"
12-
android:textColor="@android:color/black"
12+
android:textColor="?attr/colorControlNormal"
1313
android:textSize="18sp"
1414
android:textStyle="bold" />
1515

app/src/main/res/layout/fragment_foldertype_dialog.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
android:layout_height="50dp"
3030
android:layout_gravity="end"
3131
android:text="@string/finish"
32-
android:textColor="@color/primary_dark" />
32+
android:textColor="?attr/colorControlNormal" />
3333

3434
</LinearLayout>
3535
</ScrollView>

app/src/main/res/layout/fragment_pullorder_dialog.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
android:layout_height="50dp"
3030
android:layout_gravity="end"
3131
android:text="@string/finish"
32-
android:textColor="@color/primary_dark" />
32+
android:textColor="?attr/colorControlNormal" />
3333

3434
</LinearLayout>
3535
</ScrollView>

app/src/main/res/layout/fragment_simple_versioning.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
android:layout_margin="10dp"
2222
android:text="@string/keep_versions"
2323
android:textAlignment="center"
24-
android:textColor="@android:color/black"
24+
android:textColor="?attr/colorControlNormal"
2525
android:textSize="18sp"
2626
android:textStyle="bold" />
2727

@@ -40,4 +40,4 @@
4040
android:layout_margin="10dp" />
4141

4242
</LinearLayout>
43-
</ScrollView>
43+
</ScrollView>

app/src/main/res/layout/fragment_staggered_versioning.xml

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
android:layout_height="wrap_content"
1616
android:text="@string/maximum_age"
1717
android:textAlignment="center"
18-
android:textColor="@android:color/black"
18+
android:textColor="?attr/colorControlNormal"
1919
android:textSize="18sp"
2020
android:textStyle="bold"
2121
android:layout_margin="10dp"
@@ -42,7 +42,7 @@
4242
android:layout_margin="10dp"
4343
android:text="@string/versions_path"
4444
android:textAlignment="center"
45-
android:textColor="@android:color/black"
45+
android:textColor="?attr/colorControlNormal"
4646
android:textSize="18sp"
4747
android:textStyle="bold"
4848
/>
@@ -63,4 +63,4 @@
6363
android:layout_margin="10dp"
6464
android:text="@string/versions_path_description" />
6565

66-
</LinearLayout>
66+
</LinearLayout>

app/src/main/res/layout/fragment_trashcan_versioning.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
android:layout_height="wrap_content"
2222
android:text="@string/clean_out_after"
2323
android:textAlignment="center"
24-
android:textColor="@android:color/black"
24+
android:textColor="?attr/colorControlNormal"
2525
android:textSize="18sp"
2626
android:layout_margin="10dp"
2727
android:textStyle="bold"/>
@@ -41,4 +41,4 @@
4141
android:layout_margin="10dp" />
4242
</LinearLayout>
4343

44-
</ScrollView>
44+
</ScrollView>

app/src/main/res/layout/fragment_versioning_dialog.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@
3434
android:layout_height="50dp"
3535
android:layout_gravity="end"
3636
android:text="@string/finish"
37-
android:textColor="@color/primary_dark" />
37+
android:textColor="?attr/colorControlNormal" />
3838

3939
</LinearLayout>
4040
</ScrollView>
4141

42-
</LinearLayout>
42+
</LinearLayout>

app/src/main/res/values-de/strings.xml

+5
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,11 @@ Bitte melden Sie auftretende Probleme via GitHub.</string>
402402
<string name="settings_title">Einstellungen</string>
403403

404404
<string name="category_run_conditions">Laufkonditionen</string>
405+
406+
<string name="category_user_interface">Benutzeroberfläche</string>
407+
408+
<string name="preference_app_theme_title">Thema</string>
409+
405410
<string name="category_behaviour">Verhalten</string>
406411

407412
<string name="category_syncthing_options">Syncthing-Optionen</string>
+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
<color name="primary">#0288D1</color>
4+
<color name="primary_dark">#002171</color>
5+
</resources>
+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<resources>
3+
4+
<!-- Button themes -->
5+
<style name="Theme.Syncthing.GreyButton" parent="ThemeOverlay.AppCompat.Dark">
6+
<item name="android:textColor">@color/btn_welcome_slide_color</item>
7+
</style>
8+
9+
<!-- Dialog themes -->
10+
<eat-comment/>
11+
12+
<style name="Theme.Syncthing.Dialog" parent="Theme.AppCompat.Dialog.Alert">
13+
<item name="colorAccent">@color/light_blue</item>
14+
<item name="android:windowBackground">@color/blue_grey</item>
15+
<item name="android:textColor">?attr/colorControlNormal</item>
16+
</style>
17+
</resources>

0 commit comments

Comments
 (0)