diff options
author | tobiasKaminsky <tobias@kaminsky.me> | 2022-06-13 10:15:20 +0300 |
---|---|---|
committer | tobiasKaminsky <tobias@kaminsky.me> | 2022-06-13 17:17:28 +0300 |
commit | 60757a18534639775494058a684f62cf827beca3 (patch) | |
tree | b531199d3b269413aed72bb7bd8766b6878808dc | |
parent | c56ccc83637f2c594d2a337cde34d0a04366749d (diff) |
Groupfolders cannot be encryptedgroupfolderCannotBeEncrypted
added test showing folder types
Signed-off-by: tobiasKaminsky <tobias@kaminsky.me>
12 files changed, 122 insertions, 30 deletions
diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png Binary files differnew file mode 100644 index 0000000000..453ff46dd7 --- /dev/null +++ b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showFolderTypes.png diff --git a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png Binary files differindex 435df38e17..4dde9d5c1e 100644 --- a/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png +++ b/app/screenshots/gplay/debug/com.owncloud.android.ui.fragment.OCFileListFragmentStaticServerIT_showSharedFiles.png diff --git a/app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt b/app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt index bec8a63a56..fded525180 100644 --- a/app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt +++ b/app/src/androidTest/java/com/owncloud/android/ui/fragment/OCFileListFragmentStaticServerIT.kt @@ -29,6 +29,7 @@ import com.owncloud.android.AbstractIT import com.owncloud.android.datamodel.OCFile import com.owncloud.android.lib.resources.shares.ShareType import com.owncloud.android.lib.resources.shares.ShareeUser +import com.owncloud.android.utils.MimeType import com.owncloud.android.utils.ScreenshotTest import org.junit.After import org.junit.Assert @@ -80,90 +81,103 @@ class OCFileListFragmentStaticServerIT : AbstractIT() { /** * Use same values as {@link FileDetailSharingFragmentIT listSharesFileAllShareTypes } */ + @Test + @ScreenshotTest fun showSharedFiles() { val sut = testActivityRule.launchActivity(null) val fragment = OCFileListFragment() - val userShare = OCFile("/sharedToUser.jpg").apply { + OCFile("/sharedToUser.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("Admin", "Server Admin", ShareType.USER)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(userShare) - val groupShare = OCFile("/sharedToGroup.jpg").apply { + OCFile("/sharedToGroup.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("group", "Group", ShareType.GROUP)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(groupShare) - val emailShare = OCFile("/sharedToEmail.jpg").apply { + OCFile("/sharedToEmail.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("admin@nextcloud.localhost", "admin@nextcloud.localhost", ShareType.EMAIL)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(emailShare) - val publicLink = OCFile("/publicLink.jpg").apply { + OCFile("/publicLink.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedViaLink = true + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(publicLink) - val federatedUserShare = OCFile("/sharedToFederatedUser.jpg").apply { + OCFile("/sharedToFederatedUser.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf( ShareeUser("admin@remote.nextcloud.com", "admin@remote.nextcloud.com (remote)", ShareType.FEDERATED) ) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(federatedUserShare) - val personalCircleShare = OCFile("/sharedToPersonalCircle.jpg").apply { + OCFile("/sharedToPersonalCircle.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("circle", "Circle (Personal circle)", ShareType.CIRCLE)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(personalCircleShare) // as we cannot distinguish circle types, we do not need them right now -// val publicCircleShare = OCFile("/sharedToPublicCircle.jpg").apply { +// OCFile("/sharedToPublicCircle.jpg").apply { // parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId // isSharedWithSharee = true // sharees = listOf(ShareeUser("circle", "Circle (Public circle)", ShareType.CIRCLE)) +// modificationTimestamp = 1000 +// sut.storageManager.saveFile(this) // } -// sut.storageManager.saveFile(publicCircleShare) // -// val closedCircleShare = OCFile("/sharedToClosedCircle.jpg").apply { +// OCFile("/sharedToClosedCircle.jpg").apply { // parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId // isSharedWithSharee = true // sharees = listOf(ShareeUser("circle", "Circle (Closed circle)", ShareType.CIRCLE)) +// modificationTimestamp = 1000 +// sut.storageManager.saveFile(this) // } -// sut.storageManager.saveFile(closedCircleShare) // -// val secretCircleShare = OCFile("/sharedToSecretCircle.jpg").apply { +// OCFile("/sharedToSecretCircle.jpg").apply { // parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId // isSharedWithSharee = true // sharees = listOf(ShareeUser("circle", "Circle (Secret circle)", ShareType.CIRCLE)) +// modificationTimestamp = 1000 +// sut.storageManager.saveFile(this) // } -// sut.storageManager.saveFile(secretCircleShare) - val userRoomShare = OCFile("/sharedToUserRoom.jpg").apply { + OCFile("/sharedToUserRoom.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("Conversation", "Admin", ShareType.ROOM)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(userRoomShare) - val groupRoomShare = OCFile("/sharedToGroupRoom.jpg").apply { + OCFile("/sharedToGroupRoom.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf(ShareeUser("Conversation", "Meeting", ShareType.ROOM)) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(groupRoomShare) - val usersShare = OCFile("/sharedToUsers.jpg").apply { + OCFile("/sharedToUsers.jpg").apply { parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId isSharedWithSharee = true sharees = listOf( @@ -171,13 +185,67 @@ class OCFileListFragmentStaticServerIT : AbstractIT() { ShareeUser("User", "User", ShareType.USER), ShareeUser("Christine", "Christine Scott", ShareType.USER) ) + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) + } + + OCFile("/notShared.jpg").apply { + parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + modificationTimestamp = 1000 + sut.storageManager.saveFile(this) + } + + sut.addFragment(fragment) + + shortSleep() + + val root = sut.storageManager.getFileByEncryptedRemotePath("/") + + sut.runOnUiThread { + fragment.listDirectory(root, false, false) + fragment.adapter.setShowShareAvatar(true) + } + + waitForIdleSync() + shortSleep() + shortSleep() + shortSleep() + + screenshot(sut) + } + + /** + * Use same values as {@link FileDetailSharingFragmentIT listSharesFileAllShareTypes } + */ + @Test + @ScreenshotTest + fun showFolderTypes() { + val sut = testActivityRule.launchActivity(null) + val fragment = OCFileListFragment() + + OCFile("/normal/").apply { + mimeType = MimeType.DIRECTORY + modificationTimestamp = 1624003571000 + parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + sut.storageManager.saveFile(this) + } + + OCFile("/groupFolder/").apply { + mimeType = MimeType.DIRECTORY + modificationTimestamp = 1615003571000 + parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + permissions += "M" + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(usersShare) - val noShare = OCFile("/notShared.jpg").apply { + OCFile("/encrypted/").apply { + mimeType = MimeType.DIRECTORY + isEncrypted = true + decryptedRemotePath = "/encrypted/" + modificationTimestamp = 1614003571000 parentId = sut.storageManager.getFileByEncryptedRemotePath("/").fileId + sut.storageManager.saveFile(this) } - sut.storageManager.saveFile(noShare) sut.addFragment(fragment) diff --git a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java index ed19d1880e..3904029c8e 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java +++ b/app/src/main/java/com/owncloud/android/datamodel/FileDataStorageManager.java @@ -506,6 +506,7 @@ public class FileDataStorageManager { cv.put(ProviderTableMeta.FILE_LOCK_TIMESTAMP, file.getLockTimestamp()); cv.put(ProviderTableMeta.FILE_LOCK_TIMEOUT, file.getLockTimeout()); cv.put(ProviderTableMeta.FILE_LOCK_TOKEN, file.getLockToken()); + cv.put(ProviderTableMeta.FILE_MODIFIED, file.getModificationTimestamp()); return cv; } diff --git a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java index c497109799..9a74a6af9b 100644 --- a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java +++ b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java @@ -52,6 +52,7 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa @VisibleForTesting public final static String PERMISSION_CAN_RESHARE = "R"; private final static String PERMISSION_CAN_WRITE = "CK"; + private final static String PERMISSION_GROUPFOLDER = "M"; public static final String PATH_SEPARATOR = "/"; public static final String ROOT_PATH = PATH_SEPARATOR; @@ -618,6 +619,11 @@ public class OCFile implements Parcelable, Comparable<OCFile>, ServerFileInterfa return permissions != null && permissions.contains(PERMISSION_CAN_WRITE); } + public boolean isGroupFolder() { + String permissions = getPermissions(); + return permissions != null && permissions.contains(PERMISSION_GROUPFOLDER); + } + public static final Parcelable.Creator<OCFile> CREATOR = new Parcelable.Creator<OCFile>() { @Override diff --git a/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java b/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java index 6796d9d574..1f8e301f09 100644 --- a/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java +++ b/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java @@ -310,7 +310,7 @@ public class FileMenuFilter { } private void filterEncrypt(List<Integer> toShow, List<Integer> toHide, boolean endToEndEncryptionEnabled) { - if (files.isEmpty() || !isSingleSelection() || isSingleFile() || isEncryptedFolder() + if (files.isEmpty() || !isSingleSelection() || isSingleFile() || isEncryptedFolder() || isGroupFolder() || !endToEndEncryptionEnabled) { toHide.add(R.id.action_encrypted); } else { @@ -546,6 +546,10 @@ public class FileMenuFilter { } } + private boolean isGroupFolder() { + return files.iterator().next().isGroupFolder(); + } + private boolean isSingleImage() { return isSingleSelection() && MimeTypeUtil.isImage(files.iterator().next()); } diff --git a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java index 9dc2b73ed4..9321dfc40b 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/EditorWebView.java @@ -156,6 +156,7 @@ public abstract class EditorWebView extends ExternalSiteWebView { file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), + file.isGroupFolder(), file.getMountType(), this, themeColorUtils, diff --git a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java index dcb767eeb1..120c91bc84 100644 --- a/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java +++ b/app/src/main/java/com/owncloud/android/ui/activity/ShareActivity.java @@ -76,6 +76,7 @@ public class ShareActivity extends FileActivity { file.isSharedWithSharee(), file.isSharedViaLink(), file.isEncrypted(), + file.isGroupFolder(), file.getMountType(), this, themeColorUtils, diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java b/app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java index c0ff816821..513388cd0d 100644 --- a/app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java +++ b/app/src/main/java/com/owncloud/android/ui/adapter/UploaderAdapter.java @@ -108,6 +108,7 @@ public class UploaderAdapter extends SimpleAdapter { final Drawable icon = MimeTypeUtil.getFolderTypeIcon(isShared, file.isSharedViaLink(), file.isEncrypted(), + file.isGroupFolder(), user, file.getMountType(), mContext, diff --git a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java index cd77c578df..2ab1908be8 100644 --- a/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java +++ b/app/src/main/java/com/owncloud/android/utils/DisplayUtils.java @@ -858,8 +858,13 @@ public final class DisplayUtils { stopShimmer(shimmerThumbnail, thumbnailView); thumbnailView.setImageDrawable(MimeTypeUtil .getFolderTypeIcon(file.isSharedWithMe() || file.isSharedWithSharee(), - file.isSharedViaLink(), file.isEncrypted(), - file.getMountType(), context, themeColorUtils, themeDrawableUtils)); + file.isSharedViaLink(), + file.isEncrypted(), + file.isGroupFolder(), + file.getMountType(), + context, + themeColorUtils, + themeDrawableUtils)); } else { if (file.getRemoteId() != null && file.isPreviewAvailable()) { // Thumbnail in cache? diff --git a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java index 40b6754ba4..7a82487104 100644 --- a/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java +++ b/app/src/main/java/com/owncloud/android/utils/MimeTypeUtil.java @@ -157,6 +157,7 @@ public final class MimeTypeUtil { public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, boolean isEncrypted, + boolean isGroupfolder, WebdavEntry.MountType mountType, Context context, ThemeColorUtils themeColorUtils, @@ -164,6 +165,7 @@ public final class MimeTypeUtil { return getFolderTypeIcon(isSharedViaUsers, isSharedViaLink, isEncrypted, + isGroupfolder, null, mountType, context, @@ -183,6 +185,7 @@ public final class MimeTypeUtil { public static Drawable getFolderTypeIcon(boolean isSharedViaUsers, boolean isSharedViaLink, boolean isEncrypted, + boolean isGroupFolder, @Nullable User user, WebdavEntry.MountType mountType, Context context, @@ -198,7 +201,7 @@ public final class MimeTypeUtil { drawableId = R.drawable.folder_encrypted; } else if (WebdavEntry.MountType.EXTERNAL == mountType) { drawableId = R.drawable.folder_external; - } else if (WebdavEntry.MountType.GROUP == mountType) { + } else if (WebdavEntry.MountType.GROUP == mountType || isGroupFolder) { drawableId = R.drawable.folder_group; } else { drawableId = R.drawable.folder; @@ -216,6 +219,7 @@ public final class MimeTypeUtil { return getFolderTypeIcon(false, false, false, + false, WebdavEntry.MountType.INTERNAL, context, themeColorUtils, diff --git a/scripts/androidScreenshotTest b/scripts/androidScreenshotTest index 99a0c0e073..fdf2e1eda0 100755 --- a/scripts/androidScreenshotTest +++ b/scripts/androidScreenshotTest @@ -61,6 +61,7 @@ done < <(adb devices | cut -f1) if [ "$emulatorIsRunning" == false ] ; then "$(command -v emulator)" -writable-system -avd uiComparison -no-snapshot -gpu swiftshader_indirect -no-audio -skin 500x833 & + sleep 20 fi if [ -e $5 ] ; then |