Theme switching

This commit is contained in:
2021-02-21 00:31:02 +03:00
parent 06aa41cab1
commit 35c45fd34f
34 changed files with 447 additions and 155 deletions
@@ -24,7 +24,7 @@ import com.meloda.fast.extensions.ContextExtensions.drawable
import com.meloda.fast.extensions.DrawableExtensions.tint
import com.meloda.fast.fragment.FragmentConversations
import com.meloda.fast.fragment.FragmentFriends
import com.meloda.fast.fragment.FragmentSettings
import com.meloda.fast.fragment.SettingsFragment
import com.meloda.fast.fragment.LoginFragment
import com.meloda.fast.listener.OnResponseListener
import com.meloda.fast.service.LongPollService
@@ -39,7 +39,7 @@ class MainActivity : BaseActivity(),
private lateinit var fragmentConversations: FragmentConversations
private lateinit var fragmentFriends: FragmentFriends
private lateinit var fragmentSettings: FragmentSettings
private lateinit var settingsFragment: SettingsFragment
private var selectedId = 0
@@ -91,7 +91,7 @@ class MainActivity : BaseActivity(),
private fun prepareFragments() {
fragmentConversations = FragmentConversations()
fragmentFriends = FragmentFriends(UserConfig.userId)
fragmentSettings = FragmentSettings()
settingsFragment = SettingsFragment()
val containerId = R.id.fragmentContainer
@@ -27,7 +27,7 @@ import com.meloda.fast.dialog.ProfileDialog
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.DrawableExtensions.tint
import com.meloda.fast.extensions.ImageViewExtensions.loadImage
import com.meloda.fast.fragment.FragmentSettings
import com.meloda.fast.fragment.SettingsFragment
import com.meloda.fast.util.KeyboardUtils
import com.meloda.fast.util.TextUtils
import com.meloda.fast.util.ViewUtils
@@ -169,7 +169,7 @@ class MessagesActivity : BaseActivity(), MessagesView {
super.onScrolled(recyclerView, dx, dy)
if (dy < 0 && AppGlobal.inputMethodManager.isAcceptingText && AppGlobal.preferences.getBoolean(
FragmentSettings.KEY_HIDE_KEYBOARD_ON_SCROLL_UP,
SettingsFragment.KEY_HIDE_KEYBOARD_ON_SCROLL_UP,
true
)
) {
@@ -4,10 +4,9 @@ import android.os.Bundle
import com.meloda.fast.R
import com.meloda.fast.base.BaseActivity
import com.meloda.fast.common.FragmentSwitcher
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.ContextExtensions.drawable
import com.meloda.fast.extensions.DrawableExtensions.tint
import com.meloda.fast.fragment.FragmentSettings
import com.meloda.fast.fragment.SettingsFragment
import com.meloda.fast.util.ColorUtils
import com.meloda.fast.widget.Toolbar
class SettingsActivity : BaseActivity() {
@@ -21,12 +20,14 @@ class SettingsActivity : BaseActivity() {
setSupportActionBar(toolbar)
toolbar.navigationIcon = drawable(R.drawable.ic_arrow_back).tint(color(R.color.accent))
toolbar.setNavigationClickListener { onBackPressed() }
toolbar.navigationIcon = drawable(R.drawable.ic_arrow_back)
toolbar.tintNavigationIcon(ColorUtils.getColorAccent(this))
supportFragmentManager.beginTransaction()
.replace(R.id.fragmentContainer, FragmentSettings()).commitNow()
.replace(R.id.fragmentContainer, SettingsFragment())
.commit()
}
private fun initViews() {
@@ -36,7 +37,7 @@ class SettingsActivity : BaseActivity() {
override fun onBackPressed() {
val currentFragment = FragmentSwitcher.getCurrentFragment(supportFragmentManager) ?: return
if (currentFragment.javaClass == FragmentSettings::class.java && (currentFragment as FragmentSettings).onBackPressed()) {
if (currentFragment.javaClass == SettingsFragment::class.java && (currentFragment as SettingsFragment).onBackPressed()) {
super.onBackPressed()
}
}
@@ -1,10 +1,31 @@
package com.meloda.fast.base
import android.os.Build
import android.os.Bundle
import android.view.View
import androidx.appcompat.app.AppCompatActivity
import com.meloda.fast.R
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.ColorUtils
abstract class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.M) {
val navigationBarColor =
if (AndroidUtils.isDarkTheme()) {
color(R.color.dark_primaryDark)
} else {
ColorUtils.darkenColor(color(R.color.primaryDark))
}
window.navigationBarColor = navigationBarColor
}
}
fun getRootView(): View {
return findViewById(android.R.id.content)
}
@@ -22,7 +22,7 @@ import com.meloda.fast.R
import com.meloda.fast.api.UserConfig
import com.meloda.fast.database.AppDatabase
import com.meloda.fast.database.MemoryCache
import com.meloda.fast.fragment.FragmentSettings
import com.meloda.fast.fragment.SettingsFragment
import com.meloda.fast.util.AndroidUtils
import com.meloda.mvp.MvpBase
import com.microsoft.appcenter.AppCenter
@@ -133,20 +133,21 @@ class AppGlobal : Application() {
}
}
fun applyNightMode(value: String? = null) {
val mode = value ?: preferences.getString(FragmentSettings.KEY_THEME, "-1")!!
fun applyNightMode(value: String? = null): Int {
val mode = value ?: preferences.getString(SettingsFragment.KEY_THEME, "-1")!!
val nightMode = getNightMode(mode.toInt())
val oldNightMode = AppCompatDelegate.getDefaultNightMode()
AppCompatDelegate.setDefaultNightMode(nightMode)
return nightMode
}
fun getNightMode(nightMode: Int = -1): Int {
return AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM
val mode = if (nightMode != -1) nightMode else preferences.getString(
FragmentSettings.KEY_THEME,
SettingsFragment.KEY_THEME,
"-1"
)!!.toInt()
@@ -16,13 +16,11 @@ import com.meloda.fast.api.UserConfig
import com.meloda.fast.base.BaseFullscreenDialog
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.database.MemoryCache
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.ContextExtensions.drawable
import com.meloda.fast.extensions.DrawableExtensions.tint
import com.meloda.fast.extensions.FragmentExtensions.findViewById
import com.meloda.fast.item.SimpleMenuItem
import com.meloda.fast.listener.ItemClickListener
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.ColorUtils
import com.meloda.fast.util.ViewUtils
import com.meloda.fast.widget.Toolbar
@@ -63,8 +61,7 @@ class AccountDialog : BaseFullscreenDialog(), ItemClickListener {
private fun prepareToolbar() {
toolbar.navigationIcon = requireContext().drawable(R.drawable.ic_close)
.tint(ColorUtils.getColorAccent(requireContext()))
toolbar.tintNavigationIcon(ColorUtils.getColorAccent(requireContext()))
toolbar.setTitle(R.string.account_dialog_title)
toolbar.setTitleMode(Toolbar.TitleMode.SIMPLE)
@@ -10,11 +10,14 @@ import android.view.ViewGroup
import android.view.inputmethod.EditorInfo
import android.widget.EditText
import com.google.android.material.button.MaterialButton
import com.google.android.material.card.MaterialCardView
import com.meloda.fast.R
import com.meloda.fast.base.BaseFragment
import com.meloda.fast.fragment.ui.presenter.LoginPresenter
import com.meloda.fast.fragment.ui.view.LoginView
import com.meloda.fast.util.AndroidUtils
import com.meloda.fast.util.KeyboardUtils
import kotlin.math.roundToInt
class LoginFragment : BaseFragment(), LoginView {
@@ -23,6 +26,7 @@ class LoginFragment : BaseFragment(), LoginView {
private lateinit var email: EditText
private lateinit var password: EditText
private lateinit var authorize: MaterialButton
private lateinit var card: MaterialCardView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -48,12 +52,14 @@ class LoginFragment : BaseFragment(), LoginView {
email = requireView().findViewById(R.id.loginEmailEditText)
password = requireView().findViewById(R.id.loginPasswordEditText)
authorize = requireView().findViewById(R.id.loginAuthorize)
card = requireView().findViewById(R.id.loginCard)
}
override fun prepareViews() {
prepareEmailEditText()
preparePasswordEditText()
prepareAuthorizeButton()
prepareCardView()
}
private fun prepareEmailEditText() {
@@ -65,7 +71,7 @@ class LoginFragment : BaseFragment(), LoginView {
password.setOnEditorActionListener { _, _, event ->
if (event == null) return@setOnEditorActionListener false
return@setOnEditorActionListener if (event.action == EditorInfo.IME_ACTION_DONE ||
return@setOnEditorActionListener if (event.action == EditorInfo.IME_ACTION_GO ||
(event.action == KeyEvent.ACTION_DOWN && (event.keyCode == KeyEvent.KEYCODE_ENTER || event.keyCode == KeyEvent.KEYCODE_NUMPAD_ENTER))
) {
KeyboardUtils.hideKeyboardFrom(password)
@@ -85,6 +91,14 @@ class LoginFragment : BaseFragment(), LoginView {
}
}
private fun prepareCardView() {
val width = AndroidUtils.dp(resources.displayMetrics.widthPixels).roundToInt()
if (width < 380) {
card.strokeWidth = 0
}
}
override fun showErrorSnackbar(t: Throwable) {
TODO("Not yet implemented")
}
@@ -3,20 +3,19 @@ package com.meloda.fast.fragment
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.preference.Preference
import androidx.preference.PreferenceFragmentCompat
import androidx.preference.PreferenceScreen
import com.meloda.fast.R
import com.meloda.fast.activity.DropUserDataActivity
import com.meloda.fast.activity.UpdateActivity
import com.meloda.fast.base.BaseActivity
import com.meloda.fast.common.AppGlobal
import com.meloda.fast.common.TaskManager
import com.meloda.fast.extensions.ContextExtensions.color
import com.meloda.fast.extensions.ContextExtensions.drawable
import com.meloda.fast.util.AndroidUtils
class FragmentSettings : PreferenceFragmentCompat(),
class SettingsFragment : PreferenceFragmentCompat(),
Preference.OnPreferenceClickListener,
Preference.OnPreferenceChangeListener {
@@ -40,6 +39,7 @@ class FragmentSettings : PreferenceFragmentCompat(),
}
private var currentPreferenceLayout = 0
private var isRestoringState = false
override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) {
setPreferencesFromResource(R.xml.fragment_settings, rootKey)
@@ -49,7 +49,6 @@ class FragmentSettings : PreferenceFragmentCompat(),
private fun init() {
setTitle()
setNavigationIcon()
setPreferencesFromResource(currentPreferenceLayout, null)
val general = findPreference<Preference>(CATEGORY_GENERAL)
@@ -100,14 +99,6 @@ class FragmentSettings : PreferenceFragmentCompat(),
private val rootLayoutClickListener =
Preference.OnPreferenceClickListener { changeRootLayout(it) }
private fun setNavigationIcon() {
val drawable =
if (currentPreferenceLayout == R.xml.fragment_settings) null
else requireContext().drawable(R.drawable.ic_arrow_back)
drawable?.setTint(requireContext().color(R.color.accent))
}
private fun setTitle() {
var title = R.string.navigation_settings
when (currentPreferenceLayout) {
@@ -189,14 +180,8 @@ class FragmentSettings : PreferenceFragmentCompat(),
return true
}
KEY_THEME -> {
AppGlobal.instance.applyNightMode(newValue as String)
(requireActivity() as BaseActivity).apply {
// applyNightMode()
finish()
startActivity(intent)
// recreate()
}
val nightMode = AppGlobal.instance.applyNightMode(newValue as String)
(requireActivity() as AppCompatActivity).delegate.localNightMode = nightMode
return true
}
}
@@ -3,6 +3,7 @@ package com.meloda.fast.util
import android.content.ClipData
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.net.NetworkCapabilities
import android.net.Uri
import android.os.Build
@@ -28,6 +29,15 @@ object AndroidUtils {
fun dp(px: Int) = dp(px.toFloat())
fun isDarkTheme(): Boolean {
val currentNightMode =
AppGlobal.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return when (currentNightMode) {
Configuration.UI_MODE_NIGHT_YES -> true
else -> false
}
}
fun hasConnection(): Boolean {
val network = AppGlobal.connectivityManager.activeNetwork ?: return false
val activeNetwork =
@@ -1,6 +1,7 @@
package com.meloda.fast.util
import android.content.Context
import android.graphics.Color
import androidx.annotation.ColorInt
import com.meloda.fast.R
@@ -11,4 +12,19 @@ object ColorUtils {
return AndroidUtils.getThemeAttrColor(context, R.attr.colorAccent)
}
@ColorInt
fun getColorPrimary(context: Context): Int {
return AndroidUtils.getThemeAttrColor(context, R.attr.colorPrimary)
}
@JvmOverloads
fun darkenColor(color: Int, darkFactor: Float = 0.75f): Int {
var newColor = color
val hsv = FloatArray(3)
Color.colorToHSV(newColor, hsv)
hsv[2] *= darkFactor
newColor = Color.HSVToColor(hsv)
return newColor
}
}
@@ -17,15 +17,6 @@ object Utils {
return context.getString(R.string.error, t.message.toString())
}
fun isDarkTheme(): Boolean {
val currentNightMode =
AppGlobal.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
return when (currentNightMode) {
Configuration.UI_MODE_NIGHT_YES -> true
else -> false
}
}
fun serialize(source: Any?): ByteArray? {
try {
val bos = BytesOutputStream()
@@ -2,6 +2,7 @@ package com.meloda.fast.widget
import android.app.Activity
import android.content.Context
import android.content.res.ColorStateList
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.util.AttributeSet
@@ -11,6 +12,7 @@ import android.view.View
import android.widget.ImageButton
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import androidx.core.content.res.ResourcesCompat
import com.facebook.drawee.view.SimpleDraweeView
@@ -85,6 +87,11 @@ class Toolbar : MaterialToolbar {
findViewById<View>(R.id.toolbarNavigation).visibility = if (visible) VISIBLE else GONE
}
fun tintNavigationIcon(@ColorInt color: Int) {
findViewById<ImageButton>(R.id.toolbarNavigationIcon).imageTintList =
ColorStateList.valueOf(color)
}
fun setAvatarIcon(icon: Drawable?) {
findViewById<ImageView>(R.id.toolbarAvatar).setImageDrawable(icon)
}