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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2024 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2024-2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
*/
Expand Down Expand Up @@ -118,6 +118,7 @@
import com.owncloud.android.ui.fragment.SharedListFragment;
import com.owncloud.android.ui.fragment.UnifiedSearchFragment;
import com.owncloud.android.ui.fragment.albums.AlbumItemsFragment;
import com.owncloud.android.ui.fragment.albums.AlbumSharingBottomSheet;
import com.owncloud.android.ui.fragment.albums.AlbumsFragment;
import com.owncloud.android.ui.fragment.community.CommunityFragment;
import com.owncloud.android.ui.fragment.contactsbackup.BackupFragment;
Expand Down Expand Up @@ -536,4 +537,7 @@ abstract class ComponentsModule {

@ContributesAndroidInjector
abstract AlbumItemActionsBottomSheet albumItemActionsBottomSheet();

@ContributesAndroidInjector
abstract AlbumSharingBottomSheet albumSharingBottomSheet();
}
17 changes: 17 additions & 0 deletions app/src/main/java/com/nextcloud/client/utils/IntentUtil.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
Expand All @@ -10,7 +11,11 @@ package com.nextcloud.client.utils
import android.content.Context
import android.content.Intent
import android.net.Uri
import androidx.fragment.app.DialogFragment
import androidx.fragment.app.FragmentActivity
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.ui.activity.FileDisplayActivity
import com.owncloud.android.ui.dialog.ShareLinkToDialog.Companion.newInstance

object IntentUtil {

Expand Down Expand Up @@ -39,4 +44,16 @@ object IntentUtil {

private fun getExposedFileUris(context: Context, files: Array<OCFile>): ArrayList<Uri> =
ArrayList(files.map { it.getExposedFileUri(context) })

@JvmStatic
fun showShareLinkDialog(activity: FragmentActivity, link: String?) {
// Create dialog to allow the user choose an app to send the link
val intentToShareLink = Intent(Intent.ACTION_SEND)

intentToShareLink.putExtra(Intent.EXTRA_TEXT, link)
intentToShareLink.setType("text/plain")

val chooserDialog: DialogFragment = newInstance(intentToShareLink, activity.packageName)
chooserDialog.show(activity.supportFragmentManager, FileDisplayActivity.FTAG_CHOOSER_DIALOG)
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2025 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2025-2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/

Expand All @@ -21,6 +21,7 @@ enum class AlbumItemAction(val id: Int, val titleId: Int, val iconId: Int) {
R.drawable.file_image
),
RENAME_ALBUM(R.id.action_rename_file, R.string.album_rename, R.drawable.ic_edit),
SHARE_ALBUM(R.id.action_share_album, R.string.album_share, R.drawable.ic_share),
DELETE_ALBUM(R.id.action_delete, R.string.album_delete, R.drawable.ic_delete);

companion object {
Expand All @@ -29,6 +30,7 @@ enum class AlbumItemAction(val id: Int, val titleId: Int, val iconId: Int) {
UPLOAD_FROM_CAMERA_ROLL,
SELECT_IMAGES_FROM_ACCOUNT,
RENAME_ALBUM,
SHARE_ALBUM,
DELETE_ALBUM
)
}
Expand Down
12 changes: 11 additions & 1 deletion app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2025 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH
Expand All @@ -13,6 +14,7 @@ import androidx.annotation.IdRes
import androidx.annotation.StringRes
import com.owncloud.android.R
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.utils.MimeTypeUtil

enum class FileAction(
@param:IdRes val id: Int,
Expand Down Expand Up @@ -62,7 +64,10 @@ enum class FileAction(
PIN_TO_HOMESCREEN(R.id.action_pin_to_homescreen, R.string.pin_home, R.drawable.add_to_home_screen),

// Retry for offline operation
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry);
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry),

// Add to Album operation for image and video files
ADD_TO_ALBUM(R.id.action_add_to_album, R.string.add_to_album, R.drawable.ic_album);

constructor(id: Int, title: Int) : this(id, title, null)

Expand All @@ -79,6 +84,7 @@ enum class FileAction(
SEE_DETAILS,
LOCK_FILE,
RENAME_FILE,
ADD_TO_ALBUM,
MOVE_OR_COPY,
DOWNLOAD_FILE,
EXPORT_FILE,
Expand Down Expand Up @@ -206,6 +212,10 @@ enum class FileAction(
result.add(R.id.action_edit)
}

if (files.any { !MimeTypeUtil.isImage(it) && !MimeTypeUtil.isVideo(it) }) {
result.add(R.id.action_add_to_album)
}

if (files.any { it.isRecommendedFile }) {
val allowedForRecommended = setOf(
R.id.action_see_details,
Expand Down
13 changes: 13 additions & 0 deletions app/src/main/java/com/owncloud/android/files/FileMenuFilter.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2023 Alper Ozturk <alper.ozturk@nextcloud.com>
* SPDX-FileCopyrightText: 2019-2023 Tobias Kaminsky <tobias@kaminsky.me>
* SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas <alvaro@alvarobrey.com>
Expand Down Expand Up @@ -169,6 +170,7 @@ private List<Integer> filter(boolean inSingleFileFragment) {
filterUnsetEncrypted(toHide, endToEndEncryptionEnabled);
filterSetPictureAs(toHide);
filterStream(toHide);
filterAddToAlbum(toHide);
filterLock(toHide, fileLockingEnabled);
filterUnlock(toHide, fileLockingEnabled);
filterPinToHome(toHide);
Expand Down Expand Up @@ -399,6 +401,17 @@ private void filterStream(List<Integer> toHide) {
}
}

private void filterAddToAlbum(List<Integer> toHide) {
if (files.isEmpty() || containsEncryptedFile()) {
toHide.add(R.id.action_add_to_album);
return;
}
OCFile file = files.iterator().next();
if(!MimeTypeUtil.isImage(file) && !MimeTypeUtil.isVideo(file)){
toHide.add(R.id.action_add_to_album);
}
}

private boolean anyFileSynchronizing() {
boolean synchronizing = false;
if (componentsGetter != null && !files.isEmpty() && user != null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2018-2023 Tobias Kaminsky <tobias@kaminsky.me>
* SPDX-FileCopyrightText: 2021-2025 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2021-2026 TSI-mc <surinder.kumar@t-systems.com>
* SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
* SPDX-FileCopyrightText: 2017-2018 Andy Scherzinger <info@andy-scherzinger.de>
* SPDX-FileCopyrightText: 2015 ownCloud Inc.
Expand Down Expand Up @@ -43,6 +43,7 @@
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
import com.owncloud.android.lib.common.utils.Log_OC;
import com.owncloud.android.lib.resources.albums.CreateNewAlbumRemoteOperation;
import com.owncloud.android.lib.resources.albums.PublicShareLinkAlbumRemoteOperation;
import com.owncloud.android.lib.resources.albums.RemoveAlbumRemoteOperation;
import com.owncloud.android.lib.resources.albums.RenameAlbumRemoteOperation;
import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation;
Expand Down Expand Up @@ -109,6 +110,7 @@ public class OperationsService extends Service {
public static final String EXTRA_IN_BACKGROUND = "IN_BACKGROUND";
public static final String EXTRA_FILES_DOWNLOAD_LIMIT = "FILES_DOWNLOAD_LIMIT";
public static final String EXTRA_SHARE_ATTRIBUTES = "SHARE_ATTRIBUTES";
public static final String EXTRA_CREATE_ALBUM_SHARE = "CREATE_ALBUM_SHARE";

public static final String ACTION_CREATE_SHARE_VIA_LINK = "CREATE_SHARE_VIA_LINK";
public static final String ACTION_CREATE_SECURE_FILE_DROP = "CREATE_SECURE_FILE_DROP";
Expand All @@ -135,6 +137,7 @@ public class OperationsService extends Service {
public static final String ACTION_ALBUM_COPY_FILE = "ALBUM_COPY_FILE";
public static final String ACTION_RENAME_ALBUM = "RENAME_ALBUM";
public static final String ACTION_REMOVE_ALBUM = "REMOVE_ALBUM";
public static final String ACTION_PUBLIC_SHARE_LINK_ALBUM = "PUBLIC_SHARE_LINK_ALBUM";

private ServiceHandler mOperationsHandler;
private OperationsServiceBinder mOperationsBinder;
Expand Down Expand Up @@ -809,6 +812,12 @@ private Pair<Target, RemoteOperation> newOperation(Intent operationIntent) {
operation = new RemoveAlbumRemoteOperation(albumNameToRemove);
break;

case ACTION_PUBLIC_SHARE_LINK_ALBUM:
String albmName = operationIntent.getStringExtra(EXTRA_ALBUM_NAME);
boolean isCreateShare = operationIntent.getBooleanExtra(EXTRA_CREATE_ALBUM_SHARE, false);
operation = new PublicShareLinkAlbumRemoteOperation(albmName, isCreateShare);
break;

default:
// do nothing
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ class AlbumsPickerActivity :

private lateinit var folderPickerBinding: FilesFolderPickerBinding

private var targetFilePaths: ArrayList<String>? = null
private var albumName: String? = null

private fun initBinding() {
folderPickerBinding = FilesFolderPickerBinding.inflate(layoutInflater)
setContentView(folderPickerBinding.root)
Expand All @@ -57,6 +60,7 @@ class AlbumsPickerActivity :
setupToolbar()
setupAction()
setupActionBar()
initExtras()

if (savedInstanceState == null) {
createFragments()
Expand All @@ -79,6 +83,11 @@ class AlbumsPickerActivity :
}
}

private fun initExtras() {
targetFilePaths = intent.getStringArrayListExtra(EXTRA_FILE_PATHS)
albumName = intent.getStringExtra(EXTRA_ALBUM_NAME)
}

private fun setupAction() {
action = intent.getStringExtra(EXTRA_ACTION)
setupUIForChooseButton()
Expand Down Expand Up @@ -180,6 +189,19 @@ class AlbumsPickerActivity :
}
}

fun addFilesToAlbum(albumName: String?) {
targetFilePaths?.let {
fileOperationsHelper.albumCopyFiles(it, albumName)
}
}

fun addFilesToAlbum(files: Collection<OCFile>) {
val paths: List<String> = files.map { it.remotePath }
albumName?.let {
fileOperationsHelper.albumCopyFiles(paths, it)
}
}

override fun showDetails(file: OCFile?) = Unit

override fun showDetails(file: OCFile?, activeTab: Int) = Unit
Expand All @@ -192,19 +214,22 @@ class AlbumsPickerActivity :
private val EXTRA_ACTION = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_ACTION")
private val CHOOSE_ALBUM = AlbumsPickerActivity::class.java.canonicalName?.plus(".CHOOSE_ALBUM")
private val CHOOSE_MEDIA_FILES = AlbumsPickerActivity::class.java.canonicalName?.plus(".CHOOSE_MEDIA_FILES")
private val EXTRA_FILE_PATHS = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_FILE_PATHS")
private val EXTRA_ALBUM_NAME = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_ALBUM_NAME")
val EXTRA_FROM_ALBUM = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_FROM_ALBUM")
val EXTRA_MEDIA_FILES_PATH = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_MEDIA_FILES_PATH")

private val TAG = AlbumsPickerActivity::class.java.simpleName

fun intentForPickingAlbum(context: FragmentActivity): Intent =
fun intentForPickingAlbum(context: FragmentActivity, paths: ArrayList<String>): Intent =
Intent(context, AlbumsPickerActivity::class.java).apply {
putExtra(EXTRA_ACTION, CHOOSE_ALBUM)
putStringArrayListExtra(EXTRA_FILE_PATHS, paths)
}

fun intentForPickingMediaFiles(context: FragmentActivity): Intent =
fun intentForPickingMediaFiles(context: FragmentActivity, albumName: String): Intent =
Intent(context, AlbumsPickerActivity::class.java).apply {
putExtra(EXTRA_ACTION, CHOOSE_MEDIA_FILES)
putExtra(EXTRA_ALBUM_NAME, albumName)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation
import com.owncloud.android.lib.common.operations.RemoteOperationResult
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.albums.CreateNewAlbumRemoteOperation
import com.owncloud.android.lib.resources.albums.PublicShareLinkAlbumRemoteOperation
import com.owncloud.android.lib.resources.albums.RemoveAlbumRemoteOperation
import com.owncloud.android.lib.resources.albums.RenameAlbumRemoteOperation
import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation
Expand Down Expand Up @@ -1394,7 +1395,6 @@ class FileDisplayActivity :
highlightNavigationViewItem(menuItemId)
}


if (SettingsActivity.isBackPressed) {
Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic")
return
Expand Down Expand Up @@ -2166,6 +2166,10 @@ class FileDisplayActivity :
is RemoveAlbumRemoteOperation -> {
albumOperationListener.onRemoveAlbumOperationFinish(operation, result)
}

is PublicShareLinkAlbumRemoteOperation -> {
albumOperationListener.onAlbumPublicLinkOperationFinish(operation, result)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ import com.owncloud.android.databinding.AlbumsGridItemBinding
import com.owncloud.android.databinding.AlbumsListItemBinding
import com.owncloud.android.datamodel.FileDataStorageManager
import com.owncloud.android.datamodel.OCFile
import com.owncloud.android.datamodel.SyncedFolderProvider
import com.owncloud.android.datamodel.ThumbnailsCacheManager
import com.owncloud.android.lib.common.utils.Log_OC
import com.owncloud.android.lib.resources.albums.PhotoAlbumEntry
Expand Down Expand Up @@ -62,6 +61,13 @@ class AlbumsAdapter(
DisplayUtils.getDateByPattern(file.createdDate, "MMM yyyy")
)

gridViewHolder.albumName.setCompoundDrawablesWithIntrinsicBounds(
0,
0,
if (file.collaborators.isNotEmpty()) R.drawable.ic_share else 0,
0
)

if (file.lastPhoto > 0) {
var ocLocal = storageManager?.getFileByLocalId(file.lastPhoto)
if (ocLocal == null) {
Expand Down
Loading