Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

package com.nextcloud.utils.extensions

import android.view.View
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updatePadding
import androidx.drawerlayout.widget.DrawerLayout

fun DrawerLayout.padDrawerContentForSystemBars(header: View, footer: View) {
val headerTopPadding = header.paddingTop
val footerBottomPadding = footer.paddingBottom

ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
header.updatePadding(top = headerTopPadding + systemBars.top)
footer.updatePadding(bottom = footerBottomPadding + systemBars.bottom)
insets
}
ViewCompat.requestApplyInsets(this)
}
13 changes: 13 additions & 0 deletions app/src/main/java/com/nextcloud/utils/extensions/ViewExtensions.kt
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,22 @@ import android.view.View
import android.view.ViewGroup
import android.view.ViewOutlineProvider
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.updateLayoutParams
import com.nextcloud.ui.behavior.OnScrollBehavior
import com.owncloud.android.lib.common.utils.Log_OC

fun View.addNavigationBarInsetToBottomMargin() {
val baseBottomMargin = (layoutParams as? ViewGroup.MarginLayoutParams)?.bottomMargin ?: return
ViewCompat.setOnApplyWindowInsetsListener(this) { view, insets ->
view.updateLayoutParams<ViewGroup.MarginLayoutParams> {
bottomMargin = baseBottomMargin + insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom
}
insets
}
}

fun View?.setVisibleIf(condition: Boolean) {
if (this == null) return
visibility = if (condition) View.VISIBLE else View.GONE
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ package com.nextcloud.utils.extensions
import android.view.View
import android.view.Window
import androidx.appcompat.app.ActionBar
import androidx.core.view.ViewCompat
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
import androidx.core.view.isVisible
import androidx.core.view.updatePadding

fun ActionBar.toggle(show: Boolean) {
if (show) {
Expand All @@ -22,16 +25,19 @@ fun ActionBar.toggle(show: Boolean) {
}
}

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.extendBarsBehindSystemBars(appBar: View, bottomBar: View?) {
ViewCompat.setOnApplyWindowInsetsListener(decorView) { view, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
val ime = insets.getInsets(WindowInsetsCompat.Type.ime())
val isBottomBarBehindNavigationBar = bottomBar?.isVisible == true && ime.bottom == 0
val bottomInset = if (isBottomBarBehindNavigationBar) 0 else maxOf(systemBars.bottom, ime.bottom)

view.updatePadding(left = systemBars.left, top = 0, right = systemBars.right, bottom = bottomInset)
appBar.updatePadding(top = systemBars.top)

insets.inset(systemBars.left, 0, systemBars.right, bottomInset)
}
ViewCompat.requestApplyInsets(decorView)
}

fun Window.showNavigationBar(show: Boolean, view: View) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
import com.nextcloud.utils.SnackbarUtil;
import com.nextcloud.utils.extensions.ActivityExtensionsKt;
import com.nextcloud.utils.extensions.DrawerActivityExtensionsKt;
import com.nextcloud.utils.extensions.DrawerLayoutExtensionsKt;
import com.nextcloud.utils.extensions.NavigationViewExtensionsKt;
import com.nextcloud.utils.extensions.ViewExtensionsKt;
import com.nextcloud.utils.mdm.MDMConfig;
Expand Down Expand Up @@ -131,6 +132,7 @@
import androidx.core.content.ContextCompat;
import androidx.core.content.res.ResourcesCompat;
import androidx.core.view.GravityCompat;
import androidx.core.view.ViewCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;
Expand Down Expand Up @@ -173,6 +175,8 @@ public abstract class DrawerActivity extends ToolbarActivity
*/
private View mNavigationViewHeader;

private boolean isDrawerPaddedForSystemBars;

/**
* Flag to signal if the account chooser is active.
*/
Expand Down Expand Up @@ -262,6 +266,7 @@ protected void setupDrawer(int id) {

// Setting up drawer header
mNavigationViewHeader = drawerNavigationView.getHeaderView(0);
padDrawerForSystemBars();
updateHeader();

setupDrawerMenu(drawerNavigationView);
Expand Down Expand Up @@ -1491,8 +1496,19 @@ private void handleNavItemClickEvent(@IdRes int menuItemId) {
onNavigationItemClicked(navMenu.findItem(menuItemId));
}

private void padDrawerForSystemBars() {
View quota = drawerNavigationView.findViewById(R.id.drawer_quota);
if (isDrawerPaddedForSystemBars || mDrawerLayout == null || mNavigationViewHeader == null || quota == null) {
return;
}

DrawerLayoutExtensionsKt.padDrawerContentForSystemBars(mDrawerLayout, mNavigationViewHeader, quota);
isDrawerPaddedForSystemBars = true;
}

public void showBottomNavigationBar(boolean show) {
ViewExtensionsKt.setVisibleIf(bottomNavigationView, show);
ViewCompat.requestApplyInsets(getWindow().getDecorView());
}

public BottomNavigationView getBottomNavigationView() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ import com.nextcloud.model.OCUploadLocalPathData
import com.nextcloud.model.WorkerState.OfflineOperationsCompleted
import com.nextcloud.ui.composeActivity.ComposeProcessTextAlias
import com.nextcloud.utils.SnackbarUtil
import com.nextcloud.utils.extensions.addNavigationBarInsetToBottomMargin
import com.nextcloud.utils.extensions.getParcelableArgument
import com.nextcloud.utils.extensions.getSerializableArgument
import com.nextcloud.utils.extensions.isActive
Expand Down Expand Up @@ -352,6 +353,7 @@ class FileDisplayActivity :
// Inflate and set the layout view
binding = FilesBinding.inflate(layoutInflater)
setContentView(binding.getRoot())
binding.fabMain.addNavigationBarInsetToBottomMargin()
}

private fun initUI() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
import com.google.android.material.textview.MaterialTextView;
import com.nextcloud.android.common.ui.theme.utils.ColorRole;
import com.nextcloud.client.di.Injectable;
import com.nextcloud.utils.extensions.WindowExtensionsKt;
import com.owncloud.android.R;
import com.owncloud.android.datamodel.FileDataStorageManager;
import com.owncloud.android.datamodel.OCFile;
Expand Down Expand Up @@ -87,6 +88,9 @@ private void setupToolbar(boolean isHomeSearchToolbarShow, boolean showSortListB
setSupportActionBar(mToolbar);

mAppBar = findViewById(R.id.appbar);
if (mAppBar != null) {
WindowExtensionsKt.extendBarsBehindSystemBars(getWindow(), mAppBar, findViewById(R.id.bottom_navigation));
}
mDefaultToolbar = findViewById(R.id.default_toolbar);
mHomeSearchToolbar = findViewById(R.id.home_toolbar);
mHomeSearchContainer = findViewById(R.id.home_search_container);
Expand Down Expand Up @@ -276,6 +280,7 @@ private void showHomeSearchToolbar(boolean isShow) {

if (isShow) {
viewThemeUtils.platform.resetStatusBar(this);
mAppBar.setBackgroundResource(R.color.bg_default);
mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
R.animator.appbar_elevation_off));
mDefaultToolbar.setVisibility(View.GONE);
Expand All @@ -286,6 +291,7 @@ private void showHomeSearchToolbar(boolean isShow) {
mAppBar.setStateListAnimator(AnimatorInflater.loadStateListAnimator(mAppBar.getContext(),
R.animator.appbar_elevation_on));
viewThemeUtils.platform.themeStatusBar(this);
viewThemeUtils.platform.colorViewBackground(mAppBar);
mDefaultToolbar.setVisibility(View.VISIBLE);
mHomeSearchToolbar.setVisibility(View.GONE);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,12 @@ import android.content.Context
import android.content.Intent
import android.content.IntentFilter
import android.content.res.Configuration
import android.graphics.Color
import android.os.Bundle
import android.view.MenuItem
import androidx.activity.OnBackPressedCallback
import androidx.activity.SystemBarStyle
import androidx.activity.enableEdgeToEdge
import androidx.core.content.ContextCompat
import androidx.core.graphics.drawable.toDrawable
import androidx.core.view.ViewCompat
Expand Down Expand Up @@ -120,6 +123,12 @@ class PreviewImageActivity :

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge(
statusBarStyle = SystemBarStyle.dark(Color.TRANSPARENT),
navigationBarStyle = SystemBarStyle.dark(Color.TRANSPARENT)
)
window.setBackgroundDrawable(ContextCompat.getColor(this, R.color.black).toDrawable())
ViewCompat.setOnApplyWindowInsetsListener(window.decorView, null)

if (savedInstanceState != null &&
!savedInstanceState.getBoolean(
Expand All @@ -141,7 +150,7 @@ class PreviewImageActivity :
updateActionBarTitleAndHomeButton(chosenFile)
viewThemeUtils.files.setWhiteBackButton(this, it)
it.setDisplayHomeAsUpEnabled(true)
it.setBackgroundDrawable(R.color.black.toDrawable())
it.setBackgroundDrawable(ContextCompat.getColor(this, R.color.black).toDrawable())
}

setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED)
Expand All @@ -152,8 +161,6 @@ class PreviewImageActivity :
}

observeWorkerState()
applyDisplayCutOutTopPadding()

handleBackPress()

lifecycle.addObserver(sendShareDownloader)
Expand All @@ -175,27 +182,6 @@ class PreviewImageActivity :

override fun getMenuItemId(): Int = R.id.nav_gallery

private fun applyDisplayCutOutTopPadding() {
window.decorView.setOnApplyWindowInsetsListener { view, insets ->
updatePagerDisplayCutOutPadding(isInPictureInPictureMode, insets.displayCutout?.safeInsetTop ?: 0)
view.onApplyWindowInsets(insets)
}
}

private fun updatePagerDisplayCutOutPadding(inPictureInPictureMode: Boolean, safeInsetTop: Int) {
val pager = viewPager ?: findViewById(R.id.fragmentPager) ?: return
val topPadding = if (inPictureInPictureMode) 0 else safeInsetTop

pager.setPadding(pager.paddingLeft, topPadding, pager.paddingRight, pager.paddingBottom)

if (topPadding > 0) {
pager.setBackgroundColor(ContextCompat.getColor(this, R.color.black))
}
}

private fun displayCutOutSafeInsetTop(): Int =
ViewCompat.getRootWindowInsets(window.decorView)?.displayCutout?.safeInsetTop ?: 0

fun toggleActionBarVisibility(show: Boolean) {
supportActionBar?.toggle(show)
}
Expand Down Expand Up @@ -536,7 +522,6 @@ class PreviewImageActivity :

override fun onPictureInPictureModeChanged(isInPictureInPictureMode: Boolean, newConfig: Configuration) {
super.onPictureInPictureModeChanged(isInPictureInPictureMode, newConfig)
updatePagerDisplayCutOutPadding(isInPictureInPictureMode, displayCutOutSafeInsetTop())

if (isInPictureInPictureMode) {
wasSystemUiVisibleBeforePictureInPicture = isSystemUIVisible
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ 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
Expand Down Expand Up @@ -411,7 +410,6 @@ class PreviewPlaybackFragment :
previewActivity.toggleActionBarVisibility(!isFullScreen)
binding.playerControlView.setVisibilityWithAnimation(!isFullScreen)
previewActivity.window.run {
showSystemBar(!isFullScreen, binding.root)
showNavigationBar(!isFullScreen, binding.root)
}
}
Expand Down
47 changes: 27 additions & 20 deletions app/src/main/res/layout/preview_playback_fragment.xml
Original file line number Diff line number Diff line change
Expand Up @@ -8,28 +8,35 @@
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/player_background_color">

<ImageView
android:id="@+id/icon"
android:layout_width="@dimen/player_file_icon_size"
android:layout_height="@dimen/player_file_icon_size"
android:layout_gravity="center"
android:importantForAccessibility="no"
android:src="@drawable/video_white" />

<ImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no" />
android:background="@color/black">

<SurfaceView
android:id="@+id/surfaceView"
<FrameLayout
android:id="@+id/videoContainer"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="gone" />
android:layout_height="match_parent">

<ImageView
android:id="@+id/icon"
android:layout_width="@dimen/player_file_icon_size"
android:layout_height="@dimen/player_file_icon_size"
android:layout_gravity="center"
android:importantForAccessibility="no"
android:src="@drawable/video_white" />

<ImageView
android:id="@+id/thumbnail"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:importantForAccessibility="no" />

<SurfaceView
android:id="@+id/surfaceView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:visibility="gone" />

</FrameLayout>

<com.nextcloud.client.player.ui.control.PlayerControlView
android:id="@+id/playerControlView"
Expand Down
2 changes: 0 additions & 2 deletions app/src/main/res/values/colors.xml
Original file line number Diff line number Diff line change
Expand Up @@ -71,8 +71,6 @@

<color name="background_color_png">#FFFFFF</color>

<!-- special transparent action bar colors for image preview -->
<color name="color_transparent">#201D2D44</color>
<color name="color_dark_transparent">#40162233</color>

<!-- Multiselect backgrounds -->
Expand Down
4 changes: 2 additions & 2 deletions app/src/main/res/values/styles.xml
Original file line number Diff line number Diff line change
Expand Up @@ -237,10 +237,10 @@

<!-- ACTION BAR STYLES -->
<style name="Theme.ownCloud.Overlay.ActionBar" parent="@style/Widget.Material3.Toolbar">
<item name="android:background">@color/color_transparent</item>
<item name="android:background">@android:color/transparent</item>
<item name="android:windowActionBarOverlay">true</item>
<!-- Support library compatibility -->
<item name="background">@color/color_transparent</item>
<item name="background">@android:color/transparent</item>
<item name="windowActionBarOverlay">true</item>
<item name="titleTextColor">@color/white</item>
</style>
Expand Down
Loading