diff --git a/.gitignore b/.gitignore index 986db55f..000f857e 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,6 @@ local.properties # fdroid **/fastlane/repo/** **/fastlane/tmp/** -**/fastlane/iod-scan-apk.php -**/fastlane/current_iod-scan-apk.php -**/fastlane/current_result.json +**/fastlane/izzyscript/iod-scan-apk.php +**/fastlane/izzyscript/current_iod-scan-apk.php +**/fastlane/izzyscript/current_result_*.json diff --git a/.gitmodules b/.gitmodules index 393a652c..f3a2516e 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,9 @@ [submodule "msa-auth-for-android"] - path = msa-auth-for-android + path = lib/msa-auth-for-android url = https://github.com/SailReal/msa-auth-for-android.git [submodule "subsampling-scale-image-view"] - path = subsampling-scale-image-view + path = lib/subsampling-scale-image-view url = https://github.com/SailReal/subsampling-scale-image-view.git [submodule "pcloud-sdk-java"] - path = pcloud-sdk-java - url = https://github.com/SailReal/pcloud-sdk-java + path = lib/pcloud-sdk-java + url = https://github.com/SailReal/pcloud-sdk-java.git diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index c6c582f6..1ed39b2b 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -186,4 +186,4 @@ - \ No newline at end of file + diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 16b33dfd..65b6cf64 100755 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -2,8 +2,8 @@ - - - + + + - \ No newline at end of file + diff --git a/Gemfile.lock b/Gemfile.lock index 70c6f8a7..6ce84c81 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,7 +1,8 @@ GEM remote: https://rubygems.org/ specs: - CFPropertyList (3.0.3) + CFPropertyList (3.0.4) + rexml addressable (2.8.0) public_suffix (>= 2.0.2, < 5.0) apktools (0.7.4) @@ -9,8 +10,8 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.501.0) - aws-sdk-core (3.121.0) + aws-partitions (1.509.0) + aws-sdk-core (3.121.1) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.239.0) aws-sigv4 (~> 1.1) @@ -18,7 +19,7 @@ GEM aws-sdk-kms (1.48.0) aws-sdk-core (~> 3, >= 3.120.0) aws-sigv4 (~> 1.1) - aws-sdk-s3 (1.102.0) + aws-sdk-s3 (1.103.0) aws-sdk-core (~> 3, >= 3.120.0) aws-sdk-kms (~> 1) aws-sigv4 (~> 1.4) @@ -38,9 +39,9 @@ GEM unf (>= 0.0.5, < 1.0.0) dotenv (2.7.6) ed25519 (1.2.4) - emoji_regex (3.2.2) - excon (0.85.0) - faraday (1.7.2) + emoji_regex (3.2.3) + excon (0.86.0) + faraday (1.8.0) faraday-em_http (~> 1.0) faraday-em_synchrony (~> 1.0) faraday-excon (~> 1.1) @@ -65,7 +66,7 @@ GEM faraday_middleware (1.1.0) faraday (~> 1.0) fastimage (2.2.5) - fastlane (2.193.1) + fastlane (2.195.0) CFPropertyList (>= 2.3, < 4.0.0) addressable (>= 2.8, < 3.0.0) artifactory (~> 3.0) @@ -125,14 +126,14 @@ GEM google-apis-core (>= 0.4, < 2.a) google-apis-playcustomapp_v1 (0.5.0) google-apis-core (>= 0.4, < 2.a) - google-apis-storage_v1 (0.6.0) + google-apis-storage_v1 (0.8.0) google-apis-core (>= 0.4, < 2.a) google-cloud-core (1.6.0) google-cloud-env (~> 1.0) google-cloud-errors (~> 1.0) google-cloud-env (1.5.0) faraday (>= 0.17.3, < 2.0) - google-cloud-errors (1.1.0) + google-cloud-errors (1.2.0) google-cloud-storage (1.34.1) addressable (~> 2.5) digest-crc (~> 0.4) @@ -141,13 +142,13 @@ GEM google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (0.17.1) + googleauth (1.0.0) faraday (>= 0.17.3, < 2.0) jwt (>= 1.4, < 3.0) memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) - signet (~> 0.15) + signet (>= 0.16, < 2.a) highline (2.0.3) http-cookie (1.0.4) domain_name (~> 0.5) @@ -203,7 +204,7 @@ GEM unf (0.1.4) unf_ext unf_ext (0.0.8) - unicode-display_width (1.7.0) + unicode-display_width (1.8.0) webrick (1.7.0) word_wrap (1.0.0) xcodeproj (1.21.0) diff --git a/build.gradle b/build.gradle index ce2ac01a..157c6d16 100644 --- a/build.gradle +++ b/build.gradle @@ -2,7 +2,7 @@ apply from: 'buildsystem/dependencies.gradle' apply plugin: "com.vanniktech.android.junit.jacoco" buildscript { - ext.kotlin_version = '1.5.30' + ext.kotlin_version = '1.5.31' repositories { mavenCentral() google() @@ -39,7 +39,7 @@ allprojects { ext { androidApplicationId = 'org.cryptomator' androidVersionCode = getVersionCode() - androidVersionName = '1.6.0-beta4' + androidVersionName = '1.6.0-SNAPSHOT' } repositories { mavenCentral() diff --git a/buildsystem/dependencies.gradle b/buildsystem/dependencies.gradle index a0788c5b..4c853160 100644 --- a/buildsystem/dependencies.gradle +++ b/buildsystem/dependencies.gradle @@ -18,7 +18,7 @@ ext { // support lib androidSupportAnnotationsVersion = '1.2.0' - androidSupportAppcompatVersion = '1.3.0' + androidSupportAppcompatVersion = '1.3.1' androidSupportDesignVersion = '1.4.0' coreDesugaringVersion = '1.1.5' @@ -29,11 +29,11 @@ ext { rxAndroidVersion = '2.1.1' rxBindingVersion = '2.2.0' - daggerVersion = '2.38.1' + daggerVersion = '2.39' gsonVersion = '2.8.8' - okHttpVersion = '4.9.1' + okHttpVersion = '4.9.2' okHttpDigestVersion = '2.5' velocityVersion = '2.3' @@ -54,9 +54,14 @@ ext { dropboxVersion = '4.0.1' - googleApiServicesVersion = 'v3-rev20210725-1.32.1' - googlePlayServicesVersion = '19.0.0' - googleClientVersion = '1.32.1' + googleApiServicesVersion = 'v3-rev20210919-1.32.1' + googlePlayServicesVersion = '19.2.0' + googleClientVersion = '1.32.1' // keep in sync with https://github.com/SailReal/google-http-java-client + /* + update using https://github.com/SailReal/google-http-java-client with `mvn clean install`, + copying `google-http-client-*.jar` and `google-http-client-android-*.jar` into the lib folder of this project + */ + trackingFreeGoogleCLientVersion = '1.40.1' msgraphVersion = '2.10.0' @@ -69,8 +74,7 @@ ext { // testing dependencies - jUnitVersion = '5.7.1' - jUnit4Version = '4.13.1' + jUnitVersion = '5.8.1' assertJVersion = '1.7.1' mockitoVersion = '3.12.4' mockitoKotlinVersion = '3.2.0' @@ -84,7 +88,7 @@ ext { uiautomatorVersion = '2.2.0' androidxCoreVersion = '1.6.0' - androidxFragmentVersion = '1.3.5' + androidxFragmentVersion = '1.3.6' androidxViewpagerVersion = '1.0.0' androidxSwiperefreshVersion = '1.1.0' androidxPreferenceVersion = '1.1.1' @@ -119,6 +123,8 @@ ext { googleApiClientAndroid: "com.google.api-client:google-api-client-android:${googleClientVersion}", googleApiServicesDrive: "com.google.apis:google-api-services-drive:${googleApiServicesVersion}", googlePlayServicesAuth: "com.google.android.gms:play-services-auth:${googlePlayServicesVersion}", + trackingFreeGoogleCLient : files("lib/google-http-client-${trackingFreeGoogleCLientVersion}.jar"), + trackingFreeGoogleAndroidCLient: files("lib/google-http-client-android-${trackingFreeGoogleCLientVersion}.jar"), greenDao : "org.greenrobot:greendao:${greenDaoVersion}", gson : "com.google.code.gson:gson:${gsonVersion}", hamcrest : "org.hamcrest:hamcrest-all:${hamcrestVersion}", @@ -127,7 +133,6 @@ ext { junitApi : "org.junit.jupiter:junit-jupiter-api:${jUnitVersion}", junitEngine : "org.junit.jupiter:junit-jupiter-engine:${jUnitVersion}", junitParams : "org.junit.jupiter:junit-jupiter-params:${jUnitVersion}", - junit4 : "org.junit.jupiter:junit-jupiter:${jUnit4Version}", junit4Engine : "org.junit.vintage:junit-vintage-engine:${jUnitVersion}", minIo : "io.minio:minio:${minIoVersion}", mockito : "org.mockito:mockito-core:${mockitoVersion}", diff --git a/data/build.gradle b/data/build.gradle index a3a6bfc2..211a64e4 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -120,27 +120,54 @@ dependencies { implementation dependencies.stax api dependencies.minIo - playstoreImplementation dependencies.googlePlayServicesAuth - apkstoreImplementation dependencies.googlePlayServicesAuth + playstoreImplementation(dependencies.googlePlayServicesAuth) { + exclude module: 'guava-jdk5' + exclude module: 'httpclient' + exclude module: 'googlehttpclient' + exclude group: "com.google.http-client", module: "google-http-client" + } + apkstoreImplementation(dependencies.googlePlayServicesAuth) { + exclude module: 'guava-jdk5' + exclude module: 'httpclient' + exclude module: "google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" + } playstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: 'googlehttpclient' + exclude group: "com.google.http-client", module: "google-http-client" } apkstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: "google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" } playstoreImplementation(dependencies.googleApiClientAndroid) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: "google-http-client" + exclude module: "jetified-google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" + exclude group: "com.google.http-client", module: "jetified-google-http-client" } apkstoreImplementation(dependencies.googleApiClientAndroid) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: "google-http-client" + exclude module: "jetified-google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" + exclude group: "com.google.http-client", module: "jetified-google-http-client" } + playstoreImplementation dependencies.trackingFreeGoogleCLient + apkstoreImplementation dependencies.trackingFreeGoogleCLient + playstoreImplementation dependencies.trackingFreeGoogleAndroidCLient + apkstoreImplementation dependencies.trackingFreeGoogleAndroidCLient + // rest implementation dependencies.rxJava implementation dependencies.rxAndroid @@ -163,8 +190,6 @@ dependencies { testImplementation dependencies.junitApi testRuntimeOnly dependencies.junitEngine testImplementation dependencies.junitParams - - testImplementation dependencies.junit4 testRuntimeOnly dependencies.junit4Engine testImplementation dependencies.mockito diff --git a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt index bc085a87..6b17040e 100644 --- a/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt +++ b/data/src/main/java/org/cryptomator/data/cloud/crypto/CryptoImplVaultFormat7.kt @@ -285,7 +285,7 @@ open class CryptoImplVaultFormat7 : CryptoImplDecorator { ByteArrayOutputStream().use { out -> cloudContentRepository.read(file, null, out, ProgressAware.NO_OP_PROGRESS_AWARE_DOWNLOAD) if (dirfileIsEmpty(out)) { - throw EmptyDirFileException(file.name, file.path) + throw EmptyDirFileException(file.parent.name, file.path) } return out.toByteArray() } diff --git a/domain/build.gradle b/domain/build.gradle index de703a84..9bc1cd3f 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -65,7 +65,6 @@ dependencies { testRuntimeOnly dependencies.junitEngine testImplementation dependencies.junitParams - testImplementation dependencies.junit4 testRuntimeOnly dependencies.junit4Engine testImplementation dependencies.mockito diff --git a/fastlane/Fastfile b/fastlane/Fastfile index acc77ce1..9018300c 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -65,6 +65,9 @@ platform :android do |options| } ) + checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'playstore') + checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'playstore') + upload_to_play_store( track: deploy_target, apk: lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], @@ -100,6 +103,9 @@ platform :android do |options| } ) + checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'apkstore') + checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'apkstore') + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}.apk") server_host = ENV["APK_STORE_BASIC_URL"] @@ -182,7 +188,8 @@ platform :android do |options| } ) - checkTrackingAddedInDependency(alpha:options[:alpha], beta:options[:beta]) + checkTrackingAddedInDependencyUsingIzzyScript(alpha:options[:alpha], beta:options[:beta], flavor: 'fdroid') + checkTrackingAddedInDependencyUsingExodus(alpha:options[:alpha], beta:options[:beta], flavor: 'fdroid') if options[:alpha] or options[:beta] puts "Skipping deployment to F-Droid cause there isn't currently a alpha/beta channel" @@ -213,44 +220,61 @@ platform :android do |options| FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "release/Cryptomator-#{version}_fdroid_signed.apk") end - desc "Check if tracking added in some dependency" - lane :checkTrackingAddedInDependency do |options| + desc "Check if tracking added in some dependency using Izzy's script" + lane :checkTrackingAddedInDependencyUsingIzzyScript do |options| + flavor = options[:flavor] + puts "Check if script file is latest" - sh("wget -O current_iod-scan-apk.php https://gitlab.com/fdroid/issuebot/-/raw/master/modules/iod-scan-apk.php") + Dir.chdir("izzyscript") do + sh("wget -O current_iod-scan-apk.php https://gitlab.com/fdroid/issuebot/-/raw/master/modules/iod-scan-apk.php") - same_script = FileUtils.compare_file("iod-scan-apk.php", "current_iod-scan-apk.php") - if same_script - puts "Script file unchanged" - FileUtils.rm("current_iod-scan-apk.php") - else - UI.error("Script updated, check diff, download and save to iod-scan-apk.php") - fail + same_script = FileUtils.compare_file("iod-scan-apk.php", "current_iod-scan-apk.php") + if same_script + puts "Script file unchanged" + FileUtils.rm("current_iod-scan-apk.php") + else + UI.error("Script updated, check diff, download and save to iod-scan-apk.php") + fail + end + + FileUtils.mkdir("unsigned") + + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "unsigned/org.cryptomator_fdroid.apk") + + sh("ISSUEBOT_CURRENT_APPLICATION_ID=org.cryptomator ISSUEBOT_CURRENT_REPLY_FILE=current_result_#{flavor}.json php iod-scan-apk.php") + + # clean up + FileUtils.rm("libinfo.txt") + FileUtils.rm("libsmali.txt") + FileUtils.rm("org.cryptomator_fdroid.apk") + FileUtils.rm_r("unsigned") + FileUtils.rm_r("org.cryptomator_fdroid") + + puts "Check if something changed in the APK regarding the dependencies" + + report = JSON.parse(File.read("result_#{flavor}.json"))["report"] + current_report = JSON.parse(File.read("current_result_#{flavor}.json"))["report"] + + if report.eql?(current_report) + puts "Dependencies unchanged" + FileUtils.rm("current_result_#{flavor}.json") + else + UI.error("Dependencies changed, check result of current_result.json, if no problem, move it to result.json, commit and retry") + fail + end end + end - FileUtils.mkdir("unsigned") + desc "Check if tracking added in some dependency using exodus" + lane :checkTrackingAddedInDependencyUsingExodus do |options| + FileUtils.mkdir("exodus-test") - FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "unsigned/org.cryptomator_fdroid.apk") + FileUtils.cp(lane_context[SharedValues::GRADLE_APK_OUTPUT_PATH], "exodus-test/org.cryptomator.apk") - sh("ISSUEBOT_CURRENT_APPLICATION_ID=org.cryptomator ISSUEBOT_CURRENT_REPLY_FILE=current_result.json php iod-scan-apk.php") + puts "Check if a tracking library was added" + sh("docker run -v $(pwd)/exodus-test/org.cryptomator.apk:/app.apk --rm -i exodusprivacy/exodus-standalone | tail -1 | grep -q 'Found trackers: 0'") - # clean up - FileUtils.rm("libinfo.txt") - FileUtils.rm("libsmali.txt") - FileUtils.rm_r("unsigned") - FileUtils.rm_r("org.cryptomator_fdroid") - - puts "Check if something changed in the APK regarding the dependencies" - - report = JSON.parse(File.read("result.json"))["report"] - current_report = JSON.parse(File.read("current_result.json"))["report"] - - if report.eql?(current_report) - puts "Dependencies unchanged" - FileUtils.rm("current_result.json") - else - UI.error("Dependencies changed, check result of current_result.json, if no problem, move it to result.json, commit and retry") - fail - end + FileUtils.rm_r("exodus-test") end desc "Create GitHub draft release" diff --git a/fastlane/README.md b/fastlane/README.md index bca77c73..5edd2012 100644 --- a/fastlane/README.md +++ b/fastlane/README.md @@ -41,11 +41,16 @@ Deploy new version to server fastlane android deployToFDroid ``` Deploy new version to F-Droid -### android checkTrackingAddedInDependency +### android checkTrackingAddedInDependencyUsingIzzyScript ``` -fastlane android checkTrackingAddedInDependency +fastlane android checkTrackingAddedInDependencyUsingIzzyScript ``` -Check if tracking added in some dependency +Check if tracking added in some dependency using Izzy's script +### android checkTrackingAddedInDependencyUsingExodus +``` +fastlane android checkTrackingAddedInDependencyUsingExodus +``` +Check if tracking added in some dependency using exodus ### android createGitHubDraftRelease ``` fastlane android createGitHubDraftRelease diff --git a/fastlane/izzyscript/result_apkstore.json b/fastlane/izzyscript/result_apkstore.json new file mode 100644 index 00000000..7ff782e7 --- /dev/null +++ b/fastlane/izzyscript/result_apkstore.json @@ -0,0 +1 @@ +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n\n5 offender(s). Full report available here.
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/services/msa","name":"MSA Auth for Android","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2687 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 28256 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 60 libraries, 5 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/result.json b/fastlane/izzyscript/result_fdroid.json similarity index 100% rename from fastlane/result.json rename to fastlane/izzyscript/result_fdroid.json diff --git a/fastlane/izzyscript/result_playstore.json b/fastlane/izzyscript/result_playstore.json new file mode 100644 index 00000000..7ff782e7 --- /dev/null +++ b/fastlane/izzyscript/result_playstore.json @@ -0,0 +1 @@ +{"applicationId":"org.cryptomator","emoji":[],"labels":["scanner-warning"],"report":"

APK library scanner

\nunsigned/org.cryptomator_fdroid.apk\nOffending libs:
\n\n5 offender(s). Full report available here.
\n","reportData":{"unsigned/org.cryptomator_fdroid.apk":[{"id":"/android/support/v4","name":"Android Support v4","typ":"Development Framework","anti":""},{"id":"/androidx/activity","name":"AndroidX Activity","typ":"Utility","anti":""},{"id":"/androidx/annotation","name":"Android Jetpack Annotations","typ":"Utility","anti":""},{"id":"/androidx/arch","name":"Arch","typ":"Utility","anti":""},{"id":"/androidx/appcompat","name":"AppCompat","typ":"Utility","anti":""},{"id":"/androidx/biometric","name":"Biometric","typ":"Utility","anti":""},{"id":"/androidx/collection","name":"Android Support Library collections","typ":"Utility","anti":""},{"id":"/androidx/constraintlayout","name":"Constraint Layout Library","typ":"Utility","anti":""},{"id":"/androidx/core","name":"Androidx Core","typ":"Utility","anti":""},{"id":"/androidx/cursoradapter","name":"AndroidX Cursor Adapter","typ":"Utility","anti":""},{"id":"/androidx/documentfile","name":"Documentfile","typ":"UI Component","anti":""},{"id":"/androidx/exifinterface","name":"Exifinterface","typ":"Utility","anti":""},{"id":"/androidx/fragment/app","name":"Androidx Fragment","typ":"Development Aid","anti":""},{"id":"/androidx/legacy","name":"androidx.legacy","typ":"Utility","anti":""},{"id":"/androidx/lifecycle","name":"Lifecycle","typ":"Utility","anti":""},{"id":"/androidx/loader","name":"Loader","typ":"Utility","anti":""},{"id":"/androidx/localbroadcastmanager","name":"AndroidX Local Broadcast Manager","typ":"Utility","anti":""},{"id":"/androidx/preference","name":"Preference","typ":"Utility","anti":""},{"id":"/androidx/print","name":"Print","typ":"Utility","anti":""},{"id":"/androidx/savedstate","name":"Android Activity Saved State","typ":"Utility","anti":""},{"id":"/androidx/transition","name":"Transition","typ":"UI Component","anti":""},{"id":"/androidx/vectordrawable","name":"Vectordrawable","typ":"UI Component","anti":""},{"id":"/androidx/versionedparcelable","name":"Android Jetpack VersionedParcelable","typ":"Utility","anti":""},{"id":"/androidx/viewpager2","name":"AndroidX Widget ViewPager2","typ":"UI Component","anti":""},{"id":"/com/burgstaller/okhttp","name":"okhttp-digest","typ":"Utility","anti":""},{"id":"/com/davemorrissey/labs/subscaleview","name":"Subsampling Scale Image View","typ":"UI Component","anti":""},{"id":"/com/dropbox/core","name":"Dropbox Core SDK for Java","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/fasterxml","name":"Fasterxml","typ":"Utility","anti":""},{"id":"/com/google/android/gms","name":"Google Mobile Services","typ":"Development Framework","anti":"NonFreeDep"},{"id":"/com/google/android/material","name":"Google Material Design","typ":"Utility","anti":""},{"id":"/com/google/api/client","name":"Google API Client Libraries","typ":"Development Framework","anti":"NonFreeNet"},{"id":"/com/google/common","name":"Google Core Libraries for Java 6+","typ":"Utility","anti":""},{"id":"/com/google/errorprone","name":"Error Prone","typ":"Utility","anti":""},{"id":"/com/google/gson","name":"Google Gson","typ":"Utility","anti":""},{"id":"/com/google/j2objc","name":"J2ObjC","typ":"Utility","anti":""},{"id":"/com/jakewharton/rxbinding","name":"RxBinding","typ":"Utility","anti":""},{"id":"/com/microsoft/graph","name":"Microsoft Graph-SDK","typ":"Development Framework","anti":""},{"id":"/com/microsoft/services/msa","name":"MSA Auth for Android","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/nulabinc/zxcvbn","name":"zxcvbn4j","typ":"Utility","anti":""},{"id":"/com/pcloud/sdk","name":"pCloud Java SDK","typ":"Utility","anti":"NonFreeNet"},{"id":"/com/simplecityapps/recyclerview_fastscroll","name":"RecyclerView-FastScroll","typ":"UI Component","anti":""},{"id":"/com/squareup/okhttp","name":"OkHttp","typ":"Utility","anti":""},{"id":"/com/tomclaw/cache","name":"Disk LRU Cache","typ":"Utility","anti":""},{"id":"/dagger","name":"Dagger","typ":"Utility","anti":""},{"id":"/io/jsonwebtoken","name":"Java JWT","typ":"Utility","anti":""},{"id":"/io/reactivex","name":"RxJava","typ":"Utility","anti":""},{"id":"/javax/annotation","name":"JavaX Annotation API","typ":"Utility","anti":""},{"id":"/javax/inject","name":"JavaX Dependency Injection","typ":"Utility","anti":""},{"id":"/kotlin","name":"Kotlin","typ":"Utility","anti":""},{"id":"/kotlinx/coroutines","name":"kotlinx.coroutines","typ":"Utility","anti":""},{"id":"/okio","name":"OkHttp okio Framework","typ":"Utility","anti":""},{"id":"/org/apache/commons","name":"Apache Commons","typ":"Development Framework","anti":""},{"id":"/org/apache/http","name":"Apache Http","typ":"Utility","anti":""},{"id":"/org/checkerframework","name":"Checker Framework","typ":"Utility","anti":""},{"id":"/org/greenrobot/greendao","name":"greenDAO","typ":"Utility","anti":""},{"id":"/org/intellij","name":"IntelliJ IDEA","typ":"Utility","anti":""},{"id":"/org/reactivestreams","name":"Reactive Streams","typ":"Utility","anti":""},{"id":"/org/simpleframework","name":"Simple","typ":"Utility","anti":""},{"id":"/org/slf4j","name":"Simple Logging Facade for Java","typ":"Utility","anti":""},{"id":"/timber/log","name":"Timber","typ":"Utility","anti":""}],"log":["Fetching library definitions from https://gitlab.com/IzzyOnDroid/repo/-/raw/master/lib","Loaded 2687 library definitions","Analyzing 'unsigned/org.cryptomator_fdroid.apk'...","Apktool returned: 0","Read 28256 bytes of smali path names from 'org.cryptomator_fdroid.dirlist'","Identified 60 libraries, 5 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/lib/google-http-client-1.40.1.jar b/lib/google-http-client-1.40.1.jar new file mode 100644 index 00000000..175ee6fc Binary files /dev/null and b/lib/google-http-client-1.40.1.jar differ diff --git a/lib/google-http-client-android-1.40.1.jar b/lib/google-http-client-android-1.40.1.jar new file mode 100644 index 00000000..5ce9a8e1 Binary files /dev/null and b/lib/google-http-client-android-1.40.1.jar differ diff --git a/msa-auth-for-android b/lib/msa-auth-for-android similarity index 100% rename from msa-auth-for-android rename to lib/msa-auth-for-android diff --git a/lib/pcloud-sdk-java b/lib/pcloud-sdk-java new file mode 160000 index 00000000..4226c0b1 --- /dev/null +++ b/lib/pcloud-sdk-java @@ -0,0 +1 @@ +Subproject commit 4226c0b1297a12dc5937b2d3eae7962f146cf683 diff --git a/subsampling-scale-image-view b/lib/subsampling-scale-image-view similarity index 100% rename from subsampling-scale-image-view rename to lib/subsampling-scale-image-view diff --git a/pcloud-sdk-java b/pcloud-sdk-java deleted file mode 160000 index e62e9480..00000000 --- a/pcloud-sdk-java +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e62e948056a17ddc2ada4ad23c27e9b451078787 diff --git a/presentation/build.gradle b/presentation/build.gradle index d54340b2..90e807f5 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -149,21 +149,37 @@ dependencies { playstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: 'googlehttpclient' + exclude group: "com.google.http-client", module: "google-http-client" } apkstoreImplementation(dependencies.googleApiServicesDrive) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude group: "com.google.http-client", module: "google-http-client" } playstoreImplementation(dependencies.googleApiClientAndroid) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: "google-http-client" + exclude module: "jetified-google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" + exclude group: "com.google.http-client", module: "jetified-google-http-client" } apkstoreImplementation(dependencies.googleApiClientAndroid) { exclude module: 'guava-jdk5' exclude module: 'httpclient' + exclude module: "google-http-client" + exclude module: "jetified-google-http-client" + exclude group: "com.google.http-client", module: "google-http-client" + exclude group: "com.google.http-client", module: "jetified-google-http-client" } + playstoreImplementation dependencies.trackingFreeGoogleCLient + apkstoreImplementation dependencies.trackingFreeGoogleCLient + playstoreImplementation dependencies.trackingFreeGoogleAndroidCLient + apkstoreImplementation dependencies.trackingFreeGoogleAndroidCLient + // rest implementation dependencies.rxJava implementation dependencies.rxAndroid @@ -212,8 +228,6 @@ dependencies { testImplementation dependencies.junitApi testRuntimeOnly dependencies.junitEngine testImplementation dependencies.junitParams - - testImplementation dependencies.junit4 testRuntimeOnly dependencies.junit4Engine testImplementation dependencies.mockito diff --git a/presentation/src/main/AndroidManifest.xml b/presentation/src/main/AndroidManifest.xml index 61dea3f0..0e2bbcf7 100644 --- a/presentation/src/main/AndroidManifest.xml +++ b/presentation/src/main/AndroidManifest.xml @@ -101,7 +101,6 @@ - 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 db8337fe..07aec966 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,7 +13,6 @@ 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.EmptyDirIdFileInfoActivity; import org.cryptomator.presentation.ui.activity.ImagePreviewActivity; import org.cryptomator.presentation.ui.activity.LicenseCheckActivity; import org.cryptomator.presentation.ui.activity.LicensesActivity; @@ -32,7 +31,6 @@ import org.cryptomator.presentation.ui.fragment.BrowseFilesFragment; import org.cryptomator.presentation.ui.fragment.ChooseCloudServiceFragment; import org.cryptomator.presentation.ui.fragment.CloudConnectionListFragment; import org.cryptomator.presentation.ui.fragment.CloudSettingsFragment; -import org.cryptomator.presentation.ui.fragment.EmptyDirIdFileInfoFragment; import org.cryptomator.presentation.ui.fragment.ImagePreviewFragment; import org.cryptomator.presentation.ui.fragment.S3AddOrChangeFragment; import org.cryptomator.presentation.ui.fragment.SetPasswordFragment; @@ -96,10 +94,6 @@ public interface ActivityComponent { void inject(CloudConnectionListActivity cloudConnectionListActivity); - void inject(EmptyDirIdFileInfoActivity emptyDirIdFileInfoActivity); - - void inject(EmptyDirIdFileInfoFragment emptyDirIdFileInfoFragment); - void inject(BiometricAuthSettingsActivity biometricAuthSettingsActivity); void inject(BiometricAuthSettingsFragment biometricAuthSettingsFragment); diff --git a/presentation/src/main/java/org/cryptomator/presentation/intent/EmptyDirIdFileInfoIntent.java b/presentation/src/main/java/org/cryptomator/presentation/intent/EmptyDirIdFileInfoIntent.java deleted file mode 100644 index e5ec6bd5..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/intent/EmptyDirIdFileInfoIntent.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.cryptomator.presentation.intent; - -import org.cryptomator.generator.Intent; -import org.cryptomator.presentation.ui.activity.EmptyDirIdFileInfoActivity; - -@Intent(EmptyDirIdFileInfoActivity.class) -public interface EmptyDirIdFileInfoIntent { - - String dirName(); - - String dirFilePath(); - -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/model/ProgressStateModel.kt b/presentation/src/main/java/org/cryptomator/presentation/model/ProgressStateModel.kt index 18a2372f..93acd60c 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/model/ProgressStateModel.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/model/ProgressStateModel.kt @@ -5,9 +5,9 @@ import java.io.Serializable open class ProgressStateModel private constructor(private val name: String, image: Image, text: Text, selectable: Boolean) : Serializable { - private val imageResourceId: Int - private val textResourceId: Int - val isSelectable: Boolean + private val imageResourceId: Int = image.id() + private val textResourceId: Int = text.id() + val isSelectable: Boolean = selectable private constructor(name: String) : this(name, noImage(), noText()) private constructor(name: String, text: Text) : this(name, noImage(), text) @@ -76,9 +76,4 @@ open class ProgressStateModel private constructor(private val name: String, imag } } - init { - imageResourceId = image.id() - textResourceId = text.id() - isSelectable = selectable - } } diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/AutoUploadChooseVaultPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/AutoUploadChooseVaultPresenter.kt index 64ed5926..3af6a9fb 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/AutoUploadChooseVaultPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/AutoUploadChooseVaultPresenter.kt @@ -21,7 +21,6 @@ import org.cryptomator.presentation.ui.activity.view.AutoUploadChooseVaultView import org.cryptomator.presentation.workflow.ActivityResult import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler import org.cryptomator.util.SharedPreferencesHandler -import java.util.* import javax.inject.Inject @PerView diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt index 7124b351..47e03969 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/BrowseFilesPresenter.kt @@ -13,9 +13,31 @@ import org.cryptomator.domain.CloudFile import org.cryptomator.domain.CloudFolder import org.cryptomator.domain.CloudNode import org.cryptomator.domain.di.PerView -import org.cryptomator.domain.exception.* -import org.cryptomator.domain.usecases.* -import org.cryptomator.domain.usecases.cloud.* +import org.cryptomator.domain.exception.CloudNodeAlreadyExistsException +import org.cryptomator.domain.exception.EmptyDirFileException +import org.cryptomator.domain.exception.FatalBackendException +import org.cryptomator.domain.exception.NoDirFileException +import org.cryptomator.domain.exception.NoSuchCloudFileException +import org.cryptomator.domain.exception.SymLinkException +import org.cryptomator.domain.usecases.CloudFolderRecursiveListing +import org.cryptomator.domain.usecases.CloudNodeRecursiveListing +import org.cryptomator.domain.usecases.CopyDataUseCase +import org.cryptomator.domain.usecases.DownloadFile +import org.cryptomator.domain.usecases.ResultRenamed +import org.cryptomator.domain.usecases.cloud.CreateFolderUseCase +import org.cryptomator.domain.usecases.cloud.DeleteNodesUseCase +import org.cryptomator.domain.usecases.cloud.DownloadFilesUseCase +import org.cryptomator.domain.usecases.cloud.DownloadState +import org.cryptomator.domain.usecases.cloud.GetCloudListRecursiveUseCase +import org.cryptomator.domain.usecases.cloud.GetCloudListUseCase +import org.cryptomator.domain.usecases.cloud.MoveFilesUseCase +import org.cryptomator.domain.usecases.cloud.MoveFoldersUseCase +import org.cryptomator.domain.usecases.cloud.Progress +import org.cryptomator.domain.usecases.cloud.RenameFileUseCase +import org.cryptomator.domain.usecases.cloud.RenameFolderUseCase +import org.cryptomator.domain.usecases.cloud.UploadFile +import org.cryptomator.domain.usecases.cloud.UploadFilesUseCase +import org.cryptomator.domain.usecases.cloud.UploadState import org.cryptomator.domain.usecases.vault.AssertUnlockedUseCase import org.cryptomator.generator.Callback import org.cryptomator.generator.InjectIntent @@ -28,26 +50,48 @@ import org.cryptomator.presentation.intent.BrowseFilesIntent import org.cryptomator.presentation.intent.ChooseCloudNodeSettings import org.cryptomator.presentation.intent.IntentBuilder import org.cryptomator.presentation.intent.Intents -import org.cryptomator.presentation.model.* -import org.cryptomator.presentation.model.mappers.* +import org.cryptomator.presentation.model.CloudFileModel +import org.cryptomator.presentation.model.CloudFolderModel +import org.cryptomator.presentation.model.CloudModel +import org.cryptomator.presentation.model.CloudNodeModel +import org.cryptomator.presentation.model.ImagePreviewFilesStore +import org.cryptomator.presentation.model.ProgressModel +import org.cryptomator.presentation.model.ProgressStateModel +import org.cryptomator.presentation.model.mappers.CloudFileModelMapper +import org.cryptomator.presentation.model.mappers.CloudFolderModelMapper +import org.cryptomator.presentation.model.mappers.CloudNodeModelMapper +import org.cryptomator.presentation.model.mappers.ProgressModelMapper +import org.cryptomator.presentation.model.mappers.ProgressStateModelMapper import org.cryptomator.presentation.service.OpenWritableFileNotification import org.cryptomator.presentation.ui.activity.view.BrowseFilesView import org.cryptomator.presentation.ui.dialog.ExportCloudFilesDialog import org.cryptomator.presentation.ui.dialog.FileNameDialog -import org.cryptomator.presentation.util.* -import org.cryptomator.presentation.workflow.* +import org.cryptomator.presentation.util.ContentResolverUtil +import org.cryptomator.presentation.util.DownloadFileUtil +import org.cryptomator.presentation.util.FileNameBlacklist +import org.cryptomator.presentation.util.FileUtil +import org.cryptomator.presentation.util.FolderNameBlacklist +import org.cryptomator.presentation.util.ShareFileHelper +import org.cryptomator.presentation.workflow.ActivityResult +import org.cryptomator.presentation.workflow.AddExistingVaultWorkflow +import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler +import org.cryptomator.presentation.workflow.CreateNewVaultWorkflow +import org.cryptomator.presentation.workflow.PermissionsResult +import org.cryptomator.presentation.workflow.Workflow import org.cryptomator.util.ExceptionUtil import org.cryptomator.util.SharedPreferencesHandler import org.cryptomator.util.file.FileCacheUtils import org.cryptomator.util.file.MimeType import org.cryptomator.util.file.MimeTypes -import java.io.* +import java.io.File +import java.io.FileInputStream +import java.io.FileNotFoundException +import java.io.FileOutputStream +import java.io.Serializable import java.security.DigestInputStream import java.security.MessageDigest -import java.util.* import java.util.function.Supplier import javax.inject.Inject -import kotlin.collections.ArrayList import kotlin.reflect.KClass import timber.log.Timber @@ -167,10 +211,7 @@ class BrowseFilesPresenter @Inject constructor( // return } e is EmptyDirFileException -> { - Intents.emptyDirIdFileInfoIntent() // - .withDirName(e.dirName) // - .withDirFilePath(e.filePath) // - .startActivity(this@BrowseFilesPresenter) + view?.showNoDirFileDialog(e.dirName, e.filePath) } e is SymLinkException -> { view?.showSymLinkDialog() 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 1fa66b76..ff98ce85 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/CloudConnectionListPresenter.kt @@ -31,7 +31,6 @@ import org.cryptomator.presentation.ui.activity.view.CloudConnectionListView import org.cryptomator.presentation.ui.dialog.PCloudCredentialsUpdatedDialog import org.cryptomator.presentation.workflow.ActivityResult import org.cryptomator.util.crypto.CredentialCryptor -import java.util.* import java.util.concurrent.atomic.AtomicReference import javax.inject.Inject import timber.log.Timber diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/EmptyDirIdFileInfoPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/EmptyDirIdFileInfoPresenter.kt deleted file mode 100644 index 25dd5a32..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/EmptyDirIdFileInfoPresenter.kt +++ /dev/null @@ -1,18 +0,0 @@ -package org.cryptomator.presentation.presenter - -import android.content.Intent -import android.net.Uri -import org.cryptomator.domain.di.PerView -import org.cryptomator.presentation.exception.ExceptionHandlers -import org.cryptomator.presentation.ui.activity.view.EmptyDirFileView -import javax.inject.Inject - -@PerView -class EmptyDirIdFileInfoPresenter @Inject constructor(exceptionMappings: ExceptionHandlers) : Presenter(exceptionMappings) { - - fun onShowMoreInfoButtonPressed() { - val intent = Intent(Intent.ACTION_VIEW) - intent.data = Uri.parse("https://cryptomator.org/help/articles/sanitizer") - context().startActivity(intent) - } -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/presenter/SharedFilesPresenter.kt b/presentation/src/main/java/org/cryptomator/presentation/presenter/SharedFilesPresenter.kt index 4ed7b75f..8d168049 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/presenter/SharedFilesPresenter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/presenter/SharedFilesPresenter.kt @@ -3,10 +3,19 @@ package org.cryptomator.presentation.presenter import android.Manifest import android.net.Uri import org.cryptomator.data.cloud.crypto.CryptoCloud -import org.cryptomator.domain.* +import org.cryptomator.domain.Cloud +import org.cryptomator.domain.CloudFile +import org.cryptomator.domain.CloudFolder +import org.cryptomator.domain.CloudNode +import org.cryptomator.domain.Vault import org.cryptomator.domain.di.PerView import org.cryptomator.domain.usecases.GetDecryptedCloudForVaultUseCase -import org.cryptomator.domain.usecases.cloud.* +import org.cryptomator.domain.usecases.cloud.GetCloudListUseCase +import org.cryptomator.domain.usecases.cloud.GetRootFolderUseCase +import org.cryptomator.domain.usecases.cloud.Progress +import org.cryptomator.domain.usecases.cloud.UploadFile +import org.cryptomator.domain.usecases.cloud.UploadFilesUseCase +import org.cryptomator.domain.usecases.cloud.UploadState import org.cryptomator.domain.usecases.vault.GetVaultListUseCase import org.cryptomator.generator.Callback import org.cryptomator.generator.InstanceState @@ -15,7 +24,11 @@ import org.cryptomator.presentation.exception.ExceptionHandlers import org.cryptomator.presentation.intent.ChooseCloudNodeSettings import org.cryptomator.presentation.intent.Intents import org.cryptomator.presentation.intent.UnlockVaultIntent -import org.cryptomator.presentation.model.* +import org.cryptomator.presentation.model.CloudFolderModel +import org.cryptomator.presentation.model.CloudModel +import org.cryptomator.presentation.model.ProgressModel +import org.cryptomator.presentation.model.SharedFileModel +import org.cryptomator.presentation.model.VaultModel import org.cryptomator.presentation.model.mappers.CloudFolderModelMapper import org.cryptomator.presentation.model.mappers.ProgressModelMapper import org.cryptomator.presentation.ui.activity.view.SharedFilesView @@ -25,7 +38,6 @@ import org.cryptomator.presentation.workflow.ActivityResult import org.cryptomator.presentation.workflow.AuthenticationExceptionHandler import org.cryptomator.presentation.workflow.PermissionsResult import org.cryptomator.util.file.FileCacheUtils -import java.util.* import javax.inject.Inject import timber.log.Timber diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/EmptyDirIdFileInfoActivity.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/activity/EmptyDirIdFileInfoActivity.kt deleted file mode 100644 index 569e66a9..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/activity/EmptyDirIdFileInfoActivity.kt +++ /dev/null @@ -1,39 +0,0 @@ -package org.cryptomator.presentation.ui.activity - -import org.cryptomator.generator.Activity -import org.cryptomator.generator.InjectIntent -import org.cryptomator.presentation.R -import org.cryptomator.presentation.intent.EmptyDirIdFileInfoIntent -import org.cryptomator.presentation.presenter.EmptyDirIdFileInfoPresenter -import org.cryptomator.presentation.ui.activity.view.EmptyDirFileView -import org.cryptomator.presentation.ui.fragment.EmptyDirIdFileInfoFragment -import javax.inject.Inject -import kotlinx.android.synthetic.main.toolbar_layout.toolbar - -@Activity(layout = R.layout.activity_empty_dir_file_info) -class EmptyDirIdFileInfoActivity : BaseActivity(), EmptyDirFileView { - - @Inject - lateinit var presenter: EmptyDirIdFileInfoPresenter - - @InjectIntent - lateinit var emptyDirIdFileInfoIntent: EmptyDirIdFileInfoIntent - - override fun setupView() { - setupToolbar() - } - - private fun setupToolbar() { - toolbar.title = getString( - R.string.screen_empty_dir_file_info_title, - emptyDirIdFileInfoIntent.dirName() - ) - setSupportActionBar(toolbar) - } - - override fun onResume() { - super.onResume() - (supportFragmentManager.findFragmentByTag("EmptyDirIdFileInfoFragment") as EmptyDirIdFileInfoFragment) - .setDirFilePath(emptyDirIdFileInfoIntent.dirFilePath()) - } -} diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudSettingsAdapter.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudSettingsAdapter.kt index 560a4966..5ad5aab1 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudSettingsAdapter.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/adapter/CloudSettingsAdapter.kt @@ -7,7 +7,9 @@ import org.cryptomator.presentation.model.CloudModel import org.cryptomator.presentation.model.CloudTypeModel import org.cryptomator.presentation.ui.adapter.CloudSettingsAdapter.CloudSettingViewHolder import javax.inject.Inject -import kotlinx.android.synthetic.main.item_cloud_setting.view.* +import kotlinx.android.synthetic.main.item_cloud_setting.view.cloudImage +import kotlinx.android.synthetic.main.item_cloud_setting.view.cloudName +import kotlinx.android.synthetic.main.item_cloud_setting.view.cloudUsername class CloudSettingsAdapter @Inject constructor(private val context: Context) : RecyclerViewBaseAdapter() { diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/AutoUploadChooseVaultFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/AutoUploadChooseVaultFragment.kt index c43bd47d..bc96cec8 100644 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/AutoUploadChooseVaultFragment.kt +++ b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/AutoUploadChooseVaultFragment.kt @@ -9,8 +9,8 @@ import org.cryptomator.presentation.presenter.AutoUploadChooseVaultPresenter import org.cryptomator.presentation.ui.adapter.SharedLocationsAdapter import org.cryptomator.util.SharedPreferencesHandler import javax.inject.Inject -import kotlinx.android.synthetic.main.fragment_shared_files.* -import kotlinx.android.synthetic.main.view_receive_save_button.* +import kotlinx.android.synthetic.main.fragment_auto_upload_choose_vault.locationsRecyclerView +import kotlinx.android.synthetic.main.view_receive_save_button.saveFiles @Fragment(R.layout.fragment_auto_upload_choose_vault) class AutoUploadChooseVaultFragment : BaseFragment() { diff --git a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/EmptyDirIdFileInfoFragment.kt b/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/EmptyDirIdFileInfoFragment.kt deleted file mode 100644 index 7de9617f..00000000 --- a/presentation/src/main/java/org/cryptomator/presentation/ui/fragment/EmptyDirIdFileInfoFragment.kt +++ /dev/null @@ -1,23 +0,0 @@ -package org.cryptomator.presentation.ui.fragment - -import org.cryptomator.generator.Fragment -import org.cryptomator.presentation.R -import org.cryptomator.presentation.presenter.EmptyDirIdFileInfoPresenter -import javax.inject.Inject -import kotlinx.android.synthetic.main.fragment_empty_dir_file_info.infoText -import kotlinx.android.synthetic.main.fragment_empty_dir_file_info.moreDetailsButton - -@Fragment(R.layout.fragment_empty_dir_file_info) -class EmptyDirIdFileInfoFragment : BaseFragment() { - - @Inject - lateinit var presenter: EmptyDirIdFileInfoPresenter - - override fun setupView() { - moreDetailsButton.setOnClickListener { presenter.onShowMoreInfoButtonPressed() } - } - - fun setDirFilePath(dirFilePath: String) { - infoText.text = String.format(getString(R.string.screen_empty_dir_file_info_text), dirFilePath) - } -} diff --git a/presentation/src/main/res/layout/activity_empty_dir_file_info.xml b/presentation/src/main/res/layout/activity_empty_dir_file_info.xml deleted file mode 100644 index d7fb3ca0..00000000 --- a/presentation/src/main/res/layout/activity_empty_dir_file_info.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - diff --git a/presentation/src/main/res/layout/fragment_empty_dir_file_info.xml b/presentation/src/main/res/layout/fragment_empty_dir_file_info.xml deleted file mode 100644 index 21396e80..00000000 --- a/presentation/src/main/res/layout/fragment_empty_dir_file_info.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - -