From fb2038066e32799f41ad3d6193db3044e51867ac Mon Sep 17 00:00:00 2001 From: Eiichi Yoshikawa Date: Mon, 23 Feb 2026 16:47:37 +0900 Subject: [PATCH] fix: edge-to-edge --- gradle/libs.versions.toml | 3 +- opencloudApp/build.gradle | 1 + opencloudApp/src/main/AndroidManifest.xml | 12 +- .../authentication/LoginActivity.kt | 11 + .../conflicts/ConflictsResolveActivity.kt | 20 ++ .../presentation/logging/LogsListActivity.kt | 13 ++ .../migration/StorageMigrationActivity.kt | 19 +- .../releasenotes/ReleaseNotesActivity.kt | 17 ++ .../security/passcode/PassCodeActivity.kt | 14 ++ .../security/pattern/PatternActivity.kt | 14 ++ .../presentation/settings/SettingsActivity.kt | 14 ++ .../privacypolicy/PrivacyPolicyActivity.kt | 13 ++ .../presentation/sharing/ShareActivity.kt | 13 +- .../ui/activity/ActivityEdgeToEdgeUtils.kt | 55 +++++ .../ui/activity/FileDisplayActivity.kt | 53 +++-- .../ui/activity/FolderPickerActivity.kt | 11 + .../ReceiveExternalFilesActivity.java | 10 + .../ui/activity/UploadListActivity.java | 20 ++ .../android/ui/activity/WhatsNewActivity.java | 23 ++- .../ui/preview/PreviewVideoActivity.kt | 9 + .../res/layout-sw600dp/whats_new_activity.xml | 5 + .../layout-w600dp/activity_pattern_lock.xml | 170 +++++++++------- .../main/res/layout-w600dp/passcodelock.xml | 190 +++++++++-------- .../res/layout/activity_conflicts_resolve.xml | 31 +++ .../src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/activity_pattern_lock.xml | 125 +++++++----- .../src/main/res/layout/activity_settings.xml | 2 + .../main/res/layout/logs_list_activity.xml | 1 + .../res/layout/nav_coordinator_layout.xml | 12 +- .../main/res/layout/nav_drawer_content.xml | 1 + .../src/main/res/layout/opencloud_toolbar.xml | 4 +- .../src/main/res/layout/passcodelock.xml | 191 ++++++++++-------- .../res/layout/release_notes_activity.xml | 11 +- .../main/res/layout/whats_new_activity.xml | 6 + opencloudApp/src/main/res/values/styles.xml | 5 + 35 files changed, 774 insertions(+), 327 deletions(-) create mode 100644 opencloudApp/src/main/java/eu/opencloud/android/ui/activity/ActivityEdgeToEdgeUtils.kt create mode 100644 opencloudApp/src/main/res/layout/activity_conflicts_resolve.xml 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 + + +