diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index 1fbeb1cc..6e6500a1 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -30,9 +30,9 @@ ext { javaxAnnotationVersion = '1.0' // support lib - androidSupportAnnotationsVersion = '1.2.0' - androidSupportAppcompatVersion = '1.3.1' - androidSupportDesignVersion = '1.4.0' + androidSupportAnnotationsVersion = '1.3.0' + androidSupportAppcompatVersion = '1.4.1' + androidMaterialDesignVersion = '1.6.0' coreDesugaringVersion = '1.1.5' @@ -102,15 +102,16 @@ ext { uiautomatorVersion = '2.2.0' androidxTestJunitKtlnVersion = '1.1.3' - androidxCoreVersion = '1.6.0' - androidxFragmentVersion = '1.3.6' + androidxCoreVersion = '1.7.0' + androidxFragmentVersion = '1.4.1' androidxViewpagerVersion = '1.0.0' androidxSwiperefreshVersion = '1.1.0' - androidxPreferenceVersion = '1.1.1' + androidxPreferenceVersion = '1.2.0' androidxRecyclerViewVersion = '1.2.1' androidxDocumentfileVersion = '1.0.1' androidxBiometricVersion = '1.1.0' androidxTestCoreVersion = '1.4.0' + androidxSplashscreenVersion = '1.0.0-rc01' jsonWebTokenApiVersion = '0.11.5' @@ -126,13 +127,14 @@ ext { androidxPreference : "androidx.preference:preference:${androidxPreferenceVersion}", documentFile : "androidx.documentfile:documentfile:${androidxDocumentfileVersion}", recyclerView : "androidx.recyclerview:recyclerview:${androidxRecyclerViewVersion}", + androidxSplashscreen : "androidx.core:core-splashscreen:${androidxSplashscreenVersion}", androidxTestCore : "androidx.test:core:${androidxTestCoreVersion}", androidxTestJunitKtln : "androidx.test.ext:junit-ktx:${androidxTestJunitKtlnVersion}", commonsCodec : "commons-codec:commons-codec:${commonsCodecVersion}", cryptolib : "org.cryptomator:cryptolib:${cryptolibVersion}", dagger : "com.google.dagger:dagger:${daggerVersion}", daggerCompiler : "com.google.dagger:dagger-compiler:${daggerVersion}", - design : "com.google.android.material:material:${androidSupportDesignVersion}", + design : "com.google.android.material:material:${androidMaterialDesignVersion}", coreDesugaring : "com.android.tools:desugar_jdk_libs:${coreDesugaringVersion}", dropbox : "com.dropbox.core:dropbox-core-sdk:${dropboxVersion}", espresso : "androidx.test.espresso:espresso-core:${espressoVersion}", diff --git a/data/build.gradle b/data/build.gradle index cd56b4ef..0e62cde7 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -53,19 +53,27 @@ android { fdroid { dimension "version" } + + lite { + dimension "version" + } } sourceSets { playstore { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/'] + java.srcDirs = ['src/main/java/', 'src/apiKey/java/', 'src/apkStorePlaystore/java/'] } apkstore { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/'] + java.srcDirs = ['src/main/java/', 'src/apiKey/java/', 'src/apkStorePlaystore/java/'] } fdroid { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/'] + java.srcDirs = ['src/main/java/', 'src/apiKey/java/', 'src/fdroid/java/'] + } + + lite { + java.srcDirs = ['src/main/java/', 'src/lite/java/'] } } packagingOptions { @@ -95,7 +103,9 @@ dependencies { implementation project(':domain') implementation project(':util') - implementation project(':pcloud-sdk-java') + playstoreImplementation project(':pcloud-sdk-java') + apkstoreImplementation project(':pcloud-sdk-java') + fdroidImplementation project(':pcloud-sdk-java') coreLibraryDesugaring dependencies.coreDesugaring @@ -113,9 +123,16 @@ dependencies { implementation dependencies.jsonWebTokenJson // cloud - implementation dependencies.dropbox - implementation dependencies.msgraphAuth - implementation dependencies.msgraph + playstoreImplementation dependencies.dropbox + apkstoreImplementation dependencies.dropbox + fdroidImplementation dependencies.dropbox + + playstoreImplementation dependencies.msgraphAuth + apkstoreImplementation dependencies.msgraphAuth + fdroidImplementation dependencies.msgraphAuth + playstoreImplementation dependencies.msgraph + apkstoreImplementation dependencies.msgraph + fdroidImplementation dependencies.msgraph implementation dependencies.stax api dependencies.minIo diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxClientFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepository.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepositoryFactory.java b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepositoryFactory.java similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepositoryFactory.java rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudContentRepositoryFactory.java diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudNodeFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudNodeFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxCloudNodeFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxCloudNodeFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxFile.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxFile.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxFile.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxFile.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxFolder.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxImpl.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxNode.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxNode.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/DropboxNode.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/DropboxNode.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/dropbox/RootDropboxFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/RootDropboxFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/dropbox/RootDropboxFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/dropbox/RootDropboxFolder.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveClientFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepository.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudContentRepositoryFactory.java diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveCloudNodeFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveFile.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveFile.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveFile.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveFile.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveFolder.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCache.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCache.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCache.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCache.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCloudNode.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCloudNode.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCloudNode.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveIdCloudNode.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveImpl.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveNode.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveNode.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/OnedriveNode.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/OnedriveNode.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/onedrive/RootOnedriveFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/RootOnedriveFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/onedrive/RootOnedriveFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/onedrive/RootOnedriveFolder.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudApiError.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudClientFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepository.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepositoryFactory.java b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepositoryFactory.java similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepositoryFactory.java rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudContentRepositoryFactory.java diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudFile.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudFile.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudFile.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudFile.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudFolder.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudImpl.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudNode.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudNode.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudNode.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudNode.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudNodeFactory.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudNodeFactory.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/PCloudNodeFactory.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/PCloudNodeFactory.kt diff --git a/data/src/main/java/org/cryptomator/data/cloud/pcloud/RootPCloudFolder.kt b/data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/RootPCloudFolder.kt similarity index 100% rename from data/src/main/java/org/cryptomator/data/cloud/pcloud/RootPCloudFolder.kt rename to data/src/apiKey/java/org/cryptomator/data/cloud/pcloud/RootPCloudFolder.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java index 918d4dfb..4e7a7284 100644 --- a/data/src/notFoss/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java +++ b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java @@ -1,5 +1,7 @@ package org.cryptomator.data.cloud; +import static java.util.Arrays.asList; + import org.cryptomator.data.cloud.crypto.CryptoCloudContentRepositoryFactory; import org.cryptomator.data.cloud.dropbox.DropboxCloudContentRepositoryFactory; import org.cryptomator.data.cloud.googledrive.GoogleDriveCloudContentRepositoryFactory; @@ -16,8 +18,6 @@ import java.util.Iterator; import javax.inject.Inject; import javax.inject.Singleton; -import static java.util.Arrays.asList; - @Singleton public class CloudContentRepositoryFactories implements Iterable { diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/FixedGoogleAccountCredential.java b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/FixedGoogleAccountCredential.java similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/FixedGoogleAccountCredential.java rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/FixedGoogleAccountCredential.java diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveClientFactory.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepository.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepositoryFactory.java b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepositoryFactory.java similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepositoryFactory.java rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudContentRepositoryFactory.java diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveCloudNodeFactory.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFile.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFile.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFile.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFile.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFolder.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFolder.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFolder.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveFolder.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCache.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCache.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCache.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCache.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCloudNode.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCloudNode.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCloudNode.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveIdCloudNode.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveImpl.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveNode.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveNode.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/GoogleDriveNode.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/GoogleDriveNode.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/RootGoogleDriveFolder.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/RootGoogleDriveFolder.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/RootGoogleDriveFolder.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/RootGoogleDriveFolder.kt diff --git a/data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/TransferredBytesAwareGoogleContentInputStream.kt b/data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/TransferredBytesAwareGoogleContentInputStream.kt similarity index 100% rename from data/src/notFoss/java/org/cryptomator/data/cloud/googledrive/TransferredBytesAwareGoogleContentInputStream.kt rename to data/src/apkStorePlaystore/java/org/cryptomator/data/cloud/googledrive/TransferredBytesAwareGoogleContentInputStream.kt diff --git a/data/src/foss/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java b/data/src/fdroid/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java similarity index 100% rename from data/src/foss/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java rename to data/src/fdroid/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java diff --git a/data/src/lite/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java b/data/src/lite/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java new file mode 100644 index 00000000..748dea6e --- /dev/null +++ b/data/src/lite/java/org/cryptomator/data/cloud/CloudContentRepositoryFactories.java @@ -0,0 +1,40 @@ +package org.cryptomator.data.cloud; + +import static java.util.Arrays.asList; + +import org.cryptomator.data.cloud.crypto.CryptoCloudContentRepositoryFactory; +import org.cryptomator.data.cloud.local.LocalStorageContentRepositoryFactory; +import org.cryptomator.data.cloud.s3.S3CloudContentRepositoryFactory; +import org.cryptomator.data.cloud.webdav.WebDavCloudContentRepositoryFactory; +import org.cryptomator.data.repository.CloudContentRepositoryFactory; +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; + +import javax.inject.Inject; +import javax.inject.Singleton; + +@Singleton +public class CloudContentRepositoryFactories implements Iterable { + + private final Iterable factories; + + @Inject + public CloudContentRepositoryFactories( + S3CloudContentRepositoryFactory s3Factory, // + CryptoCloudContentRepositoryFactory cryptoFactory, // + LocalStorageContentRepositoryFactory localStorageFactory, // + WebDavCloudContentRepositoryFactory webDavFactory) { + + factories = asList(s3Factory, // + cryptoFactory, // + localStorageFactory, // + webDavFactory); + } + + @NotNull + @Override + public Iterator iterator() { + return factories.iterator(); + } +} diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 5de64d26..59c24d89 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -29,6 +29,7 @@ platform :android do |options| deployToPlaystore(alpha:options[:alpha], beta:options[:beta]) deployToServer(alpha:options[:alpha], beta:options[:beta]) deployToFDroid(alpha:options[:alpha], beta:options[:beta]) + testLite(alpha:options[:alpha], beta:options[:beta]) createGitHubDraftRelease(alpha:options[:alpha], beta:options[:beta]) slack( @@ -220,6 +221,29 @@ platform :android do |options| FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") end + desc "Deploy new lite version" + lane :deployLite do |options| + gradle(task: "clean") + + gradle( + task: "assemble", + build_type: "Release", + flavor: "lite", + print_command: false, + properties: { + "android.injected.signing.store.file" => ENV["SIGNING_KEYSTORE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], + "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], + } + ) + + checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'lite') + checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'lite') + + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_lite_signed.apk") + end + desc "Check if tracking added in some dependency using Izzy's script" lane :checkTrackingAddedInDependencyUsingIzzyScript do |options| flavor = options[:flavor] @@ -289,8 +313,9 @@ platform :android do |options| website_apk_sha256 = Digest::SHA256.hexdigest File.read "release/Cryptomator-#{version}_signed.apk" fdroid_apk_sha256 = Digest::SHA256.hexdigest File.read "release/Cryptomator-#{version}_fdroid_signed.apk" + lite_sha256 = Digest::SHA256.hexdigest File.read "release/Cryptomator-#{version}_lite_signed.apk" - release_note = "## What's New\n\n" + File.read(release_note_path_en) + "\n\n---\n\nSHA256 Signature: `#{website_apk_sha256}`\nSHA256 Signature fdroid: `#{fdroid_apk_sha256}`\n" + release_note = "## What's New\n\n" + File.read(release_note_path_en) + "\n\n---\n\nSHA256 Signature: `#{website_apk_sha256}`\nSHA256 Signature fdroid: `#{fdroid_apk_sha256}`\nSHA256 Signature lite: `#{lite_sha256}`\n" puts release_note @@ -303,7 +328,7 @@ platform :android do |options| commitish: target_branch, is_draft: true, is_prerelease: prerelease, - upload_assets: ["fastlane/release/Cryptomator-#{version}_fdroid_signed.apk", "fastlane/release/Cryptomator-#{version}_signed.apk"] + upload_assets: ["fastlane/release/Cryptomator-#{version}_fdroid_signed.apk", "fastlane/release/Cryptomator-#{version}_lite_signed.apk", "fastlane/release/Cryptomator-#{version}_signed.apk"] ) end @@ -362,5 +387,23 @@ platform :android do |options| checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'fdroid') checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'fdroid') + + gradle(task: "clean") + + gradle( + task: "assemble", + build_type: "Release", + flavor: "lite", + print_command: false, + properties: { + "android.injected.signing.store.file" => ENV["SIGNING_KEYSTORE_PATH"], + "android.injected.signing.store.password" => ENV["SIGNING_KEYSTORE_PASSWORD"], + "android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"], + "android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"], + } + ) + + checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'lite') + checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'lite') end end diff --git a/fastlane/README.md b/fastlane/README.md index 08ca5371..72aaa68b 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -55,6 +55,14 @@ Deploy new version to server Deploy new version to F-Droid +### android deployLite + +```sh +[bundle exec] fastlane android deployLite +``` + +Deploy new lite version + ### android checkTrackingAddedInDependencyUsingIzzyScript ```sh diff --git a/fastlane/izzyscript/result_apkstore.json b/fastlane/izzyscript/result_apkstore.json index aa1e5e29..df5873bc 100644 --- a/fastlane/izzyscript/result_apkstore.json +++ b/fastlane/izzyscript/result_apkstore.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Google Mobile Services (/com/google/android/gms): NonFreeDep
  • \n
  • Google API Client Libraries (/com/google/api/client): NonFreeNet
  • \n
  • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
  • \n
  • Google Java API Client Services (/com/google/api/services): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n8 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Mobile Services/com/google/android/gmsDevelopment FrameworkProprietaryNonFreeDep
Google Material Design/com/google/android/materialUtilityApache-2.0
Google API Client Libraries/com/google/api/clientDevelopment FrameworkApache-2.0NonFreeNet
Google Drive API/com/google/api/services/driveUtilityApache-2.0NonFreeDep,NonFreeNet
Google Java API Client Services/com/google/api/servicesUtilityApache-2.0NonFreeNet
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Apache Http/org/apache/httpUtilityApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep","url":"https://developers.google.com/android/reference/com/google/android/gms/package-summary","license":"Proprietary"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client","license":"Apache-2.0"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services/tree/main/clients/google-api-services-drive","license":"Apache-2.0"},{"id":"/com/google/api/services","name":"Google Java API Client Services","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":"","url":"https://hc.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2918 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 48677 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 90 libraries, 8 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Google Mobile Services (/com/google/android/gms): NonFreeDep
  • \n
  • Google API Client Libraries (/com/google/api/client): NonFreeNet
  • \n
  • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
  • \n
  • Google Java API Client Services (/com/google/api/services): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n8 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
AndroidX Test/androidx/testDevelopment FrameworkApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Mobile Services/com/google/android/gmsDevelopment FrameworkProprietaryNonFreeDep
Google Material Design/com/google/android/materialUtilityApache-2.0
Google API Client Libraries/com/google/api/clientDevelopment FrameworkApache-2.0NonFreeNet
Google Drive API/com/google/api/services/driveUtilityApache-2.0NonFreeDep,NonFreeNet
Google Java API Client Services/com/google/api/servicesUtilityApache-2.0NonFreeNet
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Junit/junitUtilityEPL-1.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Apache Http/org/apache/httpUtilityApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
Java Hamcrest/org/hamcrestUtilityBSD-3-Clause
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
jUnit Java Unit Test/org/junitUtilityEPL-2.0
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/test","name":"AndroidX Test","typ":"Development Framework","anti":"","url":"https://github.com/android/android-test","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep","url":"https://developers.google.com/android/reference/com/google/android/gms/package-summary","license":"Proprietary"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client","license":"Apache-2.0"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services/tree/main/clients/google-api-services-drive","license":"Apache-2.0"},{"id":"/com/google/api/services","name":"Google Java API Client Services","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/junit","name":"Junit","typ":"Utility","anti":"","url":"https://junit.org/junit4/","license":"EPL-1.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":"","url":"https://hc.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/hamcrest","name":"Java Hamcrest","typ":"Utility","anti":"","url":"https://github.com/hamcrest/JavaHamcrest","license":"BSD-3-Clause"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/junit","name":"jUnit Java Unit Test","typ":"Utility","anti":"","url":"http://junit.org/","license":"EPL-2.0"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2938 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 50794 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 94 libraries, 8 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/fastlane/izzyscript/result_fdroid.json b/fastlane/izzyscript/result_fdroid.json index 590d888c..29942e79 100644 --- a/fastlane/izzyscript/result_fdroid.json +++ b/fastlane/izzyscript/result_fdroid.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n4 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Material Design/com/google/android/materialUtilityApache-2.0
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2918 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 43741 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 85 libraries, 4 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n4 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
AndroidX Test/androidx/testDevelopment FrameworkApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Material Design/com/google/android/materialUtilityApache-2.0
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Junit/junitUtilityEPL-1.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
Java Hamcrest/org/hamcrestUtilityBSD-3-Clause
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
jUnit Java Unit Test/org/junitUtilityEPL-2.0
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/test","name":"AndroidX Test","typ":"Development Framework","anti":"","url":"https://github.com/android/android-test","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/junit","name":"Junit","typ":"Utility","anti":"","url":"https://junit.org/junit4/","license":"EPL-1.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/hamcrest","name":"Java Hamcrest","typ":"Utility","anti":"","url":"https://github.com/hamcrest/JavaHamcrest","license":"BSD-3-Clause"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/junit","name":"jUnit Java Unit Test","typ":"Utility","anti":"","url":"http://junit.org/","license":"EPL-2.0"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2938 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 45815 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 89 libraries, 4 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/fastlane/izzyscript/result_lite.json b/fastlane/izzyscript/result_lite.json new file mode 100644 index 00000000..87e58736 --- /dev/null +++ b/fastlane/izzyscript/result_lite.json @@ -0,0 +1 @@ +{"applicationId":"org.cryptomator","emoji":[],"labels":[],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\n
  • Library definitions checked against: 2938
  • Libraries matched in this APK: 72
\nNo offending libs found. Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
AndroidX Test/androidx/testDevelopment FrameworkApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Material Design/com/google/android/materialUtilityApache-2.0
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Junit/junitUtilityEPL-1.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
Java Hamcrest/org/hamcrestUtilityBSD-3-Clause
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
jUnit Java Unit Test/org/junitUtilityEPL-2.0
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/test","name":"AndroidX Test","typ":"Development Framework","anti":"","url":"https://github.com/android/android-test","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/junit","name":"Junit","typ":"Utility","anti":"","url":"https://junit.org/junit4/","license":"EPL-1.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/hamcrest","name":"Java Hamcrest","typ":"Utility","anti":"","url":"https://github.com/hamcrest/JavaHamcrest","license":"BSD-3-Clause"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/junit","name":"jUnit Java Unit Test","typ":"Utility","anti":"","url":"http://junit.org/","license":"EPL-2.0"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2938 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 30115 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 72 libraries, 0 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/fastlane/izzyscript/result_playstore.json b/fastlane/izzyscript/result_playstore.json index aa1e5e29..df5873bc 100644 --- a/fastlane/izzyscript/result_playstore.json +++ b/fastlane/izzyscript/result_playstore.json @@ -1 +1 @@ -{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Google Mobile Services (/com/google/android/gms): NonFreeDep
  • \n
  • Google API Client Libraries (/com/google/api/client): NonFreeNet
  • \n
  • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
  • \n
  • Google Java API Client Services (/com/google/api/services): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n8 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Mobile Services/com/google/android/gmsDevelopment FrameworkProprietaryNonFreeDep
Google Material Design/com/google/android/materialUtilityApache-2.0
Google API Client Libraries/com/google/api/clientDevelopment FrameworkApache-2.0NonFreeNet
Google Drive API/com/google/api/services/driveUtilityApache-2.0NonFreeDep,NonFreeNet
Google Java API Client Services/com/google/api/servicesUtilityApache-2.0NonFreeNet
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Apache Http/org/apache/httpUtilityApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep","url":"https://developers.google.com/android/reference/com/google/android/gms/package-summary","license":"Proprietary"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client","license":"Apache-2.0"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services/tree/main/clients/google-api-services-drive","license":"Apache-2.0"},{"id":"/com/google/api/services","name":"Google Java API Client Services","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":"","url":"https://hc.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2918 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 48677 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 90 libraries, 8 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n
    \n
  • Azure SDK for Java (/com/azure): NonFreeNet
  • \n
  • Dropbox Core SDK for Java (/com/dropbox/core): NonFreeNet
  • \n
  • Google Mobile Services (/com/google/android/gms): NonFreeDep
  • \n
  • Google API Client Libraries (/com/google/api/client): NonFreeNet
  • \n
  • Google Drive API (/com/google/api/services/drive): NonFreeDep,NonFreeNet
  • \n
  • Google Java API Client Services (/com/google/api/services): NonFreeNet
  • \n
  • Microsoft Authentication Library (/com/microsoft/identity): NonFreeNet
  • \n
  • pCloud Java SDK (/com/pcloud/sdk): NonFreeNet
  • \n
\n8 offender(s). Full report available here.\n
Full list of libraries detected:\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
LibraryIdTypeLicenseAntiFeatures
Android Support v4/android/support/v4Development FrameworkApache-2.0
AndroidX Activity/androidx/activityUtilityApache-2.0
Android Jetpack Annotations/androidx/annotationUtilityApache-2.0
Arch/androidx/archUtilityApache-2.0
AppCompat/androidx/appcompatUtilityApache-2.0
Asynclayoutinflater/androidx/asynclayoutinflaterUI ComponentApache-2.0
Biometric/androidx/biometricUtilityApache-2.0
Browser/androidx/browserUtilityApache-2.0
Cardview/androidx/cardviewUI ComponentApache-2.0
Android Support Library collections/androidx/collectionUtilityApache-2.0
Constraint Layout Library/androidx/constraintlayoutUtilityApache-2.0
Coordinatorlayout/androidx/coordinatorlayoutUI ComponentApache-2.0
Androidx Core/androidx/coreUtilityApache-2.0
AndroidX Cursor Adapter/androidx/cursoradapterUtilityApache-2.0
Android Support Library Custom View/androidx/customviewUI ComponentApache-2.0
Documentfile/androidx/documentfileUI ComponentApache-2.0
Drawerlayout/androidx/drawerlayoutUI ComponentApache-2.0
Dynamicanimation/androidx/dynamicanimationUI ComponentApache-2.0
Exifinterface/androidx/exifinterfaceUtilityApache-2.0
AndroidX Fragment/androidx/fragmentUI ComponentApache-2.0
Interpolator/androidx/interpolatorUI ComponentApache-2.0
androidx.legacy/androidx/legacyUtilityApache-2.0
Lifecycle/androidx/lifecycleUtilityApache-2.0
Loader/androidx/loaderUtilityApache-2.0
AndroidX Local Broadcast Manager/androidx/localbroadcastmanagerUtilityApache-2.0
Android Multi Dex Library/androidx/multidexUtilityApache-2.0
Preference/androidx/preferenceUtilityApache-2.0
Print/androidx/printUtilityApache-2.0
Recyclerview/androidx/recyclerviewUtilityApache-2.0
Android Activity Saved State/androidx/savedstateUtilityApache-2.0
Slidingpanelayout/androidx/slidingpanelayoutUI ComponentApache-2.0
Swiperefreshlayout/androidx/swiperefreshlayoutUI ComponentApache-2.0
AndroidX Test/androidx/testDevelopment FrameworkApache-2.0
Tracing/androidx/tracingUtilityApache-2.0
Transition/androidx/transitionUI ComponentApache-2.0
Vectordrawable/androidx/vectordrawableUI ComponentApache-2.0
Android Jetpack VersionedParcelable/androidx/versionedparcelableUtilityApache-2.0
Viewpager/androidx/viewpagerUI ComponentApache-2.0
AndroidX Widget ViewPager2/androidx/viewpager2UI ComponentApache-2.0
Azure SDK for Java/com/azureDevelopment FrameworkMITNonFreeNet
okhttp-digest/com/burgstaller/okhttpUtilityApache-2.0
Woodstox/com/ctc/wstxUtilityApache-2.0
Subsampling Scale Image View/com/davemorrissey/labs/subscaleviewUI ComponentApache-2.0
Dropbox Core SDK for Java/com/dropbox/coreUtilityMITNonFreeNet
FasterXML Jackson/com/fasterxml/jacksonUtilityApache-2.0
Google Mobile Services/com/google/android/gmsDevelopment FrameworkProprietaryNonFreeDep
Google Material Design/com/google/android/materialUtilityApache-2.0
Google API Client Libraries/com/google/api/clientDevelopment FrameworkApache-2.0NonFreeNet
Google Drive API/com/google/api/services/driveUtilityApache-2.0NonFreeDep,NonFreeNet
Google Java API Client Services/com/google/api/servicesUtilityApache-2.0NonFreeNet
Google Core Libraries for Java 6+/com/google/commonUtilityApache-2.0
Error Prone/com/google/errorproneUtilityApache-2.0
Google Gson/com/google/gsonUtilityApache-2.0
J2ObjC/com/google/j2objcUtilityApache-2.0
RxBinding/com/jakewharton/rxbindingUtilityApache-2.0
Microsoft Azure Active Directory Authentication Library/com/microsoft/aad/adalUtilityMIT
Surface Duo SDK/com/microsoft/device/dualscreenUtilityMIT
Microsoft Graph-SDK/com/microsoft/graphDevelopment FrameworkMIT
Microsoft Authentication Library/com/microsoft/identityUtilityMITNonFreeNet
Nimbus JOSE+JWT/com/nimbusds/joseUtilityApache-2.0
zxcvbn4j/com/nulabinc/zxcvbnUtilityMIT
pCloud Java SDK/com/pcloud/sdkUtilityApache-2.0NonFreeNet
RecyclerView-FastScroll/com/simplecityapps/recyclerview_fastscrollUI ComponentApache-2.0
OkHttp/com/squareup/okhttpUtilityApache-2.0
Disk LRU Cache/com/tomclaw/cacheUtilityMIT
HttpClient Android repackaged/cz/msebera/android/httpclientUtilityApache-2.0
Dagger/daggerUtilityApache-2.0
Java JWT/io/jsonwebtokenUtilityApache-2.0
MinIO Client SDK for Java/io/minioUtilityApache-2.0
Netty Project/io/nettyDevelopment FrameworkApache-2.0
RxJava/io/reactivexUtilityApache-2.0
JavaX Annotation API/javax/annotationUtilityBSD-3-Clause
JavaX Dependency Injection/javax/injectUtilityApache-2.0
Junit/junitUtilityEPL-1.0
Kotlin/kotlinUtilityApache-2.0
kotlinx.coroutines/kotlinx/coroutinesUtilityApache-2.0
JCIP Annotations/net/jcip/annotationsUtilityApache-2.0
OkHttp okio Framework/okioUtilityApache-2.0
Apache Commons/org/apache/commonsDevelopment FrameworkApache-2.0
Apache Http/org/apache/httpUtilityApache-2.0
Bouncy Castle/org/bouncycastleUtilityMIT
Checker Framework/org/checkerframeworkUtilityGPL-2.0-only
Stax2 API/org/codehaus/stax2UtilityBSD
greenDAO/org/greenrobot/greendaoUtilityApache-2.0
Java Hamcrest/org/hamcrestUtilityBSD-3-Clause
IntelliJ IDEA/org/intellijUtilityApache-2.0
JSON in Java/org/jsonUtilityMIT
jUnit Java Unit Test/org/junitUtilityEPL-2.0
Reactive Streams/org/reactivestreamsUtilityMIT
Simple/org/simpleframework/xmlUtilityLGPL-2.1-only
Simple Logging Facade for Java/org/slf4jUtilityMIT
snappy-java/org/xerial/snappyUtilityApache-2.0
Reactor Core/reactor/coreUtilityApache-2.0
Timber/timber/logUtilityApache-2.0

\n\n
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":"","url":"https://developer.android.com/reference/android/support/v4/app/package-summary.html","license":"Apache-2.0"},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/annotation","license":"Apache-2.0"},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/arch","license":"Apache-2.0"},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/appcompat","license":"Apache-2.0"},{"id":"/androidx/asynclayoutinflater","name":"Asynclayoutinflater","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/asynclayoutinflater","license":"Apache-2.0"},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/biometric","license":"Apache-2.0"},{"id":"/androidx/browser","name":"Browser","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/browser","license":"Apache-2.0"},{"id":"/androidx/cardview","name":"Cardview","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/cardview/","license":"Apache-2.0"},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":"","url":"https://github.com/androidx/constraintlayout","license":"Apache-2.0"},{"id":"/androidx/coordinatorlayout","name":"Coordinatorlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/coordinatorlayout","license":"Apache-2.0"},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/core","license":"Apache-2.0"},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":"","url":"https://developer.android.com/tools/extras/support-library.html","license":"Apache-2.0"},{"id":"/androidx/customview","name":"Android Support Library Custom View","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/customview/","license":"Apache-2.0"},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/documentfile","license":"Apache-2.0"},{"id":"/androidx/drawerlayout","name":"Drawerlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/drawerlayout","license":"Apache-2.0"},{"id":"/androidx/dynamicanimation","name":"Dynamicanimation","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/dynamicanimation","license":"Apache-2.0"},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/exifinterface","license":"Apache-2.0"},{"id":"/androidx/fragment","name":"AndroidX Fragment","typ":"UI Component","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/fragment/","license":"Apache-2.0"},{"id":"/androidx/interpolator","name":"Interpolator","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/interpolator","license":"Apache-2.0"},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/legacy","license":"Apache-2.0"},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/lifecycle","license":"Apache-2.0"},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/loader","license":"Apache-2.0"},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":"","url":"https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-localbroadcastmanager-release/localbroadcastmanager/","license":"Apache-2.0"},{"id":"/androidx/multidex","name":"Android Multi Dex Library","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/multidex","license":"Apache-2.0"},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/preference","license":"Apache-2.0"},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/print","license":"Apache-2.0"},{"id":"/androidx/recyclerview","name":"Recyclerview","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/recyclerview","license":"Apache-2.0"},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx","license":"Apache-2.0"},{"id":"/androidx/slidingpanelayout","name":"Slidingpanelayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/slidingpanelayout","license":"Apache-2.0"},{"id":"/androidx/swiperefreshlayout","name":"Swiperefreshlayout","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout","license":"Apache-2.0"},{"id":"/androidx/test","name":"AndroidX Test","typ":"Development Framework","anti":"","url":"https://github.com/android/android-test","license":"Apache-2.0"},{"id":"/androidx/tracing","name":"Tracing","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/tracing","license":"Apache-2.0"},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/transition","license":"Apache-2.0"},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/vectordrawable","license":"Apache-2.0"},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/versionedparcelable","license":"Apache-2.0"},{"id":"/androidx/viewpager","name":"Viewpager","typ":"UI Component","anti":"","url":"https://developer.android.com/jetpack/androidx/releases/viewpager","license":"Apache-2.0"},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":"","url":"https://developer.android.com/reference/androidx/viewpager2/widget/ViewPager2","license":"Apache-2.0"},{"id":"/com/azure","name":"Azure SDK for Java","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/Azure/azure-sdk-for-java","license":"MIT"},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":"","url":"https://github.com/rburgst/okhttp-digest","license":"Apache-2.0"},{"id":"/com/ctc/wstx","name":"Woodstox","typ":"Utility","anti":"","url":"https://github.com/FasterXML/woodstox","license":"Apache-2.0"},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":"","url":"https://github.com/davemorrissey/subsampling-scale-image-view","license":"Apache-2.0"},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/dropbox/dropbox-sdk-java","license":"MIT"},{"id":"/com/fasterxml/jackson","name":"FasterXML Jackson","typ":"Utility","anti":"","url":"https://github.com/FasterXML/jackson-core","license":"Apache-2.0"},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep","url":"https://developers.google.com/android/reference/com/google/android/gms/package-summary","license":"Proprietary"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":"","url":"https://github.com/material-components/material-components-android","license":"Apache-2.0"},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client","license":"Apache-2.0"},{"id":"/com/google/api/services/drive","name":"Google Drive API","typ":"Utility","anti":"NonFreeDep,NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services/tree/main/clients/google-api-services-drive","license":"Apache-2.0"},{"id":"/com/google/api/services","name":"Google Java API Client Services","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/googleapis/google-api-java-client-services","license":"Apache-2.0"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":"","url":"https://github.com/google/guava","license":"Apache-2.0"},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":"","url":"https://github.com/google/error-prone","license":"Apache-2.0"},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":"","url":"https://github.com/google/gson","license":"Apache-2.0"},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":"","url":"https://github.com/google/j2objc","license":"Apache-2.0"},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/RxBinding","license":"Apache-2.0"},{"id":"/com/microsoft/aad/adal","name":"Microsoft Azure Active Directory Authentication Library","typ":"Utility","anti":"","url":"https://github.com/AzureAD/azure-activedirectory-library-for-android","license":"MIT"},{"id":"/com/microsoft/device/dualscreen","name":"Surface Duo SDK","typ":"Utility","anti":"","url":"https://github.com/microsoft/surface-duo-sdk","license":"MIT"},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":"","url":"https://github.com/microsoftgraph/msgraph-sdk-java","license":"MIT"},{"id":"/com/microsoft/identity","name":"Microsoft Authentication Library","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/AzureAD/microsoft-authentication-library-for-android","license":"MIT"},{"id":"/com/nimbusds/jose","name":"Nimbus JOSE+JWT","typ":"Utility","anti":"","url":"https://github.com/gesellix/Nimbus-JOSE-JWT","license":"Apache-2.0"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":"","url":"https://github.com/nulab/zxcvbn4j","license":"MIT"},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet","url":"https://github.com/pCloud/pcloud-sdk-java","license":"Apache-2.0"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":"","url":"https://github.com/timusus/RecyclerView-FastScroll","license":"Apache-2.0"},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":"","url":"https://github.com/square/okhttp","license":"Apache-2.0"},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":"","url":"https://github.com/solkin/disk-lru-cache","license":"MIT"},{"id":"/cz/msebera/android/httpclient","name":"HttpClient Android repackaged","typ":"Utility","anti":"","url":"https://github.com/smarek/httpclient-android","license":"Apache-2.0"},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":"","url":"https://github.com/google/dagger","license":"Apache-2.0"},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":"","url":"https://github.com/jwtk/jjwt","license":"Apache-2.0"},{"id":"/io/minio","name":"MinIO Client SDK for Java","typ":"Utility","anti":"","url":"https://github.com/minio/minio-java","license":"Apache-2.0"},{"id":"/io/netty","name":"Netty Project","typ":"Development Framework","anti":"","url":"https://github.com/netty/netty","license":"Apache-2.0"},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":"","url":"https://github.com/ReactiveX/RxJava","license":"Apache-2.0"},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":"","url":"https://github.com/amaembo/jsr-305/tree/master/ri","license":"BSD-3-Clause"},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":"","url":"https://docs.oracle.com/javaee/6/api/javax/inject/package-summary.html","license":"Apache-2.0"},{"id":"/junit","name":"Junit","typ":"Utility","anti":"","url":"https://junit.org/junit4/","license":"EPL-1.0"},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":"","url":"https://github.com/JetBrains/kotlin","license":"Apache-2.0"},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":"","url":"https://github.com/Kotlin/kotlinx.coroutines","license":"Apache-2.0"},{"id":"/net/jcip/annotations","name":"JCIP Annotations","typ":"Utility","anti":"","url":"https://github.com/stephenc/jcip-annotations","license":"Apache-2.0"},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":"","url":"https://github.com/square/okio","license":"Apache-2.0"},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":"","url":"https://commons.apache.org/","license":"Apache-2.0"},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":"","url":"https://hc.apache.org/","license":"Apache-2.0"},{"id":"/org/bouncycastle","name":"Bouncy Castle","typ":"Utility","anti":"","url":"http://www.bouncycastle.org/java.html","license":"MIT"},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":"","url":"https://checkerframework.org/","license":"GPL-2.0-only"},{"id":"/org/codehaus/stax2","name":"Stax2 API","typ":"Utility","anti":"","url":"https://github.com/FasterXML/stax2-api","license":"BSD"},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":"","url":"https://github.com/greenrobot/greenDAO","license":"Apache-2.0"},{"id":"/org/hamcrest","name":"Java Hamcrest","typ":"Utility","anti":"","url":"https://github.com/hamcrest/JavaHamcrest","license":"BSD-3-Clause"},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":"","url":"https://github.com/JetBrains/intellij-community","license":"Apache-2.0"},{"id":"/org/json","name":"JSON in Java","typ":"Utility","anti":"","url":"https://github.com/stleary/JSON-java","license":"MIT"},{"id":"/org/junit","name":"jUnit Java Unit Test","typ":"Utility","anti":"","url":"http://junit.org/","license":"EPL-2.0"},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":"","url":"http://www.reactive-streams.org/","license":"MIT"},{"id":"/org/simpleframework/xml","name":"Simple","typ":"Utility","anti":"","url":"https://sourceforge.net/projects/simple/","license":"LGPL-2.1-only"},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":"","url":"https://www.slf4j.org/","license":"MIT"},{"id":"/org/xerial/snappy","name":"snappy-java","typ":"Utility","anti":"","url":"https://github.com/xerial/snappy-java","license":"Apache-2.0"},{"id":"/reactor/core","name":"Reactor Core","typ":"Utility","anti":"","url":"https://github.com/reactor/reactor-core","license":"Apache-2.0"},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":"","url":"https://github.com/JakeWharton/timber","license":"Apache-2.0"}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2938 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 50794 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 94 libraries, 8 offenders.","Done analyzing 'unsigned/org.cryptomator_fdroid.apk'"],"self_url":"/artifacts/public/issuebot///iod-scan-apk.php.json"}} \ No newline at end of file diff --git a/presentation/build.gradle b/presentation/build.gradle index c3bef375..60b64a04 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -50,8 +50,6 @@ android { buildConfigField "String", "PCLOUD_CLIENT_ID", "\"" + getApiKey('PCLOUD_CLIENT_ID') + "\"" manifestPlaceholders = [DROPBOX_API_KEY: getApiKey('DROPBOX_API_KEY'), ONEDRIVE_API_KEY_DECODED: getOnedriveApiKey()] - - resValue "string", "app_id", androidApplicationId } debug { @@ -69,8 +67,6 @@ android { applicationIdSuffix ".debug" versionNameSuffix '-DEBUG' - - resValue "string", "app_id", androidApplicationId + applicationIdSuffix } } @@ -88,19 +84,30 @@ android { fdroid { dimension "version" } + + lite { + dimension "version" + + applicationIdSuffix ".lite" + resValue "string", "app_id", androidApplicationId + applicationIdSuffix + } } sourceSets { playstore { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/'] + java.srcDirs = ['src/main/java', 'src/apiKey/java/', 'src/apkStorePlaystore/java/'] } apkstore { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/notFoss/java', 'src/notFoss/java/'] + java.srcDirs = ['src/main/java/', 'src/apiKey/java/', 'src/apkStorePlaystore/java/'] } fdroid { - java.srcDirs = ['src/main/java', 'src/main/java/', 'src/foss/java', 'src/foss/java/'] + java.srcDirs = ['src/main/java/', 'src/apiKey/java/', 'src/fdroid/java/', 'src/fdroidAndLite/java/'] + } + + lite { + java.srcDirs = ['src/main/java/', 'src/lite/java/', 'src/fdroidAndLite/java/'] } } packagingOptions { @@ -142,14 +149,22 @@ dependencies { implementation dependencies.androidxCore implementation dependencies.androidxFragment implementation dependencies.androidxViewpager + implementation dependencies.androidxSplashscreen implementation dependencies.androidxSwiperefresh implementation dependencies.androidxPreference implementation dependencies.androidxBiometric // cloud - implementation dependencies.dropbox - implementation dependencies.msgraph - implementation dependencies.msgraphAuth + playstoreImplementation dependencies.dropbox + apkstoreImplementation dependencies.dropbox + fdroidImplementation dependencies.dropbox + + playstoreImplementation dependencies.msgraphAuth + apkstoreImplementation dependencies.msgraphAuth + fdroidImplementation dependencies.msgraphAuth + playstoreImplementation dependencies.msgraph + apkstoreImplementation dependencies.msgraph + fdroidImplementation dependencies.msgraph playstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' diff --git a/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt b/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt new file mode 100644 index 00000000..bb44e3af --- /dev/null +++ b/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt @@ -0,0 +1,17 @@ +package org.cryptomator.presentation.presenter + +import android.content.Context +import com.dropbox.core.android.Auth +import org.cryptomator.presentation.BuildConfig + +object DropboxAuthHelper { + + fun startOAuth2Authentication(context: Context) { + Auth.startOAuth2Authentication(context, BuildConfig.DROPBOX_API_KEY) + } + + fun getOAuth2Token(): String? { + return Auth.getOAuth2Token() + } + +} diff --git a/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt b/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt new file mode 100644 index 00000000..102af8ec --- /dev/null +++ b/presentation/src/apiKey/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt @@ -0,0 +1,139 @@ +package org.cryptomator.presentation.presenter + +import android.app.Activity +import android.content.Context +import com.microsoft.identity.client.AuthenticationCallback +import com.microsoft.identity.client.IAccount +import com.microsoft.identity.client.IAuthenticationResult +import com.microsoft.identity.client.IMultipleAccountPublicClientApplication +import com.microsoft.identity.client.IPublicClientApplication +import com.microsoft.identity.client.PublicClientApplication +import com.microsoft.identity.client.exception.MsalException +import com.microsoft.identity.client.exception.MsalUiRequiredException +import org.cryptomator.domain.OnedriveCloud +import org.cryptomator.domain.exception.FatalBackendException +import org.cryptomator.presentation.R +import org.cryptomator.util.crypto.CredentialCryptor +import timber.log.Timber + +object OnedriveAuthentication { + + fun refreshOrCheckAuth(activity: Activity, cloud: OnedriveCloud, success: (cloud: OnedriveCloud) -> Unit, failed: (e: FatalBackendException) -> Unit) { + PublicClientApplication.createMultipleAccountPublicClientApplication( + activity.applicationContext, + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + if (accounts.isEmpty()) { + application.acquireToken(activity, AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback(activity.applicationContext, cloud, success, failed)) + } else { + accounts.find { account -> account.username == cloud.username() }?.let { + application.acquireTokenSilentAsync( + AuthenticateCloudPresenter.onedriveScopes(), + it, + "https://login.microsoftonline.com/common", + getAuthSilentCallback(activity, cloud, success, failed, application) + ) + } ?: application.acquireToken(activity, AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback(activity.applicationContext, cloud, success, failed)) + } + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + failed(FatalBackendException(e)) + } + }) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") + failed(FatalBackendException(e)) + } + }) + } + + private fun getAuthSilentCallback( + activity: Activity, + cloud: OnedriveCloud, + success: (cloud: OnedriveCloud) -> Unit, + failed: (e: FatalBackendException) -> Unit, + application: IMultipleAccountPublicClientApplication + ): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + onTokenObtained(activity.applicationContext, cloud, authenticationResult, success) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") + when (e) { + is MsalUiRequiredException -> { + /* Tokens expired or no session, retry with interactive */ + application.acquireToken(activity, AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback(activity.applicationContext, cloud, success, failed)) + } + else -> failed(FatalBackendException(e)) + } + } + + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } + } + } + + private fun onTokenObtained(context: Context, cloud: OnedriveCloud?, authenticationResult: IAuthenticationResult, success: (cloud: OnedriveCloud) -> Unit) { + Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") + val accessToken = CredentialCryptor.getInstance(context).encrypt(authenticationResult.accessToken) + val cloudBuilder = cloud?.let { OnedriveCloud.aCopyOf(it) } ?: OnedriveCloud.aOnedriveCloud() + val onedriveSkeleton = cloudBuilder.withAccessToken(accessToken).withUsername(authenticationResult.account.username).build() + success(onedriveSkeleton) + } + + fun getAuthenticatedOnedriveCloud(activity: Activity, success: (cloud: OnedriveCloud) -> Unit, failed: (e: FatalBackendException) -> Unit) { + PublicClientApplication.createMultipleAccountPublicClientApplication( + activity.applicationContext, + R.raw.auth_config_onedrive, + object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { + override fun onCreated(application: IMultipleAccountPublicClientApplication) { + application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { + override fun onTaskCompleted(accounts: List) { + application.acquireToken(activity, AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback(activity.applicationContext, null, success, failed)) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") + failed(FatalBackendException(e)) + } + }) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") + failed(FatalBackendException(e)) + } + }) + } + + private fun getAuthInteractiveCallback(context: Context, cloud: OnedriveCloud?, success: (cloud: OnedriveCloud) -> Unit, failed: (e: FatalBackendException) -> Unit): AuthenticationCallback { + return object : AuthenticationCallback { + + override fun onSuccess(authenticationResult: IAuthenticationResult) { + onTokenObtained(context, cloud, authenticationResult, success) + } + + override fun onError(e: MsalException) { + Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") + failed(FatalBackendException(e)) + } + + override fun onCancel() { + Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") + } + } + } +} + + diff --git a/presentation/src/apkStorePlaystore/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt b/presentation/src/apkStorePlaystore/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt new file mode 100644 index 00000000..f85cade2 --- /dev/null +++ b/presentation/src/apkStorePlaystore/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt @@ -0,0 +1,13 @@ +package org.cryptomator.presentation.presenter + +import android.content.Context +import android.content.Intent +import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential +import com.google.api.services.drive.DriveScopes + +object GoogleAuthHelper { + + fun getChooseAccountIntent(context: Context): Intent? { + return GoogleAccountCredential.usingOAuth2(context, setOf(DriveScopes.DRIVE)).newChooseAccountIntent() + } +} diff --git a/presentation/src/apkstore/AndroidManifest.xml b/presentation/src/apkstore/AndroidManifest.xml index f0b9b94c..2bf4fbf5 100644 --- a/presentation/src/apkstore/AndroidManifest.xml +++ b/presentation/src/apkstore/AndroidManifest.xml @@ -5,4 +5,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml index 4a0eb132..7353dbd1 100644 --- a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml +++ b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml b/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml deleted file mode 100644 index 4a0eb132..00000000 --- a/presentation/src/debug/res/mipmap-anydpi-v26/ic_launcher_round.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 06ba5001..00000000 Binary files a/presentation/src/debug/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index b31fd740..00000000 Binary files a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png deleted file mode 100644 index 59b67a34..00000000 Binary files a/presentation/src/debug/res/mipmap-hdpi/ic_launcher_round.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index b6c41cd4..00000000 Binary files a/presentation/src/debug/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 6f85a129..00000000 Binary files a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png deleted file mode 100644 index 18359374..00000000 Binary files a/presentation/src/debug/res/mipmap-mdpi/ic_launcher_round.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 8f7d27c2..00000000 Binary files a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index ea9a5fc9..00000000 Binary files a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png deleted file mode 100644 index 3b928c52..00000000 Binary files a/presentation/src/debug/res/mipmap-xhdpi/ic_launcher_round.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 8db4eec8..00000000 Binary files a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index bd6bc45d..00000000 Binary files a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png deleted file mode 100644 index cdb10637..00000000 Binary files a/presentation/src/debug/res/mipmap-xxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher.png b/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index d3404092..00000000 Binary files a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 2403cf92..00000000 Binary files a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png b/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png deleted file mode 100644 index aaaeac56..00000000 Binary files a/presentation/src/debug/res/mipmap-xxxhdpi/ic_launcher_round.png and /dev/null differ diff --git a/presentation/src/debug/res/values/ic_launcher_background.xml b/presentation/src/debug/res/values/ic_launcher_background.xml index 23e58742..e50a17c8 100644 --- a/presentation/src/debug/res/values/ic_launcher_background.xml +++ b/presentation/src/debug/res/values/ic_launcher_background.xml @@ -1,4 +1,4 @@ - #F1C40F - + #F1C40F + \ No newline at end of file diff --git a/presentation/src/fdroid/AndroidManifest.xml b/presentation/src/fdroid/AndroidManifest.xml new file mode 100644 index 00000000..2bf4fbf5 --- /dev/null +++ b/presentation/src/fdroid/AndroidManifest.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/fdroidAndLite/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt b/presentation/src/fdroidAndLite/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt new file mode 100644 index 00000000..622fa4db --- /dev/null +++ b/presentation/src/fdroidAndLite/java/org/cryptomator/presentation/presenter/GoogleAuthHelper.kt @@ -0,0 +1,11 @@ +package org.cryptomator.presentation.presenter + +import android.content.Context +import android.content.Intent + +object GoogleAuthHelper { + + fun getChooseAccountIntent(context: Context): Intent? { + return null + } +} diff --git a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt deleted file mode 100644 index a7871af4..00000000 --- a/presentation/src/foss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ /dev/null @@ -1,610 +0,0 @@ -package org.cryptomator.presentation.presenter - -import android.accounts.AccountManager -import android.content.Intent -import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE -import android.provider.DocumentsContract -import android.widget.Toast -import com.dropbox.core.android.Auth -import com.microsoft.identity.client.AuthenticationCallback -import com.microsoft.identity.client.IAccount -import com.microsoft.identity.client.IAuthenticationResult -import com.microsoft.identity.client.IMultipleAccountPublicClientApplication -import com.microsoft.identity.client.IPublicClientApplication -import com.microsoft.identity.client.PublicClientApplication -import com.microsoft.identity.client.exception.MsalClientException -import com.microsoft.identity.client.exception.MsalException -import com.microsoft.identity.client.exception.MsalServiceException -import com.microsoft.identity.client.exception.MsalUiRequiredException -import org.cryptomator.data.util.X509CertificateHelper -import org.cryptomator.domain.Cloud -import org.cryptomator.domain.CloudType -import org.cryptomator.domain.DropboxCloud -import org.cryptomator.domain.GoogleDriveCloud -import org.cryptomator.domain.OnedriveCloud -import org.cryptomator.domain.PCloud -import org.cryptomator.domain.WebDavCloud -import org.cryptomator.domain.di.PerView -import org.cryptomator.domain.exception.FatalBackendException -import org.cryptomator.domain.exception.NetworkConnectionException -import org.cryptomator.domain.exception.authentication.AuthenticationException -import org.cryptomator.domain.exception.authentication.WebDavCertificateUntrustedAuthenticationException -import org.cryptomator.domain.exception.authentication.WebDavNotSupportedException -import org.cryptomator.domain.exception.authentication.WebDavServerNotFoundException -import org.cryptomator.domain.exception.authentication.WrongCredentialsException -import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase -import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase -import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase -import org.cryptomator.generator.Callback -import org.cryptomator.presentation.BuildConfig -import org.cryptomator.presentation.R -import org.cryptomator.presentation.exception.ExceptionHandlers -import org.cryptomator.presentation.exception.PermissionNotGrantedException -import org.cryptomator.presentation.intent.AuthenticateCloudIntent -import org.cryptomator.presentation.intent.Intents -import org.cryptomator.presentation.model.CloudModel -import org.cryptomator.presentation.model.CloudTypeModel -import org.cryptomator.presentation.model.LocalStorageModel -import org.cryptomator.presentation.model.ProgressModel -import org.cryptomator.presentation.model.ProgressStateModel -import org.cryptomator.presentation.model.S3CloudModel -import org.cryptomator.presentation.model.WebDavCloudModel -import org.cryptomator.presentation.model.mappers.CloudModelMapper -import org.cryptomator.presentation.ui.activity.view.AuthenticateCloudView -import org.cryptomator.presentation.workflow.ActivityResult -import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow -import org.cryptomator.presentation.workflow.CreateNewVaultWorkflow -import org.cryptomator.presentation.workflow.Workflow -import org.cryptomator.util.ExceptionUtil -import org.cryptomator.util.crypto.CredentialCryptor -import java.security.cert.CertificateEncodingException -import java.security.cert.CertificateException -import java.security.cert.X509Certificate -import javax.inject.Inject -import timber.log.Timber - -@PerView -class AuthenticateCloudPresenter @Inject constructor( // - exceptionHandlers: ExceptionHandlers, // - private val cloudModelMapper: CloudModelMapper, // - private val addOrChangeCloudConnectionUseCase: AddOrChangeCloudConnectionUseCase, // - private val getCloudsUseCase: GetCloudsUseCase, // - private val getUsernameUseCase: GetUsernameUseCase, // - private val addExistingVaultWorkflow: AddExistingVaultWorkflow, // - private val createNewVaultWorkflow: CreateNewVaultWorkflow -) : Presenter(exceptionHandlers) { - - private val strategies = arrayOf( // - DropboxAuthStrategy(), // - OnedriveAuthStrategy(), // - PCloudAuthStrategy(), // - WebDAVAuthStrategy(), // - S3AuthStrategy(), // - LocalStorageAuthStrategy() // - ) - - override fun workflows(): Iterable> { - return listOf(createNewVaultWorkflow, addExistingVaultWorkflow) - } - - override fun resumed() { - val cloud = view?.intent()?.cloud() - val error = view?.intent()?.error() - handleNetworkConnectionExceptionIfRequired(error) - view?.intent()?.let { cloud?.let { cloud -> authStrategyFor(cloud).resumed(it) } } - } - - private fun handleNetworkConnectionExceptionIfRequired(error: AuthenticationException?) { - if (error != null && ExceptionUtil.contains(error, NetworkConnectionException::class.java)) { - view?.showMessage(R.string.error_no_network_connection) - finish() - } - } - - private fun authStrategyFor(cloud: CloudModel): AuthStrategy { - strategies.forEach { strategy -> - if (strategy.supports(cloud)) { - return strategy - } - } - return FailingAuthStrategy() - } - - private fun getUsernameAndSuceedAuthentication(cloud: Cloud) { - getUsernameUseCase.withCloud(cloud).run(object : DefaultResultHandler() { - override fun onSuccess(username: String) { - succeedAuthenticationWith(updateUsernameOf(cloud, username)) - } - - override fun onError(e: Throwable) { - super.onError(e) - finish() - } - }) - } - - private fun updateUsernameOf(cloud: Cloud, username: String): Cloud { - when (cloud.type()) { - CloudType.DROPBOX -> return DropboxCloud.aCopyOf(cloud as DropboxCloud).withUsername(username).build() - CloudType.ONEDRIVE -> return OnedriveCloud.aCopyOf(cloud as OnedriveCloud).withUsername(username).build() - } - throw IllegalStateException("Cloud " + cloud.type() + " is not supported") - } - - private fun succeedAuthenticationWith(cloud: Cloud) { - addOrChangeCloudConnectionUseCase // - .withCloud(cloud) // - .run(object : DefaultResultHandler() { - override fun onSuccess(void: Void?) { - finishWithResult(cloudModelMapper.toModel(cloud)) - } - - override fun onError(e: Throwable) { - super.onError(e) - finish() - } - }) - } - - private fun failAuthentication(cloudName: Int) { - activity().runOnUiThread { - view?.showMessage(String.format(getString(R.string.screen_authenticate_auth_authentication_failed), getString(cloudName))) - } - finish() - } - - private fun failAuthentication(error: PermissionNotGrantedException) { - finishWithResult(error) - } - - private inner class DropboxAuthStrategy : AuthStrategy { - - private var authenticationStarted = false - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.DROPBOX - } - - override fun resumed(intent: AuthenticateCloudIntent) { - if (authenticationStarted) { - handleAuthenticationResult(intent.cloud()) - } else { - startAuthentication() - } - } - - private fun startAuthentication() { - showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION)) - authenticationStarted = true - Auth.startOAuth2Authentication(context(), BuildConfig.DROPBOX_API_KEY) - view?.skipTransition() - } - - private fun handleAuthenticationResult(cloudModel: CloudModel) { - val authToken = Auth.getOAuth2Token() - if (authToken == null) { - failAuthentication(cloudModel.name()) - } else { - getUsernameAndSuceedAuthentication( // - DropboxCloud.aCopyOf(cloudModel.toCloud() as DropboxCloud) // - .withAccessToken(encrypt(authToken)) // - .build() - ) - } - } - } - - @Callback(dispatchResultOkOnly = false) - fun onUserRecoveryFinished(result: ActivityResult, cloud: CloudModel) { - if (result.isResultOk) { - succeedAuthenticationWith(cloud.toCloud()) - } else { - failAuthentication(cloud.name()) - } - } - - @Callback(dispatchResultOkOnly = false) - fun onGoogleDriveAuthenticated(result: ActivityResult, cloud: CloudModel) { - if (result.isResultOk) { - val accountName = result.intent()?.extras?.getString(AccountManager.KEY_ACCOUNT_NAME) - succeedAuthenticationWith( - GoogleDriveCloud.aCopyOf(cloud.toCloud() as GoogleDriveCloud) // - .withUsername(accountName) // - .withAccessToken(accountName) // - .build() - ) - } else { - failAuthentication(cloud.name()) - } - } - - private inner class OnedriveAuthStrategy : AuthStrategy { - - private var authenticationStarted = false - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.ONEDRIVE - } - - override fun resumed(intent: AuthenticateCloudIntent) { - if (!authenticationStarted) { - startAuthentication(intent.cloud()) - } - } - - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - - Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show() - - PublicClientApplication.createMultipleAccountPublicClientApplication( - context(), - R.raw.auth_config_onedrive, - object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { - override fun onCreated(application: IMultipleAccountPublicClientApplication) { - application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { - override fun onTaskCompleted(accounts: List) { - if (accounts.isEmpty()) { - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } else { - accounts.find { account -> account.username == cloud.username() }?.let { - application.acquireTokenSilentAsync( - onedriveScopes(), - it, - "https://login.microsoftonline.com/common", - getAuthSilentCallback(cloud, application) - ) - } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") - failAuthentication(cloud.name()) - } - }) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") - failAuthentication(cloud.name()) - } - }) - } - - private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { - return object : AuthenticationCallback { - - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") - when (e) { - is MsalClientException -> { - /* Exception inside MSAL, more info inside MsalError.java */ - failAuthentication(cloud.name()) - } - is MsalServiceException -> { - /* Exception when communicating with the STS, likely config issue */ - failAuthentication(cloud.name()) - } - is MsalUiRequiredException -> { - /* Tokens expired or no session, retry with interactive */ - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } - } - } - - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") - } - } - } - - private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { - return object : AuthenticationCallback { - - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") - failAuthentication(cloud.name()) - } - - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") - } - } - } - - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .build() - ) - } - - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .withUsername(username) - .build() - ) - } - } - - private inner class PCloudAuthStrategy : AuthStrategy { - - private var authenticationStarted = false - - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.PCLOUD - } - - override fun resumed(intent: AuthenticateCloudIntent) { - if (authenticationStarted) { - finish() - } else { - startAuthentication(intent.cloud()) - Toast.makeText( - context(), - String.format(getString(R.string.error_authentication_failed_re_authenticate), intent.cloud().username()), - Toast.LENGTH_LONG - ).show() - } - } - - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION)) - view?.skipTransition() - requestActivityResult( - ActivityResultCallbacks.pCloudReAuthenticationFinished(cloud), // - Intents.cloudConnectionListIntent() // - .withCloudType(CloudTypeModel.PCLOUD) // - .withDialogTitle(context().getString(R.string.screen_update_pcloud_connections_title)) // - .withFinishOnCloudItemClick(false) // - ) - } - } - - @Callback - fun pCloudReAuthenticationFinished(activityResult: ActivityResult, cloud: CloudModel) { - val code = activityResult.intent().extras?.getString(CloudConnectionListPresenter.PCLOUD_OAUTH_AUTH_CODE, "") - val hostname = activityResult.intent().extras?.getString(CloudConnectionListPresenter.PCLOUD_HOSTNAME, "") - - if (!code.isNullOrEmpty() && !hostname.isNullOrEmpty()) { - Timber.tag("CloudConnectionListPresenter").i("PCloud OAuth code successfully retrieved") - - val accessToken = CredentialCryptor // - .getInstance(this.context()) // - .encrypt(code) - val pCloudSkeleton = PCloud.aPCloud() // - .withAccessToken(accessToken) - .withUrl(hostname) - .build(); - getUsernameUseCase // - .withCloud(pCloudSkeleton) // - .run(object : DefaultResultHandler() { - override fun onSuccess(username: String) { - Timber.tag("CloudConnectionListPresenter").i("PCloud Authentication successfully") - prepareForSavingPCloud(PCloud.aCopyOf(pCloudSkeleton).withUsername(username).build()) - } - }) - } else { - Timber.tag("CloudConnectionListPresenter").i("PCloud Authentication not successful") - failAuthentication(cloud.name()) - } - } - - fun prepareForSavingPCloud(cloud: PCloud) { - getCloudsUseCase // - .withCloudType(cloud.type()) // - .run(object : DefaultResultHandler>() { - override fun onSuccess(clouds: List) { - clouds.firstOrNull { - (it as PCloud).username() == cloud.username() - }?.let { - it as PCloud - succeedAuthenticationWith( - PCloud.aCopyOf(it) // - .withUrl(cloud.url()) - .withAccessToken(cloud.accessToken()) - .build() - ) - } ?: succeedAuthenticationWith(cloud) - } - }) - } - - private inner class WebDAVAuthStrategy : AuthStrategy { - - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.WEBDAV - } - - override fun resumed(intent: AuthenticateCloudIntent) { - handleWebDavAuthenticationExceptionIfRequired(intent.cloud() as WebDavCloudModel, intent.error()) - } - - private fun handleWebDavAuthenticationExceptionIfRequired(cloud: WebDavCloudModel, e: AuthenticationException) { - Timber.tag("AuthicateCloudPrester").e(e) - when { - ExceptionUtil.contains(e, WrongCredentialsException::class.java) -> { - failAuthentication(cloud.name()) - } - ExceptionUtil.contains(e, WebDavCertificateUntrustedAuthenticationException::class.java) -> { - handleCertificateUntrustedExceptionIfRequired(cloud, e) - } - ExceptionUtil.contains(e, WebDavServerNotFoundException::class.java) -> { - view?.showMessage(R.string.error_server_not_found) - finish() - } - ExceptionUtil.contains(e, WebDavNotSupportedException::class.java) -> { - view?.showMessage(R.string.screen_cloud_error_webdav_not_supported) - finish() - } - } - } - - private fun handleCertificateUntrustedExceptionIfRequired(cloud: WebDavCloudModel, e: AuthenticationException) { - val untrustedException = ExceptionUtil.extract(e, WebDavCertificateUntrustedAuthenticationException::class.java) - try { - val certificate = X509CertificateHelper.convertFromPem(untrustedException.get().certificate) - view?.showUntrustedCertificateDialog(cloud.toCloud() as WebDavCloud, certificate) - } catch (ex: CertificateException) { - Timber.tag("AuthicateCloudPrester").e(ex) - throw FatalBackendException(ex) - } - } - } - - fun onAcceptWebDavCertificateClicked(cloud: WebDavCloud, certificate: X509Certificate) { - try { - val webDavCloudWithAcceptedCert = WebDavCloud.aCopyOf(cloud) // - .withCertificate(X509CertificateHelper.convertToPem(certificate)) // - .build() - finishWithResultAndExtra( - cloudModelMapper.toModel(webDavCloudWithAcceptedCert), // - WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE, // - true - ) - } catch (e: CertificateEncodingException) { - Timber.tag("AuthicateCloudPrester").e(e) - throw FatalBackendException(e) - } - } - - fun onAcceptWebDavCertificateDenied() { - finish() - } - - private inner class S3AuthStrategy : AuthStrategy { - - private var authenticationStarted = false - - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.S3 - } - - override fun resumed(intent: AuthenticateCloudIntent) { - when { - ExceptionUtil.contains(intent.error(), WrongCredentialsException::class.java) -> { - if (!authenticationStarted) { - startAuthentication(intent.cloud()) - Toast.makeText( - context(), - String.format(getString(R.string.error_authentication_failed), intent.cloud().username()), - Toast.LENGTH_LONG - ).show() - } - } - else -> { - Timber.tag("AuthicateCloudPrester").e(intent.error()) - failAuthentication(intent.cloud().name()) - } - } - } - - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - startIntent(Intents.s3AddOrChangeIntent().withS3Cloud(cloud as S3CloudModel)) - } - } - - private inner class LocalStorageAuthStrategy : AuthStrategy { - - private var authenticationStarted = false - - override fun supports(cloud: CloudModel): Boolean { - return cloud.cloudType() == CloudTypeModel.LOCAL - } - - override fun resumed(intent: AuthenticateCloudIntent) { - if (!authenticationStarted) { - startAuthentication(intent.cloud()) - } - } - - private fun startAuthentication(cloud: CloudModel) { - authenticationStarted = true - - val uri = (cloud as LocalStorageModel).uri() - - val permissions = context().contentResolver.persistedUriPermissions - for (permission in permissions) { - if (permission.uri.toString() == uri) { - succeedAuthenticationWith(cloud.toCloud()) - } - } - - Timber.tag("AuthicateCloudPrester").e("Permission revoked, ask to re-pick location") - - Toast.makeText(context(), getString(R.string.permission_revoked_re_request_permission), Toast.LENGTH_LONG).show() - - val openDocumentTree = Intent(ACTION_OPEN_DOCUMENT_TREE).apply { - putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri) - } - - requestActivityResult(ActivityResultCallbacks.rePickedLocalStorageLocation(cloud), openDocumentTree) - } - } - - @Callback - fun rePickedLocalStorageLocation(result: ActivityResult, cloud: LocalStorageModel) { - val rootTreeUriOfLocalStorage = result.intent().data - rootTreeUriOfLocalStorage?.let { - context() // - .contentResolver // - .takePersistableUriPermission( // - it, // - Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION - ) - } - Timber.tag("AuthicateCloudPrester").e("Permission granted again") - succeedAuthenticationWith(cloud.toCloud()) - } - - private fun encrypt(password: String): String { - return CredentialCryptor // - .getInstance(context()) // - .encrypt(password) - } - - private inner class FailingAuthStrategy : AuthStrategy { - - override fun supports(cloud: CloudModel): Boolean { - return false - } - - override fun resumed(intent: AuthenticateCloudIntent) { - view?.showError(R.string.error_authentication_failed) - finish() - } - } - - private interface AuthStrategy { - - fun supports(cloud: CloudModel): Boolean - fun resumed(intent: AuthenticateCloudIntent) - } - - companion object { - - const val WEBDAV_ACCEPTED_UNTRUSTED_CERTIFICATE = "acceptedUntrustedCertificate" - - fun onedriveScopes(): Array { - return arrayOf("User.Read", "Files.ReadWrite") - } - } - - init { - unsubscribeOnDestroy(addOrChangeCloudConnectionUseCase, getCloudsUseCase, getUsernameUseCase) - } -} diff --git a/presentation/src/lite/AndroidManifest.xml b/presentation/src/lite/AndroidManifest.xml new file mode 100644 index 00000000..e341d057 --- /dev/null +++ b/presentation/src/lite/AndroidManifest.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + diff --git a/presentation/src/lite/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt b/presentation/src/lite/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt new file mode 100644 index 00000000..eb63ac60 --- /dev/null +++ b/presentation/src/lite/java/org/cryptomator/presentation/presenter/DropboxAuthHelper.kt @@ -0,0 +1,15 @@ +package org.cryptomator.presentation.presenter + +import android.content.Context + +object DropboxAuthHelper { + + fun startOAuth2Authentication(context: Context) { + // no-op + } + + fun getOAuth2Token(): String? { + return null + } + +} diff --git a/presentation/src/lite/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt b/presentation/src/lite/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt new file mode 100644 index 00000000..56b44f1f --- /dev/null +++ b/presentation/src/lite/java/org/cryptomator/presentation/presenter/OnedriveAuthentication.kt @@ -0,0 +1,18 @@ +package org.cryptomator.presentation.presenter + +import android.app.Activity +import org.cryptomator.domain.OnedriveCloud +import org.cryptomator.domain.exception.FatalBackendException + +object OnedriveAuthentication { + + fun getAuthenticatedOnedriveCloud(activity: Activity, success: (cloud: OnedriveCloud) -> Unit, failed: (e: FatalBackendException) -> Unit) { + // no-op + } + + fun refreshOrCheckAuth(activity: Activity, cloud: OnedriveCloud, success: (cloud: OnedriveCloud) -> Unit, failed: (e: FatalBackendException) -> Unit) { + // no-op + } +} + + diff --git a/presentation/src/lite/res/drawable/ic_launcher_foreground.xml b/presentation/src/lite/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..0607f651 --- /dev/null +++ b/presentation/src/lite/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,23 @@ + + + + + + + + diff --git a/presentation/src/lite/res/mipmap-anydpi-v26/ic_launcher.xml b/presentation/src/lite/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..7353dbd1 --- /dev/null +++ b/presentation/src/lite/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/lite/res/values/ic_launcher_background.xml b/presentation/src/lite/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..c5d5899f --- /dev/null +++ b/presentation/src/lite/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #FFFFFF + \ No newline at end of file diff --git a/presentation/src/liteDebug/res/mipmap-anydpi-v26/ic_launcher.xml b/presentation/src/liteDebug/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 00000000..7353dbd1 --- /dev/null +++ b/presentation/src/liteDebug/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/presentation/src/liteDebug/res/values/ic_launcher_background.xml b/presentation/src/liteDebug/res/values/ic_launcher_background.xml new file mode 100644 index 00000000..e50a17c8 --- /dev/null +++ b/presentation/src/liteDebug/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #F1C40F + \ No newline at end of file diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index 359fb2ec..bb00e7d5 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -36,20 +36,17 @@ android:required="false" /> + android:theme="@style/AppTheme.Starting" + android:windowSoftInputMode="adjustPan"> - + - - - - - - - - - - - - + @@ -188,22 +172,6 @@ - - - - - - - - - - - "fdroid" -> { "F-Droid Edition" } + "lite" -> { + "F-Droid Main Repo Edition" + } else -> "Google Play Edition" } Timber.tag("App").i( diff --git a/presentation/src/main/java/org/cryptomator/presentation/di/component/ActivityComponent.java b/presentation/src/main/java/org/cryptomator/presentation/di/component/ActivityComponent.java index 07aec966..a7665c28 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/di/component/ActivityComponent.java +++ b/presentation/src/main/java/org/cryptomator/presentation/di/component/ActivityComponent.java @@ -13,6 +13,7 @@ import org.cryptomator.presentation.ui.activity.ChooseCloudServiceActivity; import org.cryptomator.presentation.ui.activity.CloudConnectionListActivity; import org.cryptomator.presentation.ui.activity.CloudSettingsActivity; import org.cryptomator.presentation.ui.activity.CreateVaultActivity; +import org.cryptomator.presentation.ui.activity.CryptomatorVariantsActivity; import org.cryptomator.presentation.ui.activity.ImagePreviewActivity; import org.cryptomator.presentation.ui.activity.LicenseCheckActivity; import org.cryptomator.presentation.ui.activity.LicensesActivity; @@ -20,7 +21,6 @@ import org.cryptomator.presentation.ui.activity.S3AddOrChangeActivity; import org.cryptomator.presentation.ui.activity.SetPasswordActivity; import org.cryptomator.presentation.ui.activity.SettingsActivity; import org.cryptomator.presentation.ui.activity.SharedFilesActivity; -import org.cryptomator.presentation.ui.activity.SplashActivity; import org.cryptomator.presentation.ui.activity.TextEditorActivity; import org.cryptomator.presentation.ui.activity.UnlockVaultActivity; import org.cryptomator.presentation.ui.activity.VaultListActivity; @@ -50,8 +50,6 @@ public interface ActivityComponent { Activity activity(); - void inject(SplashActivity splashActivity); - void inject(VaultListActivity vaultListActivity); void inject(SetPasswordActivity setPasswordActivity); @@ -123,4 +121,7 @@ public interface ActivityComponent { void inject(S3AddOrChangeActivity s3AddOrChangeActivity); void inject(S3AddOrChangeFragment s3AddOrChangeFragment); + + void inject(CryptomatorVariantsActivity cryptomatorVariantsActivity); + } diff --git a/presentation/src/main/java/org/cryptomator/presentation/intent/AutoUploadChooseVaultIntent.java b/presentation/src/main/java/org/cryptomator/presentation/intent/AutoUploadChooseVaultIntent.java new file mode 100644 index 00000000..f5f79627 --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/intent/AutoUploadChooseVaultIntent.java @@ -0,0 +1,9 @@ +package org.cryptomator.presentation.intent; + +import org.cryptomator.generator.Intent; +import org.cryptomator.presentation.ui.activity.AutoUploadChooseVaultActivity; + +@Intent(AutoUploadChooseVaultActivity.class) +public interface AutoUploadChooseVaultIntent { + +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/intent/CryptomatorVariantsIntent.java b/presentation/src/main/java/org/cryptomator/presentation/intent/CryptomatorVariantsIntent.java new file mode 100644 index 00000000..87f8c284 --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/intent/CryptomatorVariantsIntent.java @@ -0,0 +1,9 @@ +package org.cryptomator.presentation.intent; + +import org.cryptomator.generator.Intent; +import org.cryptomator.presentation.ui.activity.CryptomatorVariantsActivity; + +@Intent(CryptomatorVariantsActivity.class) +public interface CryptomatorVariantsIntent { + +} diff --git a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt similarity index 78% rename from presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt rename to presentation/src/main/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt index f84f0af1..9b29202a 100644 --- a/presentation/src/notFoss/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/AuthenticateCloudPresenter.kt @@ -6,19 +6,6 @@ import android.content.Intent import android.content.Intent.ACTION_OPEN_DOCUMENT_TREE import android.provider.DocumentsContract import android.widget.Toast -import com.dropbox.core.android.Auth -import com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential -import com.google.api.services.drive.DriveScopes -import com.microsoft.identity.client.AuthenticationCallback -import com.microsoft.identity.client.IAccount -import com.microsoft.identity.client.IAuthenticationResult -import com.microsoft.identity.client.IMultipleAccountPublicClientApplication -import com.microsoft.identity.client.IPublicClientApplication -import com.microsoft.identity.client.PublicClientApplication -import com.microsoft.identity.client.exception.MsalClientException -import com.microsoft.identity.client.exception.MsalException -import com.microsoft.identity.client.exception.MsalServiceException -import com.microsoft.identity.client.exception.MsalUiRequiredException import org.cryptomator.data.util.X509CertificateHelper import org.cryptomator.domain.Cloud import org.cryptomator.domain.CloudType @@ -39,7 +26,6 @@ import org.cryptomator.domain.usecases.cloud.AddOrChangeCloudConnectionUseCase import org.cryptomator.domain.usecases.cloud.GetCloudsUseCase import org.cryptomator.domain.usecases.cloud.GetUsernameUseCase import org.cryptomator.generator.Callback -import org.cryptomator.presentation.BuildConfig import org.cryptomator.presentation.R import org.cryptomator.presentation.exception.ExceptionHandlers import org.cryptomator.presentation.intent.AuthenticateCloudIntent @@ -175,12 +161,12 @@ class AuthenticateCloudPresenter @Inject constructor( // private fun startAuthentication() { showProgress(ProgressModel(ProgressStateModel.AUTHENTICATION)) authenticationStarted = true - Auth.startOAuth2Authentication(context(), BuildConfig.DROPBOX_API_KEY) + DropboxAuthHelper.startOAuth2Authentication(context()) view?.skipTransition() } private fun handleAuthenticationResult(cloudModel: CloudModel) { - val authToken = Auth.getOAuth2Token() + val authToken = DropboxAuthHelper.getOAuth2Token() if (authToken == null) { failAuthentication(cloudModel.name()) } else { @@ -221,11 +207,10 @@ class AuthenticateCloudPresenter @Inject constructor( // } private fun chooseAccount(cloud: CloudModel) { - val chooseAccountIntent = GoogleAccountCredential.usingOAuth2(context(), setOf(DriveScopes.DRIVE)).newChooseAccountIntent() try { requestActivityResult( // ActivityResultCallbacks.onGoogleDriveAuthenticated(cloud), // - chooseAccountIntent + GoogleAuthHelper.getChooseAccountIntent(context()) ) } catch (e: ActivityNotFoundException) { view?.showMessage(R.string.error_play_services_not_available) @@ -261,6 +246,7 @@ class AuthenticateCloudPresenter @Inject constructor( // private inner class OnedriveAuthStrategy : AuthStrategy { private var authenticationStarted = false + override fun supports(cloud: CloudModel): Boolean { return cloud.cloudType() == CloudTypeModel.ONEDRIVE } @@ -276,107 +262,11 @@ class AuthenticateCloudPresenter @Inject constructor( // Toast.makeText(context(), R.string.notification_authenticating, Toast.LENGTH_SHORT).show() - PublicClientApplication.createMultipleAccountPublicClientApplication( - context(), - R.raw.auth_config_onedrive, - object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { - override fun onCreated(application: IMultipleAccountPublicClientApplication) { - application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { - override fun onTaskCompleted(accounts: List) { - if (accounts.isEmpty()) { - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } else { - accounts.find { account -> account.username == cloud.username() }?.let { - application.acquireTokenSilentAsync( - onedriveScopes(), - it, - "https://login.microsoftonline.com/common", - getAuthSilentCallback(cloud, application) - ) - } ?: application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") - failAuthentication(cloud.name()) - } - }) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") - failAuthentication(cloud.name()) - } - }) - } - - private fun getAuthSilentCallback(cloud: CloudModel, application: IMultipleAccountPublicClientApplication): AuthenticationCallback { - return object : AuthenticationCallback { - - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Failed to acquireToken") - when (e) { - is MsalClientException -> { - /* Exception inside MSAL, more info inside MsalError.java */ - failAuthentication(cloud.name()) - } - is MsalServiceException -> { - /* Exception when communicating with the STS, likely config issue */ - failAuthentication(cloud.name()) - } - is MsalUiRequiredException -> { - /* Tokens expired or no session, retry with interactive */ - application.acquireToken(activity(), onedriveScopes(), getAuthInteractiveCallback(cloud)) - } - } - } - - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") - } - } - } - - private fun getAuthInteractiveCallback(cloud: CloudModel): AuthenticationCallback { - return object : AuthenticationCallback { - - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - handleAuthenticationResult(cloud, authenticationResult.accessToken, authenticationResult.account.username) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") - failAuthentication(cloud.name()) - } - - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") - } - } - } - - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .build() - ) - } - - private fun handleAuthenticationResult(cloud: CloudModel, accessToken: String, username: String) { - getUsernameAndSuceedAuthentication( // - OnedriveCloud.aCopyOf(cloud.toCloud() as OnedriveCloud) // - .withAccessToken(encrypt(accessToken)) // - .withUsername(username) - .build() - ) + OnedriveAuthentication.refreshOrCheckAuth(activity(), cloud.toCloud() as OnedriveCloud, { authenticatedCloud -> + getUsernameAndSuceedAuthentication(authenticatedCloud) + }, { + failAuthentication(cloud.name()) + }) } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/ChooseCloudServicePresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/ChooseCloudServicePresenter.kt index 67a49acb..3b2a5d4c 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/ChooseCloudServicePresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/ChooseCloudServicePresenter.kt @@ -1,5 +1,6 @@ package org.cryptomator.presentation.presenter +import android.view.View import org.cryptomator.domain.Cloud import org.cryptomator.domain.di.PerView import org.cryptomator.domain.exception.FatalBackendException @@ -12,6 +13,7 @@ import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.model.CloudTypeModel import org.cryptomator.presentation.model.mappers.CloudModelMapper import org.cryptomator.presentation.ui.activity.view.ChooseCloudServiceView +import org.cryptomator.presentation.ui.snackbar.SnackbarAction import org.cryptomator.presentation.workflow.ActivityResult import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow import org.cryptomator.presentation.workflow.CreateNewVaultWorkflow @@ -37,6 +39,11 @@ class ChooseCloudServicePresenter @Inject constructor( // if (BuildConfig.FLAVOR == "fdroid") { cloudTypeModels.remove(CloudTypeModel.GOOGLE_DRIVE) + } else if (BuildConfig.FLAVOR == "lite") { + cloudTypeModels.remove(CloudTypeModel.GOOGLE_DRIVE) + cloudTypeModels.remove(CloudTypeModel.DROPBOX) + cloudTypeModels.remove(CloudTypeModel.ONEDRIVE) + cloudTypeModels.remove(CloudTypeModel.PCLOUD) } view?.render(cloudTypeModels) @@ -87,6 +94,18 @@ class ChooseCloudServicePresenter @Inject constructor( // finishWithResult(cloudModelMapper.toModel(cloud)) } + fun showCloudMissingSnackbarHintInLiteVariant() { + if (BuildConfig.FLAVOR == "lite") { + view?.showSnackbar(R.string.snack_bar_cryptomator_variants_hint, object: SnackbarAction { + override fun onClick(v: View?) { + startIntent(Intents.cryptomatorVariantsIntent()) + } + override val text: Int + get() = R.string.snack_bar_cryptomator_variants_title + }) + } + } + init { unsubscribeOnDestroy(getCloudsUseCase) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt index 935bcff4..4d1a36e1 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -4,13 +4,6 @@ import android.content.ActivityNotFoundException import android.content.Intent import android.net.Uri import android.widget.Toast -import com.microsoft.identity.client.AuthenticationCallback -import com.microsoft.identity.client.IAccount -import com.microsoft.identity.client.IAuthenticationResult -import com.microsoft.identity.client.IMultipleAccountPublicClientApplication -import com.microsoft.identity.client.IPublicClientApplication -import com.microsoft.identity.client.PublicClientApplication -import com.microsoft.identity.client.exception.MsalException import org.cryptomator.domain.Cloud import org.cryptomator.domain.LocalStorageCloud import org.cryptomator.domain.OnedriveCloud @@ -137,49 +130,11 @@ class CloudConnectionListPresenter @Inject constructor( // } private fun addOnedriveCloud() { - PublicClientApplication.createMultipleAccountPublicClientApplication( - context(), - R.raw.auth_config_onedrive, - object : IPublicClientApplication.IMultipleAccountApplicationCreatedListener { - override fun onCreated(application: IMultipleAccountPublicClientApplication) { - application.getAccounts(object : IPublicClientApplication.LoadAccountsCallback { - override fun onTaskCompleted(accounts: List) { - application.acquireToken(activity(), AuthenticateCloudPresenter.onedriveScopes(), getAuthInteractiveCallback()) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Error to get accounts") - showError(e); - } - }) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").i(e, "Error in configuration") - showError(e); - } - }) - } - - private fun getAuthInteractiveCallback(): AuthenticationCallback { - return object : AuthenticationCallback { - - override fun onSuccess(authenticationResult: IAuthenticationResult) { - Timber.tag("AuthenticateCloudPresenter").i("Successfully authenticated") - val accessToken = CredentialCryptor.getInstance(context()).encrypt(authenticationResult.accessToken) - val onedriveSkeleton = OnedriveCloud.aOnedriveCloud().withAccessToken(accessToken).withUsername(authenticationResult.account.username).build() - saveOnedriveCloud(onedriveSkeleton) - } - - override fun onError(e: MsalException) { - Timber.tag("AuthenticateCloudPresenter").e(e, "Successfully authenticated") - showError(e); - } - - override fun onCancel() { - Timber.tag("AuthenticateCloudPresenter").i("User cancelled login") - } - } + OnedriveAuthentication.getAuthenticatedOnedriveCloud(activity(), { cloud -> + saveOnedriveCloud(cloud) + }, { e -> + showError(e) + }) } private fun saveOnedriveCloud(onedriveSkeleton: OnedriveCloud) { diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt index 79ca7a35..5607f424 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudSettingsPresenter.kt @@ -140,9 +140,28 @@ class CloudSettingsPresenter @Inject constructor( // it.add(aS3Cloud()) it.add(aLocalCloud()) } + .filter { cloud -> !(BuildConfig.FLAVOR == "lite" && excludeApiCloudsInLite(cloud.cloudType())) } // view?.render(cloudModel) } + private fun excludeApiCloudsInLite(cloudType: CloudTypeModel): Boolean { + return when (cloudType) { + CloudTypeModel.GOOGLE_DRIVE -> { + true + } + CloudTypeModel.ONEDRIVE -> { + true + } + CloudTypeModel.DROPBOX -> { + true + } + CloudTypeModel.PCLOUD -> { + true + } + else -> false + } + } + private fun aOnedriveCloud(): OnedriveCloudModel { return OnedriveCloudModel(OnedriveCloud.aOnedriveCloud().build()) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/CryptomatorVariantsPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/CryptomatorVariantsPresenter.kt new file mode 100644 index 00000000..1c4b0cf8 --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CryptomatorVariantsPresenter.kt @@ -0,0 +1,103 @@ +package org.cryptomator.presentation.presenter + +import android.content.Intent +import android.net.Uri +import android.widget.Toast +import com.google.common.base.Optional +import org.cryptomator.data.util.NetworkConnectionCheck +import org.cryptomator.domain.di.PerView +import org.cryptomator.domain.usecases.DoUpdateCheckUseCase +import org.cryptomator.domain.usecases.DoUpdateUseCase +import org.cryptomator.domain.usecases.NoOpResultHandler +import org.cryptomator.domain.usecases.UpdateCheck +import org.cryptomator.presentation.R +import org.cryptomator.presentation.exception.ExceptionHandlers +import org.cryptomator.presentation.model.ProgressModel +import org.cryptomator.presentation.ui.activity.view.CryptomatorVariantsView +import org.cryptomator.presentation.util.FileUtil +import javax.inject.Inject + +@PerView +class CryptomatorVariantsPresenter @Inject constructor( + // + exceptionMappings: ExceptionHandlers, // + private val updateCheckUseCase: DoUpdateCheckUseCase, // + private val updateUseCase: DoUpdateUseCase, // + private val networkConnectionCheck: NetworkConnectionCheck, // + private val fileUtil: FileUtil, // +) : Presenter(exceptionMappings) { + + private val fDroidPackageName = "org.fdroid.fdroid" + + fun onInstallMainFDroidVariantClicked() { + context().packageManager.getLaunchIntentForPackage(fDroidPackageName)?.let { + it.data = Uri.parse("https://f-droid.org/packages/org.cryptomator.light") + context().startActivity(it) + } ?: Toast.makeText(context(), R.string.error_interact_with_fdroid_but_fdroid_missing, Toast.LENGTH_SHORT).show() + } + + fun onAddRepoClicked() { + context().packageManager.getLaunchIntentForPackage(fDroidPackageName)?.let { + it.data = Uri.parse("https://static.cryptomator.org/android/fdroid/repo?fingerprint=F7C3EC3B0D588D3CB52983E9EB1A7421C93D4339A286398E71D7B651E8D8ECDD") + context().startActivity(it) + } ?: Toast.makeText(context(), R.string.error_interact_with_fdroid_but_fdroid_missing, Toast.LENGTH_SHORT).show() + } + + fun onInstallFDroidVariantClicked() { + context().packageManager.getLaunchIntentForPackage(fDroidPackageName)?.let { + it.data = Uri.parse("https://f-droid.org/packages/org.cryptomator") + context().startActivity(it) + } ?: Toast.makeText(context(), R.string.error_interact_with_fdroid_but_fdroid_missing, Toast.LENGTH_SHORT).show() + } + + fun onInstallWebsiteVariantClicked() { + if (networkConnectionCheck.isPresent) { + view?.showProgress(ProgressModel.GENERIC) + + updateCheckUseCase // + .withVersion("0.0.0") + .run(object : NoOpResultHandler>() { + override fun onSuccess(result: Optional) { + installUpdate() + } + + override fun onError(e: Throwable) { + view?.showProgress(ProgressModel.COMPLETED) + showError(e) + } + }) + } else { + Toast.makeText(context(), R.string.error_update_no_internet, Toast.LENGTH_SHORT).show() + } + } + + private fun installUpdate() { + val uri = fileUtil.contentUriForNewTempFile("cryptomator.apk") + val file = fileUtil.tempFile("cryptomator.apk") + + updateUseCase // + .withFile(file) // + .run(object : NoOpResultHandler() { + override fun onError(e: Throwable) { + showError(e) + } + + override fun onSuccess(result: Void?) { + super.onSuccess(result) + val intent = Intent(Intent.ACTION_VIEW) + intent.setDataAndType(uri, "application/vnd.android.package-archive") + intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + context().startActivity(intent) + } + + override fun onFinished() { + view?.showProgress(ProgressModel.COMPLETED) + } + }) + } + + init { + unsubscribeOnDestroy(updateCheckUseCase, updateUseCase) + } +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/SettingsPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/SettingsPresenter.kt index 2a9602b9..17435262 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/SettingsPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/SettingsPresenter.kt @@ -83,6 +83,9 @@ class SettingsPresenter @Inject internal constructor( "fdroid" -> { "F-Droid" } + "lite" -> { + "F-Droid Main Repo Edition" + } else -> "Google Play" } return StringBuilder().append("## ").append(context().getString(R.string.error_report_subject)).append("\n\n") // diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/SplashPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/SplashPresenter.kt deleted file mode 100644 index 5f614bcc..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/SplashPresenter.kt +++ /dev/null @@ -1,16 +0,0 @@ -package org.cryptomator.presentation.presenter - -import org.cryptomator.domain.di.PerView -import org.cryptomator.presentation.exception.ExceptionHandlers -import org.cryptomator.presentation.intent.Intents -import org.cryptomator.presentation.ui.activity.view.SplashView -import javax.inject.Inject - -@PerView -class SplashPresenter @Inject constructor(exceptionMappings: ExceptionHandlers) : Presenter(exceptionMappings) { - - override fun resumed() { - Intents.vaultListIntent().startActivity(this) - finish() - } -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/UnlockVaultPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/UnlockVaultPresenter.kt index c0844d1c..634ce3c0 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/UnlockVaultPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/UnlockVaultPresenter.kt @@ -402,6 +402,10 @@ class UnlockVaultPresenter @Inject constructor( finishWithResult(null) } + fun onChangePasswordCanceled() { + finishWithResult(null) + } + private open class PendingUnlock(private val vault: Vault?) : Serializable { private var unlockToken: UnlockToken? = null diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt index 521083a2..f30cfed6 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/VaultListPresenter.kt @@ -123,7 +123,7 @@ class VaultListPresenter @Inject constructor( // } private fun checkLicense() { - if (BuildConfig.FLAVOR == "apkstore" || BuildConfig.FLAVOR == "fdroid") { + if (BuildConfig.FLAVOR == "apkstore" || BuildConfig.FLAVOR == "fdroid" || BuildConfig.FLAVOR == "lite") { licenseCheckUseCase // .withLicense("") // .run(object : NoOpResultHandler() { diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt b/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt index cfd8f00a..7630e0fd 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/AutoUploadNotification.kt @@ -39,7 +39,7 @@ class AutoUploadNotification(private val context: Context, private val amountOfP this.builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) // .setContentTitle(context.getString(R.string.notification_auto_upload_title)) // - .setSmallIcon(R.drawable.background_splash_cryptomator) // + .setSmallIcon(R.drawable.ic_notification) // .setColor(getColor(R.color.colorPrimary)) // .addAction(cancelNowAction()) .setGroup(NOTIFICATION_GROUP_KEY) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt b/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt index f36d6098..9594f440 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/OpenWritableFileNotification.kt @@ -35,7 +35,7 @@ class OpenWritableFileNotification(private val context: Context, private val uri this.builder = NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID) // .setContentTitle(context.getString(R.string.notification_open_writable_file_title)) // .setContentText(context.getString(R.string.notification_open_writable_file_message)) // - .setSmallIcon(R.drawable.background_splash_cryptomator) // + .setSmallIcon(R.drawable.ic_notification) // .setColor(getColor(R.color.colorPrimary)) // .setGroup(NOTIFICATION_GROUP_KEY) .setOngoing(true) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt b/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt index d9d1e929..c5dfc0a6 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/service/PhotoContentJob.kt @@ -13,10 +13,9 @@ import android.net.Uri import android.os.Handler import android.provider.MediaStore import org.cryptomator.domain.exception.FatalBackendException +import org.cryptomator.presentation.BuildConfig import org.cryptomator.presentation.CryptomatorApp -import org.cryptomator.presentation.R import org.cryptomator.presentation.util.FileUtil -import org.cryptomator.presentation.util.ResourceHelper import org.cryptomator.util.SharedPreferencesHandler import org.cryptomator.util.file.MimeTypeMap import org.cryptomator.util.file.MimeTypes @@ -145,7 +144,7 @@ class PhotoContentJob : JobService() { private const val PHOTOS_CONTENT_JOB = 23 init { - val builder = JobInfo.Builder(PHOTOS_CONTENT_JOB, ComponentName(ResourceHelper.getString(R.string.app_id), PhotoContentJob::class.java.name)) + val builder = JobInfo.Builder(PHOTOS_CONTENT_JOB, ComponentName(BuildConfig.APPLICATION_ID, PhotoContentJob::class.java.name)) builder.addTriggerContentUri(JobInfo.TriggerContentUri(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) builder.addTriggerContentUri(JobInfo.TriggerContentUri(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) builder.addTriggerContentUri(JobInfo.TriggerContentUri(MediaStore.Images.Media.INTERNAL_CONTENT_URI, FLAG_NOTIFY_FOR_DESCENDANTS)) diff --git a/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java b/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java index 1b90f1d1..3f0c6ab8 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java +++ b/presentation/src/main/java/org/cryptomator/presentation/service/UnlockedNotification.java @@ -52,7 +52,7 @@ class UnlockedNotification { } this.builder = new NotificationCompat.Builder(service, NOTIFICATION_CHANNEL_ID) // - .setSmallIcon(R.drawable.background_splash_cryptomator) // + .setSmallIcon(R.drawable.ic_notification) // .setColor(ResourceHelper.Companion.getColor(R.color.colorPrimary)) // .addAction(lockNowAction()) // .setGroup(NOTIFICATION_GROUP_KEY) // diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BaseActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BaseActivity.kt index a4b73723..25f4c3ba 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BaseActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/BaseActivity.kt @@ -316,6 +316,7 @@ abstract class BaseActivity : AppCompatActivity(), View, ActivityCompat.OnReques internal open fun snackbarView(): android.view.View { return activity().findViewById(R.id.locationsRecyclerView) as android.view.View? + ?: activity().findViewById(R.id.rlChooseCloudService) as android.view.View? ?: return activity().findViewById(R.id.coordinatorLayout) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/CryptomatorVariantsActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/CryptomatorVariantsActivity.kt new file mode 100644 index 00000000..97eedf54 --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/CryptomatorVariantsActivity.kt @@ -0,0 +1,51 @@ +package org.cryptomator.presentation.ui.activity + +import org.cryptomator.generator.Activity +import org.cryptomator.presentation.R +import org.cryptomator.presentation.presenter.CryptomatorVariantsPresenter +import org.cryptomator.presentation.ui.activity.view.CryptomatorVariantsView +import javax.inject.Inject +import kotlinx.android.synthetic.main.activity_cryptomator_variants.btnAddRepo +import kotlinx.android.synthetic.main.activity_cryptomator_variants.btnInstallFDroidVariant +import kotlinx.android.synthetic.main.activity_cryptomator_variants.btnInstallLiteVariant +import kotlinx.android.synthetic.main.activity_cryptomator_variants.btnInstallWebsiteVariant +import kotlinx.android.synthetic.main.activity_cryptomator_variants.tvFdroidCustomSupported +import kotlinx.android.synthetic.main.activity_cryptomator_variants.tvFdroidCustomUnsupported +import kotlinx.android.synthetic.main.activity_cryptomator_variants.tvLiteSupported +import kotlinx.android.synthetic.main.activity_cryptomator_variants.tvLiteUnsupported +import kotlinx.android.synthetic.main.activity_cryptomator_variants.tvWebsiteSupported +import kotlinx.android.synthetic.main.toolbar_layout.toolbar + +@Activity(layout = R.layout.activity_cryptomator_variants) +class CryptomatorVariantsActivity : BaseActivity(), CryptomatorVariantsView { + + @Inject + lateinit var presenter: CryptomatorVariantsPresenter + + override fun setupView() { + toolbar.title = getString(R.string.screen_cryptomator_variants_title) + setSupportActionBar(toolbar) + + tvLiteSupported.text = "WebDAV, S3, Local Storage" + tvLiteUnsupported.text = "Dropbox, Google Drive, OneDrive, pCloud" + + tvFdroidCustomSupported.text = "Dropbox, OneDrive, pCloud, WebDAV, S3, Local Storage" + tvFdroidCustomUnsupported.text = "Google Drive" + + tvWebsiteSupported.text = "Dropbox, Google Drive, OneDrive, pCloud, WebDAV, S3, Local Storage" + + btnInstallLiteVariant.setOnClickListener { + presenter.onInstallMainFDroidVariantClicked() + } + btnAddRepo.setOnClickListener { + presenter.onAddRepoClicked() + } + btnInstallFDroidVariant.setOnClickListener { + presenter.onInstallFDroidVariantClicked() + } + btnInstallWebsiteVariant.setOnClickListener { + presenter.onInstallWebsiteVariantClicked() + } + } + +} diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/SplashActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/SplashActivity.kt deleted file mode 100644 index ca987ce0..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/SplashActivity.kt +++ /dev/null @@ -1,14 +0,0 @@ -package org.cryptomator.presentation.ui.activity - -import org.cryptomator.generator.Activity -import org.cryptomator.presentation.presenter.SplashPresenter -import org.cryptomator.presentation.ui.activity.view.SplashView - -import javax.inject.Inject - -@Activity(secure = false) -class SplashActivity : BaseActivity(), SplashView { - - @Inject - lateinit var splashPresenter: SplashPresenter -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/UnlockVaultActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/UnlockVaultActivity.kt index bd37c356..ee6ed627 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/UnlockVaultActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/UnlockVaultActivity.kt @@ -110,6 +110,10 @@ class UnlockVaultActivity : BaseActivity(), // presenter.onChangePasswordClick(vaultModel, unverifiedVaultConfig, oldPassword, newPassword) } + override fun onChangePasswordCanceled() { + presenter.onChangePasswordCanceled() + } + override fun onDeleteMissingVaultClicked(vault: Vault) { presenter.onDeleteMissingVaultClicked(vault) } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt index aae409c3..7fe53a3b 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/VaultListActivity.kt @@ -2,7 +2,9 @@ package org.cryptomator.presentation.ui.activity import android.content.Intent import android.net.Uri +import android.os.Bundle import android.view.View +import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen import androidx.fragment.app.Fragment import org.cryptomator.generator.Activity import org.cryptomator.generator.InjectIntent @@ -47,6 +49,11 @@ class VaultListActivity : BaseActivity(), // @InjectIntent lateinit var vaultListIntent: VaultListIntent + override fun onCreate(savedInstanceState: Bundle?) { + installSplashScreen() + super.onCreate(savedInstanceState) + } + override fun onWindowFocusChanged(hasFocus: Boolean) { super.onWindowFocusChanged(hasFocus) vaultListPresenter.onWindowFocusChanged(hasFocus) diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/CryptomatorVariantsView.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/CryptomatorVariantsView.kt new file mode 100644 index 00000000..9b8ee1be --- /dev/null +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/view/CryptomatorVariantsView.kt @@ -0,0 +1,3 @@ +package org.cryptomator.presentation.ui.activity.view + +interface CryptomatorVariantsView : View diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedFilesAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedFilesAdapter.kt index fd5133be..41b4ae92 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedFilesAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/SharedFilesAdapter.kt @@ -1,21 +1,22 @@ package org.cryptomator.presentation.ui.adapter +import android.content.Context import android.text.Editable import android.text.TextWatcher import android.view.View +import androidx.appcompat.content.res.AppCompatResources import org.cryptomator.presentation.R import org.cryptomator.presentation.model.SharedFileModel import org.cryptomator.presentation.ui.adapter.SharedFilesAdapter.FileViewHolder import org.cryptomator.presentation.util.FileIcon import org.cryptomator.presentation.util.FileUtil import org.cryptomator.util.Comparators -import java.util.HashSet import javax.inject.Inject -import kotlinx.android.synthetic.main.item_shared_files.view.fileImage import kotlinx.android.synthetic.main.item_shared_files.view.fileName +import kotlinx.android.synthetic.main.item_shared_files.view.til_file_name class SharedFilesAdapter @Inject -constructor(private val fileUtil: FileUtil) : RecyclerViewBaseAdapter(Comparators.naturalOrder()) { +constructor(private val fileUtil: FileUtil, private val context: Context) : RecyclerViewBaseAdapter(Comparators.naturalOrder()) { interface Callback { @@ -55,7 +56,7 @@ constructor(private val fileUtil: FileUtil) : RecyclerViewBaseAdapter } // - .setNegativeButton(getString(R.string.dialog_button_cancel)) { _: DialogInterface?, _: Int -> } // + .setNegativeButton(getString(R.string.dialog_button_cancel)) { _: DialogInterface?, _: Int -> callback?.onChangePasswordCanceled() } // .create() } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/dialog/FileNameDialog.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/dialog/FileNameDialog.kt index 478ad562..47ee7521 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/dialog/FileNameDialog.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/dialog/FileNameDialog.kt @@ -9,7 +9,7 @@ import androidx.appcompat.app.AlertDialog import org.cryptomator.generator.Dialog import org.cryptomator.presentation.R import org.cryptomator.presentation.util.FileUtil -import kotlinx.android.synthetic.main.dialog_file_name.file_name +import kotlinx.android.synthetic.main.dialog_file_name.et_file_name @Dialog(R.layout.dialog_file_name) class FileNameDialog : BaseProgressErrorDialog() { @@ -28,20 +28,20 @@ class FileNameDialog : BaseProgressErrorDialog() { createFileButton = dialog.getButton(android.app.Dialog.BUTTON_POSITIVE) createFileButton?.setOnClickListener { callback?.onCreateNewTextFileClicked(effectiveTextFileName()) - onWaitForResponse(file_name) + onWaitForResponse(et_file_name) } dialog.setCanceledOnTouchOutside(false) - file_name.requestFocus() + et_file_name.requestFocus() createFileButton?.let { button -> - file_name.nextFocusForwardId = button.id + et_file_name.nextFocusForwardId = button.id } } } private fun effectiveTextFileName(): String { - return if (file_name.text.toString().isEmpty()) // + return if (et_file_name.text.toString().isEmpty()) // requireContext().getString(R.string.dialog_file_name_placeholder) else // - effectiveNewFileName(file_name.text.toString()) + effectiveNewFileName(et_file_name.text.toString()) } override fun setupDialog(builder: AlertDialog.Builder): android.app.Dialog { @@ -60,8 +60,8 @@ class FileNameDialog : BaseProgressErrorDialog() { } override fun setupView() { - createFileButton?.let { registerOnEditorDoneActionAndPerformButtonClick(file_name) { it } } - file_name.addTextChangedListener(object : TextWatcher { + createFileButton?.let { registerOnEditorDoneActionAndPerformButtonClick(et_file_name) { it } } + et_file_name.addTextChangedListener(object : TextWatcher { override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {} override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {} override fun afterTextChanged(s: Editable) { @@ -75,6 +75,6 @@ class FileNameDialog : BaseProgressErrorDialog() { } override fun enableViewAfterError(): View { - return file_name + return et_file_name } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/ChooseCloudServiceFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/ChooseCloudServiceFragment.kt index 4902d353..31d5ec57 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/ChooseCloudServiceFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/ChooseCloudServiceFragment.kt @@ -27,6 +27,7 @@ class ChooseCloudServiceFragment : BaseFragment() { override fun setupView() { setupRecyclerView() + chooseCloudServicePresenter.showCloudMissingSnackbarHintInLiteVariant() } fun render(cloudModels: List?) { diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt index d40769ff..aa88bfa1 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/SettingsFragment.kt @@ -1,5 +1,6 @@ package org.cryptomator.presentation.ui.fragment +import android.content.Intent import android.os.Bundle import android.text.SpannableString import android.text.style.ForegroundColorSpan @@ -11,15 +12,21 @@ import androidx.core.content.ContextCompat import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat -import androidx.preference.SwitchPreferenceCompat +import androidx.preference.SwitchPreference import org.cryptomator.presentation.BuildConfig import org.cryptomator.presentation.R import org.cryptomator.presentation.service.PhotoContentJob +import org.cryptomator.presentation.ui.activity.AutoUploadChooseVaultActivity +import org.cryptomator.presentation.ui.activity.BiometricAuthSettingsActivity +import org.cryptomator.presentation.ui.activity.CloudSettingsActivity +import org.cryptomator.presentation.ui.activity.CryptomatorVariantsActivity +import org.cryptomator.presentation.ui.activity.LicensesActivity import org.cryptomator.presentation.ui.activity.SettingsActivity import org.cryptomator.presentation.ui.dialog.DebugModeDisclaimerDialog import org.cryptomator.presentation.ui.dialog.DisableAppWhenObscuredDisclaimerDialog import org.cryptomator.presentation.ui.dialog.DisableSecureScreenDisclaimerDialog import org.cryptomator.util.SharedPreferencesHandler +import org.cryptomator.util.SharedPreferencesHandler.Companion.CRYPTOMATOR_VARIANTS import org.cryptomator.util.file.LruFileCacheUtil import java.lang.Boolean.FALSE import java.lang.Boolean.TRUE @@ -39,6 +46,7 @@ class SettingsFragment : PreferenceFragmentCompat() { setupAppVersion() setupLruCacheSize() setupLicense() + setupCryptomatorVariants() } private val sendErrorReportClickListener = Preference.OnPreferenceClickListener { @@ -105,10 +113,9 @@ class SettingsFragment : PreferenceFragmentCompat() { if (biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_SUCCESS && biometricAuthenticationAvailable != BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED ) { - val preference = findPreference(BIOMETRIC_AUTHENTICATION_ITEM_KEY) as Preference? - val generalCategory = findPreference(getString(R.string.screen_settings_section_general)) as PreferenceCategory? - generalCategory?.removePreference(preference) - + (findPreference(BIOMETRIC_AUTHENTICATION_ITEM_KEY) as Preference?)?.let { preference -> + (findPreference(getString(R.string.screen_settings_section_general)) as PreferenceCategory?)?.removePreference(preference) + } Timber // .tag("SettingsFragment") // .d("No working biometric hardware detected") @@ -122,7 +129,9 @@ class SettingsFragment : PreferenceFragmentCompat() { ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // 0, versionName.length, 0 ) - preference?.summary = versionName + preference?.summaryProvider = Preference.SummaryProvider { + versionName + } } private fun setupLruCacheSize() { @@ -148,7 +157,9 @@ class SettingsFragment : PreferenceFragmentCompat() { ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // 0, lruCacheSize.length, 0 ) - preference?.summary = lruCacheSize + preference?.summaryProvider = Preference.SummaryProvider { + lruCacheSize + } } private fun setupLicense() { @@ -157,12 +168,12 @@ class SettingsFragment : PreferenceFragmentCompat() { (findPreference(SharedPreferencesHandler.MAIL) as Preference?)?.title = format(getString(R.string.screen_settings_license_mail), sharedPreferencesHandler.mail()) setupUpdateCheck() } - "fdroid" -> { + "fdroid", "lite" -> { (findPreference(SharedPreferencesHandler.MAIL) as Preference?)?.title = format(getString(R.string.screen_settings_license_mail), sharedPreferencesHandler.mail()) removeUpdateCheck() } else -> { - preferenceScreen.removePreference(findPreference(LICENSE_ITEM_KEY)) + (findPreference(LICENSE_ITEM_KEY) as Preference?)?.let { preferenceScreen.removePreference(it) } removeUpdateCheck() } } @@ -170,8 +181,8 @@ class SettingsFragment : PreferenceFragmentCompat() { private fun removeUpdateCheck() { val versionCategory = findPreference("versionCategory") as PreferenceCategory? - versionCategory?.removePreference(findPreference(UPDATE_CHECK_ITEM_KEY)) - versionCategory?.removePreference(findPreference(UPDATE_INTERVAL_ITEM_KEY)) + (findPreference(UPDATE_CHECK_ITEM_KEY) as Preference?)?.let { versionCategory?.removePreference(it) } + (findPreference(UPDATE_INTERVAL_ITEM_KEY) as Preference?)?.let { versionCategory?.removePreference(it) } } fun setupUpdateCheck() { @@ -192,7 +203,17 @@ class SettingsFragment : PreferenceFragmentCompat() { ForegroundColorSpan(ContextCompat.getColor(activity(), R.color.textColorLight)), // 0, date.length, 0 ) - preference?.summary = date + preference?.summaryProvider = Preference.SummaryProvider { + date + } + } + + private fun setupCryptomatorVariants() { + if (BuildConfig.FLAVOR == "playstore") { + (findPreference(CRYPTOMATOR_VARIANTS) as Preference?)?.let { preference -> + (findPreference(getString(R.string.screen_settings_section_general)) as PreferenceCategory?)?.removePreference(preference) + } + } } override fun onResume() { @@ -209,21 +230,29 @@ class SettingsFragment : PreferenceFragmentCompat() { if (BuildConfig.FLAVOR == "apkstore") { (findPreference(UPDATE_CHECK_ITEM_KEY) as Preference?)?.onPreferenceClickListener = updateCheckClickListener } + + (findPreference(SharedPreferencesHandler.CLOUD_SETTINGS) as Preference?)?.intent = Intent(context, CloudSettingsActivity::class.java) + (findPreference(SharedPreferencesHandler.BIOMETRIC_AUTHENTICATION) as Preference?)?.intent = Intent(context, BiometricAuthSettingsActivity::class.java) + if (BuildConfig.FLAVOR != "playstore") { + (findPreference(SharedPreferencesHandler.CRYPTOMATOR_VARIANTS) as Preference?)?.intent = Intent(context, CryptomatorVariantsActivity::class.java) + } + (findPreference(SharedPreferencesHandler.PHOTO_UPLOAD_VAULT) as Preference?)?.intent = Intent(context, AutoUploadChooseVaultActivity::class.java) + (findPreference(SharedPreferencesHandler.LICENSES_ACTIVITY) as Preference?)?.intent = Intent(context, LicensesActivity::class.java) } fun deactivateDebugMode() { sharedPreferencesHandler.setDebugMode(false) - (findPreference(SharedPreferencesHandler.DEBUG_MODE) as SwitchPreferenceCompat?)?.isChecked = false + (findPreference(SharedPreferencesHandler.DEBUG_MODE) as SwitchPreference?)?.isChecked = false } fun disableAppWhenObscured() { sharedPreferencesHandler.setDisableAppWhenObscured(true) - (findPreference(SharedPreferencesHandler.DISABLE_APP_WHEN_OBSCURED) as SwitchPreferenceCompat?)?.isChecked = true + (findPreference(SharedPreferencesHandler.DISABLE_APP_WHEN_OBSCURED) as SwitchPreference?)?.isChecked = true } fun secureScreen() { sharedPreferencesHandler.setSecureScreen(true) - (findPreference(SharedPreferencesHandler.SECURE_SCREEN) as SwitchPreferenceCompat?)?.isChecked = true + (findPreference(SharedPreferencesHandler.SECURE_SCREEN) as SwitchPreference?)?.isChecked = true } private fun onSendErrorReportClicked() { @@ -260,7 +289,7 @@ class SettingsFragment : PreferenceFragmentCompat() { } else { PhotoContentJob.cancelJob(activity().applicationContext) } - (findPreference(SharedPreferencesHandler.PHOTO_UPLOAD) as SwitchPreferenceCompat?)?.isChecked = enabled + (findPreference(SharedPreferencesHandler.PHOTO_UPLOAD) as SwitchPreference?)?.isChecked = enabled } fun rootView(): View { diff --git a/presentation/src/main/res/drawable-anydpi/ic_notification.xml b/presentation/src/main/res/drawable-anydpi/ic_notification.xml new file mode 100644 index 00000000..0b99d37a --- /dev/null +++ b/presentation/src/main/res/drawable-anydpi/ic_notification.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/presentation/src/main/res/drawable-hdpi/ic_notification.png b/presentation/src/main/res/drawable-hdpi/ic_notification.png new file mode 100644 index 00000000..c934b21d Binary files /dev/null and b/presentation/src/main/res/drawable-hdpi/ic_notification.png differ diff --git a/presentation/src/main/res/drawable-mdpi/background_splash_cryptomator.png b/presentation/src/main/res/drawable-mdpi/background_splash_cryptomator.png deleted file mode 100644 index 822cc679..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/background_splash_cryptomator.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/dropbox_vault.png b/presentation/src/main/res/drawable-mdpi/dropbox_vault.png deleted file mode 100644 index f0343d4e..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/dropbox_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/dropbox_vault_selected.png b/presentation/src/main/res/drawable-mdpi/dropbox_vault_selected.png deleted file mode 100644 index 9c636e86..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/dropbox_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/google_drive_vault.png b/presentation/src/main/res/drawable-mdpi/google_drive_vault.png deleted file mode 100644 index 039226cb..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/google_drive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/google_drive_vault_selected.png b/presentation/src/main/res/drawable-mdpi/google_drive_vault_selected.png deleted file mode 100644 index 315d60ed..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/google_drive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/ic_notification.png b/presentation/src/main/res/drawable-mdpi/ic_notification.png new file mode 100644 index 00000000..8d21ef31 Binary files /dev/null and b/presentation/src/main/res/drawable-mdpi/ic_notification.png differ diff --git a/presentation/src/main/res/drawable-mdpi/local_fs_vault.png b/presentation/src/main/res/drawable-mdpi/local_fs_vault.png deleted file mode 100644 index c929073a..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/local_fs_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/local_fs_vault_selected.png b/presentation/src/main/res/drawable-mdpi/local_fs_vault_selected.png deleted file mode 100644 index ba53b5b9..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/local_fs_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/onedrive_vault.png b/presentation/src/main/res/drawable-mdpi/onedrive_vault.png deleted file mode 100644 index b3f417a8..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/onedrive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/onedrive_vault_selected.png b/presentation/src/main/res/drawable-mdpi/onedrive_vault_selected.png deleted file mode 100644 index 1e4bd83c..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/onedrive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/pcloud_vault.png b/presentation/src/main/res/drawable-mdpi/pcloud_vault.png deleted file mode 100644 index f3ccd64b..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/pcloud_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/pcloud_vault_selected.png b/presentation/src/main/res/drawable-mdpi/pcloud_vault_selected.png deleted file mode 100644 index 648a8f8f..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/pcloud_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/s3_vault.png b/presentation/src/main/res/drawable-mdpi/s3_vault.png deleted file mode 100644 index ddfe67e4..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/s3_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/s3_vault_selected.png b/presentation/src/main/res/drawable-mdpi/s3_vault_selected.png deleted file mode 100644 index 1a1a7e9e..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/s3_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/vault_unlocked.png b/presentation/src/main/res/drawable-mdpi/vault_unlocked.png deleted file mode 100755 index cbd35a23..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/vault_unlocked.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/webdav_vault.png b/presentation/src/main/res/drawable-mdpi/webdav_vault.png deleted file mode 100644 index 2d8c762f..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/webdav_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-mdpi/webdav_vault_selected.png b/presentation/src/main/res/drawable-mdpi/webdav_vault_selected.png deleted file mode 100644 index be58746c..00000000 Binary files a/presentation/src/main/res/drawable-mdpi/webdav_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-night/ic_clear_gray.xml b/presentation/src/main/res/drawable-night/ic_clear_gray.xml new file mode 100644 index 00000000..70dfd52f --- /dev/null +++ b/presentation/src/main/res/drawable-night/ic_clear_gray.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable-night/ic_done_gray.xml b/presentation/src/main/res/drawable-night/ic_done_gray.xml new file mode 100644 index 00000000..5f99d9aa --- /dev/null +++ b/presentation/src/main/res/drawable-night/ic_done_gray.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable-xhdpi/background_splash_cryptomator.png b/presentation/src/main/res/drawable-xhdpi/background_splash_cryptomator.png deleted file mode 100644 index d51a6757..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/background_splash_cryptomator.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/dropbox_vault.png b/presentation/src/main/res/drawable-xhdpi/dropbox_vault.png deleted file mode 100644 index 745ababe..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/dropbox_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/dropbox_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/dropbox_vault_selected.png deleted file mode 100644 index 92ae71d3..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/dropbox_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/google_drive_vault.png b/presentation/src/main/res/drawable-xhdpi/google_drive_vault.png deleted file mode 100644 index cfa960ef..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/google_drive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/google_drive_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/google_drive_vault_selected.png deleted file mode 100644 index 2166ab4f..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/google_drive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/ic_notification.png b/presentation/src/main/res/drawable-xhdpi/ic_notification.png new file mode 100644 index 00000000..bd1111b3 Binary files /dev/null and b/presentation/src/main/res/drawable-xhdpi/ic_notification.png differ diff --git a/presentation/src/main/res/drawable-xhdpi/local_fs_vault.png b/presentation/src/main/res/drawable-xhdpi/local_fs_vault.png deleted file mode 100644 index f761c547..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/local_fs_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/local_fs_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/local_fs_vault_selected.png deleted file mode 100644 index f6461dd2..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/local_fs_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/onedrive_vault.png b/presentation/src/main/res/drawable-xhdpi/onedrive_vault.png deleted file mode 100644 index 84c2f91c..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/onedrive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/onedrive_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/onedrive_vault_selected.png deleted file mode 100644 index 9225a553..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/onedrive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/pcloud_vault.png b/presentation/src/main/res/drawable-xhdpi/pcloud_vault.png deleted file mode 100644 index 13d91ac5..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/pcloud_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/pcloud_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/pcloud_vault_selected.png deleted file mode 100644 index 593e456c..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/pcloud_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/s3_vault.png b/presentation/src/main/res/drawable-xhdpi/s3_vault.png deleted file mode 100644 index edc4d47f..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/s3_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/s3_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/s3_vault_selected.png deleted file mode 100644 index 852ef2ce..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/s3_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/vault_unlocked.png b/presentation/src/main/res/drawable-xhdpi/vault_unlocked.png deleted file mode 100755 index 3f995f64..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/vault_unlocked.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/webdav_vault.png b/presentation/src/main/res/drawable-xhdpi/webdav_vault.png deleted file mode 100644 index 52ff0b24..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/webdav_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xhdpi/webdav_vault_selected.png b/presentation/src/main/res/drawable-xhdpi/webdav_vault_selected.png deleted file mode 100644 index 85abf330..00000000 Binary files a/presentation/src/main/res/drawable-xhdpi/webdav_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/background_splash_cryptomator.png b/presentation/src/main/res/drawable-xxhdpi/background_splash_cryptomator.png deleted file mode 100644 index e7977980..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/background_splash_cryptomator.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/dropbox_vault.png b/presentation/src/main/res/drawable-xxhdpi/dropbox_vault.png deleted file mode 100644 index a8e8c3eb..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/dropbox_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/dropbox_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/dropbox_vault_selected.png deleted file mode 100644 index 92939cce..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/dropbox_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/google_drive_vault.png b/presentation/src/main/res/drawable-xxhdpi/google_drive_vault.png deleted file mode 100644 index e3edf692..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/google_drive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/google_drive_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/google_drive_vault_selected.png deleted file mode 100644 index 395f4948..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/google_drive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/ic_notification.png b/presentation/src/main/res/drawable-xxhdpi/ic_notification.png new file mode 100644 index 00000000..7b662c8c Binary files /dev/null and b/presentation/src/main/res/drawable-xxhdpi/ic_notification.png differ diff --git a/presentation/src/main/res/drawable-xxhdpi/local_fs_vault.png b/presentation/src/main/res/drawable-xxhdpi/local_fs_vault.png deleted file mode 100644 index c5ca6629..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/local_fs_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/local_fs_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/local_fs_vault_selected.png deleted file mode 100644 index 7ea7d563..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/local_fs_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/onedrive_vault.png b/presentation/src/main/res/drawable-xxhdpi/onedrive_vault.png deleted file mode 100644 index 5d726678..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/onedrive_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/onedrive_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/onedrive_vault_selected.png deleted file mode 100644 index 364e6516..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/onedrive_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/pcloud_vault.png b/presentation/src/main/res/drawable-xxhdpi/pcloud_vault.png deleted file mode 100644 index 3cf1b337..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/pcloud_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/pcloud_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/pcloud_vault_selected.png deleted file mode 100644 index a6ca25e9..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/pcloud_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/s3_vault.png b/presentation/src/main/res/drawable-xxhdpi/s3_vault.png deleted file mode 100644 index 006f36de..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/s3_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/s3_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/s3_vault_selected.png deleted file mode 100644 index a42452ab..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/s3_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/vault_unlocked.png b/presentation/src/main/res/drawable-xxhdpi/vault_unlocked.png deleted file mode 100755 index 5272e46b..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/vault_unlocked.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/webdav_vault.png b/presentation/src/main/res/drawable-xxhdpi/webdav_vault.png deleted file mode 100644 index ac643f7b..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/webdav_vault.png and /dev/null differ diff --git a/presentation/src/main/res/drawable-xxhdpi/webdav_vault_selected.png b/presentation/src/main/res/drawable-xxhdpi/webdav_vault_selected.png deleted file mode 100644 index 4661a93d..00000000 Binary files a/presentation/src/main/res/drawable-xxhdpi/webdav_vault_selected.png and /dev/null differ diff --git a/presentation/src/main/res/drawable/background_splash.xml b/presentation/src/main/res/drawable/background_splash.xml deleted file mode 100644 index b8180bf1..00000000 --- a/presentation/src/main/res/drawable/background_splash.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - diff --git a/presentation/src/main/res/drawable/dropbox_vault.xml b/presentation/src/main/res/drawable/dropbox_vault.xml new file mode 100644 index 00000000..61e2890f --- /dev/null +++ b/presentation/src/main/res/drawable/dropbox_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/dropbox_vault_selected.xml b/presentation/src/main/res/drawable/dropbox_vault_selected.xml new file mode 100644 index 00000000..1ad2e477 --- /dev/null +++ b/presentation/src/main/res/drawable/dropbox_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/google_drive_vault.xml b/presentation/src/main/res/drawable/google_drive_vault.xml new file mode 100644 index 00000000..c4d0cc93 --- /dev/null +++ b/presentation/src/main/res/drawable/google_drive_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/google_drive_vault_selected.xml b/presentation/src/main/res/drawable/google_drive_vault_selected.xml new file mode 100644 index 00000000..869e25aa --- /dev/null +++ b/presentation/src/main/res/drawable/google_drive_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/ic_clear_gray.xml b/presentation/src/main/res/drawable/ic_clear_gray.xml new file mode 100644 index 00000000..481c0aa6 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_clear_gray.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable/ic_done_gray.xml b/presentation/src/main/res/drawable/ic_done_gray.xml new file mode 100644 index 00000000..2603270e --- /dev/null +++ b/presentation/src/main/res/drawable/ic_done_gray.xml @@ -0,0 +1,9 @@ + + + diff --git a/presentation/src/main/res/drawable/ic_launcher_foreground.xml b/presentation/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 00000000..6979bda7 --- /dev/null +++ b/presentation/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/presentation/src/main/res/drawable/local_fs_vault.xml b/presentation/src/main/res/drawable/local_fs_vault.xml new file mode 100644 index 00000000..28876ee6 --- /dev/null +++ b/presentation/src/main/res/drawable/local_fs_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/local_fs_vault_selected.xml b/presentation/src/main/res/drawable/local_fs_vault_selected.xml new file mode 100644 index 00000000..9e6e392a --- /dev/null +++ b/presentation/src/main/res/drawable/local_fs_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/onedrive_vault.xml b/presentation/src/main/res/drawable/onedrive_vault.xml new file mode 100644 index 00000000..3441917f --- /dev/null +++ b/presentation/src/main/res/drawable/onedrive_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/onedrive_vault_selected.xml b/presentation/src/main/res/drawable/onedrive_vault_selected.xml new file mode 100644 index 00000000..6908527f --- /dev/null +++ b/presentation/src/main/res/drawable/onedrive_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/pcloud_vault.xml b/presentation/src/main/res/drawable/pcloud_vault.xml new file mode 100644 index 00000000..ac96fe18 --- /dev/null +++ b/presentation/src/main/res/drawable/pcloud_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/pcloud_vault_selected.xml b/presentation/src/main/res/drawable/pcloud_vault_selected.xml new file mode 100644 index 00000000..e64095db --- /dev/null +++ b/presentation/src/main/res/drawable/pcloud_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/s3_vault.xml b/presentation/src/main/res/drawable/s3_vault.xml new file mode 100644 index 00000000..98f64a85 --- /dev/null +++ b/presentation/src/main/res/drawable/s3_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/s3_vault_selected.xml b/presentation/src/main/res/drawable/s3_vault_selected.xml new file mode 100644 index 00000000..ae07a5a7 --- /dev/null +++ b/presentation/src/main/res/drawable/s3_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/webdav_vault.xml b/presentation/src/main/res/drawable/webdav_vault.xml new file mode 100644 index 00000000..d203134f --- /dev/null +++ b/presentation/src/main/res/drawable/webdav_vault.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/drawable/webdav_vault_selected.xml b/presentation/src/main/res/drawable/webdav_vault_selected.xml new file mode 100644 index 00000000..e7428f38 --- /dev/null +++ b/presentation/src/main/res/drawable/webdav_vault_selected.xml @@ -0,0 +1,10 @@ + + + diff --git a/presentation/src/main/res/layout/activity_cryptomator_variants.xml b/presentation/src/main/res/layout/activity_cryptomator_variants.xml new file mode 100644 index 00000000..20aa6339 --- /dev/null +++ b/presentation/src/main/res/layout/activity_cryptomator_variants.xml @@ -0,0 +1,314 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +