diff --git a/app/src/androidTest/java/com/nmc/android/ui/LauncherActivityIT.kt b/app/src/androidTest/java/com/nmc/android/ui/LauncherActivityIT.kt
index 6a25b465084a..b2ab5ff004bc 100644
--- a/app/src/androidTest/java/com/nmc/android/ui/LauncherActivityIT.kt
+++ b/app/src/androidTest/java/com/nmc/android/ui/LauncherActivityIT.kt
@@ -10,6 +10,7 @@ import android.content.Intent
import android.view.View
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.platform.app.InstrumentationRegistry
+import com.nextcloud.test.Flaky
import com.owncloud.android.AbstractIT
import com.owncloud.android.R
import org.junit.Assert.assertEquals
@@ -31,6 +32,7 @@ class LauncherActivityIT : AbstractIT() {
}
@Test
+ @Flaky(reason = "Opening FileDisplayActivity can keep the main thread busy past the launch timeout")
fun testSplashScreenWithTitlesShouldShowTitles() {
val activity = launchLauncherActivity()
diff --git a/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt b/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt
index a0ebd8ee76ab..73362905e918 100644
--- a/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt
+++ b/app/src/main/java/com/nextcloud/client/systembars/SystemBarBackgroundCallbacks.kt
@@ -17,6 +17,7 @@ import com.nmc.android.ui.LauncherActivity
import com.owncloud.android.R
import com.owncloud.android.authentication.AuthenticatorActivity
import com.owncloud.android.ui.activity.DrawerActivity
+import com.owncloud.android.ui.preview.PreviewImageActivity
import com.owncloud.android.utils.theme.ViewThemeUtils
import dynamiccolor.MaterialDynamicColors
import javax.inject.Provider
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt
index 4f9ba65373fd..d062e9b3d127 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/WindowExtensions.kt
@@ -7,12 +7,7 @@
package com.nextcloud.utils.extensions
-import android.view.View
-import android.view.Window
import androidx.appcompat.app.ActionBar
-import androidx.core.view.WindowCompat
-import androidx.core.view.WindowInsetsCompat
-import androidx.core.view.WindowInsetsControllerCompat
fun ActionBar.toggle(show: Boolean) {
if (show) {
@@ -21,27 +16,3 @@ fun ActionBar.toggle(show: Boolean) {
hide()
}
}
-
-fun Window.showSystemBar(show: Boolean, view: View) {
- WindowCompat.getInsetsController(this, view).run {
- val types = WindowInsetsCompat.Type.systemBars()
- if (show) {
- show(types)
- } else {
- systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- hide(types)
- }
- }
-}
-
-fun Window.showNavigationBar(show: Boolean, view: View) {
- WindowCompat.getInsetsController(this, view).run {
- val types = WindowInsetsCompat.Type.navigationBars()
- if (show) {
- show(types)
- } else {
- systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
- hide(types)
- }
- }
-}
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
index 5049c8dfd5d3..39822907e8e0 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageActivity.kt
@@ -12,6 +12,7 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.res.Configuration
+import android.os.Build
import android.os.Bundle
import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
@@ -102,7 +103,9 @@ class PreviewImageActivity :
private val downloadFinishReceiver = DownloadFinishReceiver()
private val windowInsetsController: WindowInsetsControllerCompat by lazy {
- WindowCompat.getInsetsController(window, window.decorView)
+ WindowCompat.getInsetsController(window, window.decorView).apply {
+ systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+ }
}
private var isDownloadWorkStarted = false
@@ -123,7 +126,7 @@ class PreviewImageActivity :
if (savedInstanceState != null &&
!savedInstanceState.getBoolean(
- KEY_SYSTEM_VISIBLE,
+ KEY_ACTION_BAR_VISIBLE,
true
) &&
supportActionBar != null
@@ -158,6 +161,15 @@ class PreviewImageActivity :
lifecycle.addObserver(sendShareDownloader)
sendShareDownloader.restoreState(savedInstanceState)
+ applyDarkSystemBars()
+ }
+
+ private fun applyDarkSystemBars() {
+ windowInsetsController.isAppearanceLightStatusBars = false
+ windowInsetsController.isAppearanceLightNavigationBars = false
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
+ window.isNavigationBarContrastEnforced = false
+ }
}
override fun onNewIntent(intent: Intent?) {
@@ -380,7 +392,7 @@ class PreviewImageActivity :
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putBoolean(KEY_WAITING_FOR_BINDER, screenState == PreviewImageActivityState.WaitingForBinder)
- outState.putBoolean(KEY_SYSTEM_VISIBLE, isSystemUIVisible)
+ outState.putBoolean(KEY_ACTION_BAR_VISIBLE, isActionBarVisible)
sendShareDownloader.saveState(outState)
}
@@ -539,12 +551,12 @@ class PreviewImageActivity :
updatePagerDisplayCutOutPadding(isInPictureInPictureMode, displayCutOutSafeInsetTop())
if (isInPictureInPictureMode) {
- wasSystemUiVisibleBeforePictureInPicture = isSystemUIVisible
+ wasActionBarVisibleBeforePictureInPicture = isActionBarVisible
toggleActionBarVisibility(false)
return
}
- toggleActionBarVisibility(wasSystemUiVisibleBeforePictureInPicture)
+ toggleActionBarVisibility(wasActionBarVisibleBeforePictureInPicture)
if (lifecycle.currentState != Lifecycle.State.CREATED) return
@@ -629,19 +641,19 @@ class PreviewImageActivity :
}
}
- val isSystemUIVisible: Boolean
+ val isActionBarVisible: Boolean
get() = supportActionBar == null || supportActionBar?.isShowing == true
fun toggleFullScreen() {
- val rootInsets = ViewCompat.getRootWindowInsets(window.decorView) ?: return
-
// the content is laid out edge to edge so that showing and hiding the bars does not move it
WindowCompat.setDecorFitsSystemWindows(window, false)
- if (rootInsets.isVisible(WindowInsetsCompat.Type.systemBars())) {
- windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
+ val showBars = !isActionBarVisible
+ toggleActionBarVisibility(showBars)
+ if (showBars) {
+ windowInsetsController.show(WindowInsetsCompat.Type.navigationBars())
} else {
- windowInsetsController.show(WindowInsetsCompat.Type.systemBars())
+ windowInsetsController.hide(WindowInsetsCompat.Type.navigationBars())
}
}
@@ -675,7 +687,7 @@ class PreviewImageActivity :
const val EXTRA_VIRTUAL_TYPE: String = "EXTRA_VIRTUAL_TYPE"
const val EXTRA_MEDIA_STATE: String = "EXTRA_MEDIA_STATE"
private const val KEY_WAITING_FOR_BINDER = "WAITING_FOR_BINDER"
- private const val KEY_SYSTEM_VISIBLE = "TRUE"
+ private const val KEY_ACTION_BAR_VISIBLE = "TRUE"
private const val NO_POSITION = -1
fun previewFileIntent(context: Context?, user: User?, file: OCFile?): Intent =
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt
index 5cbe74c00289..7cb46e1ebd91 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewImageFragment.kt
@@ -793,7 +793,7 @@ class PreviewImageFragment :
if (binding.image.drawable is LayerDrawable) {
val layerDrawable = binding.image.drawable as LayerDrawable
- val layerOne = if (previewImageActivity?.isSystemUIVisible == true) {
+ val layerOne = if (previewImageActivity?.isActionBarVisible == true) {
ResourcesCompat.getDrawable(resources, R.color.bg_default, null)
} else {
ResourcesCompat.getDrawable(
diff --git a/app/src/main/java/com/owncloud/android/ui/preview/PreviewPlaybackFragment.kt b/app/src/main/java/com/owncloud/android/ui/preview/PreviewPlaybackFragment.kt
index 893623cadfa6..664740e1caa3 100644
--- a/app/src/main/java/com/owncloud/android/ui/preview/PreviewPlaybackFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/preview/PreviewPlaybackFragment.kt
@@ -43,8 +43,6 @@ import com.nextcloud.ui.fileactions.FileActionsBottomSheet
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.getSerializableArgument
import com.nextcloud.utils.extensions.setVisibilityWithAnimation
-import com.nextcloud.utils.extensions.showNavigationBar
-import com.nextcloud.utils.extensions.showSystemBar
import com.owncloud.android.R
import com.owncloud.android.databinding.PreviewPlaybackFragmentBinding
import com.owncloud.android.datamodel.OCFile
@@ -123,7 +121,9 @@ class PreviewPlaybackFragment :
private var renderedVideoSize: VideoSize? = null
private var pictureInPictureCallback: OnBackPressedCallback? = null
- private var isFullScreen = false
+
+ private val previewActivity: PreviewImageActivity?
+ get() = activity as? PreviewImageActivity
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
@@ -183,7 +183,7 @@ class PreviewPlaybackFragment :
}
private fun onOverflowClick(isManualClick: Boolean = false) {
- val storageManager = previewActivity()?.storageManager ?: return
+ val storageManager = previewActivity?.storageManager ?: return
val updatedFile = storageManager.getFileById(file.fileId)
// check for albums file for album file both local and remoteId will be same configured at operation level
@@ -203,7 +203,7 @@ class PreviewPlaybackFragment :
}
private fun fetchFileMetaDataIfAbsent(ocFile: OCFile) {
- val previewActivity = previewActivity() ?: return
+ val previewActivity = previewActivity ?: return
val context = context ?: return
previewActivity.showLoadingDialog(getString(R.string.wait_a_moment))
@@ -233,7 +233,7 @@ class PreviewPlaybackFragment :
@Suppress("CyclomaticComplexMethod")
private fun onFileActionChosen(itemId: Int) {
- val previewActivity = previewActivity() ?: return
+ val previewActivity = previewActivity ?: return
val fileOperationsHelper = previewActivity.fileOperationsHelper
when (itemId) {
@@ -291,7 +291,7 @@ class PreviewPlaybackFragment :
viewLifecycleOwner,
enabled = false
) {
- if (previewActivity()?.enterPictureInPicture() == true) {
+ if (previewActivity?.enterPictureInPicture() == true) {
return@addCallback
}
@@ -392,7 +392,7 @@ class PreviewPlaybackFragment :
}
private fun showPageOfCurrentItem(state: PlaybackState?) {
- val previewActivity = previewActivity() ?: return
+ val previewActivity = previewActivity ?: return
val localId = state?.currentItemState?.file?.id?.toLongOrNull()
if (localId != null && previewActivity.showFilePage(localId)) return
@@ -401,19 +401,12 @@ class PreviewPlaybackFragment :
}
}
- private fun previewActivity(): PreviewImageActivity? = activity as? PreviewImageActivity
-
private fun isInPictureInPictureMode(): Boolean = activity?.isInPictureInPictureMode == true
private fun toggleFullScreen() {
- val previewActivity = previewActivity() ?: return
- isFullScreen = !isFullScreen
- previewActivity.toggleActionBarVisibility(!isFullScreen)
- binding.playerControlView.setVisibilityWithAnimation(!isFullScreen)
- previewActivity.window.run {
- showSystemBar(!isFullScreen, binding.root)
- showNavigationBar(!isFullScreen, binding.root)
- }
+ val previewActivity = previewActivity ?: return
+ binding.playerControlView.setVisibilityWithAnimation(!previewActivity.isActionBarVisible)
+ previewActivity.toggleFullScreen()
}
private fun updatePlayerControlsVisibility() {
@@ -422,8 +415,7 @@ class PreviewPlaybackFragment :
return
}
- // playback updates arrive every second, so they must not undo full screen or cut the fade short
- if (!isFullScreen) {
+ if (previewActivity?.isActionBarVisible == true) {
binding.playerControlView.isVisible = true
}
}
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 0003449383bf..3b48bcb6524a 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -545,8 +545,6 @@
- @color/player_default_text_color
-
-