forked from melod1n/fast-messenger
Theme switching
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
+5
-20
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user