Skip to content

Commit f1e6ca7

Browse files
committed
album addons: link share, add to album
Signed-off-by: Surinder Kumar <surinder.kumar@t-systems.com>
1 parent 9e3cfd8 commit f1e6ca7

30 files changed

Lines changed: 1230 additions & 140 deletions

app/src/main/java/com/nextcloud/client/di/ComponentsModule.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Nextcloud - Android Client
33
*
4-
* SPDX-FileCopyrightText: 2024 TSI-mc <surinder.kumar@t-systems.com>
4+
* SPDX-FileCopyrightText: 2024-2026 TSI-mc <surinder.kumar@t-systems.com>
55
* SPDX-FileCopyrightText: 2020 Chris Narkiewicz <hello@ezaquarii.com>
66
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
77
*/
@@ -118,6 +118,7 @@
118118
import com.owncloud.android.ui.fragment.SharedListFragment;
119119
import com.owncloud.android.ui.fragment.UnifiedSearchFragment;
120120
import com.owncloud.android.ui.fragment.albums.AlbumItemsFragment;
121+
import com.owncloud.android.ui.fragment.albums.AlbumSharingBottomSheet;
121122
import com.owncloud.android.ui.fragment.albums.AlbumsFragment;
122123
import com.owncloud.android.ui.fragment.community.CommunityFragment;
123124
import com.owncloud.android.ui.fragment.contactsbackup.BackupFragment;
@@ -536,4 +537,7 @@ abstract class ComponentsModule {
536537

537538
@ContributesAndroidInjector
538539
abstract AlbumItemActionsBottomSheet albumItemActionsBottomSheet();
540+
541+
@ContributesAndroidInjector
542+
abstract AlbumSharingBottomSheet albumSharingBottomSheet();
539543
}

app/src/main/java/com/nextcloud/client/utils/IntentUtil.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Nextcloud - Android Client
33
*
4+
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
45
* SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
56
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH
67
* SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-only
@@ -10,7 +11,11 @@ package com.nextcloud.client.utils
1011
import android.content.Context
1112
import android.content.Intent
1213
import android.net.Uri
14+
import androidx.fragment.app.DialogFragment
15+
import androidx.fragment.app.FragmentActivity
1316
import com.owncloud.android.datamodel.OCFile
17+
import com.owncloud.android.ui.activity.FileDisplayActivity
18+
import com.owncloud.android.ui.dialog.ShareLinkToDialog.Companion.newInstance
1419

1520
object IntentUtil {
1621

@@ -39,4 +44,16 @@ object IntentUtil {
3944

4045
private fun getExposedFileUris(context: Context, files: Array<OCFile>): ArrayList<Uri> =
4146
ArrayList(files.map { it.getExposedFileUri(context) })
47+
48+
@JvmStatic
49+
fun showShareLinkDialog(activity: FragmentActivity, link: String?) {
50+
// Create dialog to allow the user choose an app to send the link
51+
val intentToShareLink = Intent(Intent.ACTION_SEND)
52+
53+
intentToShareLink.putExtra(Intent.EXTRA_TEXT, link)
54+
intentToShareLink.setType("text/plain")
55+
56+
val chooserDialog: DialogFragment = newInstance(intentToShareLink, activity.packageName)
57+
chooserDialog.show(activity.supportFragmentManager, FileDisplayActivity.FTAG_CHOOSER_DIALOG)
58+
}
4259
}

app/src/main/java/com/nextcloud/ui/albumItemActions/AlbumItemAction.kt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/*
22
* Nextcloud - Android Client
33
*
4-
* SPDX-FileCopyrightText: 2025 TSI-mc <surinder.kumar@t-systems.com>
4+
* SPDX-FileCopyrightText: 2025-2026 TSI-mc <surinder.kumar@t-systems.com>
55
* SPDX-License-Identifier: AGPL-3.0-or-later
66
*/
77

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

2627
companion object {
@@ -29,6 +30,7 @@ enum class AlbumItemAction(val id: Int, val titleId: Int, val iconId: Int) {
2930
UPLOAD_FROM_CAMERA_ROLL,
3031
SELECT_IMAGES_FROM_ACCOUNT,
3132
RENAME_ALBUM,
33+
SHARE_ALBUM,
3234
DELETE_ALBUM
3335
)
3436
}

app/src/main/java/com/nextcloud/ui/fileactions/FileAction.kt

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Nextcloud - Android Client
33
*
4+
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
45
* SPDX-FileCopyrightText: 2025 Alper Ozturk <alper.ozturk@nextcloud.com>
56
* SPDX-FileCopyrightText: 2022 Álvaro Brey <alvaro@alvarobrey.com>
67
* SPDX-FileCopyrightText: 2022 Nextcloud GmbH
@@ -13,6 +14,7 @@ import androidx.annotation.IdRes
1314
import androidx.annotation.StringRes
1415
import com.owncloud.android.R
1516
import com.owncloud.android.datamodel.OCFile
17+
import com.owncloud.android.utils.MimeTypeUtil
1618

1719
enum class FileAction(
1820
@param:IdRes val id: Int,
@@ -62,7 +64,10 @@ enum class FileAction(
6264
PIN_TO_HOMESCREEN(R.id.action_pin_to_homescreen, R.string.pin_home, R.drawable.add_to_home_screen),
6365

6466
// Retry for offline operation
65-
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry);
67+
RETRY(R.id.action_retry, R.string.retry, R.drawable.ic_retry),
68+
69+
// Add to Album operation for image and video files
70+
ADD_TO_ALBUM(R.id.action_add_to_album, R.string.add_to_album, R.drawable.ic_album);
6671

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

@@ -79,6 +84,7 @@ enum class FileAction(
7984
SEE_DETAILS,
8085
LOCK_FILE,
8186
RENAME_FILE,
87+
ADD_TO_ALBUM,
8288
MOVE_OR_COPY,
8389
DOWNLOAD_FILE,
8490
EXPORT_FILE,
@@ -206,6 +212,10 @@ enum class FileAction(
206212
result.add(R.id.action_edit)
207213
}
208214

215+
if (files.any { !MimeTypeUtil.isImage(it) && !MimeTypeUtil.isVideo(it) }) {
216+
result.add(R.id.action_add_to_album)
217+
}
218+
209219
if (files.any { it.isRecommendedFile }) {
210220
val allowedForRecommended = setOf(
211221
R.id.action_see_details,

app/src/main/java/com/owncloud/android/files/FileMenuFilter.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
/*
22
* Nextcloud - Android Client
33
*
4+
* SPDX-FileCopyrightText: 2026 TSI-mc <surinder.kumar@t-systems.com>
45
* SPDX-FileCopyrightText: 2023 Alper Ozturk <alper.ozturk@nextcloud.com>
56
* SPDX-FileCopyrightText: 2019-2023 Tobias Kaminsky <tobias@kaminsky.me>
67
* SPDX-FileCopyrightText: 2022 Álvaro Brey Vilas <alvaro@alvarobrey.com>
@@ -169,6 +170,7 @@ private List<Integer> filter(boolean inSingleFileFragment) {
169170
filterUnsetEncrypted(toHide, endToEndEncryptionEnabled);
170171
filterSetPictureAs(toHide);
171172
filterStream(toHide);
173+
filterAddToAlbum(toHide);
172174
filterLock(toHide, fileLockingEnabled);
173175
filterUnlock(toHide, fileLockingEnabled);
174176
filterPinToHome(toHide);
@@ -399,6 +401,17 @@ private void filterStream(List<Integer> toHide) {
399401
}
400402
}
401403

404+
private void filterAddToAlbum(List<Integer> toHide) {
405+
if (files.isEmpty() || containsEncryptedFile()) {
406+
toHide.add(R.id.action_add_to_album);
407+
return;
408+
}
409+
OCFile file = files.iterator().next();
410+
if(!MimeTypeUtil.isImage(file) && !MimeTypeUtil.isVideo(file)){
411+
toHide.add(R.id.action_add_to_album);
412+
}
413+
}
414+
402415
private boolean anyFileSynchronizing() {
403416
boolean synchronizing = false;
404417
if (componentsGetter != null && !files.isEmpty() && user != null) {

app/src/main/java/com/owncloud/android/services/OperationsService.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* Nextcloud - Android Client
33
*
44
* SPDX-FileCopyrightText: 2018-2023 Tobias Kaminsky <tobias@kaminsky.me>
5-
* SPDX-FileCopyrightText: 2021-2025 TSI-mc <surinder.kumar@t-systems.com>
5+
* SPDX-FileCopyrightText: 2021-2026 TSI-mc <surinder.kumar@t-systems.com>
66
* SPDX-FileCopyrightText: 2019 Chris Narkiewicz <hello@ezaquarii.com>
77
* SPDX-FileCopyrightText: 2017-2018 Andy Scherzinger <info@andy-scherzinger.de>
88
* SPDX-FileCopyrightText: 2015 ownCloud Inc.
@@ -43,6 +43,7 @@
4343
import com.owncloud.android.lib.common.operations.RemoteOperationResult;
4444
import com.owncloud.android.lib.common.utils.Log_OC;
4545
import com.owncloud.android.lib.resources.albums.CreateNewAlbumRemoteOperation;
46+
import com.owncloud.android.lib.resources.albums.PublicShareLinkAlbumRemoteOperation;
4647
import com.owncloud.android.lib.resources.albums.RemoveAlbumRemoteOperation;
4748
import com.owncloud.android.lib.resources.albums.RenameAlbumRemoteOperation;
4849
import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation;
@@ -109,6 +110,7 @@ public class OperationsService extends Service {
109110
public static final String EXTRA_IN_BACKGROUND = "IN_BACKGROUND";
110111
public static final String EXTRA_FILES_DOWNLOAD_LIMIT = "FILES_DOWNLOAD_LIMIT";
111112
public static final String EXTRA_SHARE_ATTRIBUTES = "SHARE_ATTRIBUTES";
113+
public static final String EXTRA_CREATE_ALBUM_SHARE = "CREATE_ALBUM_SHARE";
112114

113115
public static final String ACTION_CREATE_SHARE_VIA_LINK = "CREATE_SHARE_VIA_LINK";
114116
public static final String ACTION_CREATE_SECURE_FILE_DROP = "CREATE_SECURE_FILE_DROP";
@@ -135,6 +137,7 @@ public class OperationsService extends Service {
135137
public static final String ACTION_ALBUM_COPY_FILE = "ALBUM_COPY_FILE";
136138
public static final String ACTION_RENAME_ALBUM = "RENAME_ALBUM";
137139
public static final String ACTION_REMOVE_ALBUM = "REMOVE_ALBUM";
140+
public static final String ACTION_PUBLIC_SHARE_LINK_ALBUM = "PUBLIC_SHARE_LINK_ALBUM";
138141

139142
private ServiceHandler mOperationsHandler;
140143
private OperationsServiceBinder mOperationsBinder;
@@ -809,6 +812,12 @@ private Pair<Target, RemoteOperation> newOperation(Intent operationIntent) {
809812
operation = new RemoveAlbumRemoteOperation(albumNameToRemove);
810813
break;
811814

815+
case ACTION_PUBLIC_SHARE_LINK_ALBUM:
816+
String albmName = operationIntent.getStringExtra(EXTRA_ALBUM_NAME);
817+
boolean isCreateShare = operationIntent.getBooleanExtra(EXTRA_CREATE_ALBUM_SHARE, false);
818+
operation = new PublicShareLinkAlbumRemoteOperation(albmName, isCreateShare);
819+
break;
820+
812821
default:
813822
// do nothing
814823
break;

app/src/main/java/com/owncloud/android/ui/activity/AlbumsPickerActivity.kt

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,9 @@ class AlbumsPickerActivity :
4343

4444
private lateinit var folderPickerBinding: FilesFolderPickerBinding
4545

46+
private var targetFilePaths: ArrayList<String>? = null
47+
private var albumName: String? = null
48+
4649
private fun initBinding() {
4750
folderPickerBinding = FilesFolderPickerBinding.inflate(layoutInflater)
4851
setContentView(folderPickerBinding.root)
@@ -57,6 +60,7 @@ class AlbumsPickerActivity :
5760
setupToolbar()
5861
setupAction()
5962
setupActionBar()
63+
initExtras()
6064

6165
if (savedInstanceState == null) {
6266
createFragments()
@@ -79,6 +83,11 @@ class AlbumsPickerActivity :
7983
}
8084
}
8185

86+
private fun initExtras() {
87+
targetFilePaths = intent.getStringArrayListExtra(EXTRA_FILE_PATHS)
88+
albumName = intent.getStringExtra(EXTRA_ALBUM_NAME)
89+
}
90+
8291
private fun setupAction() {
8392
action = intent.getStringExtra(EXTRA_ACTION)
8493
setupUIForChooseButton()
@@ -180,6 +189,19 @@ class AlbumsPickerActivity :
180189
}
181190
}
182191

192+
fun addFilesToAlbum(albumName: String?) {
193+
targetFilePaths?.let {
194+
fileOperationsHelper.albumCopyFiles(it, albumName)
195+
}
196+
}
197+
198+
fun addFilesToAlbum(files: Collection<OCFile>) {
199+
val paths: List<String> = files.map { it.remotePath }
200+
albumName?.let {
201+
fileOperationsHelper.albumCopyFiles(paths, it)
202+
}
203+
}
204+
183205
override fun showDetails(file: OCFile?) = Unit
184206

185207
override fun showDetails(file: OCFile?, activeTab: Int) = Unit
@@ -192,19 +214,22 @@ class AlbumsPickerActivity :
192214
private val EXTRA_ACTION = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_ACTION")
193215
private val CHOOSE_ALBUM = AlbumsPickerActivity::class.java.canonicalName?.plus(".CHOOSE_ALBUM")
194216
private val CHOOSE_MEDIA_FILES = AlbumsPickerActivity::class.java.canonicalName?.plus(".CHOOSE_MEDIA_FILES")
217+
private val EXTRA_FILE_PATHS = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_FILE_PATHS")
218+
private val EXTRA_ALBUM_NAME = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_ALBUM_NAME")
195219
val EXTRA_FROM_ALBUM = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_FROM_ALBUM")
196-
val EXTRA_MEDIA_FILES_PATH = AlbumsPickerActivity::class.java.canonicalName?.plus(".EXTRA_MEDIA_FILES_PATH")
197220

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

200-
fun intentForPickingAlbum(context: FragmentActivity): Intent =
223+
fun intentForPickingAlbum(context: FragmentActivity, paths: ArrayList<String>): Intent =
201224
Intent(context, AlbumsPickerActivity::class.java).apply {
202225
putExtra(EXTRA_ACTION, CHOOSE_ALBUM)
226+
putStringArrayListExtra(EXTRA_FILE_PATHS, paths)
203227
}
204228

205-
fun intentForPickingMediaFiles(context: FragmentActivity): Intent =
229+
fun intentForPickingMediaFiles(context: FragmentActivity, albumName: String): Intent =
206230
Intent(context, AlbumsPickerActivity::class.java).apply {
207231
putExtra(EXTRA_ACTION, CHOOSE_MEDIA_FILES)
232+
putExtra(EXTRA_ALBUM_NAME, albumName)
208233
}
209234
}
210235

app/src/main/java/com/owncloud/android/ui/activity/FileDisplayActivity.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ import com.owncloud.android.lib.common.operations.RemoteOperation
9999
import com.owncloud.android.lib.common.operations.RemoteOperationResult
100100
import com.owncloud.android.lib.common.utils.Log_OC
101101
import com.owncloud.android.lib.resources.albums.CreateNewAlbumRemoteOperation
102+
import com.owncloud.android.lib.resources.albums.PublicShareLinkAlbumRemoteOperation
102103
import com.owncloud.android.lib.resources.albums.RemoveAlbumRemoteOperation
103104
import com.owncloud.android.lib.resources.albums.RenameAlbumRemoteOperation
104105
import com.owncloud.android.lib.resources.files.RestoreFileVersionRemoteOperation
@@ -1394,7 +1395,6 @@ class FileDisplayActivity :
13941395
highlightNavigationViewItem(menuItemId)
13951396
}
13961397

1397-
13981398
if (SettingsActivity.isBackPressed) {
13991399
Log_OC.d(TAG, "User returned from settings activity, skipping reset content logic")
14001400
return
@@ -2166,6 +2166,10 @@ class FileDisplayActivity :
21662166
is RemoveAlbumRemoteOperation -> {
21672167
albumOperationListener.onRemoveAlbumOperationFinish(operation, result)
21682168
}
2169+
2170+
is PublicShareLinkAlbumRemoteOperation -> {
2171+
albumOperationListener.onAlbumPublicLinkOperationFinish(operation, result)
2172+
}
21692173
}
21702174
}
21712175

app/src/main/java/com/owncloud/android/ui/adapter/albums/AlbumsAdapter.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import com.owncloud.android.databinding.AlbumsGridItemBinding
2020
import com.owncloud.android.databinding.AlbumsListItemBinding
2121
import com.owncloud.android.datamodel.FileDataStorageManager
2222
import com.owncloud.android.datamodel.OCFile
23-
import com.owncloud.android.datamodel.SyncedFolderProvider
2423
import com.owncloud.android.datamodel.ThumbnailsCacheManager
2524
import com.owncloud.android.lib.common.utils.Log_OC
2625
import com.owncloud.android.lib.resources.albums.PhotoAlbumEntry
@@ -62,6 +61,13 @@ class AlbumsAdapter(
6261
DisplayUtils.getDateByPattern(file.createdDate, "MMM yyyy")
6362
)
6463

64+
gridViewHolder.albumName.setCompoundDrawablesWithIntrinsicBounds(
65+
0,
66+
0,
67+
if (file.collaborators.isNotEmpty()) R.drawable.ic_share else 0,
68+
0
69+
)
70+
6571
if (file.lastPhoto > 0) {
6672
var ocLocal = storageManager?.getFileByLocalId(file.lastPhoto)
6773
if (ocLocal == null) {

0 commit comments

Comments
 (0)