From c657156ee86f8b7020cafe74f0b13236dc33438f Mon Sep 17 00:00:00 2001 From: Sylvain Berfini Date: Mon, 24 Aug 2020 16:12:56 +0200 Subject: [PATCH] Added setting to use the app in fullscreen --- .../linphone/activities/GenericActivity.kt | 45 +++++++++++++++++++ .../fragments/AdvancedSettingsFragment.kt | 11 +++++ .../viewmodels/AdvancedSettingsViewModel.kt | 10 +++++ .../java/org/linphone/core/CorePreferences.kt | 6 +++ .../res/layout/settings_advanced_fragment.xml | 7 +++ app/src/main/res/values/strings.xml | 2 + 6 files changed, 81 insertions(+) diff --git a/app/src/main/java/org/linphone/activities/GenericActivity.kt b/app/src/main/java/org/linphone/activities/GenericActivity.kt index 76f4a5117..7fcb66220 100644 --- a/app/src/main/java/org/linphone/activities/GenericActivity.kt +++ b/app/src/main/java/org/linphone/activities/GenericActivity.kt @@ -24,8 +24,14 @@ import android.content.pm.ActivityInfo import android.content.res.Configuration import android.os.Bundle import android.view.Surface +import android.view.View import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatDelegate +import androidx.lifecycle.lifecycleScope +import java.util.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.linphone.LinphoneApplication.Companion.coreContext import org.linphone.LinphoneApplication.Companion.corePreferences import org.linphone.LinphoneApplication.Companion.ensureCoreExists @@ -33,11 +39,14 @@ import org.linphone.R import org.linphone.core.tools.Log abstract class GenericActivity : AppCompatActivity() { + private var timer: Timer? = null + @SuppressLint("SourceLockedOrientationActivity") override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) ensureCoreExists(applicationContext) + hideSystemUI() if (corePreferences.forcePortrait) { requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT @@ -59,6 +68,28 @@ abstract class GenericActivity : AppCompatActivity() { } } } + + window.decorView.setOnSystemUiVisibilityChangeListener { visibility -> + if (visibility and View.SYSTEM_UI_FLAG_FULLSCREEN == 0) { + timer?.cancel() + + timer = Timer("Hide Android top & bottom bars") + timer?.schedule(object : TimerTask() { + override fun run() { + lifecycleScope.launch { + withContext(Dispatchers.Main) { + hideSystemUI() + } + } + } + }, 2000) + } + } + } + + override fun onWindowFocusChanged(hasFocus: Boolean) { + super.onWindowFocusChanged(hasFocus) + if (hasFocus) hideSystemUI() } override fun onResume() { @@ -83,4 +114,18 @@ abstract class GenericActivity : AppCompatActivity() { fun isTablet(): Boolean { return resources.getBoolean(R.bool.isTablet) } + + fun hideSystemUI() { + if (corePreferences.fullScreen) { + window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_IMMERSIVE + or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_FULLSCREEN + or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + or View.SYSTEM_UI_FLAG_LAYOUT_STABLE) + } + } + + fun showSystemUI() { + window.decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE) + } } diff --git a/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt b/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt index a13379407..6943ebc0d 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/fragments/AdvancedSettingsFragment.kt @@ -33,6 +33,7 @@ import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import androidx.navigation.fragment.findNavController import org.linphone.R +import org.linphone.activities.GenericActivity import org.linphone.activities.main.settings.viewmodels.AdvancedSettingsViewModel import org.linphone.core.tools.Log import org.linphone.core.tools.compatibility.DeviceUtils @@ -75,6 +76,16 @@ class AdvancedSettingsFragment : Fragment() { } }) + viewModel.fullScreenChangedEvent.observe(viewLifecycleOwner, { + it.consume { hideUI -> + if (hideUI) { + (activity as GenericActivity).hideSystemUI() + } else { + (activity as GenericActivity).showSystemUI() + } + } + }) + viewModel.backgroundModeEnabled.value = !DeviceUtils.isAppUserRestricted(requireContext()) viewModel.goToBatterySettingsEvent.observe(viewLifecycleOwner, { it.consume { diff --git a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AdvancedSettingsViewModel.kt b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AdvancedSettingsViewModel.kt index 9f59bb897..00c1c0c43 100644 --- a/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AdvancedSettingsViewModel.kt +++ b/app/src/main/java/org/linphone/activities/main/settings/viewmodels/AdvancedSettingsViewModel.kt @@ -68,6 +68,15 @@ class AdvancedSettingsViewModel : GenericSettingsViewModel() { private val darkModeValues = arrayListOf(-1, 0, 1) val setNightModeEvent = MutableLiveData>() + val fullScreenListener = object : SettingListenerStub() { + override fun onBoolValueChanged(newValue: Boolean) { + prefs.fullScreen = newValue + fullScreenChangedEvent.value = Event(newValue) + } + } + val fullScreen = MutableLiveData() + val fullScreenChangedEvent = MutableLiveData>() + val deviceNameListener = object : SettingListenerStub() { override fun onTextValueChanged(newValue: String) { prefs.deviceName = newValue @@ -128,6 +137,7 @@ class AdvancedSettingsViewModel : GenericSettingsViewModel() { darkModeLabels.value = labels darkModeIndex.value = darkModeValues.indexOf(prefs.darkMode) + fullScreen.value = prefs.fullScreen deviceName.value = prefs.deviceName remoteProvisioningUrl.value = core.provisioningUri logsServerUrl.value = core.logCollectionUploadServerUrl diff --git a/app/src/main/java/org/linphone/core/CorePreferences.kt b/app/src/main/java/org/linphone/core/CorePreferences.kt index 8bf2894ca..96023bfcd 100644 --- a/app/src/main/java/org/linphone/core/CorePreferences.kt +++ b/app/src/main/java/org/linphone/core/CorePreferences.kt @@ -62,6 +62,12 @@ class CorePreferences constructor(private val context: Context) { config.setBool("app", "force_portrait_orientation", value) } + var fullScreen: Boolean + get() = config.getBool("app", "full_screen_activities", false) + set(value) { + config.setBool("app", "full_screen_activities", value) + } + /** -1 means auto, 0 no, 1 yes */ var darkMode: Int get() { diff --git a/app/src/main/res/layout/settings_advanced_fragment.xml b/app/src/main/res/layout/settings_advanced_fragment.xml index d5c71a2c7..1a473e5ad 100644 --- a/app/src/main/res/layout/settings_advanced_fragment.xml +++ b/app/src/main/res/layout/settings_advanced_fragment.xml @@ -95,6 +95,13 @@ linphone:selectedIndex="@{viewModel.darkModeIndex}" linphone:labels="@{viewModel.darkModeLabels}"/> + + Auto No Yes + Full screen + Device name Changes will be applied at next start up Remote provisioning URL