diff --git a/app/src/main/java/org/linphone/ui/GenericActivity.kt b/app/src/main/java/org/linphone/ui/GenericActivity.kt new file mode 100644 index 000000000..a27359b8a --- /dev/null +++ b/app/src/main/java/org/linphone/ui/GenericActivity.kt @@ -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 . + */ +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) + } +} diff --git a/app/src/main/java/org/linphone/ui/assistant/AssistantActivity.kt b/app/src/main/java/org/linphone/ui/assistant/AssistantActivity.kt index 2b0d5ed77..7ed845391 100644 --- a/app/src/main/java/org/linphone/ui/assistant/AssistantActivity.kt +++ b/app/src/main/java/org/linphone/ui/assistant/AssistantActivity.kt @@ -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 diff --git a/app/src/main/java/org/linphone/ui/call/CallActivity.kt b/app/src/main/java/org/linphone/ui/call/CallActivity.kt index 938fa6869..8146a8dbd 100644 --- a/app/src/main/java/org/linphone/ui/call/CallActivity.kt +++ b/app/src/main/java/org/linphone/ui/call/CallActivity.kt @@ -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 diff --git a/app/src/main/java/org/linphone/ui/main/MainActivity.kt b/app/src/main/java/org/linphone/ui/main/MainActivity.kt index de2caf0eb..ca9c69eeb 100644 --- a/app/src/main/java/org/linphone/ui/main/MainActivity.kt +++ b/app/src/main/java/org/linphone/ui/main/MainActivity.kt @@ -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() } diff --git a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt index b411bb378..12df2c501 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/fragment/SettingsFragment.kt @@ -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 diff --git a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt index 972c8900c..509ba0d26 100644 --- a/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt +++ b/app/src/main/java/org/linphone/ui/main/settings/viewmodel/SettingsViewModel.kt @@ -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 diff --git a/app/src/main/java/org/linphone/ui/sso/OpenIdActivity.kt b/app/src/main/java/org/linphone/ui/sso/OpenIdActivity.kt index 42afcbc6c..120f40143 100644 --- a/app/src/main/java/org/linphone/ui/sso/OpenIdActivity.kt +++ b/app/src/main/java/org/linphone/ui/sso/OpenIdActivity.kt @@ -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]" diff --git a/app/src/main/java/org/linphone/ui/welcome/WelcomeActivity.kt b/app/src/main/java/org/linphone/ui/welcome/WelcomeActivity.kt index 5f6c01de9..95c8b842f 100644 --- a/app/src/main/java/org/linphone/ui/welcome/WelcomeActivity.kt +++ b/app/src/main/java/org/linphone/ui/welcome/WelcomeActivity.kt @@ -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 { }