mirror of
https://gitlab.linphone.org/BC/public/linphone-android.git
synced 2026-01-17 11:28:06 +00:00
Reworked light/dark theme setting
This commit is contained in:
parent
a85d0df668
commit
55d67e92d3
8 changed files with 84 additions and 40 deletions
67
app/src/main/java/org/linphone/ui/GenericActivity.kt
Normal file
67
app/src/main/java/org/linphone/ui/GenericActivity.kt
Normal 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)
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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]"
|
||||
|
||||
|
|
|
|||
|
|
@ -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 { }
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue