Reworked light/dark theme setting

This commit is contained in:
Sylvain Berfini 2023-11-23 17:17:29 +01:00
parent a85d0df668
commit 55d67e92d3
8 changed files with 84 additions and 40 deletions

View file

@ -0,0 +1,67 @@
/*
* Copyright (c) 2010-2023 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.linphone.ui
import android.annotation.SuppressLint
import android.content.res.Configuration
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
import androidx.core.view.WindowCompat
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.core.tools.Log
open class GenericActivity : AppCompatActivity() {
companion object {
private const val TAG = "[Generic Activity]"
}
@SuppressLint("SourceLockedOrientationActivity")
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, true)
while (!coreContext.isReady()) {
Thread.sleep(20)
}
val nightMode = resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK
val darkModeEnabled = corePreferences.darkMode
Log.i("$TAG Theme selected in config file is [$darkModeEnabled]")
when (nightMode) {
Configuration.UI_MODE_NIGHT_NO, Configuration.UI_MODE_NIGHT_UNDEFINED -> {
if (darkModeEnabled == 1) {
// Force dark mode
Log.w("$TAG Forcing night mode")
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES)
}
}
Configuration.UI_MODE_NIGHT_YES -> {
if (darkModeEnabled == 0) {
// Force light mode
Log.w("$TAG Forcing day mode")
AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO)
}
}
}
super.onCreate(savedInstanceState)
}
}

View file

@ -27,9 +27,7 @@ import android.view.ViewGroup
import androidx.activity.addCallback
import androidx.annotation.DrawableRes
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.ContextCompat
import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.lifecycleScope
import androidx.navigation.findNavController
@ -37,12 +35,13 @@ import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.AssistantActivityBinding
import org.linphone.ui.GenericActivity
import org.linphone.ui.assistant.fragment.PermissionsFragmentDirections
import org.linphone.utils.ToastUtils
import org.linphone.utils.slideInToastFromTopForDuration
@UiThread
class AssistantActivity : AppCompatActivity() {
class AssistantActivity : GenericActivity() {
companion object {
private const val TAG = "[Assistant Activity]"
@ -57,13 +56,8 @@ class AssistantActivity : AppCompatActivity() {
private lateinit var binding: AssistantActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, true)
super.onCreate(savedInstanceState)
while (!coreContext.isReady()) {
Thread.sleep(20)
}
binding = DataBindingUtil.setContentView(this, R.layout.assistant_activity)
binding.lifecycleOwner = this

View file

@ -25,7 +25,6 @@ import android.os.Bundle
import android.view.ViewGroup
import androidx.annotation.DrawableRes
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
@ -39,10 +38,10 @@ import androidx.window.layout.WindowInfoTracker
import androidx.window.layout.WindowLayoutInfo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import org.linphone.LinphoneApplication
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.CallActivityBinding
import org.linphone.ui.GenericActivity
import org.linphone.ui.call.fragment.ActiveCallFragmentDirections
import org.linphone.ui.call.fragment.ActiveConferenceCallFragmentDirections
import org.linphone.ui.call.fragment.AudioDevicesMenuDialogFragment
@ -58,7 +57,7 @@ import org.linphone.utils.slideInToastFromTop
import org.linphone.utils.slideInToastFromTopForDuration
@UiThread
class CallActivity : AppCompatActivity() {
class CallActivity : GenericActivity() {
companion object {
private const val TAG = "[Call Activity]"
}
@ -70,13 +69,8 @@ class CallActivity : AppCompatActivity() {
private lateinit var callViewModel: CurrentCallViewModel
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, true)
super.onCreate(savedInstanceState)
while (!LinphoneApplication.coreContext.isReady()) {
Thread.sleep(20)
}
binding = DataBindingUtil.setContentView(this, R.layout.call_activity)
binding.lifecycleOwner = this

View file

@ -31,9 +31,7 @@ import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.annotation.DrawableRes
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.WindowCompat
import androidx.core.view.children
import androidx.core.view.doOnAttach
import androidx.databinding.DataBindingUtil
@ -50,6 +48,7 @@ import org.linphone.LinphoneApplication.Companion.corePreferences
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.MainActivityBinding
import org.linphone.ui.GenericActivity
import org.linphone.ui.assistant.AssistantActivity
import org.linphone.ui.main.help.fragment.DebugFragmentDirections
import org.linphone.ui.main.viewmodel.MainViewModel
@ -63,7 +62,7 @@ import org.linphone.utils.slideInToastFromTop
import org.linphone.utils.slideInToastFromTopForDuration
@UiThread
class MainActivity : AppCompatActivity() {
class MainActivity : GenericActivity() {
companion object {
private const val TAG = "[Main Activity]"
@ -83,13 +82,8 @@ class MainActivity : AppCompatActivity() {
// Must be done before the setContentView
installSplashScreen()
WindowCompat.setDecorFitsSystemWindows(window, true)
super.onCreate(savedInstanceState)
while (!coreContext.isReady()) {
Thread.sleep(20)
}
if (checkSelfPermission(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
loadContacts()
}

View file

@ -109,9 +109,7 @@ class SettingsFragment : GenericFragment() {
binding.themeSpinner.adapter = themeAdapter
viewModel.theme.observe(viewLifecycleOwner) { theme ->
viewModel.availableThemesValues.indexOf(
theme
)
binding.themeSpinner.setSelection(viewModel.availableThemesValues.indexOf(theme))
}
binding.themeSpinner.onItemSelectedListener = themeListener

View file

@ -310,8 +310,12 @@ class SettingsViewModel @UiThread constructor() : ViewModel() {
}
@UiThread
fun setTheme(theme: Int) {
corePreferences.darkMode = theme
fun setTheme(themeValue: Int) {
coreContext.postOnCoreThread {
corePreferences.darkMode = themeValue
Log.i("$TAG Theme [$theme] saved")
theme.postValue(themeValue)
}
}
@WorkerThread

View file

@ -24,7 +24,6 @@ import android.net.Uri
import android.os.Bundle
import android.view.View
import androidx.annotation.UiThread
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import androidx.lifecycle.lifecycleScope
import java.io.File
@ -41,11 +40,12 @@ import net.openid.appauth.ResponseTypeValues
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.SingleSignOnOpenIdActivityBinding
import org.linphone.ui.GenericActivity
import org.linphone.utils.FileUtils
import org.linphone.utils.TimestampUtils
@UiThread
class OpenIdActivity : AppCompatActivity() {
class OpenIdActivity : GenericActivity() {
companion object {
private const val TAG = "[Open ID Activity]"

View file

@ -23,24 +23,22 @@ import android.content.Intent
import android.os.Bundle
import android.view.View
import androidx.activity.addCallback
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentActivity
import androidx.viewpager2.adapter.FragmentStateAdapter
import androidx.viewpager2.widget.ViewPager2
import org.linphone.LinphoneApplication.Companion.coreContext
import org.linphone.R
import org.linphone.core.tools.Log
import org.linphone.databinding.WelcomeActivityBinding
import org.linphone.ui.GenericActivity
import org.linphone.ui.assistant.AssistantActivity
import org.linphone.ui.welcome.fragment.WelcomePage1Fragment
import org.linphone.ui.welcome.fragment.WelcomePage2Fragment
import org.linphone.ui.welcome.fragment.WelcomePage3Fragment
import org.linphone.utils.AppUtils
class WelcomeActivity : AppCompatActivity() {
class WelcomeActivity : GenericActivity() {
companion object {
private const val TAG = "[Welcome Activity]"
private const val PAGES = 3
@ -53,13 +51,8 @@ class WelcomeActivity : AppCompatActivity() {
private val pageChangedCallback = PageChangedCallback()
override fun onCreate(savedInstanceState: Bundle?) {
WindowCompat.setDecorFitsSystemWindows(window, true)
super.onCreate(savedInstanceState)
while (!coreContext.isReady()) {
Thread.sleep(20)
}
// Disable back gesture / button
onBackPressedDispatcher.addCallback { }