From 49c9805758d05620b1b64eb2fe8f88427d8c7ff4 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Fri, 26 Jun 2026 09:31:55 +0200 Subject: [PATCH 1/5] build: update versionCode and versionName for 4.8.2 Signed-off-by: Jorge Aguado Recio --- owncloudApp/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/owncloudApp/build.gradle b/owncloudApp/build.gradle index c0dc4469430..273c44cc2f1 100644 --- a/owncloudApp/build.gradle +++ b/owncloudApp/build.gradle @@ -101,8 +101,8 @@ android { testInstrumentationRunner "com.owncloud.android.utils.OCTestAndroidJUnitRunner" - versionCode = 48000100 - versionName = "4.8.1" + versionCode = 48000200 + versionName = "4.8.2" buildConfigField "String", gitRemote, "\"" + getGitOriginRemote() + "\"" buildConfigField "String", commitSHA1, "\"" + getLatestGitHash() + "\"" From 61428134b433fecdaa0905b5ab3b30674d32d044 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 1 Jul 2026 09:56:02 +0200 Subject: [PATCH 2/5] chore: move unreleased calens files to new folder release Signed-off-by: Jorge Aguado Recio --- changelog/{unreleased => 4.8.2_2026-07-01}/4887 | 0 changelog/{unreleased => 4.8.2_2026-07-01}/4897 | 0 changelog/{unreleased => 4.8.2_2026-07-01}/4901 | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename changelog/{unreleased => 4.8.2_2026-07-01}/4887 (100%) rename changelog/{unreleased => 4.8.2_2026-07-01}/4897 (100%) rename changelog/{unreleased => 4.8.2_2026-07-01}/4901 (100%) diff --git a/changelog/unreleased/4887 b/changelog/4.8.2_2026-07-01/4887 similarity index 100% rename from changelog/unreleased/4887 rename to changelog/4.8.2_2026-07-01/4887 diff --git a/changelog/unreleased/4897 b/changelog/4.8.2_2026-07-01/4897 similarity index 100% rename from changelog/unreleased/4897 rename to changelog/4.8.2_2026-07-01/4897 diff --git a/changelog/unreleased/4901 b/changelog/4.8.2_2026-07-01/4901 similarity index 100% rename from changelog/unreleased/4901 rename to changelog/4.8.2_2026-07-01/4901 From b3e78e5828160da3a95affd99fe0617924592096 Mon Sep 17 00:00:00 2001 From: "owncloud-calens-bot[bot]" <276982735+owncloud-calens-bot[bot]@users.noreply.github.com> Date: Wed, 1 Jul 2026 10:05:01 +0200 Subject: [PATCH 3/5] chore: update changelog (#4911) Co-authored-by: owncloud-calens-bot[bot] <276982735+owncloud-calens-bot[bot]@users.noreply.github.com> --- CHANGELOG.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a588e6c5ff..f34f063d6ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Table of Contents -* [Changelog for unreleased](#changelog-for-owncloud-android-client-unreleased-unreleased) +* [Changelog for 4.8.2](#changelog-for-owncloud-android-client-482-2026-07-01) * [Changelog for 4.8.1](#changelog-for-owncloud-android-client-481-2026-06-09) * [Changelog for 4.8.0](#changelog-for-owncloud-android-client-480-2026-05-18) * [Changelog for 4.7.0](#changelog-for-owncloud-android-client-470-2025-11-17) @@ -33,12 +33,12 @@ * [Changelog for 2.18.1](#changelog-for-owncloud-android-client-2181-2021-07-20) * [Changelog for 2.18.0](#changelog-for-owncloud-android-client-2180-2021-05-24) * [Changelog for 2.17 versions and below](#changelog-for-217-versions-and-below) -# Changelog for ownCloud Android Client [unreleased] (UNRELEASED) +# Changelog for ownCloud Android Client [4.8.2] (2026-07-01) -The following sections list the changes in ownCloud Android Client unreleased relevant to +The following sections list the changes in ownCloud Android Client 4.8.2 relevant to ownCloud admins and users. -[unreleased]: https://github.com/owncloud/android/compare/v4.8.1...master +[4.8.2]: https://github.com/owncloud/android/compare/v4.8.1...v4.8.2 ## Summary From 1c741ede6a56faf1eaaf8018bd2e12b9f882c43a Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 1 Jul 2026 10:08:53 +0200 Subject: [PATCH 4/5] fix: use layout content for snackbars with actions to prevent crashes Signed-off-by: Jorge Aguado Recio --- .../java/com/owncloud/android/extensions/ActivityExt.kt | 3 +-- .../com/owncloud/android/ui/activity/FileActivity.java | 8 +++----- .../owncloud/android/ui/activity/FileDisplayActivity.kt | 1 - 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt index c7f45020ba8..58a71bf3dd7 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt @@ -104,9 +104,8 @@ fun Activity.showSnackbarWithAction( actionText: CharSequence, action: () -> Unit, duration: Int = Snackbar.LENGTH_LONG, - layoutId: Int = android.R.id.content ) { - Snackbar.make(findViewById(layoutId), message, duration) + Snackbar.make(findViewById(android.R.id.content), message, duration) .setAction(actionText) { action() } .show() } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java index 863316fa2b5..80032faaf62 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileActivity.java @@ -9,7 +9,7 @@ * @author Jorge Aguado Recio *

* Copyright (C) 2011 Bartek Przybylski - * Copyright (C) 2025 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -289,8 +289,7 @@ protected void showRequestAccountChangeNotice(String errorMessage, boolean mustC requestCredentialsUpdate(); return Unit.INSTANCE; }, - Snackbar.LENGTH_INDEFINITE, - android.R.id.content + Snackbar.LENGTH_INDEFINITE ); } } @@ -304,8 +303,7 @@ protected void showRequestRegainAccess() { requestCredentialsUpdate(); return Unit.INSTANCE; }, - Snackbar.LENGTH_INDEFINITE, - android.R.id.content + Snackbar.LENGTH_INDEFINITE ); } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index 7b7d2b4a56b..e55a7bb4e7c 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -1178,7 +1178,6 @@ class FileDisplayActivity : FileActivity(), } updateBottombar(targetFolderSpace) }, - layoutId = R.id.list_layout ) } else { showMessageInSnackbar(R.id.list_layout, message) From 5eadeed713b06b888c340ccd21824e44233983f6 Mon Sep 17 00:00:00 2001 From: Jorge Aguado Recio Date: Wed, 1 Jul 2026 10:57:33 +0200 Subject: [PATCH 5/5] fix: prevent snackbars from overlapping bottom bar Signed-off-by: Jorge Aguado Recio --- .../com/owncloud/android/extensions/ActivityExt.kt | 13 +++++++++---- .../com/owncloud/android/extensions/FragmentExt.kt | 13 ++++++++++--- .../owncloud/android/ui/activity/BaseActivity.java | 10 ++++++++-- .../android/ui/activity/FileDisplayActivity.kt | 3 ++- 4 files changed, 29 insertions(+), 10 deletions(-) diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt index 58a71bf3dd7..c4027a9bb59 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/ActivityExt.kt @@ -46,6 +46,7 @@ import androidx.core.content.FileProvider import androidx.core.text.HtmlCompat import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat +import androidx.core.view.isVisible import androidx.core.view.updateLayoutParams import androidx.core.view.updateMargins import androidx.fragment.app.FragmentActivity @@ -96,7 +97,10 @@ fun Activity.showMessageInSnackbar( message: CharSequence, duration: Int = Snackbar.LENGTH_LONG ) { - Snackbar.make(findViewById(layoutId), message, duration).show() + val bottomNavView = findViewById(R.id.bottom_nav_view) + val snackbar = Snackbar.make(findViewById(layoutId), message, duration) + if (bottomNavView?.isVisible == true) { snackbar.setAnchorView(bottomNavView) } + snackbar.show() } fun Activity.showSnackbarWithAction( @@ -105,9 +109,10 @@ fun Activity.showSnackbarWithAction( action: () -> Unit, duration: Int = Snackbar.LENGTH_LONG, ) { - Snackbar.make(findViewById(android.R.id.content), message, duration) - .setAction(actionText) { action() } - .show() + val bottomNavView = findViewById(R.id.bottom_nav_view) + val snackbar = Snackbar.make(findViewById(android.R.id.content), message, duration) + if (bottomNavView?.isVisible == true) { snackbar.setAnchorView(bottomNavView) } + snackbar.setAction(actionText) { action() }.show() } fun Activity.showErrorInToast( diff --git a/owncloudApp/src/main/java/com/owncloud/android/extensions/FragmentExt.kt b/owncloudApp/src/main/java/com/owncloud/android/extensions/FragmentExt.kt index 1187c70a954..12a6d96b15b 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/extensions/FragmentExt.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/extensions/FragmentExt.kt @@ -3,8 +3,9 @@ * * @author David González Verdugo * @author Juan Carlos Garrote Gascón + * @author Jorge Aguado Recio * - * Copyright (C) 2023 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -26,7 +27,9 @@ import android.content.Context import android.content.DialogInterface import android.view.Menu import android.view.MenuItem.SHOW_AS_ACTION_NEVER +import android.view.View import android.view.inputmethod.InputMethodManager +import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.lifecycle.Lifecycle import androidx.lifecycle.lifecycleScope @@ -45,10 +48,14 @@ fun Fragment.showErrorInSnackbar(genericErrorMessageId: Int, throwable: Throwabl fun Fragment.showMessageInSnackbar( message: CharSequence, - duration: Int = Snackbar.LENGTH_LONG + duration: Int = Snackbar.LENGTH_LONG, ) { val requiredView = view ?: return - Snackbar.make(requiredView, message, duration).show() + val rootView = view?.rootView ?: return + val bottomNavView = rootView.findViewById(R.id.bottom_nav_view) + val snackbar = Snackbar.make(requiredView, message, duration) + if (bottomNavView?.isVisible == true) { snackbar.setAnchorView(bottomNavView) } + snackbar.show() } fun Fragment.showSnackbarWithAction( diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java index 96fdab7ba1c..7b8f65b8fa3 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/BaseActivity.java @@ -1,7 +1,7 @@ /** * ownCloud Android client application *

- * Copyright (C) 2022 ownCloud GmbH. + * Copyright (C) 2026 ownCloud GmbH. *

* This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2, @@ -35,6 +35,7 @@ import androidx.fragment.app.FragmentTransaction; import com.google.android.material.snackbar.Snackbar; import com.owncloud.android.MainApp; +import com.owncloud.android.R; import com.owncloud.android.presentation.authentication.AccountUtils; import com.owncloud.android.datamodel.FileDataStorageManager; import com.owncloud.android.domain.files.model.OCFile; @@ -319,12 +320,17 @@ public void dismissLoadingDialog() { */ public void showSnackMessage(String message) { final View rootView = findViewById(android.R.id.content); + final View bottomNavView = findViewById(R.id.bottom_nav_view); if (rootView == null) { // If root view is not available don't let the app brake. show the notification anyway. Toast.makeText(this, message, Toast.LENGTH_LONG).show(); return; } - Snackbar.make(rootView, message, Snackbar.LENGTH_LONG).show(); + Snackbar snackbar = Snackbar.make(rootView, message, Snackbar.LENGTH_LONG); + if (bottomNavView != null && bottomNavView.getVisibility() == View.VISIBLE) { + snackbar.setAnchorView(bottomNavView); + } + snackbar.show(); } } diff --git a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt index e55a7bb4e7c..5772e030adc 100644 --- a/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt +++ b/owncloudApp/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt @@ -58,6 +58,7 @@ import androidx.core.view.isVisible import androidx.fragment.app.Fragment import androidx.localbroadcastmanager.content.LocalBroadcastManager import androidx.work.WorkManager +import com.google.android.material.snackbar.Snackbar import com.owncloud.android.AppRater import com.owncloud.android.BuildConfig import com.owncloud.android.MainApp @@ -1409,7 +1410,7 @@ class FileDisplayActivity : FileActivity(), is SynchronizeFileUseCase.SyncType.DownloadEnqueued -> { fileWaitingToPreview?.let { - showSnackMessage(getString(R.string.new_remote_version_found_msg)) + Snackbar.make(findViewById(android.R.id.content), R.string.new_remote_version_found_msg, Snackbar.LENGTH_LONG).show() startSyncThenOpen(it) fileWaitingToPreview = null } ?: showSnackMessage(getString(R.string.download_enqueued_msg))