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
Expand Up @@ -364,6 +364,35 @@ class FileMenuFilterIT : AbstractIT() {
}
}

@Test
fun filter_setPictureAs_onlyForDownloadedImages() {
configureCapability(OCCapability())

val downloadedImage = OCFile("/downloaded.jpg").apply {
mimeType = IMAGE_MIMETYPE
storagePath = getDummyFile("downloaded.jpg").absolutePath
}
val onlineOnlyImage = OCFile("/online.jpg").apply {
mimeType = IMAGE_MIMETYPE
}

launchActivity<TestActivity>().use {
it.onActivity { activity ->
val filterFactory = FileMenuFilter.Factory(mockStorageManager, activity, editorUtils)

val downloadedToHide = filterFactory
.newInstance(downloadedImage, mockComponentsGetter, true, user)
.getToHide(false)
assertFalse(downloadedToHide.contains(R.id.action_set_as_wallpaper))

val onlineToHide = filterFactory
.newInstance(onlineOnlyImage, mockComponentsGetter, true, user)
.getToHide(false)
assertTrue(onlineToHide.contains(R.id.action_set_as_wallpaper))
}
}
}

@Test
fun filter_readOnlyFile_hidesModifyingActions() {
configureCapability(
Expand Down Expand Up @@ -479,6 +508,8 @@ class FileMenuFilterIT : AbstractIT() {
R.id.action_favorite
)

private const val IMAGE_MIMETYPE = "image/jpeg"

private const val OFFICE_MIMETYPE =
"application/vnd.openxmlformats-officedocument.wordprocessingml.document"

Expand Down
7 changes: 1 addition & 6 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -503,12 +503,7 @@
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/exposed_filepaths" />
</provider>
<provider
android:name=".providers.DiskLruImageCacheFileProvider"
android:authorities="@string/image_cache_provider_authority"
android:exported="true"
android:grantUriPermissions="true"
android:permission="android.permission.MANAGE_DOCUMENTS" /> <!-- Disable WorkManager initialization. Whoever designed this, should pay closer attention -->
<!-- Disable WorkManager initialization. Whoever designed this, should pay closer attention -->
<!-- to "best before" dates in his fridge. -->
<!-- disable default provider -->
<provider
Expand Down
4 changes: 0 additions & 4 deletions app/src/main/java/com/nextcloud/client/di/ComponentsModule.kt
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@ import com.owncloud.android.MainApp
import com.owncloud.android.authentication.AuthenticatorActivity
import com.owncloud.android.authentication.DeepLinkLoginActivity
import com.owncloud.android.files.BootupBroadcastReceiver
import com.owncloud.android.providers.DiskLruImageCacheFileProvider
import com.owncloud.android.providers.DocumentsStorageProvider
import com.owncloud.android.providers.FileContentProvider
import com.owncloud.android.providers.UsersAndGroupsSearchProvider
Expand Down Expand Up @@ -335,9 +334,6 @@ internal interface ComponentsModule {
@ContributesAndroidInjector
fun usersAndGroupsSearchProvider(): UsersAndGroupsSearchProvider

@ContributesAndroidInjector
fun diskLruImageCacheFileProvider(): DiskLruImageCacheFileProvider

@ContributesAndroidInjector
fun documentsStorageProvider(): DocumentsStorageProvider

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import androidx.lifecycle.flowWithLifecycle
import androidx.lifecycle.lifecycleScope
import com.nextcloud.client.di.Injectable
import com.nextcloud.client.di.ViewModelFactory
import com.nextcloud.client.jobs.download.SendShareDownloader
import com.nextcloud.ui.fileactions.FileActionsBottomSheet
import com.nextcloud.utils.SnackbarUtil
import com.owncloud.android.R
Expand All @@ -27,13 +28,15 @@ import com.owncloud.android.ui.activity.FileActivity
import com.owncloud.android.ui.activity.FileDisplayActivity
import com.owncloud.android.ui.dialog.ConfirmationDialogFragment
import com.owncloud.android.ui.dialog.RemoveFilesDialogFragment
import com.owncloud.android.ui.dialog.SendShareDialog
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import javax.inject.Inject

class AudioPlayerActivity :
FileActivity(),
Injectable {
Injectable,
SendShareDialog.SendShareDialogDownloader {

companion object {
fun createIntent(context: Context): Intent = Intent(context, AudioPlayerActivity::class.java).apply {
Expand All @@ -48,6 +51,8 @@ class AudioPlayerActivity :

private lateinit var audioPlayerView: AudioPlayerView

private val sendShareDownloader by lazy { SendShareDownloader(this) }

override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
super.onCreate(savedInstanceState)
Expand All @@ -68,6 +73,18 @@ class AudioPlayerActivity :
}

volumeControlStream = AudioManager.STREAM_MUSIC

lifecycle.addObserver(sendShareDownloader)
sendShareDownloader.restoreState(savedInstanceState)
}

override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
sendShareDownloader.saveState(outState)
}

override fun downloadFile(file: OCFile, packageName: String, activityName: String) {
sendShareDownloader.downloadFile(file, packageName, activityName)
}

override fun onStart() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,7 +278,7 @@ private void filterUnsetEncrypted(List<Integer> toHide, boolean endToEndEncrypti
}

private void filterSetPictureAs(List<Integer> toHide) {
if (!isSingleImage() || MimeTypeUtil.isSVG(files.iterator().next())) {
if (!isSingleImage() || MimeTypeUtil.isSVG(files.iterator().next()) || !allFileDown()) {
toHide.add(R.id.action_set_as_wallpaper);
}
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import android.content.Context;
import android.content.res.AssetFileDescriptor;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.net.Uri;
import android.os.AsyncTask;
Expand Down Expand Up @@ -68,9 +69,12 @@
import org.nextcloud.providers.cursors.FileCursor;
import org.nextcloud.providers.cursors.RootCursor;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -105,6 +109,7 @@ public class DocumentsStorageProvider extends DocumentsProvider {
@VisibleForTesting
static final String DOCUMENTID_SEPARATOR = "/";
private static final int DOCUMENTID_PARTS = 2;
private static final int THUMBNAIL_PNG_QUALITY = 90;
private final Map<String, FileDataStorageManager> rootIdToStorageManager = new HashMap<>();

private final Executor executor = Executors.newCachedThreadPool();
Expand Down Expand Up @@ -388,14 +393,42 @@ public AssetFileDescriptor openDocumentThumbnail(String documentId,
ThumbnailsCacheManager.generateThumbnailFromOCFile(file, document.getUser(), getContext());
}

return new AssetFileDescriptor(DiskLruImageCacheFileProvider.getParcelFileDescriptorForOCFile(file),
return new AssetFileDescriptor(getThumbnailFileDescriptor(file),
0,
file.getFileLength());
} finally {
Binder.restoreCallingIdentity(token);
}
}

private ParcelFileDescriptor getThumbnailFileDescriptor(OCFile ocFile) throws FileNotFoundException {
Bitmap thumbnail = FileExtensionsKt.getBigThumbnail(ocFile);

if (thumbnail == null) {
thumbnail = FileExtensionsKt.getSmallThumbnail(ocFile);
}

if (thumbnail == null) {
thumbnail = ThumbnailsCacheManager.mDefaultImg;
}

File thumbnailFile = new File(MainApp.getAppContext().getCacheDir(), ocFile.getFileName());
try {
Files.createFile(thumbnailFile.toPath());

ByteArrayOutputStream bos = new ByteArrayOutputStream();
thumbnail.compress(Bitmap.CompressFormat.PNG, THUMBNAIL_PNG_QUALITY, bos);

try (FileOutputStream fos = new FileOutputStream(thumbnailFile)) {
fos.write(bos.toByteArray());
}
} catch (Exception e) {
Log_OC.e(TAG, "Error writing thumbnail file: " + e.getMessage());
}

return ParcelFileDescriptor.open(thumbnailFile, ParcelFileDescriptor.MODE_READ_ONLY);
}

@Override
public String renameDocument(String documentId, String displayName) throws FileNotFoundException {
Log_OC.d(TAG, "renameDocument(), id=" + documentId);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/*
* Nextcloud - Android Client
*
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
package com.owncloud.android.ui.dialog

enum class SendShareAction {
SEND_NOW,
DOWNLOAD_FIRST,
DOWNLOAD_UNAVAILABLE;

companion object {
fun resolve(isDownloaded: Boolean, hostCanDownload: Boolean): SendShareAction = when {
isDownloaded -> SEND_NOW
hostCanDownload -> DOWNLOAD_FIRST
else -> DOWNLOAD_UNAVAILABLE
}
}
}
Loading
Loading