diff --git a/ui/src/main/java/com/wireguard/android/Application.kt b/ui/src/main/java/com/wireguard/android/Application.kt index 94fb2ca7..c66c52bd 100644 --- a/ui/src/main/java/com/wireguard/android/Application.kt +++ b/ui/src/main/java/com/wireguard/android/Application.kt @@ -35,6 +35,7 @@ import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import java.lang.ref.WeakReference import java.util.Locale @@ -92,10 +93,19 @@ class Application : android.app.Application() { toolsInstaller = ToolsInstaller(applicationContext, rootShell) preferencesDataStore = PreferenceDataStoreFactory.create { applicationContext.preferencesDataStoreFile("settings") } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - coroutineScope.launch { - AppCompatDelegate.setDefaultNightMode( - if (UserKnobs.darkTheme.first()) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO) + runBlocking { + AppCompatDelegate.setDefaultNightMode(if (UserKnobs.darkTheme.first()) AppCompatDelegate.MODE_NIGHT_YES else AppCompatDelegate.MODE_NIGHT_NO) } + UserKnobs.darkTheme.onEach { + val newMode = if (it) { + AppCompatDelegate.MODE_NIGHT_YES + } else { + AppCompatDelegate.MODE_NIGHT_NO + } + if (AppCompatDelegate.getDefaultNightMode() != newMode) { + AppCompatDelegate.setDefaultNightMode(newMode) + } + }.launchIn(coroutineScope) } else { AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM) } diff --git a/ui/src/main/java/com/wireguard/android/activity/BaseActivity.kt b/ui/src/main/java/com/wireguard/android/activity/BaseActivity.kt index c89bc5aa..bec673db 100644 --- a/ui/src/main/java/com/wireguard/android/activity/BaseActivity.kt +++ b/ui/src/main/java/com/wireguard/android/activity/BaseActivity.kt @@ -5,6 +5,7 @@ package com.wireguard.android.activity import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity import androidx.databinding.CallbackRegistry import androidx.databinding.CallbackRegistry.NotifierCallback import androidx.lifecycle.lifecycleScope @@ -15,7 +16,7 @@ import kotlinx.coroutines.launch /** * Base class for activities that need to remember the currently-selected tunnel. */ -abstract class BaseActivity : ThemeChangeAwareActivity() { +abstract class BaseActivity : AppCompatActivity() { private val selectionChangeRegistry = SelectionChangeRegistry() private var created = false var selectedTunnel: ObservableTunnel? = null diff --git a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt index aa768e0b..53b25938 100644 --- a/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt +++ b/ui/src/main/java/com/wireguard/android/activity/SettingsActivity.kt @@ -8,6 +8,7 @@ import android.content.Intent import android.os.Build import android.os.Bundle import android.view.MenuItem +import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.commit import androidx.lifecycle.lifecycleScope import androidx.preference.Preference @@ -24,7 +25,7 @@ import kotlinx.coroutines.withContext /** * Interface for changing application-global persistent settings. */ -class SettingsActivity : ThemeChangeAwareActivity() { +class SettingsActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) if (supportFragmentManager.findFragmentById(android.R.id.content) == null) { diff --git a/ui/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.kt b/ui/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.kt deleted file mode 100644 index 06f621c4..00000000 --- a/ui/src/main/java/com/wireguard/android/activity/ThemeChangeAwareActivity.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright © 2017-2023 WireGuard LLC. All Rights Reserved. - * SPDX-License-Identifier: Apache-2.0 - */ -package com.wireguard.android.activity - -import android.os.Build -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.app.AppCompatDelegate -import androidx.lifecycle.lifecycleScope -import com.wireguard.android.util.UserKnobs -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onEach - -abstract class ThemeChangeAwareActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - UserKnobs.darkTheme.onEach { - val newMode = if (it) { - AppCompatDelegate.MODE_NIGHT_YES - } else { - AppCompatDelegate.MODE_NIGHT_NO - } - if (AppCompatDelegate.getDefaultNightMode() != newMode) { - AppCompatDelegate.setDefaultNightMode(newMode) - recreate() - } - }.launchIn(lifecycleScope) - } - } -} diff --git a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt index 3026d9a9..4545672f 100644 --- a/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt +++ b/ui/src/main/java/com/wireguard/android/activity/TvMainActivity.kt @@ -21,6 +21,7 @@ import android.view.View import android.widget.Toast import androidx.activity.addCallback import androidx.activity.result.contract.ActivityResultContracts +import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate import androidx.core.content.ContextCompat import androidx.core.content.getSystemService @@ -48,13 +49,14 @@ import com.wireguard.android.util.ErrorMessages import com.wireguard.android.util.QuantityFormatter import com.wireguard.android.util.TunnelImporter import com.wireguard.android.util.UserKnobs +import com.wireguard.android.util.applicationScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.File -class TvMainActivity : ThemeChangeAwareActivity() { +class TvMainActivity : AppCompatActivity() { private val tunnelFileImportResultLauncher = registerForActivityResult(object : ActivityResultContracts.GetContent() { override fun createIntent(context: Context, input: String): Intent { val intent = super.createIntent(context, input) @@ -112,11 +114,9 @@ class TvMainActivity : ThemeChangeAwareActivity() { override fun onCreate(savedInstanceState: Bundle?) { if (AppCompatDelegate.getDefaultNightMode() != AppCompatDelegate.MODE_NIGHT_YES) { - /* First set it this way to prevent a white flash. */ AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES) if (Build.VERSION.SDK_INT < Build.VERSION_CODES.Q) { - /* Then update the preference, which triggers the recreation. */ - lifecycleScope.launch { + applicationScope.launch { UserKnobs.setDarkTheme(true) } }