asyncTasks,
+ boolean gridView,
+ Context context,
+ LoaderImageView shimmerThumbnail,
+ AppPreferences preferences,
+ ViewThemeUtils viewThemeUtils,
+ SyncedFolderProvider syncedFolderProvider
+ ) {
+ setThumbnail(file,
+ thumbnailView,
+ user,
+ storageManager,
+ asyncTasks,
+ gridView,
+ context,
+ shimmerThumbnail,
+ preferences,
+ viewThemeUtils,
+ syncedFolderProvider,
+ false);
+ }
+
/**
* Sets a thumbnail for a offline file, file or folder with various display options and states.
*
@@ -838,7 +865,8 @@ public static void setThumbnail(OCFile file,
LoaderImageView shimmerThumbnail,
AppPreferences preferences,
ViewThemeUtils viewThemeUtils,
- SyncedFolderProvider syncedFolderProvider) {
+ SyncedFolderProvider syncedFolderProvider,
+ boolean hideVideoOverlay) {
if (file == null || thumbnailView == null || context == null) {
return;
}
@@ -854,16 +882,16 @@ public static void setThumbnail(OCFile file,
}
if (file.getRemoteId() == null || !file.isPreviewAvailable()) {
- setThumbnailFirstTimeForFile(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils);
+ setThumbnailFirstTimeForFile(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils, hideVideoOverlay);
return;
}
- setThumbnailFromCache(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils);
+ setThumbnailFromCache(file, thumbnailView, storageManager, asyncTasks, gridView, shimmerThumbnail, user, preferences, context, viewThemeUtils, hideVideoOverlay);
}
- private static void setThumbnailFirstTimeForFile(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) {
+ private static void setThumbnailFirstTimeForFile(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils, boolean hideVideoOverlay) {
if (file.getRemoteId() != null) {
- generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils);
+ generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils, hideVideoOverlay);
return;
}
@@ -905,10 +933,10 @@ private static void setThumbnailForFolder(OCFile file, ImageView thumbnailView,
thumbnailView.setImageDrawable(fileIcon);
}
- private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils) {
+ private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView, FileDataStorageManager storageManager, List asyncTasks, boolean gridView, LoaderImageView shimmerThumbnail, User user, AppPreferences preferences, Context context, ViewThemeUtils viewThemeUtils, boolean hideVideoOverlay) {
final var thumbnail = ThumbnailsCacheManager.getBitmapFromDiskCache(ThumbnailsCacheManager.PREFIX_THUMBNAIL + file.getRemoteId());
if (thumbnail == null || file.isUpdateThumbnailNeeded()) {
- generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils);
+ generateNewThumbnail(file, thumbnailView, user, storageManager, new ArrayList<>(asyncTasks), gridView, context, shimmerThumbnail, preferences, viewThemeUtils, hideVideoOverlay);
setThumbnailBackgroundForPNGFileIfNeeded(file, context, thumbnailView);
return;
}
@@ -916,8 +944,12 @@ private static void setThumbnailFromCache(OCFile file, ImageView thumbnailView,
stopShimmer(shimmerThumbnail, thumbnailView);
if (MimeTypeUtil.isVideo(file)) {
- final var withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail, context);
- thumbnailView.setImageBitmap(withOverlay);
+ if (hideVideoOverlay) {
+ thumbnailView.setImageBitmap(thumbnail);
+ } else {
+ final var withOverlay = ThumbnailsCacheManager.addVideoOverlay(thumbnail, context);
+ thumbnailView.setImageBitmap(withOverlay);
+ }
} else {
BitmapUtils.setRoundedBitmapAccordingToListType(gridView, thumbnail, thumbnailView);
}
@@ -941,7 +973,8 @@ private static void generateNewThumbnail(OCFile file,
Context context,
LoaderImageView shimmerThumbnail,
AppPreferences preferences,
- ViewThemeUtils viewThemeUtils) {
+ ViewThemeUtils viewThemeUtils,
+ boolean hideVideoOverlay) {
if (!ThumbnailsCacheManager.cancelPotentialThumbnailWork(file, thumbnailView)) {
return;
}
@@ -972,7 +1005,8 @@ private static void generateNewThumbnail(OCFile file,
user,
asyncTasks,
gridView,
- file.getRemoteId());
+ file.getRemoteId(),
+ hideVideoOverlay);
Drawable drawable = MimeTypeUtil.getFileTypeIcon(file.getMimeType(),
file.getFileName(),
context,
diff --git a/app/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java b/app/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java
index 6795feb714e6..1f35e275d2c5 100644
--- a/app/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java
+++ b/app/src/main/java/com/owncloud/android/utils/ErrorMessageAdapter.java
@@ -5,6 +5,7 @@
* SPDX-FileCopyrightText: 2017 Tobias Kaminsky
* SPDX-FileCopyrightText: 2016 ownCloud Inc.
* SPDX-FileCopyrightText: 2015 María Asensio Valverde
+ * SPDX-FileCopyrightText: 2026 TSI-mc
* SPDX-License-Identifier: GPL-2.0-only AND (AGPL-3.0-or-later OR GPL-2.0-only)
*/
package com.owncloud.android.utils;
@@ -30,6 +31,8 @@
import com.owncloud.android.operations.UpdateSharePermissionsOperation;
import com.owncloud.android.operations.UpdateShareViaLinkOperation;
import com.owncloud.android.operations.UploadFileOperation;
+import com.owncloud.android.operations.albums.CopyFileToAlbumOperation;
+import com.owncloud.android.lib.resources.albums.RenameAlbumRemoteOperation;
import org.apache.commons.httpclient.ConnectTimeoutException;
@@ -148,6 +151,10 @@ String getMessageForResultAndOperation(
} else if (operation instanceof CopyFileOperation) {
message = getMessageForCopyFileOperation(result, res);
+ } else if (operation instanceof CopyFileToAlbumOperation) {
+ message = getMessageForCopyFileToAlbumOperation(result, res);
+ } else if (operation instanceof RenameAlbumRemoteOperation) {
+ message = getMessageForRenameAlbumOperation(result, res);
}
return message;
@@ -500,4 +507,20 @@ String getMessageForOperation(RemoteOperation operation, Resources res) {
return message;
}
-}
+
+ private static @Nullable
+ String getMessageForCopyFileToAlbumOperation(RemoteOperationResult result, Resources res) {
+ if (result.getCode() == ResultCode.CONFLICT) {
+ return res.getString(R.string.album_copy_file_conflict);
+ }
+ return null;
+ }
+
+ private static @Nullable
+ String getMessageForRenameAlbumOperation(RemoteOperationResult result, Resources res) {
+ if (result.getCode() == ResultCode.INVALID_OVERWRITE) {
+ return res.getString(R.string.album_rename_conflict);
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/app/src/main/res/drawable-xxxhdpi/bg_image_albums.png b/app/src/main/res/drawable-xxxhdpi/bg_image_albums.png
new file mode 100644
index 000000000000..a387dc95fe5a
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/bg_image_albums.png differ
diff --git a/app/src/main/res/layout/albums_fragment.xml b/app/src/main/res/layout/albums_fragment.xml
new file mode 100644
index 000000000000..14469cf62188
--- /dev/null
+++ b/app/src/main/res/layout/albums_fragment.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/albums_grid_item.xml b/app/src/main/res/layout/albums_grid_item.xml
new file mode 100644
index 000000000000..43978abec0de
--- /dev/null
+++ b/app/src/main/res/layout/albums_grid_item.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/layout/albums_list_item.xml b/app/src/main/res/layout/albums_list_item.xml
new file mode 100644
index 000000000000..afaffb3879bf
--- /dev/null
+++ b/app/src/main/res/layout/albums_list_item.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/menu/bottom_navigation_menu.xml b/app/src/main/res/menu/bottom_navigation_menu.xml
index 74abc6dbc257..3943106dfed5 100644
--- a/app/src/main/res/menu/bottom_navigation_menu.xml
+++ b/app/src/main/res/menu/bottom_navigation_menu.xml
@@ -1,6 +1,7 @@
@@ -30,4 +31,10 @@
android:icon="@drawable/selector_media"
android:title="@string/bottom_navigation_menu_media_label"/>
+
+
diff --git a/app/src/main/res/menu/custom_menu_placeholder.xml b/app/src/main/res/menu/custom_menu_placeholder.xml
index f84383a573de..0e85e2230553 100644
--- a/app/src/main/res/menu/custom_menu_placeholder.xml
+++ b/app/src/main/res/menu/custom_menu_placeholder.xml
@@ -2,12 +2,18 @@