diff --git a/app/src/main/java/org/isoron/uhabits/AboutActivity.java b/app/src/main/java/org/isoron/uhabits/AboutActivity.java index 3f84528e1..87ebad407 100644 --- a/app/src/main/java/org/isoron/uhabits/AboutActivity.java +++ b/app/src/main/java/org/isoron/uhabits/AboutActivity.java @@ -29,6 +29,7 @@ import android.view.View; import android.widget.TextView; import org.isoron.uhabits.helpers.ColorHelper; +import org.isoron.uhabits.helpers.UIHelper; public class AboutActivity extends Activity implements View.OnClickListener { @@ -37,6 +38,8 @@ public class AboutActivity extends Activity implements View.OnClickListener protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + UIHelper.applyCurrentTheme(this); + setContentView(R.layout.about); if (android.os.Build.VERSION.SDK_INT >= 21) diff --git a/app/src/main/java/org/isoron/uhabits/BaseActivity.java b/app/src/main/java/org/isoron/uhabits/BaseActivity.java index 4c8b2b75a..2ee99b695 100644 --- a/app/src/main/java/org/isoron/uhabits/BaseActivity.java +++ b/app/src/main/java/org/isoron/uhabits/BaseActivity.java @@ -26,6 +26,7 @@ import android.os.Bundle; import android.widget.Toast; import org.isoron.uhabits.commands.Command; +import org.isoron.uhabits.helpers.UIHelper; import java.util.LinkedList; @@ -44,6 +45,8 @@ abstract public class BaseActivity extends Activity implements Thread.UncaughtEx { super.onCreate(savedInstanceState); + UIHelper.applyCurrentTheme(this); + androidExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); Thread.setDefaultUncaughtExceptionHandler(this); diff --git a/app/src/main/java/org/isoron/uhabits/MainActivity.java b/app/src/main/java/org/isoron/uhabits/MainActivity.java index 760ad134e..eec014fb2 100644 --- a/app/src/main/java/org/isoron/uhabits/MainActivity.java +++ b/app/src/main/java/org/isoron/uhabits/MainActivity.java @@ -29,17 +29,19 @@ import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.net.Uri; import android.os.AsyncTask; +import android.os.Build; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; import android.view.Menu; import android.view.MenuItem; +import android.view.Window; -import org.isoron.uhabits.helpers.DateHelper; -import org.isoron.uhabits.helpers.UIHelper; import org.isoron.uhabits.fragments.ListHabitsFragment; +import org.isoron.uhabits.helpers.DateHelper; import org.isoron.uhabits.helpers.ReminderHelper; +import org.isoron.uhabits.helpers.UIHelper; import org.isoron.uhabits.models.Habit; import org.isoron.uhabits.tasks.BaseTask; import org.isoron.uhabits.widgets.CheckmarkWidgetProvider; @@ -70,6 +72,10 @@ public class MainActivity extends BaseActivity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + getWindow().requestFeature(Window.FEATURE_ACTIVITY_TRANSITIONS); + setContentView(R.layout.list_habits_activity); prefs = PreferenceManager.getDefaultSharedPreferences(this); @@ -122,6 +128,10 @@ public class MainActivity extends BaseActivity public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.list_habits_menu, menu); + + MenuItem nightModeItem = menu.findItem(R.id.action_night_mode); + nightModeItem.setChecked(UIHelper.isNightMode()); + return true; } @@ -130,6 +140,17 @@ public class MainActivity extends BaseActivity { switch (item.getItemId()) { + case R.id.action_night_mode: + { + if(UIHelper.isNightMode()) + UIHelper.setCurrentTheme(UIHelper.THEME_LIGHT); + else + UIHelper.setCurrentTheme(UIHelper.THEME_DARK); + + refreshTheme(); + return true; + } + case R.id.action_settings: { Intent intent = new Intent(this, SettingsActivity.class); @@ -158,6 +179,20 @@ public class MainActivity extends BaseActivity } } + private void refreshTheme() + { + runOnUiThread(new Runnable() + { + @Override + public void run() + { + Intent intent = new Intent(MainActivity.this, MainActivity.class); + MainActivity.this.finish(); + startActivity(intent); + } + }); + } + @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { diff --git a/app/src/main/java/org/isoron/uhabits/SettingsActivity.java b/app/src/main/java/org/isoron/uhabits/SettingsActivity.java index 9e43b1bba..cb8701265 100644 --- a/app/src/main/java/org/isoron/uhabits/SettingsActivity.java +++ b/app/src/main/java/org/isoron/uhabits/SettingsActivity.java @@ -23,6 +23,7 @@ import android.app.Activity; import android.os.Bundle; import org.isoron.uhabits.fragments.SettingsFragment; +import org.isoron.uhabits.helpers.UIHelper; public class SettingsActivity extends Activity { @@ -30,6 +31,9 @@ public class SettingsActivity extends Activity protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + + UIHelper.applyCurrentTheme(this); + getFragmentManager().beginTransaction() .replace(android.R.id.content, new SettingsFragment()) .commit(); diff --git a/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java b/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java index 6b1573be2..a0824173e 100644 --- a/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java +++ b/app/src/main/java/org/isoron/uhabits/helpers/UIHelper.java @@ -19,6 +19,7 @@ package org.isoron.uhabits.helpers; +import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.content.res.Resources; @@ -36,14 +37,19 @@ import android.view.View; import android.view.inputmethod.InputMethodManager; import org.isoron.uhabits.BuildConfig; +import org.isoron.uhabits.HabitsApplication; +import org.isoron.uhabits.R; import org.isoron.uhabits.commands.Command; import java.util.Locale; public abstract class UIHelper { - public static final String ISORON_NAMESPACE = "http://isoron.org/android"; + + public static final int THEME_LIGHT = 0; + public static final int THEME_DARK = 1; + private static Typeface fontawesome; public interface OnSavedListener @@ -190,4 +196,38 @@ public abstract class UIHelper return bool; } + + public static void applyCurrentTheme(Activity activity) + { + switch(getCurrentTheme()) + { + case THEME_DARK: + activity.setTheme(R.style.AppBaseThemeDark); + break; + + case THEME_LIGHT: + default: + activity.setTheme(R.style.AppBaseTheme); + break; + } + } + + private static int getCurrentTheme() + { + Context appContext = HabitsApplication.getContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); + return prefs.getInt("pref_theme", THEME_LIGHT); + } + + public static void setCurrentTheme(int theme) + { + Context appContext = HabitsApplication.getContext(); + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(appContext); + prefs.edit().putInt("pref_theme", theme).apply(); + } + + public static boolean isNightMode() + { + return getCurrentTheme() == THEME_DARK; + } } diff --git a/app/src/main/res/menu/list_habits_menu.xml b/app/src/main/res/menu/list_habits_menu.xml index 320dc357a..1c1fb377f 100644 --- a/app/src/main/res/menu/list_habits_menu.xml +++ b/app/src/main/res/menu/list_habits_menu.xml @@ -28,6 +28,12 @@ android:enabled="true" android:title="@string/show_archived"/> + + Generate bug report Troubleshooting Help translate this app + Night mode \ No newline at end of file