Added setting to use the app in fullscreen

This commit is contained in:
Sylvain Berfini 2020-08-24 16:12:56 +02:00
parent 253e2dc654
commit c657156ee8
6 changed files with 81 additions and 0 deletions

View file

@ -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)
}
}

View file

@ -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 {

View file

@ -68,6 +68,15 @@ class AdvancedSettingsViewModel : GenericSettingsViewModel() {
private val darkModeValues = arrayListOf(-1, 0, 1)
val setNightModeEvent = MutableLiveData<Event<Int>>()
val fullScreenListener = object : SettingListenerStub() {
override fun onBoolValueChanged(newValue: Boolean) {
prefs.fullScreen = newValue
fullScreenChangedEvent.value = Event(newValue)
}
}
val fullScreen = MutableLiveData<Boolean>()
val fullScreenChangedEvent = MutableLiveData<Event<Boolean>>()
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

View file

@ -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() {

View file

@ -95,6 +95,13 @@
linphone:selectedIndex="@{viewModel.darkModeIndex}"
linphone:labels="@{viewModel.darkModeLabels}"/>
<include
layout="@layout/settings_widget_switch"
linphone:title="@{@string/advanced_settings_full_screen_title}"
linphone:subtitle="@{@string/advanced_settings_full_screen_summary}"
linphone:listener="@{viewModel.fullScreenListener}"
linphone:checked="@={viewModel.fullScreen}"/>
<include
layout="@layout/settings_widget_text"
linphone:title="@{@string/advanced_settings_device_name_title}"

View file

@ -454,6 +454,8 @@
<string name="advanced_settings_dark_mode_label_auto">Auto</string>
<string name="advanced_settings_dark_mode_label_no">No</string>
<string name="advanced_settings_dark_mode_label_yes">Yes</string>
<string name="advanced_settings_full_screen_title">Full screen</string>
<string name="advanced_settings_full_screen_summary"></string>
<string name="advanced_settings_device_name_title">Device name</string>
<string name="advanced_settings_device_name_summary">Changes will be applied at next start up</string>
<string name="advanced_settings_remote_provisioning_url_title">Remote provisioning URL</string>