diff --git a/app/src/androidTest/java/com/nmc/android/FileMenuFilterIT.kt b/app/src/androidTest/java/com/nmc/android/FileMenuFilterIT.kt
new file mode 100644
index 000000000000..5752046cc4db
--- /dev/null
+++ b/app/src/androidTest/java/com/nmc/android/FileMenuFilterIT.kt
@@ -0,0 +1,151 @@
+/*
+ * Nextcloud Android client application
+ *
+ * @author Álvaro Brey Vilas
+ * Copyright (C) 2022 Álvaro Brey Vilas
+ * Copyright (C) 2022 Nextcloud GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+package com.nmc.android
+
+import androidx.test.core.app.launchActivity
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.nextcloud.client.account.User
+import com.nextcloud.client.jobs.download.FileDownloadWorker
+import com.nextcloud.client.jobs.upload.FileUploadHelper
+import com.nextcloud.test.TestActivity
+import com.nextcloud.utils.EditorUtils
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.R
+import com.owncloud.android.datamodel.ArbitraryDataProvider
+import com.owncloud.android.datamodel.FileDataStorageManager
+import com.owncloud.android.datamodel.OCFile
+import com.owncloud.android.files.FileMenuFilter
+import com.owncloud.android.lib.resources.status.CapabilityBooleanType
+import com.owncloud.android.lib.resources.status.OCCapability
+import com.owncloud.android.services.OperationsService
+import com.owncloud.android.ui.activity.ComponentsGetter
+import com.owncloud.android.utils.MimeType
+import io.mockk.MockKAnnotations
+import io.mockk.every
+import io.mockk.impl.annotations.MockK
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.security.SecureRandom
+
+@RunWith(AndroidJUnit4::class)
+class FileMenuFilterIT : AbstractIT() {
+
+ @MockK
+ private lateinit var mockComponentsGetter: ComponentsGetter
+
+ @MockK
+ private lateinit var mockStorageManager: FileDataStorageManager
+
+ @MockK
+ private lateinit var mockFileUploaderBinder: FileUploadHelper
+
+ @MockK
+ private lateinit var mockOperationsServiceBinder: OperationsService.OperationsServiceBinder
+
+ @MockK
+ private lateinit var mockFileDownloadProgressListener: FileDownloadWorker.FileDownloadProgressListener
+
+ @MockK
+ private lateinit var mockArbitraryDataProvider: ArbitraryDataProvider
+
+ private lateinit var editorUtils: EditorUtils
+
+ @Before
+ fun setup() {
+ MockKAnnotations.init(this)
+ every { mockFileUploaderBinder.isUploading(any(), any()) } returns false
+ every { mockComponentsGetter.fileUploaderHelper } returns mockFileUploaderBinder
+ every { mockComponentsGetter.fileDownloadProgressListener } returns mockFileDownloadProgressListener
+ every { mockOperationsServiceBinder.isSynchronizing(any(), any()) } returns false
+ every { mockComponentsGetter.operationsServiceBinder } returns mockOperationsServiceBinder
+ every { mockStorageManager.getFileById(any()) } returns OCFile("/")
+ every { mockStorageManager.getFolderContent(any(), any()) } returns ArrayList()
+ every { mockArbitraryDataProvider.getValue(any(), any()) } returns ""
+ editorUtils = EditorUtils(mockArbitraryDataProvider)
+ }
+
+ @Test
+ fun hide_shareAndFavouriteMenu_encryptedFolder() {
+ val capability = OCCapability().apply {
+ endToEndEncryption = CapabilityBooleanType.TRUE
+ }
+
+ val encryptedFolder = OCFile("/encryptedFolder/").apply {
+ isEncrypted = true
+ mimeType = MimeType.DIRECTORY
+ fileLength = SecureRandom().nextLong()
+ }
+
+ configureCapability(capability)
+
+ launchActivity().use {
+ it.onActivity { activity ->
+ val filterFactory =
+ FileMenuFilter.Factory(mockStorageManager, activity, editorUtils)
+
+ val sut = filterFactory.newInstance(encryptedFolder, mockComponentsGetter, true, user)
+ val toHide = sut.getToHide(false)
+
+ // encrypted folder
+ assertTrue(toHide.contains(R.id.action_see_details))
+ assertTrue(toHide.contains(R.id.action_favorite))
+ assertTrue(toHide.contains(R.id.action_unset_favorite))
+ }
+ }
+ }
+
+ @Test
+ fun show_shareAndFavouriteMenu_normalFolder() {
+ val capability = OCCapability().apply {
+ endToEndEncryption = CapabilityBooleanType.TRUE
+ }
+
+ val normalFolder = OCFile("/folder/").apply {
+ mimeType = MimeType.DIRECTORY
+ fileLength = SecureRandom().nextLong()
+ }
+
+ configureCapability(capability)
+
+ launchActivity().use {
+ it.onActivity { activity ->
+ val filterFactory =
+ FileMenuFilter.Factory(mockStorageManager, activity, editorUtils)
+
+ val sut = filterFactory.newInstance(normalFolder, mockComponentsGetter, true, user)
+ val toHide = sut.getToHide(false)
+
+ // normal folder
+ assertFalse(toHide.contains(R.id.action_see_details))
+ assertFalse(toHide.contains(R.id.action_favorite))
+ assertTrue(toHide.contains(R.id.action_unset_favorite))
+ }
+ }
+ }
+
+ private fun configureCapability(capability: OCCapability) {
+ every { mockStorageManager.getCapability(any()) } returns capability
+ every { mockStorageManager.getCapability(any()) } returns capability
+ }
+}
diff --git a/app/src/androidTest/java/com/nmc/android/SetupEncryptionDialogFragmentIT.kt b/app/src/androidTest/java/com/nmc/android/SetupEncryptionDialogFragmentIT.kt
new file mode 100644
index 000000000000..58e02f858b69
--- /dev/null
+++ b/app/src/androidTest/java/com/nmc/android/SetupEncryptionDialogFragmentIT.kt
@@ -0,0 +1,56 @@
+package com.nmc.android
+
+import androidx.test.espresso.Espresso.onView
+import androidx.test.espresso.assertion.ViewAssertions.matches
+import androidx.test.espresso.intent.rule.IntentsTestRule
+import androidx.test.espresso.matcher.ViewMatchers.withHint
+import androidx.test.espresso.matcher.ViewMatchers.withId
+import androidx.test.internal.runner.junit4.statement.UiThreadStatement
+import com.nextcloud.test.TestActivity
+import com.owncloud.android.AbstractIT
+import com.owncloud.android.ui.dialog.setupEncryption.SetupEncryptionDialogFragment
+import org.junit.Rule
+import org.junit.Test
+import com.owncloud.android.R
+
+class SetupEncryptionDialogFragmentIT : AbstractIT() {
+
+ @get:Rule
+ val testActivityRule = IntentsTestRule(TestActivity::class.java, true, false)
+
+ @Test
+ fun validatePassphraseInputHint() {
+ val activity = testActivityRule.launchActivity(null)
+
+ val sut = SetupEncryptionDialogFragment.newInstance(user, null, null)
+
+ sut.show(activity.supportFragmentManager, "1")
+
+ val keyWords = arrayListOf(
+ "ability",
+ "able",
+ "about",
+ "above",
+ "absent",
+ "absorb",
+ "abstract",
+ "absurd",
+ "abuse",
+ "access",
+ "accident",
+ "account",
+ "accuse"
+ )
+
+ shortSleep()
+
+ UiThreadStatement.runOnUiThread {
+ sut.setMnemonic(keyWords)
+ sut.showMnemonicInfo()
+ }
+
+ waitForIdleSync()
+
+ onView(withId(R.id.encryption_passwordInput)).check(matches(withHint("Passphrase…")))
+ }
+}
\ No newline at end of file
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 5cfcf18e1b7f..06ce46ab12da 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
@@ -406,13 +406,17 @@ class OCFileListFragmentStaticServerIT : AbstractIT() {
testFolder.richWorkspace = " "
activity.storageManager.saveFile(testFolder)
- adapter.swapDirectory(user, testFolder, activity.storageManager, false, "")
+ adapter.swapDirectory(user, testFolder, activity.storageManager, false, "",
+ showOnlyFolder = false,
+ hideEncryptedFolder = false)
Assert.assertFalse(adapter.shouldShowHeader())
testFolder.richWorkspace = null
activity.storageManager.saveFile(testFolder)
- adapter.swapDirectory(user, testFolder, activity.storageManager, false, "")
+ adapter.swapDirectory(user, testFolder, activity.storageManager, false, "",
+ showOnlyFolder = false,
+ hideEncryptedFolder = false)
Assert.assertFalse(adapter.shouldShowHeader())
EspressoIdlingResource.increment()
diff --git a/app/src/main/java/com/nextcloud/utils/extensions/OCFileExtensions.kt b/app/src/main/java/com/nextcloud/utils/extensions/OCFileExtensions.kt
index acad982bb83b..6590f0abe6cf 100644
--- a/app/src/main/java/com/nextcloud/utils/extensions/OCFileExtensions.kt
+++ b/app/src/main/java/com/nextcloud/utils/extensions/OCFileExtensions.kt
@@ -117,3 +117,7 @@ fun OCFile.isLocalETagOutdated(): Boolean {
val serverETag = etagInConflict
return !serverETag.isNullOrEmpty() && etag.eTagChanged(serverETag)
}
+
+// NMC method to filter only folders with/without e2ee folders
+fun List.filterByFolder(hideEncryptedFolder: Boolean = false): List =
+ filter { it.isFolder && (!hideEncryptedFolder || !it.isEncrypted) }
\ No newline at end of file
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 5626e13771fa..3c0eb128db82 100644
--- a/app/src/main/java/com/owncloud/android/datamodel/OCFile.java
+++ b/app/src/main/java/com/owncloud/android/datamodel/OCFile.java
@@ -627,6 +627,10 @@ public boolean isHidden() {
}
/**
+ * The unique fileId for the file within the instance This only works if we have 12 digits for instanceId RemoteId
+ * is a combination of localId + instanceId If a file has remoteId: 4174305739oc97a8ddfc96, in this 4174305739 is
+ * localId & oc97a8ddfc96 is instanceId which is of 12 digits
+ *
* unique fileId for the file within the instance
*/
@SuppressFBWarnings("STT")
@@ -634,7 +638,8 @@ public long getLocalId() {
if (localId > 0) {
return localId;
} else if (remoteId != null && remoteId.length() > 8) {
- return Long.parseLong(remoteId.substring(0, 8).replaceAll("^0*", ""));
+ //NMC Customization --> for long remote id's
+ return Long.parseLong(remoteId.substring(0, remoteId.length() - 12).replaceAll("^0*", ""));
} else {
return -1;
}
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 0d7fa33d94a6..b98c5baf9e1d 100644
--- a/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java
+++ b/app/src/main/java/com/owncloud/android/files/FileMenuFilter.java
@@ -189,7 +189,7 @@ private void filterPermissionActions(List toHide) {
private void filterShareFile(List toHide, OCCapability capability) {
- if (!isSingleSelection() || containsEncryptedFile() || hasEncryptedParent() ||
+ if (!isSingleSelection() || containsEncryptedFile() || hasEncryptedParent() || containsEncryptedFolder() ||
(!isShareViaLinkAllowed() && !isShareWithUsersAllowed()) ||
!isShareApiEnabled(capability) || !files.iterator().next().canReshare()) {
toHide.add(R.id.action_send_share_file);
@@ -220,19 +220,21 @@ private void filterSendFiles(List toHide, boolean inSingleFileFragment)
}
private void filterDetails(Collection toHide) {
- if (!isSingleSelection()) {
+ if (!isSingleSelection() || containsEncryptedFolder() || containsEncryptedFile()) {
toHide.add(R.id.action_see_details);
}
}
private void filterFavorite(List toHide, boolean synchronizing) {
- if (files.isEmpty() || synchronizing || allFavorites()) {
+ if (files.isEmpty() || synchronizing || allFavorites() || containsEncryptedFile()
+ || containsEncryptedFolder()) {
toHide.add(R.id.action_favorite);
}
}
private void filterUnfavorite(List toHide, boolean synchronizing) {
- if (files.isEmpty() || synchronizing || allNotFavorites()) {
+ if (files.isEmpty() || synchronizing || allNotFavorites() || containsEncryptedFile()
+ || containsEncryptedFolder()) {
toHide.add(R.id.action_unset_favorite);
}
}
@@ -265,7 +267,7 @@ private void filterUnlock(List toHide, boolean fileLockingEnabled) {
private void filterEncrypt(List toHide, boolean endToEndEncryptionEnabled) {
if (files.isEmpty() || !isSingleSelection() || isSingleFile() || isEncryptedFolder() || isGroupFolder()
- || !endToEndEncryptionEnabled || !isEmptyFolder() || isShared()) {
+ || !endToEndEncryptionEnabled || !isEmptyFolder() || isShared() || isInSubFolder()) {
toHide.add(R.id.action_encrypted);
}
}
@@ -412,8 +414,10 @@ private void filterReadOnly(Collection toHide) {
}
private void filterRemove(List toHide, boolean synchronizing) {
- if (files.isEmpty() || synchronizing || containsLockedFile()
- || containsEncryptedFolder() || isFolderAndContainsEncryptedFile()) {
+ if ((files.isEmpty() || synchronizing || containsLockedFile()
+ || containsEncryptedFolder() || isFolderAndContainsEncryptedFile())
+ //show delete option for encrypted sub-folder
+ && !hasEncryptedParent()) {
toHide.add(R.id.action_remove_file);
}
}
@@ -665,4 +669,15 @@ private boolean isShared() {
}
return false;
}
+
+ private boolean isInSubFolder() {
+ OCFile folder = files.iterator().next();
+ OCFile parent = storageManager.getFileById(folder.getParentId());
+
+ if (parent == null) {
+ return false;
+ }
+
+ return !OCFile.ROOT_PATH.equals(parent.getRemotePath());
+ }
}
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
index 9abf7924e82a..d7ff56c43ddb 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
+++ b/app/src/main/java/com/owncloud/android/ui/activity/FolderPickerActivity.kt
@@ -65,6 +65,8 @@ open class FolderPickerActivity :
private var mSyncBroadcastReceiver: SyncBroadcastReceiver? = null
private var mSearchOnlyFolders = false
+ private var mShowOnlyFolder = false
+ private var mHideEncryptedFolder = false
var isDoNotEnterEncryptedFolder = false
private set
@@ -124,6 +126,9 @@ open class FolderPickerActivity :
}
private fun setupAction() {
+ mShowOnlyFolder = intent.getBooleanExtra(EXTRA_SHOW_ONLY_FOLDER, false)
+ mHideEncryptedFolder = intent.getBooleanExtra(EXTRA_HIDE_ENCRYPTED_FOLDER, false)
+
action = intent.getStringExtra(EXTRA_ACTION)
if (action != null && action == CHOOSE_LOCATION) {
@@ -357,7 +362,7 @@ open class FolderPickerActivity :
}
private fun refreshListOfFilesFragment(directory: OCFile?) {
- listOfFilesFragment?.listDirectory(directory, false)
+ listOfFilesFragment?.listDirectoryFolder(directory, false, mShowOnlyFolder, mHideEncryptedFolder)
}
fun browseToRoot() {
@@ -693,6 +698,12 @@ open class FolderPickerActivity :
@JvmField
val EXTRA_ACTION = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_ACTION")
+ @JvmField
+ val EXTRA_SHOW_ONLY_FOLDER = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_SHOW_ONLY_FOLDER")
+
+ @JvmField
+ val EXTRA_HIDE_ENCRYPTED_FOLDER = FolderPickerActivity::class.java.canonicalName?.plus(".EXTRA_HIDE_ENCRYPTED_FOLDER")
+
const val MOVE_OR_COPY = "MOVE_OR_COPY"
const val CHOOSE_LOCATION = "CHOOSE_LOCATION"
private val TAG = FolderPickerActivity::class.java.simpleName
diff --git a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
index 6580a0119b24..71670c23f15d 100644
--- a/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
+++ b/app/src/main/java/com/owncloud/android/ui/activity/SettingsActivity.java
@@ -470,10 +470,14 @@ private void setupE2EPreference(PreferenceCategory preferenceCategoryMore) {
Preference preference = findPreference("setup_e2e");
if (preference != null) {
+
+ if (!CapabilityUtils.getCapability(this).getEndToEndEncryption().isTrue()) {
+ preferenceCategoryMore.removePreference(preference);
+ return;
+ }
+
if (FileOperationsHelper.isEndToEndEncryptionSetup(this, user) ||
- CapabilityUtils.getCapability(this).getEndToEndEncryptionKeysExist().isTrue() ||
- CapabilityUtils.getCapability(this).getEndToEndEncryptionKeysExist().isUnknown()
- ) {
+ CapabilityUtils.getCapability(this).getEndToEndEncryptionKeysExist().isTrue()) {
preferenceCategoryMore.removePreference(preference);
} else {
preference.setOnPreferenceClickListener(p -> {
@@ -656,6 +660,9 @@ private void showRemoveE2EAlertDialog(PreferenceCategory preferenceCategoryMore,
preferenceCategoryMore.removePreference(pMnemonic);
}
+ // NMC: restart to show the preferences correctly
+ restartSettingsActivity();
+
dialog.dismiss();
})
.create()
@@ -1123,8 +1130,8 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
} else if (requestCode == ACTION_SHOW_MNEMONIC && resultCode == RESULT_OK) {
handleMnemonicRequest(data);
} else if (requestCode == ACTION_E2E && data != null && data.getBooleanExtra(SetupEncryptionDialogFragment.SUCCESS, false)) {
- Intent i = new Intent(this, SettingsActivity.class);
- startActivity(i);
+ //restart to show the preferences correctly
+ restartSettingsActivity();
} else if (requestCode == ExtendedSettingsActivityDialog.StorageLocation.getResultId() && data != null) {
String newPath = data.getStringExtra(ExtendedSettingsActivityDialog.StorageLocation.getKey());
if (storagePath != null && !storagePath.equals(newPath)) {
@@ -1159,6 +1166,13 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
}
}
+ private void restartSettingsActivity() {
+ Intent i = new Intent(this, SettingsActivity.class);
+ i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ i.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
+ startActivity(i);
+ }
+
@VisibleForTesting
public void handleMnemonicRequest(Intent data) {
if (data == null) {
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt
index 3b3406503203..44f083beab2f 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/GalleryAdapter.kt
@@ -387,7 +387,9 @@ class GalleryAdapter(
directory: OCFile,
storageManager: FileDataStorageManager,
onlyOnDevice: Boolean,
- mLimitToMimeType: String
+ mLimitToMimeType: String,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean
) = Unit
override fun setHighlightedItem(file: OCFile) = Unit
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/CommonOCFileListAdapterInterface.kt b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/CommonOCFileListAdapterInterface.kt
index 8e04cb8054fa..cf1ebb42cd23 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/CommonOCFileListAdapterInterface.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/CommonOCFileListAdapterInterface.kt
@@ -21,7 +21,9 @@ interface CommonOCFileListAdapterInterface {
directory: OCFile,
storageManager: FileDataStorageManager,
onlyOnDevice: Boolean,
- mLimitToMimeType: String
+ mLimitToMimeType: String,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean
)
fun setHighlightedItem(file: OCFile)
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt
index 4a1db86037aa..7c7c13438407 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/OCFileListAdapter.kt
@@ -279,7 +279,9 @@ class OCFileListAdapter(
directory: OCFile,
storageManager: FileDataStorageManager,
onlyOnDevice: Boolean,
- mLimitToMimeType: String
+ mLimitToMimeType: String,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean
) {
this.onlyOnDevice = onlyOnDevice
@@ -297,6 +299,8 @@ class OCFileListAdapter(
adapterDataProvider,
onlyOnDevice,
mLimitToMimeType,
+ showOnlyFolder,
+ hideEncryptedFolder,
preferences,
accountUserId
) { newList, _ ->
diff --git a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/data/OCFileListAdapterHelper.kt b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/data/OCFileListAdapterHelper.kt
index 4057c8847844..ea0b71d9dbcf 100644
--- a/app/src/main/java/com/owncloud/android/ui/adapter/filelist/data/OCFileListAdapterHelper.kt
+++ b/app/src/main/java/com/owncloud/android/ui/adapter/filelist/data/OCFileListAdapterHelper.kt
@@ -31,6 +31,8 @@ class OCFileListAdapterHelper {
dataProvider: OCFileListAdapterDataProvider,
onlyOnDevice: Boolean,
limitToMimeType: String,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean,
preferences: AppPreferences,
userId: String,
onComplete: (List, FileSortOrder) -> Unit
@@ -44,6 +46,8 @@ class OCFileListAdapterHelper {
dataProvider,
onlyOnDevice,
limitToMimeType,
+ showOnlyFolder,
+ hideEncryptedFolder,
preferences,
userId
)
@@ -59,6 +63,8 @@ class OCFileListAdapterHelper {
dataProvider: OCFileListAdapterDataProvider,
onlyOnDevice: Boolean,
limitToMimeType: String,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean,
preferences: AppPreferences,
userId: String
): Pair, FileSortOrder> {
@@ -70,6 +76,11 @@ class OCFileListAdapterHelper {
val filtered = ArrayList(rawResult.size)
for (file in rawResult) {
+ // NMC filter condition to show only folder with or without encrypted folders
+ if ((showOnlyFolder && !file.isFolder) || (hideEncryptedFolder && file.isEncrypted)) {
+ continue
+ }
+
if (!showHiddenFiles && file.isHidden) {
continue
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt
index df6cacb57753..63bc14f50189 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/GalleryFragment.kt
@@ -336,6 +336,8 @@ class GalleryFragment :
override fun selectMediaFolder() {
val intent = Intent(requireActivity(), FolderPickerActivity::class.java).apply {
putExtra(FolderPickerActivity.EXTRA_ACTION, FolderPickerActivity.CHOOSE_LOCATION)
+ putExtra(FolderPickerActivity.EXTRA_SHOW_ONLY_FOLDER, true)
+ putExtra(FolderPickerActivity.EXTRA_HIDE_ENCRYPTED_FOLDER, true)
}
folderPickerLauncher.launch(intent)
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt
index 22d4f255a9fb..949f475ff7bf 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListBottomSheetDialog.kt
@@ -113,6 +113,7 @@ class OCFileListBottomSheetDialog(
applyBranding()
+ checkTemplateVisibility()
initCreatorContainer()
if (!deviceInfo.hasCamera(context)) {
@@ -139,46 +140,41 @@ class OCFileListBottomSheetDialog(
}
}
- private fun checkCreateEncryptedFolderVisibility() {
- fileActivity.capabilities.ifPresent { capabilities ->
- binding.menuEncryptedMkdir.setVisibleIf(!file.isEncrypted && capabilities.endToEndEncryption.isTrue)
+ private fun checkTemplateVisibility() {
+ val optionalCapability = fileActivity.capabilities
+ if (optionalCapability.isEmpty) {
+ return
}
- }
- private fun applyBranding() {
- viewThemeUtils.material.run {
- binding.run {
- colorMaterialButtonContent(menuUploadFiles, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuUploadFromApp, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuDirectCameraUpload, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuScanDocUpload, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuMkdir, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuEncryptedMkdir, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuCreateRichWorkspace, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuMoreDocuments, ColorRole.PRIMARY)
- colorMaterialButtonContent(menuBack, ColorRole.PRIMARY)
-
- viewThemeUtils.platform.tintDrawable(
- context,
- binding.menuMoreDocumentsExpand.drawable,
- ColorRole.PRIMARY
- )
+ if (optionalCapability.get().endToEndEncryption.isTrue) {
+ // NMC-4348 fix
+ // show encrypted folder option for root and e2ee folder
+ binding.menuEncryptedMkdir.visibility =
+ if (file.isEncrypted || file.isRootDirectory)
+ View.VISIBLE
+ else
+ View.GONE
+ // for e2ee folder don't show normal folder option
+ if (file.isEncrypted) {
+ binding.menuMkdir.visibility = View.GONE
}
+ } else {
+ binding.menuEncryptedMkdir.visibility = View.GONE
}
- viewThemeUtils.platform.colorViewBackground(binding.bottomSheet, ColorRole.SURFACE)
+ if (file.isEncrypted) {
+ return
+ }
- val textColor = ContextCompat.getColor(context, R.color.text_color)
+ val capability = optionalCapability.get()
+ if (!capability.isTemplateAvailable()) {
+ return
+ }
binding.run {
- menuUploadFiles.setTextColor(textColor)
- menuUploadFromApp.setTextColor(textColor)
- menuDirectCameraUpload.setTextColor(textColor)
- menuScanDocUpload.setTextColor(textColor)
- menuMkdir.setTextColor(textColor)
- menuEncryptedMkdir.setTextColor(textColor)
- menuCreateRichWorkspace.setTextColor(textColor)
- menuMoreDocuments.setTextColor(textColor)
+ menuNewDocument.visibility = View.VISIBLE
+ menuNewSpreadsheet.visibility = View.VISIBLE
+ menuNewPresentation.visibility = View.VISIBLE
}
}
@@ -382,7 +378,11 @@ class OCFileListBottomSheetDialog(
}
menuEncryptedMkdir.setOnClickListener {
- actions.createFolder(encrypted = true)
+ // NMC-4348 fix
+ // for e2e folder call normal folder creation
+ // it will auto handle creating e2e sub folder
+ // for root path the value will be true and will create e2e folder
+ actions.createFolder(!file.isEncrypted)
dismiss()
}
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt
index 01f945d5f4bb..4a955efea441 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/OCFileListFragment.kt
@@ -228,6 +228,9 @@ open class OCFileListFragment :
ADD_GRID_AND_SORT_WITH_SEARCH
}
+ private var mShowOnlyFolder = false
+ private var mHideEncryptedFolder: Boolean = false
+
fun requireContainerActivity(): ContainerActivity =
checkNotNull(containerActivity) { "Fragment $this is not attached to a ContainerActivity" }
//endregion
@@ -1010,6 +1013,7 @@ open class OCFileListFragment :
putExtra(FolderPickerActivity.EXTRA_FOLDER, currentFile)
addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION)
putExtra(FolderPickerActivity.EXTRA_ACTION, FolderPickerActivity.MOVE_OR_COPY)
+ putExtra(FolderPickerActivity.EXTRA_HIDE_ENCRYPTED_FOLDER, true)
}
activity.startActivityForResult(action, FileDisplayActivity.REQUEST_CODE__MOVE_OR_COPY_FILES)
}
@@ -1151,7 +1155,11 @@ open class OCFileListFragment :
}
Log_OC.i(TAG, "Listing directory ${directoryToList.decryptedRemotePath}, onlyOnDevice=$onlyOnDevice")
- adapter.swapDirectory(accountManager.user, directoryToList, storageManager, onlyOnDevice, mimeType)
+ adapter.swapDirectory(
+ accountManager.user, directoryToList, storageManager, onlyOnDevice, mimeType,
+ mShowOnlyFolder,
+ mHideEncryptedFolder
+ )
val previousDirectory = currentFile
currentFile = directoryToList
@@ -1189,6 +1197,17 @@ open class OCFileListFragment :
return storageManager.getFileById(candidate.parentId)
}
+ fun listDirectoryFolder(
+ directory: OCFile?,
+ onlyOnDevice: Boolean,
+ showOnlyFolder: Boolean,
+ hideEncryptedFolder: Boolean
+ ) {
+ mShowOnlyFolder = showOnlyFolder
+ mHideEncryptedFolder = hideEncryptedFolder
+ listDirectory(directory, onlyOnDevice)
+ }
+
fun refreshDirectory() {
isSearchFragment = false
val folder = currentFile ?: return
diff --git a/app/src/main/java/com/owncloud/android/ui/fragment/autoUpload/handler/AutoUploadPickers.kt b/app/src/main/java/com/owncloud/android/ui/fragment/autoUpload/handler/AutoUploadPickers.kt
index 4c8f5bff89dc..08699946cd41 100644
--- a/app/src/main/java/com/owncloud/android/ui/fragment/autoUpload/handler/AutoUploadPickers.kt
+++ b/app/src/main/java/com/owncloud/android/ui/fragment/autoUpload/handler/AutoUploadPickers.kt
@@ -35,6 +35,9 @@ class AutoUploadPickers(
fun pickRemoteFolder() {
val intent = Intent(fragment.requireContext(), FolderPickerActivity::class.java).apply {
putExtra(FolderPickerActivity.EXTRA_ACTION, FolderPickerActivity.CHOOSE_LOCATION)
+ // NMC Customization
+ putExtra(FolderPickerActivity.EXTRA_SHOW_ONLY_FOLDER, true)
+ putExtra(FolderPickerActivity.EXTRA_HIDE_ENCRYPTED_FOLDER, true)
}
remoteFolderLauncher.launch(intent)
}
diff --git a/app/src/main/res/layout/setup_encryption_dialog.xml b/app/src/main/res/layout/setup_encryption_dialog.xml
index 3fa8d5784bfb..3c0a1efef809 100644
--- a/app/src/main/res/layout/setup_encryption_dialog.xml
+++ b/app/src/main/res/layout/setup_encryption_dialog.xml
@@ -73,7 +73,7 @@
android:layout_height="wrap_content"
android:autofillHints="password"
android:ems="10"
- android:inputType="textPassword"
+ android:inputType="text"
android:textCursorDrawable="@null" />
diff --git a/app/src/main/res/raw/encryption_key_words.txt b/app/src/main/res/raw/encryption_key_words.txt
index f78ccaf2ce6f..1d8fcdea8410 100644
--- a/app/src/main/res/raw/encryption_key_words.txt
+++ b/app/src/main/res/raw/encryption_key_words.txt
@@ -1,2048 +1,2304 @@
-abandon
-ability
-able
-about
-above
-absent
-absorb
-abstract
-absurd
-abuse
-access
-accident
-account
-accuse
-achieve
-acid
-acoustic
-acquire
-across
-act
+aal
+abend
+abendrot
+abenteuer
+aberglaube
+abfahrt
+abfall
+abtei
+achse
+acht
+achtung
+achtzig
+acidum
+acker
+ackerbau
+ackerhof
action
-actor
-actress
-actual
-adapt
-add
-addict
-address
-adjust
-admit
-adult
-advance
-advice
-aerobic
-affair
-afford
-afraid
-again
-age
-agent
-agree
-ahead
-aim
-air
-airport
-aisle
-alarm
-album
-alcohol
-alert
-alien
-all
-alley
-allow
-almost
-alone
-alpha
-already
-also
-alter
-always
-amateur
-amazing
-among
-amount
-amused
-analyst
-anchor
-ancient
-anger
-angle
-angry
-animal
-ankle
-announce
-annual
-another
-answer
-antenna
-antique
-anxiety
-any
-apart
-apology
-appear
-apple
-approve
+ada
+adam
+adel
+adenauer
+ader
+aderlass
+adidas
+adieu
+adjektiv
+adolph
+adonis
+adria
+adverb
+advokat
+angina
+angler
+ansicht
+antonio
+antrag
+antrieb
+antritt
+antwort
+anwalt
+apache
+apartheid
+apartment
+aperitif
+apfel
+apfelmus
+apfelsine
+apfeltorte
+apfelwein
+aphorismus
+aphrodite
+apokalypse
+apoll
+apollo
+apologeten
+apostel
+apostroph
+apostrophs
+apotheke
+apparat
april
-arch
-arctic
-area
+apropos
+apsis
+apulien
+aquarell
+aragon
+arbeit
+archimedes
+architekt
+archiv
+arden
+areal
arena
-argue
+arenen
+argau
+arge
+argentinien
+arglist
+argonaut
+argosy
+argument
+argus
+argusaugen
+argwohn
+ariane
+arie
+aristokrat
+aristoteles
+arithmetik
+arizona
+arkade
+arkadenhof
+arkansas
+arktisforscher
arm
-armed
-armor
+armada
+armagnac
+armando
+armaturen
+armband
+armee
+armenien
+armenier
+armfluegeln
+armhaltung
+armhebel
+armkettchen
+armlehnen
+armreif
+arms
+armseligkeit
+armsessel
+armstrong
+armut
army
-around
-arrange
+arnica
+arno
arrest
-arrive
-arrow
-art
-artefact
-artist
-artwork
-ask
-aspect
-assault
-asset
-assist
-assume
-asthma
-athlete
+arroganz
+arsch
+arterie
+arthur
+arzt
+asbest
+asien
+aspirant
+astrologe
+astrologie
+astronaut
+astronomie
+asyl
+atelier
+atem
+atemzug
+atheist
+atheisten
+atheistin
+athen
+athene
+athlet
atom
-attack
-attend
-attitude
-attract
-auction
-audit
-august
-aunt
-author
+aubergine
+auch
+audienz
+audienzen
+audrey
+auen
+auerhahn
auto
-autumn
-average
-avocado
-avoid
-awake
-aware
-away
-awesome
-awful
-awkward
-axis
baby
-bachelor
-bacon
-badge
-bag
-balance
-balcony
+bach
+backup
+backware
+backwaren
+bad
+badetuch
+bahamas
+bahn
+balearen
+bali
+balkan
ball
-bamboo
-banana
-banner
-bar
-barely
-bargain
-barrel
-base
-basic
-basket
-battle
-beach
-bean
-beauty
-because
-become
-beef
-before
-begin
-behave
-behind
-believe
-below
-belt
-bench
-benefit
-best
-betray
-better
-between
-beyond
-bicycle
-bid
-bike
-bind
-biology
-bird
-birth
-bitter
-black
-blade
-blame
-blanket
-blast
-bleak
-bless
-blind
-blood
-blossom
-blouse
-blue
-blur
-blush
-board
-boat
-body
-boil
-bomb
-bone
-bonus
-book
-boost
-border
-boring
-borrow
-boss
-bottom
-bounce
-box
-boy
-bracket
-brain
-brand
-brass
-brave
-bread
-breeze
-brick
-bridge
+band
+bank
+barbar
+barbara
+bargeld
+baron
+basketball
+batterie
+bau
+bauernhof
+bauherr
+baum
+bazar
+bazille
+bedarf
+beere
+beet
+behauptung
+beifall
+beine
+beischlaf
+beitrag
+belfast
+belgien
+bengel
+benzin
+berg
+bert
+berta
+bier
+bild
+billionen
+billy
+bindegewebe
+bindeglied
+birmingham
+birne
+blaubeere
+blaubeertorte
+blech
+blei
+bleibe
+blume
+blut
+bonsai
+boa
+bob
+bock
+bombe
+boot
+bordell
brief
-bright
-bring
-brisk
-broccoli
-broken
+bronchitis
bronze
-broom
-brother
-brown
-brush
-bubble
-buddy
-budget
-buffalo
-build
-bulb
-bulk
-bullet
-bundle
-bunker
-burden
-burger
-burst
+buchkritik
+buchmacher
+buckingham
+budapest
+buddha
+bude
+buch
+buechse
+buechsen
+bueffel
+buegels
+buehler
+buehne
+bungalow
+burda
+bureau
+burg
+burgenland
bus
-business
-busy
+butler
butter
-buyer
-buzz
-cabbage
-cabin
-cable
-cactus
-cage
-cake
-call
-calm
-camera
-camp
-can
-canal
-cancel
-candy
-cannon
-canoe
-canvas
-canyon
-capable
-capital
-captain
-car
-carbon
-card
-cargo
-carpet
-carry
-cart
-case
-cash
-casino
-castle
-casual
-cat
-catalog
-catch
-category
-cattle
-caught
-cause
-caution
-cave
-ceiling
-celery
-cement
-census
-century
-cereal
-certain
-chair
-chalk
-champion
-change
-chaos
-chapter
-charge
-chase
-chat
-cheap
-check
-cheese
+buxtehude
+cafe
+cafeteria
+calabrien
+calamares
+calcutta
+carlo
+carol
+carola
+carton
+charakter
+chefkoch
chef
-cherry
-chest
-chicken
-chief
-child
-chimney
-choice
-choose
-chronic
-chuckle
-chunk
-churn
-cigar
-cinnamon
-circle
-citizen
-city
-civil
-claim
-clap
-clarify
-claw
-clay
-clean
-clerk
-clever
-click
-client
-cliff
-climb
-clinic
-clip
-clock
-clog
-close
-cloth
-cloud
+chemie
+cheyenne
+chiffre
+chromosom
+circus
+citroen
clown
club
-clump
-cluster
-clutch
-coach
-coast
-coconut
-code
-coffee
-coil
-coin
-collect
-color
-column
-combine
-come
-comfort
-comic
-common
-company
-concert
-conduct
-confirm
-congress
-connect
-consider
-control
-convince
-cook
-cool
-copper
-copy
-coral
-core
-corn
-correct
-cost
-cotton
-couch
-country
-couple
-course
-cousin
-cover
-coyote
-crack
-cradle
-craft
-cram
-crane
-crash
-crater
-crawl
-crazy
-cream
-credit
-creek
-crew
-cricket
-crime
-crisp
-critic
-crop
-cross
-crouch
-crowd
-crucial
-cruel
-cruise
-crumble
-crunch
-crush
-cry
-crystal
-cube
-culture
-cup
-cupboard
-curious
-current
-curtain
-curve
-cushion
-custom
-cute
-cycle
-dad
-damage
-damp
-dance
-danger
-daring
-dash
-daughter
-dawn
-day
-deal
-debate
-debris
-decade
-december
-decide
-decline
-decorate
-decrease
-deer
-defense
-define
-defy
-degree
-delay
-deliver
-demand
-demise
-denial
-dentist
-deny
-depart
-depend
-deposit
-depth
-deputy
-derive
-describe
-desert
-design
-desk
-despair
-destroy
+clubmaster
+cocktail
+comune
+dach
+dachbalken
+dachboden
+dackel
+daemon
+dammbruch
+dampfbad
+dante
+danton
+datenbank
+daten
+daumen
+daune
+daunen
+david
+deckblatt
+deckel
+decoder
+defizit
+deich
+deichbauer
+dekan
+dekor
+dekorateur
+dekret
+delikt
+demokrat
+demut
+denkfehler
+denkmal
+denkspiel
+depot
+destillat
detail
-detect
-develop
-device
-devote
-diagram
-dial
-diamond
-diary
-dice
+detektiv
+detroit
+dezember
+dialog
diesel
-diet
-differ
-digital
-dignity
+diesellok
+dieter
+diether
+dietrich
+digitaluhr
+diktat
+diktatur
dilemma
-dinner
-dinosaur
-direct
-dirt
-disagree
-discover
-disease
-dish
-dismiss
-disorder
-display
-distance
-divert
-divide
-divorce
-dizzy
-doctor
-document
-dog
-doll
-dolphin
-domain
-donate
-donkey
-donor
-door
-dose
-double
-dove
-draft
-dragon
+diplomat
+direkt
+disco
+dogma
+doktor
+doktorarbeit
+dokument
+dolch
+donald
+donaudelta
+doping
+dorf
+dorne
+dosis
+drache
+drachenboot
+dracula
+draht
+drahtzaun
drama
-drastic
-draw
-dream
+drecksack
+dreher
+drehung
+drehzahl
+drei
+dreieck
+dreiklang
dress
-drift
-drill
-drink
-drip
-drive
-drop
-drum
-dry
-duck
-dumb
-dune
-during
-dust
-dutch
-duty
-dwarf
-dynamic
-eager
-eagle
-early
-earn
-earth
-easily
-east
-easy
+droge
+drogen
+drogenbaron
+dubios
+dublin
+duell
+duft
+duftnote
+dumm
+dunkel
+dunkelheit
+durst
+dynamik
+dynamit
+ebenbild
echo
-ecology
-economy
-edge
-edit
-educate
-effort
-egg
-eight
-either
-elbow
-elder
-electric
-elegant
-element
-elephant
-elevator
-elite
-else
-embark
-embody
-embrace
-emerge
+echos
+ecke
+eden
+edens
+edinburgh
+edison
+editieren
+editor
+editorial
+edmund
+efeu
+efeus
+effekt
+egal
+ehebruch
+ehefrau
+ehezwist
+ehre
+eiche
+eichel
+eid
+eidechsen
+eier
+eierschale
+eifel
+eifer
+eifersucht
+eiffelturm
+eigenheim
+eigenleben
+eigensinn
+eile
+eilgut
+eiltempo
+eimer
+einband
+einbau
+einbruch
+eingabe
+einheit
+einhorn
+einklang
+einladung
+einlagen
+einsamkeit
+einsatz
+einschlag
+einschuss
+einzelfall
+eis
+eisbaer
+eisbecher
+eisberg
+eisbombe
+eisdiele
+eisen
+eisenbahn
+ekel
+elektro
+elektrik
+elend
+elfenbein
+elsass
+eltern
+elternbeirat
+email
+emanuel
+emanuela
+emanzipation
+embargo
+emblem
+embolie
+embyro
+emilia
+eminenz
+eminenzen
emotion
-employ
-empower
-empty
-enable
-enact
-end
-endless
-endorse
-enemy
-energy
-enforce
-engage
-engine
-enhance
-enjoy
-enlist
-enough
-enrich
-enroll
-ensure
-enter
-entire
-entry
-envelope
-episode
-equal
-equip
-era
-erase
-erode
+ende
+endrunde
+endung
+endungen
+engel
+england
+enkel
+enkelin
+entgelt
+erbgut
+erdoel
+erhalt
+erhaltes
+erhaltung
+erich
+erika
+eritrea
+erkaeltung
+erkenntis
+ernte
+eros
erosion
-error
-erupt
-escape
-essay
-essence
-estate
-eternal
-ethics
-evidence
-evil
-evoke
-evolve
-exact
-example
-excess
-exchange
-excite
-exclude
-excuse
-execute
-exercise
-exhaust
-exhibit
-exile
-exist
-exit
-exotic
-expand
-expect
-expire
-explain
-expose
-express
-extend
-extra
-eye
-eyebrow
-fabric
-face
-faculty
-fade
-faint
-faith
+erst
+erzeugung
+eskorte
+essig
+etat
+eule
+exil
+fabel
+fabian
+fabrik
+fabrikant
+faden
+fahne
+fahrgast
+fahrer
+fahrgeld
+fahrrad
+falke
fall
-false
-fame
-family
-famous
-fan
-fancy
-fantasy
+fallbeil
+falle
+fallobst
+fallschirm
+faltboot
+faltdach
+fantasie
+farbe
farm
-fashion
-fat
-fatal
-father
-fatigue
-fault
-favorite
-feature
-february
-federal
-fee
-feed
-feel
-female
-fence
+farmer
+farn
+faruk
+fasan
+fass
+fassade
+fatalismus
+fatalitaet
+faulenzer
+faulpelz
+fauna
+faust
+favorit
+fazit
+fechter
+feder
+federung
+fegefeuer
+fehde
+fehler
+fehlmenge
+feier
+feierabend
+feiertag
+feigling
+feind
+feinkost
+felder
+felge
+felix
+fell
+fenchel
+fenster
+fensterbank
+ferien
+fernglas
+fernost
+fernseher
+fernsicht
+fernweh
+ferrari
+festakt
+festakte
festival
-fetch
-fever
-few
-fiber
-fiction
-field
+fett
+feuer
+feueralarm
+feuerwerk
+fiasko
+fiat
+fieber
figure
-file
+fiktion
film
-filter
-final
-find
-fine
+filz
+fimmel
+finale
+finanzhai
+finderlohn
finger
-finish
-fire
-firm
-first
-fiscal
-fish
-fit
+fink
+firlefanz
+firma
+firmament
+fisch
+fischerboot
+fischfang
fitness
-fix
-flag
-flame
-flash
-flat
-flavor
-flee
-flight
-flip
-float
-flock
-floor
-flower
-fluid
-flush
-fly
-foam
-focus
-fog
-foil
-fold
-follow
-food
-foot
-force
-forest
-forget
-fork
-fortune
-forum
-forward
+flagge
+fleiss
+fleisch
+fliege
+fliegen
+fliegenpilz
+fliese
+flinte
+flipper
+flirt
+flo
+flop
+flora
+florenz
+florett
+florida
+floskel
+flotte
+flucht
+fluchtauto
+fluchtburg
+flug
+flugabwehr
+flughafen
+flunder
+fluss
+flusspferd
+flutwelle
+foen
+folklore
+folter
+folterbank
+folterknecht
+forschung
+forst
+forstamt
fossil
-foster
-found
-fox
-fragile
-frame
-frequent
-fresh
-friend
-fringe
-frog
-front
-frost
-frown
-frozen
-fruit
-fuel
-fun
-funny
-furnace
-fury
-future
-gadget
-gain
-galaxy
-gallery
-game
-gap
+foto
+fotoapparat
+foulspiel
+foyer
+fracht
+frack
+fragment
+frankfurt
+franzose
+fratze
+frei
+freibier
+freiheit
+freitag
+freizeit
+freske
+freude
+freund
+frevel
+frieden
+friesland
+frikadelle
+friseur
+frist
+frohnatur
+frohsinn
+frosch
+frucht
+fruehjahr
+frust
+fuchs
+fuenf
+furie
+fuss
+gabe
+galaxie
+galeere
+galerie
+galgen
+galilei
+galizien
garage
-garbage
-garden
-garlic
-garment
+garten
+gartenzwerg
gas
-gasp
-gate
-gather
-gauge
-gaze
-general
-genius
-genre
-gentle
-genuine
-gesture
-ghost
-giant
+gast
+gasthof
+gauda
+gaudi
+gaul
+gaukler
+gaumen
+gauner
+gazelle
+geburtstag
+gedanke
+geduld
+gefaengnis
+gefecht
+gehirn
+geier
+geist
+geizhals
+georg
+getto
+gewehr
+ghetto
gift
-giggle
-ginger
-giraffe
-girl
-give
-glad
-glance
-glare
-glass
-glide
-glimpse
-globe
-gloom
-glory
-glove
-glow
-glue
-goat
-goddess
-gold
-good
-goose
+gina
+gleis
+glueck
gorilla
-gospel
-gossip
-govern
-gown
-grab
-grace
-grain
-grant
-grape
-grass
-gravity
-great
-green
-grid
-grief
-grit
-grocery
-group
-grow
-grunt
-guard
-guess
-guide
-guilt
-guitar
-gun
-gym
-habit
-hair
-half
-hammer
-hamster
-hand
-happy
-harbor
-hard
-harsh
-harvest
-hat
-have
-hawk
-hazard
-head
-health
-heart
-heavy
-hedgehog
-height
-hello
-helmet
-help
-hen
-hero
-hidden
-high
-hill
-hint
-hip
-hire
-history
-hobby
-hockey
-hold
-hole
-holiday
-hollow
-home
-honey
-hood
-hope
-horn
-horror
-horse
-hospital
-host
+guido
+gummi
+gurke
+gurkensalat
+gurt
+guru
+haar
+hafen
+haft
+haftbefehl
+halbmond
+halogen
+hals
+handball
+handbremse
+handgelenk
+handtasche
+hannelore
+hantel
+harlekin
+harmonie
+haschisch
+harz
+hausarrest
+hausarzt
+hausschwein
+haut
+hawaii
+heck
+heckteil
+hehler
+heike
+heimat
+heino
+heinrich
+heinz
+heirat
+hektik
+held
+helsinki
+hemd
+herbert
+herbst
+herz
+heuchler
+hexen
+hexerei
+himalaja
+himalaya
+himbeere
+himmel
+hindu
+hintergrund
+hintern
+hippie
+hippodamus
+hippodrom
+hirn
+hitze
+hobbie
+hochmut
+hoftor
+hoheit
+hollywood
+holz
hotel
-hour
-hover
-hub
-huge
-human
-humble
-humor
-hundred
-hungry
-hunt
-hurdle
-hurry
-hurt
-husband
-hybrid
-ice
-icon
-idea
-identify
-idle
-ignore
-ill
-illegal
-illness
-image
-imitate
-immense
-immune
-impact
-impose
-improve
-impulse
-inch
-include
-income
-increase
+hubraum
+huehnerdieb
+huf
+hund
+hygiene
+hymne
+hypnose
+idee
+ignoranz
+imbiss
+immobilie
+import
index
-indicate
-indoor
-industry
-infant
-inflict
-inform
-inhale
-inherit
-initial
-inject
-injury
-inmate
-inner
-innocent
-input
-inquiry
-insane
-insect
-inside
-inspire
-install
-intact
-interest
-into
-invest
-invite
-involve
-iron
-island
-isolate
-issue
-item
-ivory
-jacket
+indianer
+indikator
+induktion
+industrie
+infarkt
+infekt
+infektion
+inferno
+information
+inka
+inkasso
+innovation
+innsbruck
+insasse
+insekt
+insekten
+insel
+inselstaat
+instanz
+instinkt
+institut
+instrument
+intelligenz
+intellekt
+interesse
+irak
+iran
+irrenhaus
+irrsinn
+irrtum
+italien
+ivan
+jacht
+jachtklub
+jacke
+jacob
+jagd
jaguar
-jar
+jahr
+jahrbuchs
+jahre
+jahrmarkt
+jahrzehnt
+japan
jazz
-jealous
-jeans
-jelly
-jewel
-job
-join
-joke
-journey
-joy
-judge
-juice
-jump
-jungle
-junior
-junk
-just
-kangaroo
-keen
-keep
-ketchup
-key
-kick
-kid
-kidney
+jazzband
+joker
+jongleur
+jordanien
+josef
+jubel
+jucken
+judo
+judoka
+jugend
+junge
+jurist
+kabarett
+kabel
+kabine
+kabrio
+kabriolett
+kabuki
+kabul
+kadaver
+kader
+kaernten
+kaese
+kaffee
+kafka
+kairo
+kaiser
+kakao
+kaktee
+kaktus
+kalabrien
+kalauer
+kalb
+kali
+kalk
+kalkulation
+kalkutta
+kalzium
+kambodscha
+kamel
+kamera
+kamerad
+kamikaze
+kamille
+kamin
+kanada
+kanaille
+kanal
+kannibale
+kanzlei
+kapitol
+kapitulation
+kaplan
+kappe
+kapsel
+kapuze
+karambolage
+karate
+karosse
+karosserie
+karotte
+karriere
+karte
+kartei
+kartell
+kartenspiel
+Kartoffel
+kartoffelbrei
+karton
+kasino
+kaskade
+kasko
+kasse
+kassel
+kastanie
+kastell
+katamaran
+katastrophe
+katze
+katzenauge
+kehle
+keim
+kennziffer
+kent
+kentucky
+keramik
+kerbe
+kerbel
+kessel
+kette
+ketzer
+keule
+kiesgrube
+killer
+kilo
+kilogramm
+kilometer
+kilowatt
kind
-kingdom
-kiss
-kit
-kitchen
-kite
-kitten
-kiwi
-knee
-knife
-knock
-know
-lab
-label
+kinder
+kirchturm
+kirschbaum
+kirsche
+kitzel
+klamotten
+klang
+klar
+klarheit
+klarinette
+klartext
+klassik
+klausel
+klavier
+klee
+kleider
+klima
+klinik
+klischee
+klo
+klopapier
+kloster
+klotz
+klub
+knallfrosch
+kneipe
+knete
+knetmasse
+knick
+knie
+kniff
+knoblauch
+knochen
+knopf
+knopfloch
+knospe
+kobalt
+kobold
+kobra
+kochbuch
+koerper
+koffein
+koffer
+kohle
+kokain
+kollege
+kombi
+kombination
+komma
+kommandant
+kommando
+kommentar
+kommerz
+kommissar
+kommode
+kommune
+kompetenz
+komplott
+kompost
+konfekt
+konfetti
+konflikt
+kongo
+konkurs
+konrad
+konsens
+konsulat
+konvoi
+kopfball
+kopie
+kork
+kottelet
+krabbe
+krach
+kraehe
+kraft
+kraftakt
+krakau
+kralle
+kram
+krampf
+kran
+krankenhaus
+krebs
+kredit
+krefeld
+kreide
+kreis
+krempe
+krempel
+kreole
+kresse
+kreta
+kreuz
+kreuzberg
+kreuzung
+krieg
+krim
+krimi
+kriminalbeamte
+kriminalbeamtin
+krippe
+krise
+krishna
+kristall
+kritik
+kuba
+kubanerin
+kuckuck
+kueche
+kufe
+kugel
+kugellager
+kultur
+kumulation
+kundin
+kundschaft
+kunst
+kurbel
+kurbelwelle
+kybernetik
labor
-ladder
-lady
-lake
-lamp
-language
-laptop
-large
-later
-latin
-laugh
-laundry
+laborant
+laborleiter
+labrador
+labyrinth
+lachs
+laderaum
+ladung
+lage
+lager
+lagune
+lamborghini
+lamelle
+lametta
+lamm
+lampe
+landau
+landgut
+landung
+landzunge
+langeweile
+languste
+lanzarote
+last
+lauch
+lauge
+laune
+lautsprecher
lava
-law
-lawn
-lawsuit
-layer
-lazy
-leader
-leaf
-learn
-leave
-lecture
-left
-leg
-legal
-legend
-leisure
-lemon
-lend
-length
-lens
+lavendel
+lawine
+layout
+lazarett
+legierung
+legion
+leguan
+lehre
+lehrer
+leiche
+leierkasten
+leim
+leine
+leinen
+leinwand
+leitern
+lektion
+lektorin
+lemming
+leonie
+leonore
leopard
-lesson
-letter
-level
-liar
-liberty
-library
-license
-life
-lift
-light
-like
-limb
-limit
-link
-lion
-liquid
-list
-little
-live
-lizard
-load
-loan
-lobster
-local
-lock
-logic
-lonely
-long
-loop
-lottery
-loud
-lounge
-love
-loyal
-lucky
-luggage
-lumber
-lunar
-lunch
-luxury
-lyrics
-machine
-mad
-magic
-magnet
-maid
-mail
-main
-major
-make
-mammal
-man
-manage
-mandate
-mango
-mansion
-manual
-maple
-marble
-march
-margin
+leopold
+lerche
+lermming
+lettland
+leuchtturm
+libanon
+libelle
+libyen
+licht
+lichtung
+lid
+liebe
+lied
+lieferung
+limonade
+linienbus
+linsensuppe
+linz
+lippe
+lizenz
+lorbeer
+loreley
+lorenzo
+luder
+ludwigshafen
+luebeck
+luegner
+luegnerin
+luemmel
+lueneburg
+luft
+luftabwehr
+lugano
+luke
+luna
+luxus
+macher
+macht
+machtwort
+macke
+madonna
+madrid
+maedchen
+mafia
+magazin
+magnetspule
+mai
+mainz
+mais
+maiskolben
+malaria
+malediven
+maler
+mammon
+mammut
+mandel
+mandelbaum
+manitu
+manko
+mann
+manschette
+mantel
+manuela
+marburg
marine
-market
-marriage
-mask
-mass
-master
-match
+marita
+mark
+markt
+marmor
+marokko
+marquise
+marrakesch
+mars
+mascarpone
+masche
+maschine
+maschinenbau
material
-math
-matrix
-matter
-maximum
-maze
-meadow
-mean
-measure
-meat
-mechanic
-medal
-media
-melody
-melt
-member
-memory
-mention
-menu
-mercy
-merge
-merit
-merry
-mesh
-message
-metal
-method
-middle
-midnight
-milk
-million
-mimic
-mind
-minimum
-minor
-minute
-miracle
-mirror
-misery
-miss
-mistake
-mix
-mixed
-mixture
-mobile
-model
-modify
-mom
-moment
-monitor
-monkey
-monster
-month
-moon
-moral
-more
-morning
-mosquito
-mother
-motion
+materie
+mathematik
+matratze
+medikament
+medizin
+meer
+melodie
+melone
+mensch
+mercedes
+merkmal
+metall
+metropole
+metropolis
+metzger
+michelangelo
+migraene
+mikado
+minderheit
+mineral
+minus
+module
+moebel
+mondlandung
motor
-mountain
-mouse
-move
-movie
-much
-muffin
-mule
-multiply
-muscle
+motorblock
+muecke
+muenze
+muschi
museum
-mushroom
-music
-must
-mutual
-myself
-mystery
-myth
-naive
-name
-napkin
-narrow
-nasty
-nation
-nature
-near
-neck
-need
-negative
-neglect
-neither
-nephew
-nerve
-nest
-net
-network
-neutral
-never
-news
-next
-nice
-night
-noble
-noise
-nominee
-noodle
+mustang
+mutation
+mutti
+nachbar
+nachricht
+nachtleben
+nadelholz
+nagasaki
+nagel
+nagellack
+nahrung
+nairobi
+nase
+nasenbein
+nationalpark
+natur
+nazi
+neapel
+nebel
+nebraska
+nebukadnezar
+neckar
+neffe
+negativ
+nepal
+netz
+netzanschluss
+neubau
+neujahrstag
+neumond
+neun
+nickel
+nie
+niete
+nikolaus
+nikotin
+nordpol
+norm
normal
-north
-nose
-notable
-note
-nothing
-notice
-novel
-now
-nuclear
-number
-nurse
-nut
-oak
-obey
-object
-oblige
-obscure
-observe
-obtain
-obvious
-occur
-ocean
-october
-odor
-off
-offer
-office
-often
-oil
-okay
-old
-olive
-olympic
-omit
-once
-one
-onion
-online
-only
-open
-opera
-opinion
-oppose
-option
+normanne
+norwegen
+nostalgie
+not
+notar
+notausgang
+nudel
+nudelholz
+nylon
+oberst
+oberteil
+objekt
+obligation
+ofen
+ofenheizung
+ohren
+oktober
+oldtimer
+oleg
+olga
+oligarch
+oliven
+oliver
+olymp
+olympia
+opa
+opel
+operette
+oper
+opium
+opiumkrieg
+optiker
+opus
orange
-orbit
-orchard
-order
-ordinary
-organ
+orden
+ordner
+ordnung
+oregon
+organe
+organen
+organleiden
+orgel
orient
-original
-orphan
-ostrich
-other
-outdoor
-outer
-output
-outside
-oval
-oven
-over
-own
-owner
-oxygen
-oyster
-ozone
-pact
-paddle
+orion
+orkan
+orlando
+orleans
+ornament
+ortschaft
+oscar
+osiris
+oskar
+oslo
+osnabrueck
+ostern
+otter
+otto
+ouvertuere
+ovation
+ozean
+ozeandampfer
+ozonschicht
+paella
+paganini
page
-pair
-palace
-palm
-panda
-panel
-panic
-panther
-paper
-parade
-parent
+paket
+palaver
+palermo
+palette
+palisade
+palladium
+panzerkreuzer
+panzer
+papa
+papagalli
+papagallo
+papagei
+papierkorb
+pappe
+pappeln
+paradies
+paraguay
+parameter
+parasit
+pardon
+parfuem
park
-parrot
+parkallee
+parkhaus
+parkplatz
+parkuhr
+parkverbot
+parlament
+parole
+paroli
+partei
party
-pass
-patch
-path
+partyraum
+paruguay
+parzelle
+passau
+passfoto
+patent
patient
-patrol
-pattern
-pause
-pave
-payment
-peace
-peanut
-pear
-peasant
-pelican
-pen
-penalty
-pencil
-people
-pepper
-perfect
-permit
+paul
+paulette
+paulus
+pauschal
+pavian
+pavillon
+pazifik
+pelikan
+pellkartoffel
+pelz
+peng
person
-pet
-phone
+peru
+peruecke
+perversion
+pest
+peter
+petersilie
+pfadfinder
+pfalz
+pfand
+pfannkuchen
+pfarrer
+pfeil
+pferch
+pferd
+pfirsich
+pflaster
+pflasters
+pflegerin
+pfoertner
+phaenomen
+phalanx
+phantast
+pharao
+pharma
+pharmazie
+phase
+phasen
+philippsburg
+philosoph
+philosphie
+phlegma
+phon
+phonetik
photo
-phrase
-physical
-piano
-picnic
-picture
-piece
-pig
-pigeon
-pill
-pilot
-pink
-pioneer
-pipe
-pistol
-pitch
-pizza
-place
-planet
-plastic
-plate
-play
-please
-pledge
-pluck
-plug
-plunge
-poem
-poet
-point
-polar
-pole
+pianist
+piazza
+picasso
+pickelgesicht
+picknick
+piemont
+pietaet
+pigment
+pils
+pingpong
+pinguin
+pinie
+pinsel
+pinselstrich
+pinzette
+pionier
+pirat
+piraten
+pirelli
+pirmasens
+piroschka
+plagiat
+plagiator
+plakat
+plankton
+planquadrat
+planzahl
+plasma
+plastik
+plateau
+platin
+pluralismus
+plus
+plutarch
+pluto
+plutonium
+plymouth
+pokalsieg
+pokerspiel
+pol
+polareis
+polarfuchs
+polaris
police
-pond
-pony
-pool
-popular
-portion
+polier
+poliklinik
+politur
+polle
+pollen
+pomp
+pompadour
+pompeij
+pomps
+porsche
+portwein
+porzellan
position
-possible
post
-potato
-pottery
-poverty
-powder
-power
-practice
-praise
-predict
-prefer
-prepare
-present
-pretty
-prevent
-price
-pride
-primary
-print
-priority
-prison
-private
-prize
+poster
+postfach
+postille
+postkarte
+potzblitz
+praefekt
+praeparat
+praxis
+prellung
+premier
+premiere
+presse
+priester
problem
-process
-produce
+produkt
+produzent
+profession
+professor
+professur
+profiboxer
+profil
+profilneurose
profit
-program
-project
-promote
-proof
-property
-prosper
-protect
-proud
-provide
-public
-pudding
-pull
-pulp
-pulse
-pumpkin
-punch
-pupil
-puppy
-purchase
-purity
-purpose
-purse
-push
-put
-puzzle
-pyramid
-quality
-quantum
-quarter
-question
-quick
-quit
+prognose
+programm
+projekt
+projektion
+prokura
+promille
+prominenz
+propeller
+prophet
+provision
+pruefung
+pruegel
+puffer
+punsch
+pupillen
+puppe
+pyjama
+pyramide
+qualitaet
+qualle
+qualm
+quartal
+quasar
+quatsch
+quattro
+quebec
+quitte
+quitten
+quittungen
quiz
-quote
-rabbit
-raccoon
-race
-rack
+rabe
+rache
+racheakt
radar
-radio
-rail
-rain
-raise
-rally
-ramp
-ranch
-random
-range
-rapid
-rare
-rate
-rather
-raven
-raw
-razor
-ready
+radarschirm
+radioskop
+radium
+raetsel
+raffinerie
+raffinesse
+rahm
+rahmen
+rampe
+rampenlicht
+rang
+rasse
+rastatt
+raster
+rastplatz
+ratte
+rattengift
+raudi
+raumschiff
+rauschgift
+ravenna
+ravensberg
real
-reason
-rebel
-rebuild
-recall
-receive
-recipe
-record
-recycle
-reduce
-reflect
-reform
-refuse
-region
-regret
-regular
-reject
-relax
-release
-relief
-rely
-remain
-remember
-remind
-remove
-render
-renew
-rent
-reopen
-repair
-repeat
-replace
-report
-require
-rescue
-resemble
-resist
-resource
-response
-result
-retire
-retreat
-return
-reunion
-reveal
-review
-reward
-rhythm
-rib
-ribbon
-rice
-rich
-ride
-ridge
-rifle
-right
-rigid
-ring
-riot
-ripple
-risk
-ritual
-rival
-river
-road
-roast
-robot
-robust
-rocket
-romance
-roof
-rookie
-room
+reale
+rebell
+rechner
+rechtsform
+redner
+reflektion
+reflex
+regal
+regel
+regenwald
+regenwurm
+reinfall
+reis
+reise
+reiz
+reklame
+rekrut
+reparatur
+reporter
+reporterin
+reservat
+reserve
+reservebank
+respekt
+ressort
+rettich
+revolutuion
+revolver
+rhythmus
+riad
+rialto
+ribbentrop
+rind
+risiko
+rivale
+rivalin
+robbe
+robert
+roberta
+robin
+roboter
+rolle
rose
-rotate
-rough
-round
-route
-royal
-rubber
-rude
-rug
-rule
-run
-runway
-rural
-sad
-saddle
-sadness
-safe
-sail
-salad
-salmon
+rund
+rundfunk
+russe
+spiegel
+saatgut
+sabotage
+saboteur
+sachbuch
+sack
+sackgasse
+saeugling
+safari
+safran
+saftladen
+saite
salon
-salt
-salute
-same
-sample
-sand
-satisfy
-satoshi
-sauce
-sausage
-save
-say
-scale
-scan
-scare
-scatter
-scene
-scheme
-school
-science
-scissors
-scorpion
-scout
-scrap
-screen
-script
-scrub
-sea
-search
-season
-seat
-second
-secret
-section
-security
-seed
-seek
-segment
-select
-sell
-seminar
-senior
-sense
-sentence
-series
-service
-session
-settle
-setup
-seven
-shadow
-shaft
-shallow
-share
-shed
-shell
-sheriff
-shield
-shift
-shine
-ship
-shiver
-shock
-shoe
-shoot
-shop
-short
-shoulder
-shove
-shrimp
-shrug
-shuffle
-shy
-sibling
-sick
-side
-siege
-sight
-sign
-silent
-silk
-silly
-silver
-similar
-simple
-since
-sing
-siren
-sister
-situate
-six
-size
-skate
-sketch
-ski
-skill
-skin
-skirt
-skull
-slab
-slam
-sleep
-slender
-slice
-slide
-slight
-slim
-slogan
-slot
-slow
-slush
-small
-smart
-smile
-smoke
-smooth
-snack
-snake
-snap
-sniff
-snow
-soap
-soccer
-social
-sock
+saloniki
+sambia
+samen
+samenbank
+sammlung
+sanddorn
+sandsack
+sanftmut
+sansibar
+sardine
+sarg
+sarkasmus
+satan
+satire
+sattel
+schachspiel
+schach
+schachtel
+schaden
+schafe
+schandmaul
+schanghai
+scharade
+schatten
+schatulle
+schatz
+schatzamt
+schaumbad
+scheck
+scheidung
+schein
+scheintod
+scheitel
+schenkel
+scherbe
+scherzartikel
+schick
+schickeria
+schicksal
+schiebedach
+schiffbau
+schild
+schilf
+schirm
+schinken
+schlachtschiff
+schlamassel
+schlamm
+schlampe
+schlauch
+schlauchboot
+schleim
+schlitzohr
+schloss
+schlosser
+schluckauf
+schlummer
+schmerz
+schmerzen
+schmuggler
+schmusekatze
+schmutz
+schnake
+schnaps
+schnapsglas
+schnapsidee
+schneehase
+schneekette
+schnee
+schnitzel
+schnitzerei
+schnulze
+schnurrbart
+schock
+schotte
+schrank
+schranke
+schreck
+schreibpult
+schritt
+schrott
+schuh
+schulden
+schuljahr
+schuss
+schuster
+schutz
+schwager
+schwalbe
+schwamm
+schwan
+schwinger
+seebaer
+seenot
+segen
+segler
+seide
+seife
+semester
+semikolon
+sender
+serie
+sidnay
+sie
+sieben
+sieger
+siegerin
+signatur
+sigrid
+sigrun
+silbe
+silber
+simbabwe
+simulant
+sintflut
+sinus
+sinuskurve
+sirene
+sizilianer
+skelett
soda
-soft
-solar
-soldier
-solid
-solution
-solve
-someone
-song
-soon
-sorry
-sort
-soul
-sound
-soup
-source
-south
-space
-spare
-spatial
-spawn
-speak
-special
-speed
-spell
-spend
-sphere
-spice
-spider
-spike
-spin
-spirit
-split
-spoil
-sponsor
-spoon
+sodawasser
+sodbrennen
+sodomie
+solarzelle
+sommer
+sommertag
+sommerurlaub
+sommerzeit
+sonne
+sonnenfleck
+sonntag
+spalt
+spatel
+spaten
+specht
+spekulation
+sphinx
+spiegel
+spiel
+spielbeginn
+spinner
+spinnrad
+spion
+spionin
+spirale
+spital
+spitzmaus
+spitzname
+spleen
+spore
+sporn
+sportbund
sport
-spot
-spray
-spread
-spring
-spy
-square
-squeeze
-squirrel
-stable
+sportwagen
+spreu
+sprichwort
+sprung
+staat
+staatsanwalt
+staatsbesuch
stadium
-staff
-stage
-stairs
-stamp
+stadt
+staffel
+staffelei
+stamm
+stammaktie
stand
-start
-state
-stay
+standard
+statut
+statuten
+staub
+stausee
steak
-steel
-stem
-step
+steinmetz
stereo
-stick
-still
-sting
-stock
-stomach
-stone
-stool
-story
-stove
-strategy
-street
-strike
-strong
-struggle
-student
-stuff
-stumble
-style
-subject
-submit
-subway
-success
-such
-sudden
-suffer
-sugar
-suggest
-suit
-summer
-sun
-sunny
-sunset
-super
-supply
-supreme
-sure
-surface
-surge
-surprise
-surround
-survey
-suspect
-sustain
-swallow
-swamp
-swap
-swarm
-swear
-sweet
-swift
-swim
-swing
-switch
-sword
+sternbild
+stettin
+steuer
+stichflamme
+stift
+strahl
+strasse
+sturmflut
+sydney
+sylt
+sylvester
+symbiose
symbol
symptom
-syrup
+syndikat
system
-table
-tackle
+szenario
+taeter
+tafel
tag
-tail
+tagbau
talent
-talk
+taler
+talg
+talgdruese
+tanger
+tango
+tangs
tank
-tape
-target
-task
+tankanlage
+tankwart
+tante
+tanzbaer
+tara
+tarantel
+tarif
+taschendieb
+tasse
taste
-tattoo
+tatare
+tartaria
+tatendrang
+tatort
+tatze
+tau
+taube
+taucher
+tausch
+tausend
taxi
-teach
+taxifahrer
team
-tell
-ten
-tenant
-tennis
-tent
-term
-test
+teamarbeit
+technics
+technikerin
+teddybaer
+teekanne
+teenager
+teheran
+teich
+teil
+teilchen
+teilnahme
+teint
+telefon
+temperatur
+teneriffa
+tenor
+teppich
+termin
+terminal
+terrine
+terror
+texas
text
-thank
-that
-theme
-then
-theory
-there
-they
-thing
-this
-thought
-three
-thrive
-throw
-thumb
-thunder
+thailand
+theater
+theke
+thema
+thematik
+theo
+theodor
+theologe
+theorie
+therapeut
+therapie
+theresa
+therese
+thermalbad
+thesaurus
+these
+thomas
+thriller
+thunfisch
+thymian
+tibet
+tick
ticket
-tide
-tiger
-tilt
-timber
-time
-tiny
-tip
-tired
-tissue
-title
-toast
-tobacco
-today
-toddler
-toe
-together
-toilet
-token
-tomato
-tomorrow
-tone
-tongue
-tonight
-tool
-tooth
-top
-topic
-topple
-torch
-tornado
-tortoise
-toss
+tiegel
+tier
+tierarzt
+tilsiter
+tinte
+tintenfass
+tintenfisch
+tintenfleck
+tippzettel
+tips
+tirol
+tischler
+titan
+titanic
+titel
+titelbild
+tivoli
+toaster
+tobak
+tobsucht
+todfeind
+tofu
+toilette
+tokio
+toleranz
+tollwut
+tolpatsch
+tomaten
+tonlage
+tonleiter
+tonnage
+tonne
+tonspur
+tor
+torchance
+torpedo
+torpedoboot
+torraum
+tortur
total
+toulouse
+tour
+tourenrad
tourist
-toward
-tower
-town
-toy
-track
-trade
-traffic
-tragic
-train
+tournee
+toyota
+trab
+trabant
+tracht
+tradition
+trafalgar
+tragbahre
+tragik
+trainer
+trakt
+traktor
+tramper
+trance
transfer
-trap
-trash
-travel
-tray
-treat
-tree
+transport
+trapez
+tratte
+trauer
+traum
+trauma
+traumberuf
+treffen
+treffer
+treiber
+treibhaus
+treibsand
+treibstoff
trend
-trial
-tribe
+trennung
+trennwand
+treppe
+tresen
+tresor
+treue
+treueid
+treuhand
+tribun
trick
-trigger
-trim
-trip
-trophy
-trouble
-truck
-true
-truly
-trumpet
-trust
-truth
-try
-tube
-tuition
-tumble
-tuna
+trickfilm
+triebwerk
+triest
+trikot
+trilogie
+trinkgeld
+tripolis
+tritt
+triumpf
+triumph
+troja
+trojaner
+trommelfell
+trommler
+trompeter
+tropen
+trottel
+trubel
+truhe
+truppe
+tschernobyl
+tuberkulose
+tuebingen
+tuemmler
+tuer
+tuerkei
+tuete
+tugend
+tulpe
+tumult
+tundra
+tunesien
+tunichtgut
tunnel
-turkey
-turn
-turtle
-twelve
-twenty
-twice
-twin
-twist
-two
+turban
+turbine
+turbo
+turm
+turner
+turnerin
+turnier
+tusch
+tycoon
+typ
type
-typical
-ugly
-umbrella
-unable
-unaware
-uncle
-uncover
-under
-undo
-unfair
-unfold
-unhappy
+typografie
+tyrann
+tyrannei
+ufo
+uebung
+ufer
+uganda
+uhrwerk
+uhrzeit
+uhu
+ukraine
+umfrage
+umkehr
+umkreis
+umleitung
+umschau
+umschrift
+umschweif
+umweg
+umzug
+unfall
+unfug
+ungarn
+ungeduld
+ungeheuer
+unhold
uniform
-unique
-unit
-universe
-unknown
-unlock
-until
-unusual
-unveil
-update
-upgrade
-uphold
-upon
-upper
-upset
-urban
-urge
-usage
-use
-used
-useful
-useless
-usual
-utility
-vacant
-vacuum
-vague
-valid
-valley
-valve
-van
-vanish
-vapor
-various
-vast
-vault
-vehicle
-velvet
-vendor
-venture
-venue
+unikum
+universal
+universum
+unterholz
+unterleib
+unternehmer
+unterricht
+untertan
+unterteil
+unzucht
+uran
+urkunde
+urlaub
+urmensch
+urne
+ursache
+urteil
+urwald
+urwelt
+urzeit
+utopie
+utrecht
+vagabund
+vampir
+vandale
+vanille
+variation
+vasall
+vater
+vatikan
+vehemenz
+vehikel
+veilchen
+vene
+venedig
+venezuela
+ventilator
+ventil
+venus
+verachtung
+veranda
verb
-verify
-version
-very
-vessel
+verband
+verbleib
+verblendung
+verbot
+verbrecher
+verbund
+verdienst
+verdun
+verehrer
+verein
+verfall
+verfasser
+vergleich
+verhalten
+verhandlung
+verkehr
+verlag
+verlust
+verona
+verputz
+verrat
+verse
+vertrag
+verwalter
+verwalterin
+verzehr
+verzicht
+verzug
veteran
-viable
-vibrant
-vicious
-victory
+veto
+vetorecht
+viadukt
+vibration
+victor
video
-view
-village
-vintage
-violin
-virtual
-virus
+vieh
+viertel
+vignette
+viktoria
+viktualie
+villa
+viola
+violine
+viper
+viren
+virginia
visa
-visit
-visual
-vital
-vivid
-vocal
-voice
-void
-volcano
-volume
-vote
-voyage
-wage
-wagon
-wait
-walk
+visage
+visier
+vision
+visum
+vitamin
+vitrine
+vogel
+vogt
+vokabel
+vokal
+volk
+volleyball
+vollmond
+volt
+voltaire
+vorbild
+votum
+voyeur
+vulkan
+wachs
+wachtstum
+wade
+waehrung
+waffe
+waffel
+wagemut
+waggon
+waise
+wal
+wald
wall
-walnut
-want
-warfare
-warm
-warrior
-wash
-wasp
-waste
-water
-wave
-way
-wealth
-weapon
-wear
-weasel
-weather
-web
-wedding
-weekend
-weird
-welcome
-west
-wet
-whale
-what
-wheat
-wheel
-when
-where
-whip
-whisper
-wide
-width
-wife
-wild
-will
-win
-window
-wine
-wing
-wink
-winner
+wallach
+walter
+walther
+wand
+wanne
+warze
+wassermann
+weber
+wecker
+wehmut
+weib
+weinblatt
+weizen
+welle
+welpe
+welt
+weltall
+werbung
+werft
+werk
+werkstoff
+werktag
+wermut
+wert
+wertung
+werwolf
+wesen
+weser
+wespe
+wespennest
+weste
+westfalen
+westwind
+wette
+wetter
+whisky
+wicht
+wichtig
+wickel
+widder
+widmung
+wiedergabe
+wiesel
+wiener
+wildwest
+wille
+willi
+willy
+wimpel
+wimper
+wind
+windbeutel
+windhose
+windhund
+winkel
winter
-wire
-wisdom
-wise
-wish
-witness
+winterthur
+wippe
+wirbelwind
+wirkung
+wirrwarr
+wirt
+wirtshaus
+wischer
+witterung
+witwe
+witz
+wladimir
+woche
+woelbung
wolf
-woman
-wonder
-wood
-wool
-word
-work
-world
-worry
-worth
-wrap
-wreck
-wrestle
-wrist
-write
-wrong
-yard
-year
-yellow
-you
-young
-youth
+wohnsitz
+wohnung
+wolfgang
+wolfram
+wolfsburg
+wolfshund
+wolke
+wolga
+wolle
+wollust
+worms
+wort
+wrack
+wucher
+wucht
+wunde
+wunder
+wurf
+wurm
+wurzel
+wut
+xerox
+xerxes
+xylograph
+yacht
+yangtse
+yen
+yeti
+yoga
+yokohama
+yuppie
+zack
+zaehler
+zahl
+zahn
+zahnarzt
+zahnaerztin
+zahnersatz
+zahnfleisch
+zahngold
+zahnluecke
+zahnpaste
+zahnpflege
+zahnrad
+zahnschmelz
+zange
+zapfenstreich
+zar
+zarathustra
+zauber
+zauberei
+zaum
+zaun
+zaunkoenig
zebra
+zeche
+zeh
+zehner
+zeichen
+zeichnung
+zeigefinger
+zeiger
+zeile
+zeit
+zeitalter
+zeitbombe
+zeitung
+zeitgeist
+zelle
+zellkern
+zeltdach
+zelt
+zement
+zensur
+zentner
+zentral
+zentrum
+zeppelin
+zepter
+zeremonie
+zerfall
zero
+zettel
+zeuge
+zeugin
+zeus
+zicke
+ziege
+ziegel
+ziffer
+zigarette
+zigarillo
+zigarre
+zigeuner
+zigeunerin
+zikade
+zimmer
+zimmermann
+zimt
+zinne
+zinnsoldat
+zins
+zirkel
+zisterne
+zitadelle
+zitat
+zivilist
+zoll
+zombie
zone
-zoo
\ No newline at end of file
+zoo
+zopf
+zorro
+zucht
+zucker
+zuegel
+zugabe
+zukunft
+zunge
+zuruf
+zustand
+zuzug
+zwang
+zweifel
+zwerg
+zwerchfell
+zwilling
+zwinger
+zwist
+zyanid
+zyankali
+zyklon
+zyklop
+zyklus
+zylinder
+zyniker
+zypern
+zypresse
+zyste
\ No newline at end of file
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 1374fb3d4f05..1d370231b8b0 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -241,7 +241,7 @@
Fehlerbericht auf GitHub erstellen
Nextcloud Assistant
Konfigurieren
- Lokale Verschlüsselung entfernen
+ Verschlüsselung lokal entfernen
Soll %1$s gelöscht werden?
Soll die Datei %1$s aus dem Album entfernt werden?
Sollen die ausgewählten Elemente gelöscht werden?
@@ -380,7 +380,7 @@
Automatisches Hochladen
Zähler ist zu alt
Hash nicht gefunden
- E2E bislang nicht eingerichtet
+ Die Ende-zu-Ende Verschlüsselung ist noch nicht eingerichtet.
Ohne Internetverbindung nicht möglich
Signatur stimmt nicht überein
Metadaten konnten nicht überprüft werden, die Signatur ist leer.
@@ -414,13 +414,13 @@
Verschlüsselung einrichten
Entschlüssele …
Schließen
- Geben Sie Ihre Passphrase ein, um auf Ihre Dateien zuzugreifen
+ Bitte geben Sie Ihren 12-Wort-Schlüssel (Passphrase) ein.
Dieser Ordner ist nicht leer.
Neue Schlüssel generieren …
Diese 12 Wörter-Phrase ist wie ein sehr starkes Passwort: Sie bietet vollen Zugriff um Ihre verschlüsselten Dateien anzusehen und zu verwenden. Bitte schreiben Sie sie auf und verwahren sie an einem sicheren Ort.
Ende-zu-Ende-Verschlüsselung ist auf diesem Server deaktiviert.
Notieren Sie Ihre Verschlüsselungs-Passphrase
- Passwort …
+ Passphrase …
Schlüssel abrufen …
Privater Schlüssel kann nicht abgerufen werden
Öffentlicher Schlüssel kann nicht abgerufen werden
@@ -448,7 +448,7 @@
Fehler beim Laden der Vorlagen
Fehler beim Speichern der lokalen Datei
Fehler beim Festlegen der Statusnachricht!
- Fehler beim Anzeigen des Setup-Dialogs für Verschlüsselung!
+ Fehler bei der Anzeige des Verschlüsselungsdialogs!
Fehler beim Starten der Kamera
Start des Dokumentenscans fehlgeschlagen
Aufgenommene Medien konnten nicht hochgeladen werden
@@ -827,6 +827,7 @@
E2E-Gedächtnisstütze
Um die Gedächtnisstütze anzuzeigen, aktivieren Sie bitte Geräte-Zugangsdaten
Benachrichtigungen der Mediensuche anzeigen
+ Passphrase
Über neu gefundene Medienordner informieren
GNU General Public Lizenz, version 2
Hilfe
@@ -838,7 +839,7 @@
Nach Datum in Unterordnern speichern
Unterordner verwenden
Unterordneroptionen
- Diesem Client Ende-zu-Ende-Verschlüsselung hinzufügen
+ Fügen Sie dieses Gerät zur Ende-zu-Ende Verschlüsselung hinzu.
Lizenz
App-PIN
Geräte-Anmeldedaten aktiviert
@@ -852,7 +853,7 @@
Verschlüsselung lokal entfernen
Verschlüsselte Dateien und Schlüssel entfernen
Verschlüsselungszertifikat erneuern
- Ende-zu-Ende-Verschlüsselung einrichten
+ Ende-zu-Ende Verschlüsselung starten
App-Umschalter anzeigen
Nextcloud-App-Vorschläge in der Navigationsüberschrift
Versteckte Dateien anzeigen
@@ -891,9 +892,9 @@
(extern)
Datei nicht gefunden!
Entfernen
- Sie können die Ende-zu-Ende-Verschlüsselung lokal auf diesem Client entfernen
+ Sie können die Passphrase auf diesem Gerät entfernen.
Durch diesen Vorgang werden alle verschlüsselten Dateien sowie privaten und öffentlichen Schlüssel entfernt. Sind Sie sicher?
- Sie können die Ende-zu-Ende-Verschlüsselung lokal auf diesem Client entfernen. Die verschlüsselten Dateien bleiben auf dem Server, werden aber nicht mehr mit diesem Computer synchronisiert.
+ Sie können die Passphrase auf diesem Gerät entfernen. Dadurch bleiben die verschlüsselten Inhalte unberührt, jedoch kann dieses Gerät die Daten nicht mehr entschlüsseln.\n\nSie können die Passphrase jederzeit wieder hier eingeben, um Zugriff von diesem Gerät aus auf ihre verschlüsselten Inhalte zu gewährleisten.
Löschung fehlgeschlagen
Lokales Konto entfernen
Das Konto vom Gerät entfernen und alle lokalen Dateien löschen
@@ -959,7 +960,7 @@
Online-Status
Status konnte nicht gesetzt werden!
Nutze Bild als
- Während der Einrichtung der Ende-zu-Ende-Verschlüsselung erhalten Sie eine zufällige 12-Wörter-Gedächtnisstütze, die Sie benötigen, um Ihre Dateien auf anderen Geräten zu öffnen. Diese wird nur auf diesem Gerät gespeichert und kann in diesem Bildschirm erneut angezeigt werden. Bitte notieren Sie es an einem sicheren Ort!
+ Nach dem Start der Verschlüsselung wird Ihnen eine aus 12 Wörtern zufällig erzeugte Wortfolge (Passphrase) angezeigt. Diese bleibt in dieser App erhalten und kann erneut angezeigt werden. Dennoch empfehlen wir Ihnen, die Passphrase zu notieren.
Teilen
Herunterladen und synchronisieren zulassen
Die Freigabe konnte nicht aktualisiert werden. Bitte eine Notiz hinzufügen und erneut versuchen.
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 02ad7b2f9b0c..90fb7cea7eac 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -1029,14 +1029,14 @@
Error while decrypting. Wrong password?
Decrypting…
Retrieving keys…
- Enter your passphrase to access your files
+ Please enter your passphrase to access your files
Generating new keys…
All 12 words together make a very strong password, letting only you view and make use of your encrypted files. Please write it down and keep it somewhere safe.
Set up encryption
Make note of your 12 word encryption password
End-to-end encryption disabled on server.
Set up encryption
- Password…
+ Passphrase…
Could not save keys, please try again.
Close
Storing keys
@@ -1072,6 +1072,7 @@
Updating share failed
E2E mnemonic
To show mnemonic please enable device credentials.
+ Passphrase
Log in
Sign up with provider
Host your own server
@@ -1426,7 +1427,7 @@
Icon for empty list
No items
Check back later or reload.
- E2E not yet setup
+ End-to-end encryption is not yet setup.
Error showing file actions
Shared file cannot be updated
Retry
@@ -1434,14 +1435,14 @@
Open %1$s
Displays your 12 word passphrase
An internet connection is required to set up the encrypted folder
- Set up end-to-end encryption
+ Start end-to-end encryption
End-to-end encryption is set up!
Remove encrypted files and keys
Remove encryption locally
This operation will remove all encrypted files, private and public keys. Are you sure?
- You can remove end-to-end encryption locally on this client
- Remove local encryption
- You can remove end-to-end encryption locally on this client. The encrypted files will remain on server, but will not be synced to this computer any longer.
+ You can remove end-to-end encryption locally on this device.
+ Remove encryption locally
+ You can remove the passphrase on this device. This will not affect the encrypted content, but this device will no longer be able to decrypt your data.\n\nYou can re- enter the passphrase here at any time to ensure access to your encrypted content from this device.
Renew encryption certificate
Renew your end-to-end encryption certificate while keeping your existing keys
Valid until %1$s. Tap to renew while keeping your existing keys.
@@ -1449,7 +1450,7 @@
Encryption certificate renewed
Could not renew encryption certificate
Encryption private key not found
- During setup of end-to-end encryption, you will receive a random 12 word mnemonic, which you will need to open your files on other devices. This will only be stored on this device, and can be shown again in this screen. Please note it down in a secure place!
+ After starting the encryption, a randomly generated word sequence (passphrase) of 12 words is displayed. This remains in this app and can be displayed again. Nevertheless, we recommend that you write down the passphrase.
Error showing encryption setup dialog!
Add end-to-end encryption to this client
Add new secure file drop
diff --git a/app/src/test/java/com/nmc/android/OCFileTest.kt b/app/src/test/java/com/nmc/android/OCFileTest.kt
new file mode 100644
index 000000000000..e68d7e9e5435
--- /dev/null
+++ b/app/src/test/java/com/nmc/android/OCFileTest.kt
@@ -0,0 +1,73 @@
+package com.nmc.android
+
+import com.owncloud.android.datamodel.OCFile
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+class OCFileTest {
+
+ @Test
+ fun testLongIds() {
+ val sut = OCFile("/")
+
+ //1 digit local id
+ sut.remoteId = "1ocjycgrudn78"
+ assertEquals(1, sut.localId)
+
+ //2 digit local id
+ sut.remoteId = "12ocjycgrudn78"
+ assertEquals(12, sut.localId)
+
+ //3 digit local id
+ sut.remoteId = "123ocjycgrudn78"
+ assertEquals(123, sut.localId)
+
+ //4 digit local id
+ sut.remoteId = "1234ocjycgrudn78"
+ assertEquals(1234, sut.localId)
+
+ //5 digit local id
+ sut.remoteId = "12345ocjycgrudn78"
+ assertEquals(12345, sut.localId)
+
+ //6 digit local id
+ sut.remoteId = "123456ocjycgrudn78"
+ assertEquals(123456, sut.localId)
+
+ //7 digit local id
+ sut.remoteId = "1234567ocjycgrudn78"
+ assertEquals(1234567, sut.localId)
+
+ //8 digit local id
+ sut.remoteId = "12345678ocjycgrudn78"
+ assertEquals(12345678, sut.localId)
+
+ //9 digit local id
+ sut.remoteId = "123456789ocjycgrudn78"
+ assertEquals(123456789, sut.localId)
+
+ //10 digit local id
+ sut.remoteId = "1234567890ocjycgrudn78"
+ assertEquals(1234567890, sut.localId)
+
+ //11 digit local id
+ sut.remoteId = "12345678901ocjycgrudn78"
+ assertEquals(12345678901, sut.localId)
+
+ //12 digit local id
+ sut.remoteId = "123456789012ocjycgrudn78"
+ assertEquals(123456789012, sut.localId)
+
+ //13 digit local id
+ sut.remoteId = "1234567890123ocjycgrudn78"
+ assertEquals(1234567890123, sut.localId)
+
+ //14 digit local id
+ sut.remoteId = "12345678901234ocjycgrudn78"
+ assertEquals(12345678901234, sut.localId)
+
+ //20 digit local id
+ sut.remoteId = "1234567890123456233ocjycgrudn78"
+ assertEquals(1234567890123456233L, sut.localId)
+ }
+}
\ No newline at end of file
diff --git a/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt b/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt
index 939e1a3d73f5..aedbd280cdf9 100644
--- a/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt
+++ b/app/src/test/java/com/owncloud/android/datamodel/OCFileTest.kt
@@ -48,7 +48,7 @@ class OCFileTest {
// this will fail as fileId is too large
sut.remoteId = "1234567891011ocjycgrudn78"
- assertNotEquals(1234567891011L, sut.localId)
+ assertEquals(1234567891011L, sut.localId)
sut.localId = 1234567891011L
assertEquals(1234567891011L, sut.localId)