diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 66c2311b1..541dcbe7e 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -1,6 +1,6 @@
[versions]
androidGradlePlugin = "8.7.2"
-androidxActivity = "1.6.1"
+androidxActivity = "1.8.0"
androidxAnnotation = "1.6.0"
androidxAppCompat = "1.6.1"
androidxArch = "2.2.0"
@@ -47,6 +47,7 @@ stetho = "1.6.0"
timber = "5.0.1"
[libraries]
+androidx-activity = { group = "androidx.activity", name = "activity", version.ref = "androidxActivity" }
androidx-annotation = { group = "androidx.annotation", name = "annotation", version.ref = "androidxAnnotation" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidxAppCompat" }
androidx-arch-core-testing = { group = "androidx.arch.core", name = "core-testing", version.ref = "androidxArch" }
diff --git a/opencloudApp/build.gradle b/opencloudApp/build.gradle
index f52ce2b5a..d29370371 100644
--- a/opencloudApp/build.gradle
+++ b/opencloudApp/build.gradle
@@ -16,6 +16,7 @@ dependencies {
implementation libs.kotlinx.coroutines.core
// Android X
+ implementation libs.androidx.activity
implementation libs.androidx.annotation
implementation libs.androidx.appcompat
implementation libs.androidx.biometric
diff --git a/opencloudApp/src/main/AndroidManifest.xml b/opencloudApp/src/main/AndroidManifest.xml
index 0d6ba96aa..8aeb3d789 100644
--- a/opencloudApp/src/main/AndroidManifest.xml
+++ b/opencloudApp/src/main/AndroidManifest.xml
@@ -76,7 +76,8 @@
android:name=".presentation.settings.privacypolicy.PrivacyPolicyActivity"
android:label="@string/actionbar_privacy_policy" />
-
+
+ android:screenOrientation="portrait" />
+ android:name=".presentation.conflicts.ConflictsResolveActivity" />
+ android:label="@string/pattern_label" />
+ binding.root.updatePadding(top = inset.top, bottom = inset.bottom)
+ }
+
if (loginAction != ACTION_CREATE) {
binding.accountUsername.isEnabled = false
binding.accountUsername.isFocusable = false
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/conflicts/ConflictsResolveActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/conflicts/ConflictsResolveActivity.kt
index b7c77bf54..16bfeb425 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/conflicts/ConflictsResolveActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/conflicts/ConflictsResolveActivity.kt
@@ -25,9 +25,13 @@ package eu.opencloud.android.presentation.conflicts
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.updatePadding
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
+import eu.opencloud.android.databinding.ActivityConflictsResolveBinding
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
import org.koin.androidx.viewmodel.ext.android.viewModel
@@ -36,6 +40,9 @@ import timber.log.Timber
class ConflictsResolveActivity : AppCompatActivity(), ConflictsResolveDialogFragment.OnConflictDecisionMadeListener {
+ private var _binding: ActivityConflictsResolveBinding? = null
+ val binding get() = _binding!!
+
private val conflictsResolveViewModel by viewModel {
parametersOf(
intent.getParcelableExtra(
@@ -47,6 +54,19 @@ class ConflictsResolveActivity : AppCompatActivity(), ConflictsResolveDialogFrag
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(true)
+
+ _binding = ActivityConflictsResolveBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ setSupportActionBar(binding.toolbar)
+
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.toolbar.updatePadding(top = insets.top)
+ binding.root.updatePadding(bottom = insets.bottom)
+ }
+
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
conflictsResolveViewModel.currentFile.collectLatest { updatedOCFile ->
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/logging/LogsListActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/logging/LogsListActivity.kt
index 681d2acce..00356ad21 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/logging/LogsListActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/logging/LogsListActivity.kt
@@ -34,6 +34,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
+import androidx.core.view.updatePadding
import androidx.recyclerview.widget.DefaultItemAnimator
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.LinearLayoutManager
@@ -45,6 +46,8 @@ import eu.opencloud.android.extensions.showMessageInSnackbar
import eu.opencloud.android.presentation.settings.logging.SettingsLogsViewModel
import eu.opencloud.android.providers.LogsProvider
import eu.opencloud.android.providers.MdmProvider
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
import java.io.File
@@ -86,10 +89,20 @@ class LogsListActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
_binding = LogsListActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
initToolbar()
initList()
+
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.toolbarActivityLogsList.root.updatePadding(top = insets.top)
+ binding.recyclerViewActivityLogsList.updatePadding(bottom = insets.bottom)
+ }
}
private fun initToolbar() {
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/migration/StorageMigrationActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/migration/StorageMigrationActivity.kt
index b8784feeb..52538c078 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/migration/StorageMigrationActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/migration/StorageMigrationActivity.kt
@@ -22,12 +22,16 @@ package eu.opencloud.android.presentation.migration
import android.content.Context
import android.content.Intent
import android.os.Bundle
+import android.view.View
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import eu.opencloud.android.MainApp
import eu.opencloud.android.R
-import eu.opencloud.android.data.providers.implementation.OCSharedPreferencesProvider
import eu.opencloud.android.data.providers.LegacyStorageProvider
+import eu.opencloud.android.data.providers.implementation.OCSharedPreferencesProvider
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
import java.io.File
@@ -43,8 +47,21 @@ class StorageMigrationActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(true)
+
setContentView(R.layout.activity_storage_migration)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ findViewById(android.R.id.content).updatePadding(
+ top = insets.top,
+ bottom = insets.bottom
+ )
+ }
+ supportActionBar?.elevation = 0f
+
migrationViewModel.migrationState.observe(this) {
navigateToNextMigrationScreen(it.peekContent())
}
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/releasenotes/ReleaseNotesActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/releasenotes/ReleaseNotesActivity.kt
index 7b66644f0..cef1a2fea 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/releasenotes/ReleaseNotesActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/releasenotes/ReleaseNotesActivity.kt
@@ -23,6 +23,8 @@ import android.content.Context
import android.content.Intent
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.updateLayoutParams
+import androidx.core.view.updatePadding
import androidx.recyclerview.widget.LinearLayoutManager
import eu.opencloud.android.BuildConfig
import eu.opencloud.android.MainApp
@@ -31,6 +33,8 @@ import eu.opencloud.android.R
import eu.opencloud.android.databinding.ReleaseNotesActivityBinding
import eu.opencloud.android.presentation.authentication.LoginActivity
import eu.opencloud.android.ui.activity.FileDisplayActivity
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import org.koin.androidx.viewmodel.ext.android.viewModel
class ReleaseNotesActivity : AppCompatActivity() {
@@ -45,10 +49,23 @@ class ReleaseNotesActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
_binding = ReleaseNotesActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
setData()
initView()
+
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.topSpacer.updateLayoutParams {
+ height = insets.top
+ }
+ binding.root.updatePadding(bottom = insets.bottom)
+ }
+ supportActionBar?.elevation = 0f;
}
private fun initView() {
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/passcode/PassCodeActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/passcode/PassCodeActivity.kt
index c9759662a..e9f2022b0 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/passcode/PassCodeActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/passcode/PassCodeActivity.kt
@@ -40,6 +40,7 @@ import android.view.WindowManager
import android.widget.EditText
import android.widget.LinearLayout
import androidx.appcompat.app.AppCompatActivity
+import androidx.core.view.updatePadding
import eu.opencloud.android.BuildConfig
import eu.opencloud.android.R
import eu.opencloud.android.databinding.PasscodelockBinding
@@ -51,6 +52,8 @@ import eu.opencloud.android.presentation.security.biometric.BiometricStatus
import eu.opencloud.android.presentation.security.biometric.BiometricViewModel
import eu.opencloud.android.presentation.security.biometric.EnableBiometrics
import eu.opencloud.android.presentation.settings.security.SettingsSecurityFragment.Companion.EXTRAS_LOCK_ENFORCED
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import eu.opencloud.android.utils.PreferenceUtils
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
@@ -94,8 +97,19 @@ class PassCodeActivity : AppCompatActivity(), NumberKeyboardListener, EnableBiom
window.addFlags(WindowManager.LayoutParams.FLAG_SECURE)
} // else, let it go, or taking screenshots & testing will not be possible
+ setSupportActionBar(binding.toolbar)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
setContentView(binding.root)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.toolbar?.updatePadding(top = insets.top)
+ binding.root.updatePadding(bottom = insets.bottom)
+ }
+
if (intent.getBooleanExtra(BIOMETRIC_HAS_FAILED, false)) {
showMessageInSnackbar(message = getString(R.string.biometric_not_available))
}
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/pattern/PatternActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/pattern/PatternActivity.kt
index f66d97e2b..9728b1e29 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/pattern/PatternActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/security/pattern/PatternActivity.kt
@@ -34,6 +34,7 @@ import android.view.View
import android.view.WindowManager
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
+import androidx.core.view.updatePadding
import com.andrognito.patternlockview.PatternLockView.Dot
import com.andrognito.patternlockview.listener.PatternLockViewListener
import com.andrognito.patternlockview.utils.PatternLockUtils
@@ -49,6 +50,8 @@ import eu.opencloud.android.presentation.security.biometric.BiometricStatus
import eu.opencloud.android.presentation.security.biometric.BiometricViewModel
import eu.opencloud.android.presentation.security.biometric.EnableBiometrics
import eu.opencloud.android.presentation.settings.security.SettingsSecurityFragment.Companion.EXTRAS_LOCK_ENFORCED
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import eu.opencloud.android.utils.PreferenceUtils
import org.koin.androidx.viewmodel.ext.android.viewModel
import timber.log.Timber
@@ -77,8 +80,19 @@ class PatternActivity : AppCompatActivity(), EnableBiometrics {
_binding = ActivityPatternLockBinding.inflate(layoutInflater)
+ setSupportActionBar(binding.toolbar)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
setContentView(binding.root)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.toolbar?.updatePadding(top = insets.top)
+ binding.root.updatePadding(bottom = insets.bottom)
+ }
+
if (intent.getBooleanExtra(BIOMETRIC_HAS_FAILED, false)) {
showMessageInSnackbar(message = getString(R.string.biometric_not_available))
}
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/SettingsActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/SettingsActivity.kt
index 32857c070..d0ce91ef2 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/SettingsActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/SettingsActivity.kt
@@ -25,10 +25,12 @@ package eu.opencloud.android.presentation.settings
import android.content.Intent
import android.os.Bundle
import android.view.MenuItem
+import android.view.View
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
+import androidx.core.view.updatePadding
import eu.opencloud.android.R
import eu.opencloud.android.presentation.settings.advanced.SettingsAdvancedFragment
import eu.opencloud.android.presentation.settings.automaticuploads.SettingsPictureUploadsFragment
@@ -37,11 +39,17 @@ import eu.opencloud.android.presentation.settings.logging.SettingsLogsFragment
import eu.opencloud.android.presentation.settings.more.SettingsMoreFragment
import eu.opencloud.android.presentation.settings.security.SettingsSecurityFragment
import eu.opencloud.android.ui.activity.FileDisplayActivity
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
class SettingsActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
setContentView(R.layout.activity_settings)
val toolbar = findViewById(R.id.standard_toolbar).apply {
@@ -56,6 +64,12 @@ class SettingsActivity : AppCompatActivity() {
supportFragmentManager.addOnBackStackChangedListener { updateToolbarTitle() }
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ findViewById(R.id.toolbar).updatePadding(top = insets.top)
+ findViewById(android.R.id.content).updatePadding(bottom = insets.bottom)
+ }
+
if (savedInstanceState != null) return
redirectToSubsection(intent)
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/privacypolicy/PrivacyPolicyActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/privacypolicy/PrivacyPolicyActivity.kt
index 8b8d8ebc5..b559a7f13 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/privacypolicy/PrivacyPolicyActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/settings/privacypolicy/PrivacyPolicyActivity.kt
@@ -22,6 +22,7 @@ package eu.opencloud.android.presentation.settings.privacypolicy
import android.os.Bundle
import android.view.MenuItem
+import android.view.View
import android.webkit.WebChromeClient
import android.webkit.WebView
import android.webkit.WebViewClient
@@ -31,8 +32,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.widget.Toolbar
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.view.isVisible
+import androidx.core.view.updatePadding
import eu.opencloud.android.R
import eu.opencloud.android.extensions.showMessageInSnackbar
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import eu.opencloud.android.utils.PreferenceUtils
/**
@@ -41,8 +45,17 @@ import eu.opencloud.android.utils.PreferenceUtils
class PrivacyPolicyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
setContentView(R.layout.activity_privacy_policy)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ findViewById(R.id.opencloud_app_bar).updatePadding(top = insets.top)
+ }
+
val toolbar = findViewById(R.id.standard_toolbar).apply {
setTitle(R.string.actionbar_privacy_policy)
isVisible = true
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/presentation/sharing/ShareActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/presentation/sharing/ShareActivity.kt
index 0ef66a407..8a4a4f530 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/presentation/sharing/ShareActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/presentation/sharing/ShareActivity.kt
@@ -33,12 +33,14 @@ import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
+import androidx.core.view.updatePadding
import androidx.fragment.app.transaction
import eu.opencloud.android.R
import eu.opencloud.android.domain.files.model.OCFile
import eu.opencloud.android.domain.sharing.shares.model.OCShare
import eu.opencloud.android.domain.sharing.shares.model.ShareType
import eu.opencloud.android.domain.utils.Event.EventObserver
+import eu.opencloud.android.extensions.showDialogFragment
import eu.opencloud.android.extensions.showErrorInSnackbar
import eu.opencloud.android.lib.resources.shares.RemoteShare
import eu.opencloud.android.presentation.common.UIResult
@@ -47,7 +49,8 @@ import eu.opencloud.android.presentation.sharing.sharees.SearchShareesFragment
import eu.opencloud.android.presentation.sharing.sharees.UsersAndGroupsSearchProvider
import eu.opencloud.android.presentation.sharing.shares.PublicShareDialogFragment
import eu.opencloud.android.ui.activity.FileActivity
-import eu.opencloud.android.extensions.showDialogFragment
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePreSetContentView
import org.koin.androidx.viewmodel.ext.android.viewModel
import org.koin.core.parameter.parametersOf
import timber.log.Timber
@@ -66,8 +69,16 @@ class ShareActivity : FileActivity(), ShareFragmentListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
setContentView(R.layout.share_activity)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ findViewById(android.R.id.content).updatePadding(bottom = insets.bottom)
+ }
+
setupStandardToolbar(
title = null,
displayHomeAsUpEnabled = true,
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ActivityEdgeToEdgeUtils.kt b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ActivityEdgeToEdgeUtils.kt
new file mode 100644
index 000000000..aba27e209
--- /dev/null
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ActivityEdgeToEdgeUtils.kt
@@ -0,0 +1,55 @@
+package eu.opencloud.android.ui.activity
+
+import android.graphics.Color
+import android.util.TypedValue
+import android.view.View
+import androidx.activity.SystemBarStyle
+import androidx.activity.enableEdgeToEdge
+import androidx.annotation.Px
+import androidx.core.graphics.Insets
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.updatePadding
+import androidx.fragment.app.FragmentActivity
+
+fun FragmentActivity.enableEdgeToEdgePreSetContentView(
+ isNavigationBackgroundPrimary: Boolean
+) {
+ enableEdgeToEdge(
+ statusBarStyle = SystemBarStyle.dark(Color.TRANSPARENT),
+ navigationBarStyle =
+ if (isNavigationBackgroundPrimary)
+ SystemBarStyle.dark(Color.TRANSPARENT)
+ else SystemBarStyle.light(
+ Color.TRANSPARENT,
+ Color.TRANSPARENT
+ )
+ )
+}
+
+fun FragmentActivity.enableEdgeToEdgePostSetContentView(onInsets: (Insets) -> Unit) {
+ ViewCompat.setOnApplyWindowInsetsListener(findViewById(android.R.id.content)) { _, windowInsets ->
+ val insets = windowInsets.getInsets(
+ WindowInsetsCompat.Type.systemBars() or
+ WindowInsetsCompat.Type.displayCutout(),
+ )
+ onInsets(insets)
+ WindowInsetsCompat.CONSUMED
+ }
+}
+
+fun FragmentActivity.getActionBarSize(): Int {
+ val tv = TypedValue()
+ if (theme.resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
+ return TypedValue.complexToDimensionPixelSize(tv.data, resources.displayMetrics)
+ }
+ return 0
+}
+
+fun View.updatePaddingTop(@Px paddingTop: Int) {
+ updatePadding(top = paddingTop)
+}
+
+fun View.updatePaddingBottom(@Px paddingBottom: Int) {
+ updatePadding(bottom = paddingBottom)
+}
\ No newline at end of file
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FileDisplayActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FileDisplayActivity.kt
index 97508d873..d65e14e34 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FileDisplayActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FileDisplayActivity.kt
@@ -45,6 +45,7 @@ import android.view.KeyEvent
import android.view.Menu
import android.view.MenuItem
import android.view.View
+import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.LinearLayout
import android.widget.ScrollView
@@ -53,6 +54,8 @@ import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AlertDialog
import androidx.core.content.ContextCompat
import androidx.core.view.isVisible
+import androidx.core.view.updateLayoutParams
+import androidx.core.view.updatePadding
import androidx.fragment.app.Fragment
import androidx.localbroadcastmanager.content.LocalBroadcastManager
import androidx.work.WorkManager
@@ -242,6 +245,9 @@ class FileDisplayActivity : FileActivity(),
/// USER INTERFACE
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(true)
+
// Inflate and set the layout view
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
@@ -284,6 +290,22 @@ class FileDisplayActivity : FileActivity(),
checkNotificationPermission()
+
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.navCoordinatorLayout.appBarLayout.updatePadding(
+ top = insets.top,
+ left = insets.left,
+ right = insets.right,
+ )
+ binding.navCoordinatorLayout.bottomNavViewSpacer.updateLayoutParams {
+ height = insets.bottom
+ }
+ findViewById(R.id.nav_view_container).updateLayoutParams {
+ bottomMargin = insets.bottom
+ }
+ }
+
Timber.v("onCreate() end")
}
@@ -303,7 +325,7 @@ class FileDisplayActivity : FileActivity(),
registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->
Timber.d("Permission to send notifications granted: $isGranted")
if (!isGranted) {
- showSnackMessage(getString(R.string.notifications_permission_denied))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.notifications_permission_denied))
}
sharedPreferences.putBoolean(PREFERENCE_NOTIFICATION_PERMISSION_REQUESTED, true)
}
@@ -467,11 +489,11 @@ class FileDisplayActivity : FileActivity(),
return if (secondFragment != null) {
secondFragment
- // Return null if we receive a folder. This way, second fragment will be cleared. We should move this logic out of here.
+ // Return null if we receive a folder. This way, second fragment will be cleared. We should move this logic out of here.
} else if (file.isFolder) {
null
- // Otherwise, decide which fragment should be shown.
+ // Otherwise, decide which fragment should be shown.
} else {
when {
PreviewAudioFragment.canBePreviewed(file) -> {
@@ -1007,7 +1029,7 @@ class FileDisplayActivity : FileActivity(),
val singleRemoval = listOfFilesRemoved.size == 1
if (singleRemoval) {
- showMessageInSnackbar(message = getString(R.string.remove_success_msg))
+ showMessageInSnackbar(R.id.list_layout, message = getString(R.string.remove_success_msg))
}
// Clean second fragment and refresh first one
@@ -1077,7 +1099,7 @@ class FileDisplayActivity : FileActivity(),
dismissLoadingDialog()
uiResult.error?.let {
- showMessageInSnackbar(
+ showMessageInSnackbar(R.id.list_layout,
message = it.parseError(getString(R.string.move_file_error), resources, true)
)
}
@@ -1125,7 +1147,7 @@ class FileDisplayActivity : FileActivity(),
dismissLoadingDialog()
uiResult.error?.let {
- showMessageInSnackbar(
+ showMessageInSnackbar(R.id.list_layout,
message = it.parseError(
genericErrorMessage = getString(R.string.copy_file_error),
resources = resources,
@@ -1350,7 +1372,7 @@ class FileDisplayActivity : FileActivity(),
startPreview(fileWaitingToPreview)
fileWaitingToPreview = null
} else {
- showSnackMessage(getString(R.string.sync_file_nothing_to_do_msg))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.sync_file_nothing_to_do_msg))
}
}
@@ -1362,10 +1384,10 @@ class FileDisplayActivity : FileActivity(),
is SynchronizeFileUseCase.SyncType.DownloadEnqueued -> {
fileWaitingToPreview?.let {
- showSnackMessage(getString(R.string.new_remote_version_found_msg))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.new_remote_version_found_msg))
startSyncThenOpen(it)
fileWaitingToPreview = null
- } ?: showSnackMessage(getString(R.string.download_enqueued_msg))
+ } ?: showMessageInSnackbar(R.id.list_layout, getString(R.string.download_enqueued_msg))
}
SynchronizeFileUseCase.SyncType.FileNotFound -> {
@@ -1373,7 +1395,7 @@ class FileDisplayActivity : FileActivity(),
}
is SynchronizeFileUseCase.SyncType.UploadEnqueued -> {
- showSnackMessage(getString(R.string.upload_enqueued_msg))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.upload_enqueued_msg))
}
null -> { /* Nothing to do */ }
}
@@ -1408,7 +1430,7 @@ class FileDisplayActivity : FileActivity(),
}
else -> {
- showSnackMessage(getString(R.string.sync_fail_ticker))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.sync_fail_ticker))
}
}
}
@@ -1516,7 +1538,7 @@ class FileDisplayActivity : FileActivity(),
}
else -> {
- showSnackMessage(getString(R.string.sync_fail_ticker))
+ showMessageInSnackbar(R.id.list_layout, getString(R.string.sync_fail_ticker))
}
}
}
@@ -1549,7 +1571,7 @@ class FileDisplayActivity : FileActivity(),
WorkManager.getInstance(applicationContext).getWorkInfoByIdLiveData(uuid).observeWorkerTillItFinishes(
owner = this,
onWorkEnqueued = {
- showMessageInSnackbar(
+ showMessageInSnackbar(R.id.list_layout,
message = String.format(getString(R.string.downloader_download_enqueued_ticker), file.fileName)
)
},
@@ -1571,7 +1593,7 @@ class FileDisplayActivity : FileActivity(),
}
},
onWorkFailed = {
- showMessageInSnackbar(
+ showMessageInSnackbar(R.id.list_layout,
message = String.format(getString(R.string.downloader_download_failed_ticker), file.fileName)
)
if (file.id == waitingToSend?.id) {
@@ -1956,10 +1978,11 @@ class FileDisplayActivity : FileActivity(),
is UIResult.Error -> {
dismissLoadingDialog()
if (uiResult.error is FileNotFoundException) {
- showMessageInSnackbar(message = getString(R.string.deep_link_user_no_access))
+ showMessageInSnackbar(R.id.list_layout, message = getString(R.string.deep_link_user_no_access))
changeUser()
} else {
showMessageInSnackbar(
+ R.id.list_layout,
message = getString(
if (uiResult.error is DeepLinkException) {
R.string.invalid_deep_link_format
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FolderPickerActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FolderPickerActivity.kt
index d6b3cecf1..fa244ca3e 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FolderPickerActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/FolderPickerActivity.kt
@@ -28,8 +28,10 @@ import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
+import android.view.View
import androidx.annotation.StringRes
import androidx.core.view.isVisible
+import androidx.core.view.updatePadding
import eu.opencloud.android.R
import eu.opencloud.android.databinding.FilesFolderPickerBinding
import eu.opencloud.android.datamodel.FileDataStorageManager
@@ -61,9 +63,18 @@ open class FolderPickerActivity : FileActivity(),
super.onCreate(savedInstanceState)
+ // edge-to-edge
+ enableEdgeToEdgePreSetContentView(false)
+
binding = FilesFolderPickerBinding.inflate(layoutInflater)
setContentView(binding.root)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ findViewById(R.id.opencloud_app_bar).updatePadding(top = insets.top)
+ binding.root.updatePadding(bottom = insets.bottom)
+ }
+
// Allow or disallow touches with other visible windows
binding.filesFolderPickerLayout.filterTouchesWhenObscured = PreferenceUtils.shouldDisallowTouchesWithOtherVisibleWindows(this)
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ReceiveExternalFilesActivity.java b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ReceiveExternalFilesActivity.java
index 5c1eeb0b7..7d7061baa 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ReceiveExternalFilesActivity.java
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ReceiveExternalFilesActivity.java
@@ -211,9 +211,19 @@ protected void onCreate(Bundle savedInstanceState) {
setAccount(savedInstanceState.getParcelable(FileActivity.EXTRA_ACCOUNT));
}
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePreSetContentView(this, false);
+
//init ui
setContentView(R.layout.uploader_layout);
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePostSetContentView(this, insets -> {
+ ActivityEdgeToEdgeUtilsKt.updatePaddingTop(findViewById(R.id.opencloud_app_bar), insets.top);
+ ActivityEdgeToEdgeUtilsKt.updatePaddingBottom(findViewById(android.R.id.content), insets.bottom);
+ return Unit.INSTANCE;
+ });
+
mSortOptionsView = findViewById(R.id.options_layout);
if (mSortOptionsView != null) {
mSortOptionsView.setOnSortOptionsListener(this);
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/UploadListActivity.java b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/UploadListActivity.java
index 5de900f6c..3cb8430a8 100755
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/UploadListActivity.java
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/UploadListActivity.java
@@ -34,7 +34,9 @@
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
+import android.view.ViewGroup;
+import androidx.core.view.ViewKt;
import androidx.fragment.app.FragmentTransaction;
import eu.opencloud.android.R;
import eu.opencloud.android.lib.common.operations.RemoteOperation;
@@ -45,6 +47,7 @@
import eu.opencloud.android.presentation.transfers.TransfersViewModel;
import eu.opencloud.android.utils.MimetypeIconUtil;
import kotlin.Lazy;
+import kotlin.Unit;
import org.jetbrains.annotations.NotNull;
import timber.log.Timber;
@@ -66,6 +69,9 @@ public class UploadListActivity extends FileActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePreSetContentView(this, true);
+
setContentView(R.layout.activity_main);
View rightFragmentContainer = findViewById(R.id.right_fragment_container);
@@ -89,6 +95,20 @@ protected void onCreate(Bundle savedInstanceState) {
if (savedInstanceState == null) {
createUploadListFragment();
} // else, the Fragment Manager makes the job on configuration changes
+
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePostSetContentView(this, (insets) -> {
+ ActivityEdgeToEdgeUtilsKt.updatePaddingTop(findViewById(R.id.opencloud_app_bar), insets.top);
+ ViewKt.updateLayoutParams(findViewById(R.id.bottom_nav_view_spacer), params -> {
+ params.height = insets.bottom;
+ return Unit.INSTANCE;
+ });
+ ViewKt.updateLayoutParams(findViewById(R.id.nav_view_container), params -> {
+ ((ViewGroup.MarginLayoutParams) params).bottomMargin = insets.bottom;
+ return Unit.INSTANCE;
+ });
+ return Unit.INSTANCE;
+ });
}
private void createUploadListFragment() {
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/WhatsNewActivity.java b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/WhatsNewActivity.java
index af6db7555..79beee1be 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/WhatsNewActivity.java
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/activity/WhatsNewActivity.java
@@ -36,6 +36,7 @@
import android.widget.TextView;
import androidx.annotation.Nullable;
+import androidx.core.view.ViewKt;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.fragment.app.FragmentManager;
@@ -50,6 +51,7 @@
import eu.opencloud.android.wizard.FeatureList;
import eu.opencloud.android.wizard.FeatureList.FeatureItem;
import eu.opencloud.android.wizard.ProgressIndicator;
+import kotlin.Unit;
/**
* @author Bartosz Przybylski
@@ -81,10 +83,29 @@ static private boolean shouldShow(Context context) {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
- bindingActivity = WhatsNewActivityBinding.inflate(getLayoutInflater());
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePreSetContentView(this, true);
+ bindingActivity = WhatsNewActivityBinding.inflate(getLayoutInflater());
setContentView(bindingActivity.getRoot());
+ // edge-to-edge
+ ActivityEdgeToEdgeUtilsKt.enableEdgeToEdgePostSetContentView(this, insets -> {
+ assert bindingActivity.topSpacer != null;
+ ViewKt.updateLayoutParams(bindingActivity.topSpacer, params -> {
+ params.height = insets.top;
+ return Unit.INSTANCE;
+ });
+ assert bindingActivity.bottomButtons != null;
+ ViewKt.updateLayoutParams(bindingActivity.bottomButtons, params -> {
+ if (params instanceof ViewGroup.MarginLayoutParams) {
+ ((ViewGroup.MarginLayoutParams) params).bottomMargin = insets.bottom;
+ }
+ return Unit.INSTANCE;
+ });
+ return Unit.INSTANCE;
+ });
+
mProgress = bindingActivity.progressIndicator;
mPager = bindingActivity.contentPanel;
diff --git a/opencloudApp/src/main/java/eu/opencloud/android/ui/preview/PreviewVideoActivity.kt b/opencloudApp/src/main/java/eu/opencloud/android/ui/preview/PreviewVideoActivity.kt
index f580d4bfb..5579c2dc1 100644
--- a/opencloudApp/src/main/java/eu/opencloud/android/ui/preview/PreviewVideoActivity.kt
+++ b/opencloudApp/src/main/java/eu/opencloud/android/ui/preview/PreviewVideoActivity.kt
@@ -43,6 +43,7 @@ import androidx.core.view.MenuProvider
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.WindowInsetsControllerCompat
+import androidx.core.view.updatePadding
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.lifecycleScope
import androidx.lifecycle.repeatOnLifecycle
@@ -77,6 +78,7 @@ import eu.opencloud.android.presentation.spaces.SpacesListViewModel
import eu.opencloud.android.presentation.transfers.TransfersViewModel
import eu.opencloud.android.ui.activity.FileActivity
import eu.opencloud.android.ui.activity.FileDisplayActivity
+import eu.opencloud.android.ui.activity.enableEdgeToEdgePostSetContentView
import eu.opencloud.android.ui.fragment.FileFragment
import eu.opencloud.android.ui.preview.PrepareVideoPlayerAsyncTask.OnPrepareVideoPlayerTaskListener
import kotlinx.coroutines.flow.Flow
@@ -108,6 +110,13 @@ class PreviewVideoActivity : FileActivity(), Player.Listener, OnPrepareVideoPlay
setContentView(binding.root)
addMenuProvider(this)
+ // edge-to-edge
+ enableEdgeToEdgePostSetContentView { insets ->
+ binding.root.updatePadding(
+ top = binding.root.paddingTop,
+ bottom = insets.bottom
+ )
+ }
if (savedInstanceState == null) {
val launchingIntent = intent
diff --git a/opencloudApp/src/main/res/layout-sw600dp/whats_new_activity.xml b/opencloudApp/src/main/res/layout-sw600dp/whats_new_activity.xml
index 6154245c2..c7591ef0d 100644
--- a/opencloudApp/src/main/res/layout-sw600dp/whats_new_activity.xml
+++ b/opencloudApp/src/main/res/layout-sw600dp/whats_new_activity.xml
@@ -5,6 +5,10 @@
android:layout_height="match_parent"
android:weightSum="100"
android:background="@color/primary">
+
+ android:layout_height="match_parent">
-
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
-
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintBottom_toBottomOf="parent">
-
+
-
-
-
+ android:layout_height="wrap_content"
+ android:layout_margin="@dimen/standard_margin"
+ android:gravity="center"
+ android:text="@string/pattern_configure_your_pattern_explanation"
+ android:textAppearance="@android:style/TextAppearance.Small"
+ android:textSize="14sp"
+ app:layout_constraintBottom_toTopOf="@id/error_pattern"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_bias="0.5"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/header_pattern" />
-
+
-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/opencloudApp/src/main/res/layout-w600dp/passcodelock.xml b/opencloudApp/src/main/res/layout-w600dp/passcodelock.xml
index a866f2df8..20026f234 100644
--- a/opencloudApp/src/main/res/layout-w600dp/passcodelock.xml
+++ b/opencloudApp/src/main/res/layout-w600dp/passcodelock.xml
@@ -21,103 +21,123 @@
android:id="@+id/passcodeLockLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:layout_margin="@dimen/passcode_standard_margin"
android:filterTouchesWhenObscured="true">
-
-
-
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
-
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintBottom_toBottomOf="parent">
-
+
-
+
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
diff --git a/opencloudApp/src/main/res/layout/activity_conflicts_resolve.xml b/opencloudApp/src/main/res/layout/activity_conflicts_resolve.xml
new file mode 100644
index 000000000..87919826f
--- /dev/null
+++ b/opencloudApp/src/main/res/layout/activity_conflicts_resolve.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/opencloudApp/src/main/res/layout/activity_main.xml b/opencloudApp/src/main/res/layout/activity_main.xml
index 4af7b3744..c1296ff53 100644
--- a/opencloudApp/src/main/res/layout/activity_main.xml
+++ b/opencloudApp/src/main/res/layout/activity_main.xml
@@ -21,7 +21,7 @@
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:fitsSystemWindows="true"
+ android:fitsSystemWindows="false"
tools:openDrawer="start">
+ android:layout_height="match_parent">
-
+ android:minHeight="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"/>
-
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintBottom_toBottomOf="parent">
-
+
-
+
+
+
-
+ android:layout_height="0dp"
+ android:layout_marginHorizontal="@dimen/standard_margin"
+ android:layout_marginVertical="@dimen/standard_margin"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintHorizontal_chainStyle="packed"
+ app:layout_constraintStart_toStartOf="parent">
+
+
-
+
-
-
+
+
+
diff --git a/opencloudApp/src/main/res/layout/activity_settings.xml b/opencloudApp/src/main/res/layout/activity_settings.xml
index db299f711..fa0a7dc6e 100644
--- a/opencloudApp/src/main/res/layout/activity_settings.xml
+++ b/opencloudApp/src/main/res/layout/activity_settings.xml
@@ -9,6 +9,8 @@
diff --git a/opencloudApp/src/main/res/layout/logs_list_activity.xml b/opencloudApp/src/main/res/layout/logs_list_activity.xml
index f6b4fc8cd..14281f99d 100644
--- a/opencloudApp/src/main/res/layout/logs_list_activity.xml
+++ b/opencloudApp/src/main/res/layout/logs_list_activity.xml
@@ -36,6 +36,7 @@
android:id="@+id/recyclerView_activity_logs_list"
android:layout_width="0dp"
android:layout_height="0dp"
+ android:clipToPadding="false"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
diff --git a/opencloudApp/src/main/res/layout/nav_coordinator_layout.xml b/opencloudApp/src/main/res/layout/nav_coordinator_layout.xml
index bee93b926..b47c9632d 100644
--- a/opencloudApp/src/main/res/layout/nav_coordinator_layout.xml
+++ b/opencloudApp/src/main/res/layout/nav_coordinator_layout.xml
@@ -51,9 +51,19 @@
app:itemIconTint="@color/primary_button_text_color"
app:itemTextColor="@color/primary_button_text_color"
app:labelVisibilityMode="labeled"
- app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintBottom_toTopOf="@id/bottom_nav_view_spacer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
+ app:elevation="0dp"
app:menu="@menu/bottom_navbar_menu" />
+
+
diff --git a/opencloudApp/src/main/res/layout/nav_drawer_content.xml b/opencloudApp/src/main/res/layout/nav_drawer_content.xml
index 84003dc3a..151b465a6 100644
--- a/opencloudApp/src/main/res/layout/nav_drawer_content.xml
+++ b/opencloudApp/src/main/res/layout/nav_drawer_content.xml
@@ -19,6 +19,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto">
+ android:layout_height="?android:actionBarSize">
-
+
+
+ app:layout_constraintTop_toBottomOf="@id/toolbar"
+ app:layout_constraintBottom_toBottomOf="parent">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ app:layout_constraintTop_toBottomOf="@id/layout_code" />
-
-
+ app:layout_constraintTop_toBottomOf="@id/error" />
-
-
-
-
-
-
-
-
-
+
+
+
-
-
-
+
+
-
diff --git a/opencloudApp/src/main/res/layout/release_notes_activity.xml b/opencloudApp/src/main/res/layout/release_notes_activity.xml
index ddd50fba8..4db4eca3a 100644
--- a/opencloudApp/src/main/res/layout/release_notes_activity.xml
+++ b/opencloudApp/src/main/res/layout/release_notes_activity.xml
@@ -24,6 +24,15 @@
android:layout_height="match_parent"
tools:context=".presentation.releasenotes.ReleaseNotesActivity">
+
+
+ app:layout_constraintTop_toBottomOf="@+id/top_spacer" />
+
+
true
+
+
+