From 0a7f09077f11bf763cbbf20b8e9ea6d0cd24e83a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Pich?= Date: Tue, 30 Oct 2018 22:06:29 +0100 Subject: [PATCH] Dark theme refactor (#173) --- .../repositories/PreferencesRepository.kt | 3 ++ .../wulkanowy/ui/modules/main/MainActivity.kt | 4 ++- .../ui/modules/settings/SettingsFragment.kt | 24 ++++++++++++- .../ui/modules/splash/SplashActivity.kt | 5 +++ .../ui/modules/splash/SplashPresenter.kt | 14 +++++--- .../wulkanowy/ui/modules/splash/SplashView.kt | 2 ++ .../wulkanowy/utils/ContextExtension.kt | 15 ++++++++ .../drawable/ic_menu_main_timetable_24dp.xml | 1 - .../main/res/layout/fragment_attendance.xml | 2 +- app/src/main/res/layout/fragment_exam.xml | 2 +- .../main/res/layout/fragment_timetable.xml | 2 +- app/src/main/res/layout/item_more.xml | 3 +- app/src/main/res/values-night/styles.xml | 26 ++++++++++++++ app/src/main/res/values/styles.xml | 12 ++++++- app/src/main/res/xml/scheme_preferences.xml | 36 +++++++++++-------- .../ui/modules/splash/SplashPresenterTest.kt | 6 +++- 16 files changed, 130 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt create mode 100644 app/src/main/res/values-night/styles.xml diff --git a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt index 472eb4bf..0da41940 100644 --- a/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt +++ b/app/src/main/java/io/github/wulkanowy/data/repositories/PreferencesRepository.kt @@ -12,5 +12,8 @@ class PreferencesRepository @Inject constructor(private val sharedPref: SharedPr val showPresent: Boolean get() = sharedPref.getBoolean("attendance_present", true) + + val currentTheme: Int + get() = sharedPref.getString("theme", "1")?.toInt() ?: 1 } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt index 4d1409a4..f6b0cf3c 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/main/MainActivity.kt @@ -16,6 +16,7 @@ import io.github.wulkanowy.ui.modules.exam.ExamFragment import io.github.wulkanowy.ui.modules.grade.GradeFragment import io.github.wulkanowy.ui.modules.more.MoreFragment import io.github.wulkanowy.ui.modules.timetable.TimetableFragment +import io.github.wulkanowy.utils.getThemeAttrColor import io.github.wulkanowy.utils.safelyPopFragment import io.github.wulkanowy.utils.setOnViewChangeListener import kotlinx.android.synthetic.main.activity_main.* @@ -73,7 +74,8 @@ class MainActivity : BaseActivity(), MainView { AHBottomNavigationItem(R.string.more_title, R.drawable.ic_menu_main_more_24dp, 0) )) accentColor = ContextCompat.getColor(context, R.color.colorPrimary) - inactiveColor = ContextCompat.getColor(context, android.R.color.black) + inactiveColor = getThemeAttrColor(android.R.attr.textColorSecondary) + defaultBackgroundColor = getThemeAttrColor(R.attr.bottomNavBackground) titleState = ALWAYS_SHOW currentItem = startMenuIndex isBehaviorTranslationEnabled = false diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt index ef2c27f4..4061c4b3 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/settings/SettingsFragment.kt @@ -1,11 +1,14 @@ package io.github.wulkanowy.ui.modules.settings +import android.content.SharedPreferences import android.os.Bundle +import androidx.appcompat.app.AppCompatDelegate import com.takisoft.preferencex.PreferenceFragmentCompat import io.github.wulkanowy.R import io.github.wulkanowy.ui.modules.main.MainView -class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView { +class SettingsFragment : PreferenceFragmentCompat(), SharedPreferences.OnSharedPreferenceChangeListener, + MainView.TitledView { companion object { fun newInstance() = SettingsFragment() @@ -17,4 +20,23 @@ class SettingsFragment : PreferenceFragmentCompat(), MainView.TitledView { override fun onCreatePreferencesFix(savedInstanceState: Bundle?, rootKey: String?) { addPreferencesFromResource(R.xml.scheme_preferences) } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String) { + when(key) { + "theme" -> { + AppCompatDelegate.setDefaultNightMode(sharedPreferences?.getString("theme", "1")?.toInt() ?: 1) + activity?.recreate() + } + } + } + + override fun onResume() { + super.onResume() + preferenceScreen.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + super.onPause() + preferenceScreen.sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt index 223d7abe..be481b9f 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashActivity.kt @@ -5,6 +5,7 @@ import io.github.wulkanowy.ui.base.BaseActivity import io.github.wulkanowy.ui.modules.login.LoginActivity import io.github.wulkanowy.ui.modules.main.MainActivity import javax.inject.Inject +import androidx.appcompat.app.AppCompatDelegate class SplashActivity : BaseActivity(), SplashView { @@ -26,6 +27,10 @@ class SplashActivity : BaseActivity(), SplashView { finish() } + override fun setCurrentThemeMode(mode: Int) { + AppCompatDelegate.setDefaultNightMode(mode) + } + override fun onDestroy() { presenter.onDetachView() super.onDestroy() diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt index 0ff9120b..db67f457 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashPresenter.kt @@ -1,16 +1,22 @@ package io.github.wulkanowy.ui.modules.splash import io.github.wulkanowy.data.ErrorHandler +import io.github.wulkanowy.data.repositories.PreferencesRepository import io.github.wulkanowy.data.repositories.SessionRepository import io.github.wulkanowy.ui.base.BasePresenter import javax.inject.Inject -class SplashPresenter @Inject constructor(private val sessionRepository: SessionRepository, - errorHandler: ErrorHandler) - : BasePresenter(errorHandler) { +class SplashPresenter @Inject constructor( + private val sessionRepository: SessionRepository, + private val preferencesRepository: PreferencesRepository, + errorHandler: ErrorHandler +) : BasePresenter(errorHandler) { override fun onAttachView(view: SplashView) { super.onAttachView(view) - view.run { if (sessionRepository.isSessionSaved) openMainView() else openLoginView() } + view.run { + setCurrentThemeMode(preferencesRepository.currentTheme) + if (sessionRepository.isSessionSaved) openMainView() else openLoginView() + } } } diff --git a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt index 9efd8123..0a68c4e4 100644 --- a/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt +++ b/app/src/main/java/io/github/wulkanowy/ui/modules/splash/SplashView.kt @@ -7,4 +7,6 @@ interface SplashView : BaseView { fun openLoginView() fun openMainView() + + fun setCurrentThemeMode(mode: Int) } diff --git a/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt new file mode 100644 index 00000000..e056bf7e --- /dev/null +++ b/app/src/main/java/io/github/wulkanowy/utils/ContextExtension.kt @@ -0,0 +1,15 @@ +package io.github.wulkanowy.utils + +import android.content.Context +import androidx.annotation.AttrRes +import androidx.annotation.ColorInt + +@ColorInt +fun Context.getThemeAttrColor(@AttrRes colorAttr: Int): Int { + val array = this.obtainStyledAttributes(null, intArrayOf(colorAttr)) + try { + return array.getColor(0, 0) + } finally { + array.recycle() + } +} diff --git a/app/src/main/res/drawable/ic_menu_main_timetable_24dp.xml b/app/src/main/res/drawable/ic_menu_main_timetable_24dp.xml index 63880977..213c7ea7 100644 --- a/app/src/main/res/drawable/ic_menu_main_timetable_24dp.xml +++ b/app/src/main/res/drawable/ic_menu_main_timetable_24dp.xml @@ -1,4 +1,3 @@ - diff --git a/app/src/main/res/layout/fragment_exam.xml b/app/src/main/res/layout/fragment_exam.xml index 1e31450a..5dbd2c79 100644 --- a/app/src/main/res/layout/fragment_exam.xml +++ b/app/src/main/res/layout/fragment_exam.xml @@ -59,7 +59,7 @@ android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" - android:background="@android:color/white" + android:background="?android:attr/windowBackground" android:elevation="10dp" android:orientation="horizontal"> diff --git a/app/src/main/res/layout/fragment_timetable.xml b/app/src/main/res/layout/fragment_timetable.xml index a7181523..72621b2f 100644 --- a/app/src/main/res/layout/fragment_timetable.xml +++ b/app/src/main/res/layout/fragment_timetable.xml @@ -59,7 +59,7 @@ android:layout_width="match_parent" android:layout_height="50dp" android:layout_gravity="bottom" - android:background="@android:color/white" + android:background="?android:attr/windowBackground" android:elevation="10dp" android:orientation="horizontal"> diff --git a/app/src/main/res/layout/item_more.xml b/app/src/main/res/layout/item_more.xml index 4b0f6772..8d7a2d33 100644 --- a/app/src/main/res/layout/item_more.xml +++ b/app/src/main/res/layout/item_more.xml @@ -15,7 +15,8 @@ android:layout_width="24dp" android:layout_height="24dp" android:layout_gravity="center_vertical" - app:srcCompat="@drawable/ic_more_settings_24dp" /> + app:srcCompat="@drawable/ic_more_settings_24dp" + android:tint="?android:attr/android:textColorSecondary"/> + + + + + diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 18784f5f..8228bdf8 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,6 +1,6 @@ -