diff --git a/.github/workflows/android-build.yml b/.github/workflows/android-build.yml index d59a924175..696eb0e59d 100644 --- a/.github/workflows/android-build.yml +++ b/.github/workflows/android-build.yml @@ -15,12 +15,12 @@ jobs: name: Check spotless runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: @@ -32,7 +32,7 @@ jobs: with: toolchain: stable - name: Cache Rust dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/bin/ @@ -60,27 +60,27 @@ jobs: echo "❌ .cargo/config.toml missing" exit 1 fi - - name: Check formatting using spotless - uses: gradle/actions/setup-gradle@v3 - with: - arguments: spotlessCheck --stacktrace + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Run Spotless check + run: ./gradlew spotlessCheck --stacktrace build: name: Build debug runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable - name: Cache Rust dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/bin/ @@ -108,7 +108,7 @@ jobs: echo "❌ .cargo/config.toml missing" exit 1 fi - - name: Build with Gradle - uses: gradle/actions/setup-gradle@v3 - with: - arguments: assembledebug --stacktrace \ No newline at end of file + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Build App + run: ./gradlew assembledebug --stacktrace \ No newline at end of file diff --git a/.github/workflows/android-debug-artifact-ondemand.yml b/.github/workflows/android-debug-artifact-ondemand.yml index 4dd72ba16b..526dfbb3de 100644 --- a/.github/workflows/android-debug-artifact-ondemand.yml +++ b/.github/workflows/android-debug-artifact-ondemand.yml @@ -30,16 +30,16 @@ jobs: echo "::set-output name=repo_clone_url::${{ fromJson(steps.request.outputs.data).head.repo.clone_url }}" echo "::set-output name=repo_ssh_url::${{ fromJson(steps.request.outputs.data).head.repo.ssh_url }}" - name: Checkout PR Branch - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: token: ${{ secrets.GITHUB_TOKEN }} repository: ${{fromJson(steps.request.outputs.data).head.repo.full_name}} ref: ${{fromJson(steps.request.outputs.data).head.ref}} - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: @@ -51,7 +51,7 @@ jobs: with: toolchain: stable - name: Cache Rust dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/bin/ @@ -79,10 +79,10 @@ jobs: echo "❌ .cargo/config.toml missing" exit 1 fi - - name: Build with Gradle - uses: gradle/actions/setup-gradle@v3 - with: - arguments: assembleDebug --stacktrace + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Build App + run: ./gradlew assembledebug --stacktrace - name: Upload fdroid artifact uses: actions/upload-artifact@v4 id: artifact-upload-fdroid diff --git a/.github/workflows/android-debug-artifact-release.yml b/.github/workflows/android-debug-artifact-release.yml index e837df793f..94479f6611 100644 --- a/.github/workflows/android-debug-artifact-release.yml +++ b/.github/workflows/android-debug-artifact-release.yml @@ -8,12 +8,12 @@ jobs: apk: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: @@ -25,7 +25,7 @@ jobs: with: toolchain: stable - name: Cache Rust dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/bin/ @@ -53,8 +53,10 @@ jobs: echo "❌ .cargo/config.toml missing" exit 1 fi - - name: Build with Gradle - uses: gradle/actions/setup-gradle@v3 + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Build App + run: ./gradlew assembledebug --stacktrace with: arguments: assembleDebug - name: Upload fdroid artifact diff --git a/.github/workflows/android-feature.yml b/.github/workflows/android-feature.yml index 23aca0ec1b..d58f27e016 100755 --- a/.github/workflows/android-feature.yml +++ b/.github/workflows/android-feature.yml @@ -16,12 +16,12 @@ jobs: name: Check spotless runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Set up NDK id: setup-ndk uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 @@ -29,10 +29,10 @@ jobs: ndk-version: r28c link-to-sdk: true local-cache: true - - name: Check formatting using spotless - uses: gradle/actions/setup-gradle@v3 - with: - arguments: spotlessCheck --stacktrace + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Run Spotless check + run: ./gradlew spotlessCheck --stacktrace env: ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }} @@ -40,18 +40,18 @@ jobs: name: Build debug and run Jacoco tests runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - name: Set up JDK 17 - uses: actions/setup-java@v4 + - uses: actions/checkout@v6 + - name: Set up JDK 21 + uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: toolchain: stable - name: Cache Rust dependencies - uses: actions/cache@v4 + uses: actions/cache@v5 with: path: | ~/.cargo/bin/ @@ -79,11 +79,9 @@ jobs: echo "❌ .cargo/config.toml missing" exit 1 fi - - name: Build with Gradle - uses: gradle/actions/setup-gradle@v3 - with: - arguments: assembledebug --stacktrace + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v6 + - name: Run Spotless check + run: ./gradlew spotlessCheck --stacktrace - name: Run test cases - uses: gradle/actions/setup-gradle@v3 - with: - arguments: jacocoTestPlayDebugUnitTestReport --stacktrace --info \ No newline at end of file + run: ./gradlew jacocoTestPlayDebugUnitTestReport --stacktrace --info \ No newline at end of file diff --git a/.github/workflows/android-main.yml b/.github/workflows/android-main.yml index e1dcf8055b..61a3c0e153 100644 --- a/.github/workflows/android-main.yml +++ b/.github/workflows/android-main.yml @@ -17,11 +17,11 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Set up NDK uses: nttld/setup-ndk@afb4c9964b521afb97c864b7d40b11e6911bd410 with: @@ -40,11 +40,11 @@ jobs: - uses: actions/checkout@v6 with: fetch-depth: 0 - - name: Set up JDK 17 + - name: Set up JDK 21 uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: @@ -104,15 +104,15 @@ jobs: strategy: fail-fast: true matrix: - api-level: [ 21, 28 ] + api-level: [ 23, 28 ] steps: - name: checkout uses: actions/checkout@v6 - - name: Java 17 + - name: Java 21 uses: actions/setup-java@v5 with: distribution: "temurin" - java-version: 17 + java-version: 21 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: diff --git a/.github/workflows/fastlane-pr.yml b/.github/workflows/fastlane-pr.yml index 6dabbc40b3..02a99cd3e5 100644 --- a/.github/workflows/fastlane-pr.yml +++ b/.github/workflows/fastlane-pr.yml @@ -13,7 +13,7 @@ jobs: # required to run on Linux because this is a docker container action runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - uses: ashutoshgngwr/validate-fastlane-supply-metadata@v2 with: fastlaneDir: ./fastlane/metadata/android # optional diff --git a/app/build.gradle b/app/build.gradle index e226e61195..53ce0a546d 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,10 +8,21 @@ apply plugin: 'com.google.devtools.ksp' android { namespace "com.amaze.filemanager" - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdkVersion libs.versions.compileSdk.get().toInteger() packagingOptions { resources { - excludes += ['proguard-project.txt', 'project.properties', 'META-INF/LICENSE.txt', 'META-INF/LICENSE', 'META-INF/NOTICE.txt', 'META-INF/NOTICE', 'META-INF/DEPENDENCIES.txt', 'META-INF/DEPENDENCIES', 'META-INF/versions/9/OSGI-INF/MANIFEST.MF'] + excludes += [ + 'proguard-project.txt', + 'project.properties', + 'META-INF/LICENSE.txt', + 'META-INF/LICENSE.md', + 'META-INF/LICENSE', + 'META-INF/NOTICE.txt', + 'META-INF/NOTICE', + 'META-INF/DEPENDENCIES.txt', + 'META-INF/DEPENDENCIES', + 'META-INF/versions/9/OSGI-INF/MANIFEST.MF' + ] } } @@ -44,7 +55,7 @@ android { debug { applicationIdSuffix ".debug" minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard.cfg' testProguardFile 'tests-proguard.cfg' buildConfigField "String", "CRYPTO_IV", "\"LxbHiJhhUXcj\"" buildConfigField "String", "FTP_SERVER_KEYSTORE_PASSWORD", "\"vishal007\"" @@ -56,7 +67,7 @@ android { signingConfig signingConfigs.release minifyEnabled true - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard.cfg' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard.cfg' buildConfigField "String", "CRYPTO_IV", "\"LxbHiJhhUXcj\"" buildConfigField "String", "FTP_SERVER_KEYSTORE_PASSWORD", "\"vishal007\"" } @@ -89,17 +100,9 @@ android { includeInBundle = false } - sourceSets { - test.java.srcDirs += '../testShared/src/test/java' - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } - - kotlinOptions { - jvmTarget = '17' + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } testOptions { @@ -133,6 +136,7 @@ dependencies { implementation fileTree(include: ['*.jar'], dir: 'libs') implementation libs.systembarTint + implementation libs.androidX.activity implementation libs.androidX.vectordrawable.animated implementation libs.androidX.legacySupportV13 implementation libs.androidX.material @@ -152,6 +156,7 @@ dependencies { ksp libs.androidX.annotation //For tests + testImplementation project(':testShared') testImplementation libs.junit//tests the app logic testImplementation libs.robolectric//tests android interaction testImplementation libs.robolectric.shadows.httpclient//tests android interaction @@ -164,14 +169,16 @@ dependencies { testImplementation libs.mockito.inline testImplementation libs.mockito.kotlin testImplementation libs.apache.sshd + testImplementation libs.apache.sshd.scp + testImplementation libs.apache.sshd.sftp testImplementation libs.awaitility testImplementation libs.jsoup testImplementation libs.room.migration testImplementation libs.mockk testImplementation libs.kotlin.coroutine.test testImplementation libs.androidX.core.testing + testImplementation libs.logback.classic kspTest libs.auto.service - testImplementation 'ch.qos.logback:logback-classic:1.4.14' androidTestImplementation libs.junit //tests the app logic androidTestImplementation libs.androidX.test.expresso @@ -262,7 +269,7 @@ dependencies { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } configurations.configureEach { @@ -270,6 +277,7 @@ configurations.configureEach { dependencySubstitution { substitute module("commons-logging:commons-logging-api:1.1") using module("commons-logging:commons-logging:1.1.1") substitute module("com.android.support:support-annotations:27.1.1") using module("com.android.support:support-annotations:27.0.2") + substitute module("org.bouncycastle:bcprov-jdk18on:1.80.2") using module("org.bouncycastle:bcprov-jdk18on:1.85") // These two lines are added to prevent possible class clashes between awaitility (which uses hamcrest 2.1) and junit (which uses hamcrest 1.3). substitute module('org.hamcrest:hamcrest-core:1.3') using module("org.hamcrest:hamcrest:2.1") substitute module('org.hamcrest:hamcrest-library:1.3') using module("org.hamcrest:hamcrest:2.1") diff --git a/app/src/androidTest/java/com/amaze/filemanager/ui/fragments/TabFragmentTest.kt b/app/src/androidTest/java/com/amaze/filemanager/ui/fragments/TabFragmentTest.kt index d9e675b581..bdb4937464 100644 --- a/app/src/androidTest/java/com/amaze/filemanager/ui/fragments/TabFragmentTest.kt +++ b/app/src/androidTest/java/com/amaze/filemanager/ui/fragments/TabFragmentTest.kt @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2025 Arpit Khurana , Vishal Nehra , + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , * Emmanuel Messulam, Raymond Lai and Contributors. * * This file is part of Amaze File Manager. diff --git a/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarV5Exception.java b/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java similarity index 51% rename from app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarV5Exception.java rename to app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java index 4ed70a93de..789412c242 100644 --- a/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarV5Exception.java +++ b/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , * Emmanuel Messulam, Raymond Lai and Contributors. * * This file is part of Amaze File Manager. @@ -20,10 +20,19 @@ package com.github.junrar.exception; -public class UnsupportedRarV5Exception extends Exception { - public UnsupportedRarV5Exception(Throwable cause) { +/** + * Thrown when the archive signature names a RAR format this library cannot read: a future format + * version byte ({@code 0x02}..{@code 0x04}) that the library predates (unrar {@code RARFMT_FUTURE}, + * {@code d861246:archive.cpp:122,178-181}: "so we can return a sensible warning in case we'll want + * to change the archive format sometimes in the future"). The ancient RAR 1.4 format (marker {@code + * 52 45 7e 5e}, unrar {@code RARFMT14}) no longer throws this -- {@code Archive} reads its headers + * through a dedicated loop (P1, issue #293). Distinct from {@link BadRarArchiveException} (no valid + * signature at all). + */ +public class UnsupportedRarVersionException extends Exception { + public UnsupportedRarVersionException(Throwable cause) { super(cause); } - public UnsupportedRarV5Exception() {} + public UnsupportedRarVersionException() {} } diff --git a/app/src/main/java/com/amaze/filemanager/adapters/ContributorAdapter.kt b/app/src/main/java/com/amaze/filemanager/adapters/ContributorAdapter.kt index 80fc31bb2b..1c3c0a8b5a 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/ContributorAdapter.kt +++ b/app/src/main/java/com/amaze/filemanager/adapters/ContributorAdapter.kt @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + package com.amaze.filemanager.adapters import android.view.LayoutInflater diff --git a/app/src/main/java/com/amaze/filemanager/adapters/LanguageAdapter.kt b/app/src/main/java/com/amaze/filemanager/adapters/LanguageAdapter.kt index 3b1a252d32..ef14572701 100644 --- a/app/src/main/java/com/amaze/filemanager/adapters/LanguageAdapter.kt +++ b/app/src/main/java/com/amaze/filemanager/adapters/LanguageAdapter.kt @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + package com.amaze.filemanager.adapters import android.view.LayoutInflater diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/compress/ZipHelperCallable.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/compress/ZipHelperCallable.kt index e8387d80b2..f3787bdeef 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/compress/ZipHelperCallable.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/compress/ZipHelperCallable.kt @@ -50,6 +50,9 @@ class ZipHelperCallable( try { fileLocation.path?.run { val zipfile = ZipFile(fileLocation.path) + if (!zipfile.isValidZipFile || zipfile.file.length() == 0L) { + throw ZipException("Zero byte or corrupt zip file") + } val wholelist = filterValidEntryList(zipfile) val strings = ArrayList() for (entry in wholelist) { diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt old mode 100644 new mode 100755 index 7ee9cb13cb..0ce1df3bb2 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/asynctasks/movecopy/PreparePasteTask.kt @@ -21,7 +21,6 @@ package com.amaze.filemanager.asynchronous.asynctasks.movecopy import android.app.ProgressDialog -import android.content.Context import android.content.Intent import android.view.LayoutInflater import android.widget.Toast @@ -107,6 +106,7 @@ class PreparePasteTask(strongRefMain: MainActivity) { /** * Starts execution of [PreparePasteTask] class. */ + @Suppress("LabeledExpression") fun execute( targetPath: String, isMove: Boolean, @@ -133,44 +133,54 @@ class PreparePasteTask(strongRefMain: MainActivity) { return } - val totalBytes = FileUtils.getTotalBytes(filesToCopy, context.get()) - destination = HybridFile(openMode, targetPath) - destination.generateMode(context.get()) + coroutineScope.launch { + val contextRef = context.get() ?: return@launch + val totalBytes = withContext(Dispatchers.IO) { FileUtils.getTotalBytes(filesToCopy, contextRef) } + destination = + withContext(Dispatchers.IO) { + HybridFile(openMode, targetPath).apply { generateMode(contextRef) } + } - if (filesToCopy.isNotEmpty() && - isMove && - filesToCopy[0].getParent(context.get()) == targetPath - ) { - Toast.makeText(context.get(), R.string.same_dir_move_error, Toast.LENGTH_SHORT).show() - MediaConnectionUtils.scanFile(context.get() as Context, filesToCopy.toTypedArray()) - return - } + if (filesToCopy.isNotEmpty() && + isMove && + filesToCopy[0].getParent(contextRef) == targetPath + ) { + withContext(Dispatchers.Main) { + Toast.makeText(contextRef, R.string.same_dir_move_error, Toast.LENGTH_SHORT).show() + } + MediaConnectionUtils.scanFile(contextRef, filesToCopy.toTypedArray()) + return@launch + } - val isMoveSupported = - isMove && - destination.mode == openMode && - MoveFiles.getOperationSupportedFileSystem().contains(openMode) + val isMoveSupported = + isMove && + destination.mode == openMode && + MoveFiles.getOperationSupportedFileSystem().contains(openMode) - if (destination.usableSpace < totalBytes && - !isMoveSupported - ) { - Toast.makeText(context.get(), R.string.in_safe, Toast.LENGTH_SHORT).show() - return - } - @Suppress("DEPRECATION") - progressDialog = - ProgressDialog.show( - context.get(), - "", - context.get()?.getString(R.string.checking_conflicts), + if (destination.usableSpace < totalBytes && !isMoveSupported) { + withContext(Dispatchers.Main) { + Toast.makeText(contextRef, R.string.in_safe, Toast.LENGTH_SHORT).show() + } + return@launch + } + + withContext(Dispatchers.Main) { + @Suppress("DEPRECATION") + progressDialog = + ProgressDialog.show( + contextRef, + "", + contextRef.getString(R.string.checking_conflicts), + ) + } + checkConflicts( + isRootMode, + filesToCopy, + destination, + conflictingFiles, + conflictingDirActionMap, ) - checkConflicts( - isRootMode, - filesToCopy, - destination, - conflictingFiles, - conflictingDirActionMap, - ) + } } private fun checkConflicts( diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java index 12b64b9953..b48a9d44f9 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ExtractService.java @@ -44,7 +44,7 @@ import com.amaze.filemanager.utils.DatapointParcelable; import com.amaze.filemanager.utils.ObtainableServiceBinder; import com.amaze.filemanager.utils.ProgressHandler; -import com.github.junrar.exception.UnsupportedRarV5Exception; +import com.github.junrar.exception.UnsupportedRarVersionException; import android.app.PendingIntent; import android.content.BroadcastReceiver; @@ -364,8 +364,8 @@ public boolean isCancelled() { paused = true; publishProgress(e); } else if (e.getCause() != null - && UnsupportedRarV5Exception.class.isAssignableFrom(e.getCause().getClass())) { - LOG.error("RAR " + compressedPath + " is unsupported V5 archive", e); + && UnsupportedRarVersionException.class.isAssignableFrom(e.getCause().getClass())) { + LOG.error(compressedPath + " is an unsupported RAR archive", e); AppConfig.toast( getApplicationContext(), extractService.getString(R.string.error_unsupported_v5_rar, compressedPath)); diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/ZipExtractor.kt b/app/src/main/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/ZipExtractor.kt index 159cf3d772..50e2aa88c7 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/ZipExtractor.kt +++ b/app/src/main/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/ZipExtractor.kt @@ -68,7 +68,7 @@ class ZipExtractor( invalidArchiveEntries.add(fileHeader.fileName) } } - if (entriesToExtract.size > 0) { + if (entriesToExtract.isNotEmpty()) { listener.onStart(totalBytes, entriesToExtract[0].fileName) for (entry in entriesToExtract) { if (!listener.isCancelled) { @@ -77,6 +77,9 @@ class ZipExtractor( } } } else { + if (zipfile.file.length() == 0L) { + throw ZipException("Zero byte or corrupt zip file") + } throw EmptyArchiveNotice() } listener.onFinish() diff --git a/app/src/main/java/com/amaze/filemanager/filesystem/files/EncryptDecryptUtils.kt b/app/src/main/java/com/amaze/filemanager/filesystem/files/EncryptDecryptUtils.kt index a389000915..d1fe98186b 100644 --- a/app/src/main/java/com/amaze/filemanager/filesystem/files/EncryptDecryptUtils.kt +++ b/app/src/main/java/com/amaze/filemanager/filesystem/files/EncryptDecryptUtils.kt @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + package com.amaze.filemanager.filesystem.files import android.content.Context diff --git a/app/src/main/java/com/amaze/filemanager/models/LanguageModel.kt b/app/src/main/java/com/amaze/filemanager/models/LanguageModel.kt index 1903454460..8c468016fe 100644 --- a/app/src/main/java/com/amaze/filemanager/models/LanguageModel.kt +++ b/app/src/main/java/com/amaze/filemanager/models/LanguageModel.kt @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + package com.amaze.filemanager.models data class LanguageModel(var title: String, var description: String) diff --git a/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt b/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt index f532ca4a7d..8d4103db6b 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/dialogs/DragAndDropDialog.kt @@ -135,7 +135,7 @@ class DragAndDropDialog : DialogFragment() { override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { safeLet( context, - mainActivity?.appTheme?.getMaterialDialogTheme(), + mainActivity?.appTheme?.materialDialogTheme, mainActivity?.accent, pasteLocation, operationFiles, @@ -146,7 +146,7 @@ class DragAndDropDialog : DialogFragment() { .title(getString(R.string.choose_operation)) .customView(R.layout.dialog_drag_drop, true) .theme(dialogTheme) - .negativeText(getString(R.string.cancel).toUpperCase()) + .negativeText(getString(R.string.cancel).uppercase()) .negativeColor(accent) .cancelable(false) .onNeutral { _: MaterialDialog?, _: DialogAction? -> diff --git a/app/src/main/java/com/amaze/filemanager/ui/fragments/CompressedExplorerFragment.kt b/app/src/main/java/com/amaze/filemanager/ui/fragments/CompressedExplorerFragment.kt index dacea24693..d70d9fa02b 100644 --- a/app/src/main/java/com/amaze/filemanager/ui/fragments/CompressedExplorerFragment.kt +++ b/app/src/main/java/com/amaze/filemanager/ui/fragments/CompressedExplorerFragment.kt @@ -79,7 +79,7 @@ import com.amaze.filemanager.ui.views.DividerItemDecoration import com.amaze.filemanager.ui.views.FastScroller import com.amaze.filemanager.utils.BottomBarButtonPath import com.amaze.filemanager.utils.Utils -import com.github.junrar.exception.UnsupportedRarV5Exception +import com.github.junrar.exception.UnsupportedRarVersionException import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout.OnOffsetChangedListener import io.reactivex.Flowable @@ -656,7 +656,10 @@ class CompressedExplorerFragment : Fragment(), BottomBarButtonPath { private fun archiveCorruptOrUnsupportedToast(e: Throwable?) { @StringRes val msg: Int = - if (e?.cause?.javaClass is UnsupportedRarV5Exception) { + if (UnsupportedRarVersionException::class.java.isAssignableFrom( + e?.cause?.javaClass, + ) + ) { R.string.error_unsupported_v5_rar } else { R.string.archive_unsupported_or_corrupt @@ -774,7 +777,7 @@ class CompressedExplorerFragment : Fragment(), BottomBarButtonPath { get() = isRoot(relativeDirectory) private fun isRoot(folder: String?): Boolean { - return folder == null || folder.isEmpty() + return folder.isNullOrEmpty() } /** diff --git a/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt b/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt index 50223c6121..83056c3315 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt +++ b/app/src/main/java/com/amaze/filemanager/utils/ContextCompatExt.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.utils import android.annotation.SuppressLint diff --git a/app/src/main/java/com/amaze/filemanager/utils/FingerprintHandler.kt b/app/src/main/java/com/amaze/filemanager/utils/FingerprintHandler.kt index 45f109f483..97efb65ad6 100644 --- a/app/src/main/java/com/amaze/filemanager/utils/FingerprintHandler.kt +++ b/app/src/main/java/com/amaze/filemanager/utils/FingerprintHandler.kt @@ -17,6 +17,7 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + package com.amaze.filemanager.utils import android.Manifest diff --git a/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallable.kt b/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallable.kt index 62b35e473a..6d738cfce1 100644 --- a/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallable.kt +++ b/app/src/play/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallable.kt @@ -25,7 +25,7 @@ import com.amaze.filemanager.filesystem.compressed.CompressedHelper import com.amaze.filemanager.filesystem.compressed.showcontents.helpers.RarDecompressor.Companion.convertName import com.github.junrar.Archive import com.github.junrar.exception.RarException -import com.github.junrar.exception.UnsupportedRarV5Exception +import com.github.junrar.exception.UnsupportedRarVersionException import org.apache.commons.compress.archivers.ArchiveException import java.io.File import java.io.FileNotFoundException @@ -77,8 +77,8 @@ class RarHelperCallable( ) } } - } catch (e: UnsupportedRarV5Exception) { - throw ArchiveException("RAR v5 archives are not supported", e) + } catch (e: UnsupportedRarVersionException) { + throw ArchiveException("RAR archive version not supported", e) } catch (e: FileNotFoundException) { throw ArchiveException("First part of multipart archive not found", e) } catch (e: RarException) { diff --git a/app/src/play/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/RarExtractor.kt b/app/src/play/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/RarExtractor.kt index 3cb5ebe485..c4ef3d2988 100644 --- a/app/src/play/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/RarExtractor.kt +++ b/app/src/play/java/com/amaze/filemanager/filesystem/compressed/extractcontents/helpers/RarExtractor.kt @@ -32,10 +32,11 @@ import com.amaze.filemanager.filesystem.compressed.extractcontents.Extractor import com.amaze.filemanager.filesystem.compressed.isPasswordProtectedCompat import com.amaze.filemanager.filesystem.files.GenericCopyUtil import com.github.junrar.Archive +import com.github.junrar.exception.BadRarArchiveException import com.github.junrar.exception.CorruptHeaderException import com.github.junrar.exception.MainHeaderNullException import com.github.junrar.exception.RarException -import com.github.junrar.exception.UnsupportedRarV5Exception +import com.github.junrar.exception.UnsupportedRarVersionException import com.github.junrar.rarfile.FileHeader import org.apache.commons.compress.PasswordRequiredException import java.io.BufferedInputStream @@ -58,13 +59,14 @@ class RarExtractor( override fun extractWithFilter(filter: Filter) { try { var totalBytes: Long = 0 + val file = File(filePath) val rarFile = runCatching { ArchivePasswordCache.getInstance()[filePath]?.let { - Archive(File(filePath), it).also { archive -> + Archive(file, it).also { archive -> archive.password = it } - } ?: Archive(File(filePath)) + } ?: Archive(file) }.onFailure { when { // Hack. CorruptHeaderException will throw if archive is really corrupt or @@ -78,7 +80,11 @@ class RarExtractor( throw BadArchiveNotice(it) } - UnsupportedRarV5Exception::class.java.isAssignableFrom(it::class.java) -> { + BadRarArchiveException::class.java.isAssignableFrom(it::class.java) -> { + throw BadArchiveNotice(it) + } + + UnsupportedRarVersionException::class.java.isAssignableFrom(it::class.java) -> { throw it } diff --git a/app/src/test/AndroidManifest.xml b/app/src/test/AndroidManifest.xml deleted file mode 100644 index 568741e54f..0000000000 --- a/app/src/test/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java b/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java index de57e3ea1b..cd623875ca 100644 --- a/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java +++ b/app/src/test/java/com/amaze/filemanager/application/AppConfigTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.application; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static android.os.Looper.getMainLooper; import static org.awaitility.Awaitility.await; @@ -51,7 +51,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class AppConfigTest { @After diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt index c77388920d..4dcdf74ffc 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/AbstractDeleteTaskTestBase.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.asynctasks import android.Manifest import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Looper import android.os.storage.StorageManager @@ -70,7 +70,7 @@ import org.robolectric.shadows.ShadowToast ShadowFileUtils::class, ShadowPasswordUtil::class, ], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) abstract class AbstractDeleteTaskTestBase { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java index 343e16b743..eb80992910 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/DbViewerTaskTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static android.os.Looper.getMainLooper; import static android.view.View.VISIBLE; @@ -58,7 +58,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class DbViewerTaskTest { private WebView webView; diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt index ca6c8959f5..ef9b835b92 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/AbstractCompressedHelperCallableTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -37,7 +37,7 @@ import java.io.FileOutputStream import java.util.TimeZone @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) abstract class AbstractCompressedHelperCallableTest { private lateinit var systemTz: TimeZone diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt index 335f975c18..41db09d4eb 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/compress/CompressedHelperForBadArchiveTest.kt @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -42,7 +42,7 @@ import java.io.FileOutputStream * Test behaviour of CompressedHelpers in handling corrupt archives. */ @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P]) class CompressedHelperForBadArchiveTest { /** * Test handling of corrupt archive with random junk. diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt index 097eeb34fd..ef65130190 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/searchfilesystem/SearchResultListSorterTest.kt @@ -41,7 +41,7 @@ import java.util.regex.Pattern @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod", "LargeClass") class SearchResultListSorterTest { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt index 1cfc834af1..75586a506f 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableEd25519Test.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowFileUtils @@ -45,7 +45,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [M, P, VERSION_CODES.R], ) class PemToKeyPairObservableEd25519Test { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt index 3590c52573..62d8e693cf 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/PemToKeyPairObservableRsaTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.os.Build.VERSION.SDK_INT import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.N import android.os.Build.VERSION_CODES.P import androidx.appcompat.widget.AppCompatEditText @@ -65,7 +65,7 @@ import java.util.concurrent.TimeUnit @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [M, P, VERSION_CODES.R], ) class PemToKeyPairObservableRsaTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt index a176c0fdd6..a9f8a5e33d 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/ssh/SshAuthenticationTaskTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.ssh import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -66,7 +66,7 @@ import java.util.concurrent.CountDownLatch @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication") class SshAuthenticationTaskTest { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt index f120e7f542..ed1c35d76d 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/read/ReadTextFileCallableTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.texteditor.read import android.content.Context import android.net.Uri import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class ReadTextFileCallableTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java index 8fcc850e5d..3c9ecf41c5 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/asynctasks/texteditor/write/WriteTextFileCallableTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.texteditor.write; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; @@ -44,13 +44,13 @@ import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; import org.robolectric.shadow.api.Shadow; +import org.robolectric.shadows.ShadowContentResolver; import com.amaze.filemanager.fileoperations.exceptions.ShellNotRunningException; import com.amaze.filemanager.fileoperations.exceptions.StreamNotFoundException; import com.amaze.filemanager.filesystem.EditableFileAbstraction; import com.amaze.filemanager.filesystem.FileUtil; import com.amaze.filemanager.filesystem.root.ConcatenateFileCommand; -import com.amaze.filemanager.shadows.ShadowContentResolver; import com.amaze.filemanager.shadows.ShadowMultiDex; import android.content.ContentResolver; @@ -65,7 +65,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class, ShadowContentResolver.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class WriteTextFileCallableTest { private static final String contents = "This is modified data"; diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt index eca0bf4fd4..302af8d7af 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/DecryptServiceTest.kt @@ -25,7 +25,6 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment @@ -64,7 +63,7 @@ import java.util.concurrent.TimeUnit import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class DecryptServiceTest { private lateinit var source: ByteArray diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt index 7443d72e6d..5c2dc3bac1 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/EncryptServiceTest.kt @@ -25,8 +25,8 @@ import android.content.Context import android.content.Intent import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP import android.os.Build.VERSION_CODES.M +import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import android.os.Environment import android.util.Log @@ -68,7 +68,7 @@ import java.util.concurrent.TimeUnit import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) class EncryptServiceTest { private lateinit var service: EncryptService private lateinit var notificationManager: ShadowNotificationManager @@ -128,7 +128,9 @@ class EncryptServiceTest { assertTrue(notificationManager.activeNotifications.isNotEmpty()) notificationManager.activeNotifications.first().let { assertEquals(NotificationConstants.ENCRYPT_ID, it.id) - assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + if (SDK_INT >= O) { + assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + } } await().atMost(10, TimeUnit.SECONDS).until { targetFile.length() > 0 && notificationManager.activeNotifications.isEmpty() @@ -171,7 +173,9 @@ class EncryptServiceTest { assertTrue(notificationManager.activeNotifications.isNotEmpty()) notificationManager.activeNotifications.first().let { assertEquals(NotificationConstants.ENCRYPT_ID, it.id) - assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + if (SDK_INT >= O) { + assertEquals(NotificationConstants.CHANNEL_NORMAL_ID, it.notification.channelId) + } } await().atMost(10, TimeUnit.SECONDS).until { targetFile.length() > 0 && notificationManager.activeNotifications.isEmpty() diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ExtractServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ExtractServiceTest.kt index 7bdbbf94dc..0f843504bd 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ExtractServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ExtractServiceTest.kt @@ -114,7 +114,7 @@ class ExtractServiceTest { @Rule @JvmField @RequiresApi(VERSION_CODES.R) - val allFilesPermissionRule = + val allFilesPermissionRule: GrantPermissionRule = GrantPermissionRule .grant(Manifest.permission.MANAGE_EXTERNAL_STORAGE) @@ -465,11 +465,8 @@ class ExtractServiceTest { if (BuildConfig.FLAVOR == "play") { performTest(multiVolumeRarFileV5Part1) ShadowLooper.idleMainLooper() - await() - .atMost(10, TimeUnit.SECONDS) - .until { - ShadowToast.getLatestToast() != null - } + assertNull(ShadowToast.getLatestToast()) + assertNull(ShadowToast.getTextOfLatestToast()) } } diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt index 3dbfc48c0d..ec613dff73 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/FtpServiceAndroidFileSystemIntegrationTest.kt @@ -26,7 +26,7 @@ import android.net.NetworkInfo import android.net.Uri import android.net.wifi.WifiInfo import android.net.wifi.WifiManager -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Environment import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -64,7 +64,7 @@ import kotlin.random.Random @Ignore("Pending fix for testing against newer Androids") @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP], shadows = [ShadowMultiDex::class]) +@Config(sdk = [M], shadows = [ShadowMultiDex::class]) @LooperMode(LooperMode.Mode.PAUSED) @Suppress("StringLiteralDuplication") class FtpServiceAndroidFileSystemIntegrationTest { diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt index 9faa8029cf..768f2e220a 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ZipServiceTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.asynchronous.services import android.content.Context import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Looper.getMainLooper import androidx.test.core.app.ApplicationProvider @@ -59,7 +59,7 @@ import kotlin.random.Random @RunWith(RobolectricTestRunner::class) @LooperMode(LooperMode.Mode.PAUSED) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) class ZipServiceTest { val dt = DateTimeFormatter.ofPattern("yyyyMMddkkmm") val dates = diff --git a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt index b08a421056..7b0a5dbb7d 100644 --- a/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt +++ b/app/src/test/java/com/amaze/filemanager/asynchronous/services/ftp/FtpReceiverTest.kt @@ -22,14 +22,13 @@ package com.amaze.filemanager.asynchronous.services.ftp import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.N import android.os.Build.VERSION_CODES.O import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig import com.amaze.filemanager.shadows.ShadowMultiDex -import io.mockk.Called import io.mockk.every import io.mockk.mockkObject import io.mockk.slot @@ -44,7 +43,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class FtpReceiverTest { private lateinit var receiver: FtpReceiver @@ -109,8 +108,11 @@ class FtpReceiverTest { val intent = Intent(FtpService.ACTION_START_FTPSERVER) receiver.onReceive(spy, intent) + verify(exactly = 0) { + spy.startService(capturedIntent.captured) + } + verify { - spy.startService(capturedIntent.captured)?.wasNot(Called) spy.startForegroundService(capturedIntent.captured) } } diff --git a/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt b/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt index 69c1e48289..df15a90475 100644 --- a/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/ExplorerDatabaseMigrationTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.room.Room import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory @@ -44,7 +44,7 @@ import java.io.IOException @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod") class ExplorerDatabaseMigrationTest { diff --git a/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt b/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt index f3167fcaf0..9bc04a4f09 100644 --- a/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/UtilitiesDatabaseMigrationTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.util.Base64 import androidx.room.Room @@ -52,7 +52,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class UtilitiesDatabaseMigrationTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt b/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt index 7b8a5e433c..64311aeb44 100644 --- a/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/UtilsHandlerTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import android.os.Environment.DIRECTORY_DCIM @@ -53,7 +53,7 @@ import java.io.File @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class UtilsHandlerTest { companion object { diff --git a/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt b/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt index f5adf4c7bd..4e1aefedff 100644 --- a/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/database/typeconverters/EncryptedStringTypeConverterTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.database.typeconverters import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.database.models.StringWrapper @@ -38,7 +38,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class EncryptedStringTypeConverterTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt index f306e23d7a..e10cfbc453 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractFilenameHelperIncrementNameTests.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -42,7 +42,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication") abstract class AbstractFilenameHelperIncrementNameTests { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt index 1aafbc6a79..75af7b7746 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/AbstractOperationsTestBase.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.filesystem import android.Manifest import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Looper import android.os.storage.StorageManager @@ -68,7 +68,7 @@ import org.robolectric.shadows.ShadowSQLiteConnection ShadowFileUtils::class, ShadowPasswordUtil::class, ], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) abstract class AbstractOperationsTestBase { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java index 32897ee00e..25964472f7 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/EditableFileAbstractionTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.CONTENT; import static com.amaze.filemanager.filesystem.EditableFileAbstraction.Scheme.FILE; @@ -49,7 +49,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class EditableFileAbstractionTest { @Test(expected = IllegalArgumentException.class) diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt index 7d1f6267b0..05f9eb8f9e 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/HybridFileTest.kt @@ -23,7 +23,7 @@ package com.amaze.filemanager.filesystem import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -40,7 +40,7 @@ import java.net.URLDecoder import kotlin.random.Random @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class HybridFileTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java index 329e3107e3..dac964e466 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/OperationsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -45,7 +45,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class OperationsTest { private File storageRoot = Environment.getExternalStorageDirectory(); diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java index f3004396db..7bd64e67ad 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/RootHelperTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.fail; @@ -51,7 +51,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) @Ignore("FIXME: should not ignore - please implement a shadow") public class RootHelperTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java index 1047900c01..1ed0c4730d 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/B0rkenZipTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.compressed; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static kotlin.io.ConstantsKt.DEFAULT_BUFFER_SIZE; import static org.junit.Assert.assertEquals; @@ -56,7 +56,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class B0rkenZipTest { private File zipfile1 = new File(Environment.getExternalStorageDirectory(), "zip-slip.zip"); diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java index 0573930e05..e52dc1ce7c 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/CompressedHelperTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.compressed; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -66,7 +66,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class CompressedHelperTest { private Context context; diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt index 8e2e8e1c45..2187aa2e80 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/compressed/extractcontents/AbstractExtractorTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.compressed.extractcontents import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.core.app.ApplicationProvider @@ -50,7 +50,7 @@ import java.nio.file.Paths import java.util.TimeZone @RunWith(AndroidJUnit4::class) -@Config(shadows = [ShadowMultiDex::class], sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(shadows = [ShadowMultiDex::class], sdk = [M, P, Build.VERSION_CODES.R]) abstract class AbstractExtractorTest { protected abstract fun extractorClass(): Class diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt index e2890ed677..67544eb8bd 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileListSorterTest.kt @@ -43,7 +43,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) @Suppress("StringLiteralDuplication", "ComplexMethod", "LongMethod", "LargeClass") class FileListSorterTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt index a75c54e152..311913f1ac 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/FileUtilsTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.files import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.filesystem.files.FileUtils.getPathsInPath @@ -38,7 +38,7 @@ import java.util.TimeZone @RunWith(AndroidJUnit4::class) @LooperMode(LooperMode.Mode.PAUSED) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [M, P, Build.VERSION_CODES.R]) @Suppress("TooManyFunctions", "StringLiteralDuplication") class FileUtilsTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt index fb00c32fdb..1146a3dd99 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/DirSortByTest.kt @@ -32,7 +32,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class DirSortByTest { /** Tests if [DirSortBy.getDirSortBy] returns the correct [DirSortBy] corresponding to the given index */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt index a851d96afb..84700d0153 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortByTest.kt @@ -32,7 +32,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class SortByTest { /** Tests if [SortBy.getSortBy] returns the correct [SortBy] corresponding to the given index */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt index ee9bae2172..29d978bb32 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/files/sort/SortTypeTest.kt @@ -31,7 +31,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P, Build.VERSION_CODES.R], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P, Build.VERSION_CODES.R], ) class SortTypeTest { /** Tests if the Int returned from [SortType.toDirectorySortInt] is as expected */ diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt index 35d51316ac..eb8bfb9426 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolFtpTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ftp import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -64,7 +64,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class NetCopyClientConnectionPoolFtpTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolTest.kt index 00823c7b8c..8d96019571 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ftp/NetCopyClientConnectionPoolTest.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.filesystem.ftp import org.apache.commons.net.ftp.FTPSClient diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt index 6aed30ecb4..5b9ed5533a 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ftpserver/commands/AbstractFtpserverCommandTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ftpserver.commands import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -38,7 +38,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) abstract class AbstractFtpserverCommandTest { protected lateinit var logger: LogMessageFilter diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt index b00c868784..d2216be56a 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.root import android.content.SharedPreferences import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -54,7 +54,7 @@ import java.io.InputStreamReader @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowNativeOperations::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class ListFilesCommandTest { private val sharedPreferences: SharedPreferences = diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt index 6b828df226..daa421e4f2 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/root/ListFilesCommandTest2.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.root import android.content.SharedPreferences import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.preference.PreferenceManager import androidx.test.core.app.ApplicationProvider @@ -54,7 +54,7 @@ import java.io.InputStreamReader @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowNativeOperations::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class ListFilesCommandTest2 { private val sharedPreferences: SharedPreferences = diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java b/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java index bb83e42eb4..3759026e9f 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/smb/CifsContextsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.filesystem.smb; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,7 +44,7 @@ import jcifs.ResolverType; import jcifs.context.BaseContext; -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) @RunWith(AndroidJUnit4.class) public class CifsContextsTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt index e6995e4ef4..47a95b6a8c 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/smb/SmbHybridFileTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.smb import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -45,7 +45,7 @@ import org.robolectric.shadows.ShadowSQLiteConnection @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowSmbUtil::class, ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) @LooperMode(LooperMode.Mode.PAUSED) class SmbHybridFileTest { diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt index a7cce7c3f1..8f631c1dec 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/AbstractSftpServerTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ssh import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -37,17 +37,15 @@ import com.amaze.filemanager.utils.PasswordUtil import io.reactivex.android.plugins.RxAndroidPlugins import io.reactivex.plugins.RxJavaPlugins import io.reactivex.schedulers.Schedulers -import org.apache.sshd.common.NamedFactory import org.apache.sshd.common.config.keys.KeyUtils import org.apache.sshd.common.file.FileSystemFactory import org.apache.sshd.common.file.virtualfs.VirtualFileSystemFactory -import org.apache.sshd.server.Command +import org.apache.sshd.scp.server.ScpCommandFactory import org.apache.sshd.server.SshServer import org.apache.sshd.server.auth.password.PasswordAuthenticator import org.apache.sshd.server.auth.pubkey.AcceptAllPublickeyAuthenticator -import org.apache.sshd.server.scp.ScpCommandFactory import org.apache.sshd.server.session.ServerSession -import org.apache.sshd.server.subsystem.sftp.SftpSubsystemFactory +import org.apache.sshd.sftp.server.SftpSubsystemFactory import org.junit.After import org.junit.Before import org.junit.BeforeClass @@ -65,7 +63,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [M, P, VERSION_CODES.R], ) abstract class AbstractSftpServerTest { protected var encryptedPassword: String? = @@ -132,7 +130,7 @@ abstract class AbstractSftpServerTest { server.host = HOST server.keyPairProvider = hostKeyProvider server.commandFactory = ScpCommandFactory() - server.subsystemFactories = listOf>(SftpSubsystemFactory()) + server.subsystemFactories = listOf(SftpSubsystemFactory()) server.passwordAuthenticator = PasswordAuthenticator { username: String, password: String, _: ServerSession? -> username == USERNAME && password == PASSWORD diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt index 27b8e5c406..6fd76ec607 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/NetCopyClientConnectionPoolSshTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.filesystem.ssh import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -75,7 +75,7 @@ import kotlin.text.Charsets.UTF_8 @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class NetCopyClientConnectionPoolSshTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt index 5c10d396a8..e5ceef2d31 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/SshHybridFileTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.filesystem.ssh import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import org.robolectric.annotation.LooperMode @LooperMode(LooperMode.Mode.PAUSED) @Config( shadows = [ShadowMultiDex::class, ShadowPasswordUtil::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class SshHybridFileTest { private var ctx: Context? = null diff --git a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/test/TestKeyProvider.java b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/test/TestKeyProvider.java index b76067d0fa..20ff158074 100644 --- a/app/src/test/java/com/amaze/filemanager/filesystem/ssh/test/TestKeyProvider.java +++ b/app/src/test/java/com/amaze/filemanager/filesystem/ssh/test/TestKeyProvider.java @@ -29,6 +29,7 @@ import java.util.Collections; import org.apache.sshd.common.keyprovider.KeyPairProvider; +import org.apache.sshd.common.session.SessionContext; import net.schmizz.sshj.common.KeyType; import net.schmizz.sshj.userauth.keyprovider.KeyProvider; @@ -44,7 +45,7 @@ public TestKeyProvider() throws Exception { } @Override - public Iterable loadKeys() { + public Iterable loadKeys(SessionContext sessionContext) { return Collections.singleton(keyPair); } diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt index 307828c771..d6291f3a72 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/AbstractMainActivityTestBase.kt @@ -24,7 +24,7 @@ import android.Manifest import android.content.Context import android.os.Build import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.storage.StorageManager import androidx.annotation.NonNull @@ -54,7 +54,7 @@ import org.robolectric.shadows.ShadowStorageManager */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [M, P, VERSION_CODES.R], shadows = [ ShadowMultiDex::class, ShadowStorageManager::class, diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt index 55a7909931..564535e7c0 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/DatabaseViewerActivityTest.kt @@ -1,8 +1,28 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.activities import android.content.Intent import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -23,7 +43,7 @@ import java.util.concurrent.TimeUnit */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class, ShadowStorageManager::class], ) class DatabaseViewerActivityTest { diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt b/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt index c4f178d511..7a25bfe0e1 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/PermissionsActivityTest.kt @@ -24,7 +24,7 @@ import android.app.AppOpsManager import android.content.Context import android.net.Uri import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Build.VERSION_CODES.R import android.os.storage.StorageManager @@ -64,7 +64,7 @@ import org.robolectric.shadows.ShadowStorageManager */ @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class, ShadowStorageManager::class], ) class PermissionsActivityTest { diff --git a/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java b/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java index c65a67166c..54d53de765 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/activities/TextEditorActivityTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.activities; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -58,7 +58,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class TextEditorActivityTest { private final String fileContents = "fsdfsdfs"; diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt index 7c4b684f95..2e262d934f 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractEncryptDialogTests.kt @@ -23,14 +23,16 @@ package com.amaze.filemanager.ui.dialogs import android.Manifest import android.os.Build import android.os.Build.VERSION.SDK_INT -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.N import android.os.Build.VERSION_CODES.P import androidx.annotation.RequiresApi import androidx.lifecycle.Lifecycle +import androidx.preference.PreferenceManager import androidx.test.core.app.ActivityScenario import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.rule.GrantPermissionRule +import com.amaze.filemanager.application.AppConfig import com.amaze.filemanager.shadows.ShadowFileUtils import com.amaze.filemanager.shadows.ShadowMultiDex import com.amaze.filemanager.test.ShadowTabHandler @@ -48,7 +50,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) abstract class AbstractEncryptDialogTests { protected lateinit var scenario: ActivityScenario @@ -56,7 +58,7 @@ abstract class AbstractEncryptDialogTests { @Rule @JvmField @RequiresApi(Build.VERSION_CODES.R) - var allFilesPermissionRule = + var allFilesPermissionRule: GrantPermissionRule = GrantPermissionRule .grant(Manifest.permission.MANAGE_EXTERNAL_STORAGE) @@ -71,10 +73,14 @@ abstract class AbstractEncryptDialogTests { } /** - * Post test cleanup. + * Post test cleanup. Clear all preferences. */ @After open fun tearDown() { scenario.close() + PreferenceManager.getDefaultSharedPreferences(AppConfig.getInstance()) + .edit() + .clear() + .apply() } } diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogTests.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogTests.kt index c1181a6e61..a5013f3229 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogTests.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogTests.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.dialogs import com.amaze.filemanager.ui.activities.AbstractMainActivityTestBase diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogUiTests.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogUiTests.kt index 1f5d7629aa..20673f4517 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogUiTests.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/AbstractSftpConnectDialogUiTests.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.dialogs import android.os.Bundle diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt index da53a03bee..ede4e0d9ad 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/ColorPickerDialogTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.ui.dialogs import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.application.AppConfig @@ -42,7 +42,7 @@ import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class, ShadowTabHandler::class, ShadowFileUtils::class], - sdk = [LOLLIPOP, P, VERSION_CODES.R], + sdk = [M, P, VERSION_CODES.R], ) class ColorPickerDialogTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/DecryptFingerprintDialogTest.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/DecryptFingerprintDialogTest.kt index b5af6f68a4..2d5cf9d4de 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/DecryptFingerprintDialogTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/DecryptFingerprintDialogTest.kt @@ -49,6 +49,7 @@ import org.junit.Before import org.junit.Test import org.robolectric.Shadows.shadowOf import org.robolectric.annotation.Config +import org.robolectric.shadow.api.Shadow import org.robolectric.shadows.ShadowDialog import org.robolectric.shadows.ShadowFingerprintManager import java.io.File @@ -96,7 +97,7 @@ class DecryptFingerprintDialogTest : AbstractEncryptDialogTests() { fun testDecryptFingerprintDialogSuccess() { performTest( testContent = { - shadowOf( + Shadow.extract( AppConfig.getInstance().getSystemService(FingerprintManager::class.java), ).run { setDefaultFingerprints(1) @@ -121,7 +122,7 @@ class DecryptFingerprintDialogTest : AbstractEncryptDialogTests() { fun testDecryptFingerprintDialogFailed() { performTest( testContent = { - shadowOf( + Shadow.extract( AppConfig.getInstance().getSystemService(FingerprintManager::class.java), ).run { setDefaultFingerprints(1) diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogArgumentPopulationTest.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogArgumentPopulationTest.kt index a2a1e42705..3aab5209e0 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogArgumentPopulationTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogArgumentPopulationTest.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.dialogs import android.os.Bundle diff --git a/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogFtpTest.kt b/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogFtpTest.kt index 7fcd0855d7..0d90e72ac2 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogFtpTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/dialogs/SftpConnectDialogFtpTest.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.dialogs import android.os.Bundle diff --git a/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java b/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java index 28ca6edcb3..e7554d2b00 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/fragments/CloudSheetFragmentTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.fragments; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -39,7 +39,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class CloudSheetFragmentTest { @Test diff --git a/app/src/test/java/com/amaze/filemanager/ui/fragments/TabFragmentRobolectricTest.kt b/app/src/test/java/com/amaze/filemanager/ui/fragments/TabFragmentRobolectricTest.kt index c78d0c910d..d8c31cb9a6 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/fragments/TabFragmentRobolectricTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/fragments/TabFragmentRobolectricTest.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.ui.fragments import androidx.test.core.app.ActivityScenario diff --git a/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt b/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt index 277aaccb33..a997e922df 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/fragments/preferencefragments/UiPrefsFragmentTest.kt @@ -52,7 +52,7 @@ import kotlin.random.Random */ @Config( sdk = [ - Build.VERSION_CODES.LOLLIPOP, + Build.VERSION_CODES.M, Build.VERSION_CODES.N, Build.VERSION_CODES.P, Build.VERSION_CODES.R, diff --git a/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java b/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java index 117e3da274..17e6e939b0 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/icons/IconsTest.java @@ -20,15 +20,15 @@ package com.amaze.filemanager.ui.icons; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.robolectric.Shadows; import org.robolectric.annotation.Config; +import org.robolectric.shadow.api.Shadow; import org.robolectric.shadows.ShadowMimeTypeMap; import com.amaze.filemanager.shadows.ShadowMultiDex; @@ -41,16 +41,16 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class IconsTest { @Before public void setUp() { // By default Robolectric's MimeTypeMap is empty, we need to populate them - ShadowMimeTypeMap mimeTypeMap = Shadows.shadowOf(MimeTypeMap.getSingleton()); - mimeTypeMap.addExtensionMimeTypMapping("zip", "application/zip"); - mimeTypeMap.addExtensionMimeTypMapping("rar", "application/x-rar-compressed"); - mimeTypeMap.addExtensionMimeTypMapping("tar", "application/x-tar"); + ShadowMimeTypeMap mimeTypeMap = Shadow.extract(MimeTypeMap.getSingleton()); + mimeTypeMap.addExtensionMimeTypeMapping("zip", "application/zip"); + mimeTypeMap.addExtensionMimeTypeMapping("rar", "application/x-rar-compressed"); + mimeTypeMap.addExtensionMimeTypeMapping("tar", "application/x-tar"); } @Test diff --git a/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java b/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java index 78468e5358..758431e5c2 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/notifications/NotificationConstantsTest.java @@ -22,7 +22,7 @@ import static android.app.NotificationManager.IMPORTANCE_HIGH; import static android.app.NotificationManager.IMPORTANCE_MIN; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.ui.notifications.NotificationConstants.CHANNEL_FTP_ID; import static com.amaze.filemanager.ui.notifications.NotificationConstants.CHANNEL_NORMAL_ID; @@ -54,7 +54,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class NotificationConstantsTest { private Context context; @@ -89,7 +89,7 @@ public void testSetMetadataIllegalType() { } @Test - @Config(sdk = {LOLLIPOP}) // max sdk is N + @Config(sdk = {M}) // max sdk is N public void testNormalNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_NORMAL_ID) @@ -101,7 +101,7 @@ public void testNormalNotification() { NotificationConstants.setMetadata(context, builder, TYPE_NORMAL); Notification result = builder.build(); - if (Build.VERSION.SDK_INT >= LOLLIPOP) { + if (Build.VERSION.SDK_INT >= M) { assertEquals(Notification.CATEGORY_SERVICE, result.category); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { @@ -112,7 +112,7 @@ public void testNormalNotification() { } @Test - @Config(sdk = {LOLLIPOP}) // max sdk is N + @Config(sdk = {M}) // max sdk is N public void testFtpNotification() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_FTP_ID) @@ -124,7 +124,7 @@ public void testFtpNotification() { .setOnlyAlertOnce(true); NotificationConstants.setMetadata(context, builder, TYPE_FTP); Notification result = builder.build(); - if (Build.VERSION.SDK_INT >= LOLLIPOP) { + if (Build.VERSION.SDK_INT >= M) { assertEquals(Notification.CATEGORY_SERVICE, result.category); assertEquals(Notification.VISIBILITY_PUBLIC, result.visibility); } @@ -140,10 +140,10 @@ public void testFtpNotification() { public void testCreateNormalChannel() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_NORMAL_ID); NotificationConstants.setMetadata(context, builder, TYPE_NORMAL); - List channels = shadowNotificationManager.getNotificationChannels(); + List channels = shadowNotificationManager.getNotificationChannels(); assertNotNull(channels); assertEquals(1, channels.size()); - NotificationChannel channel = (NotificationChannel) channels.get(0); + NotificationChannel channel = channels.get(0); assertEquals(IMPORTANCE_MIN, channel.getImportance()); assertEquals(CHANNEL_NORMAL_ID, channel.getId()); assertEquals(context.getString(R.string.channel_name_normal), channel.getName()); @@ -155,10 +155,10 @@ public void testCreateNormalChannel() { public void testCreateFtpChannel() { NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_FTP_ID); NotificationConstants.setMetadata(context, builder, TYPE_FTP); - List channels = shadowNotificationManager.getNotificationChannels(); + List channels = shadowNotificationManager.getNotificationChannels(); assertNotNull(channels); assertEquals(1, channels.size()); - NotificationChannel channel = (NotificationChannel) channels.get(0); + NotificationChannel channel = channels.get(0); assertEquals(IMPORTANCE_HIGH, channel.getImportance()); assertEquals(CHANNEL_FTP_ID, channel.getId()); assertEquals(context.getString(R.string.channel_name_ftp), channel.getName()); diff --git a/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt b/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt index 7d614b8431..d421c5d5d0 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt +++ b/app/src/test/java/com/amaze/filemanager/ui/theme/AppThemeTest.kt @@ -22,7 +22,7 @@ package com.amaze.filemanager.ui.theme import android.content.Context import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.PowerManager import androidx.preference.PreferenceManager @@ -41,7 +41,7 @@ import java.util.Calendar @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], shadows = [ShadowMultiDex::class], ) class AppThemeTest { diff --git a/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java b/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java index 37070cd432..f7096ace25 100644 --- a/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java +++ b/app/src/test/java/com/amaze/filemanager/ui/views/WarnableTextInputValidatorTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.ui.views; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -44,7 +44,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class WarnableTextInputValidatorTest { private Context context; diff --git a/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt b/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt index 7559fa97d4..c7c9bad0e9 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/AESCryptTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import org.junit.Assert.assertArrayEquals @@ -36,7 +36,7 @@ import kotlin.random.Random * Unit test for [AESCrypt] */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [M, P, Build.VERSION_CODES.R]) class AESCryptTest { /** * Simple sanity test on [AESCrypt]. diff --git a/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java b/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java index 92b65fdc29..24df7b4724 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/AnimUtilsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -45,7 +45,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class AnimUtilsTest { @Test diff --git a/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt index d7e116593f..6b51727d64 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/CryptUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.os.Environment import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -48,7 +48,7 @@ import kotlin.random.Random @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class CryptUtilTest { /** diff --git a/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt b/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt index 0e882b12c8..7f3d2df94b 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/MinMaxInputFilterTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import android.text.SpannedString import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -32,7 +32,7 @@ import org.junit.runner.RunWith import org.robolectric.annotation.Config @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, Build.VERSION_CODES.R]) +@Config(sdk = [M, P, Build.VERSION_CODES.R]) class MinMaxInputFilterTest { /** * Test MinMaxInputFilter functioning diff --git a/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt index 5f2a071a64..d13a4ffb72 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/NetworkUtilTest.kt @@ -1,3 +1,23 @@ +/* + * Copyright (C) 2014-2026 Arpit Khurana , Vishal Nehra , + * Emmanuel Messulam, Raymond Lai and Contributors. + * + * This file is part of Amaze File Manager. + * + * Amaze File Manager is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package com.amaze.filemanager.utils import android.app.Service @@ -10,7 +30,7 @@ import android.net.wifi.WifiInfo import android.net.wifi.WifiManager import android.os.Build import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import io.mockk.every @@ -33,7 +53,7 @@ import java.util.Collections * Tests for [NetworkUtil]. */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, VERSION_CODES.R]) +@Config(sdk = [M, P, VERSION_CODES.R]) @Suppress("StringLiteralDuplication") class NetworkUtilTest { private lateinit var context: Context diff --git a/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt index ccc65a0110..c5f498799b 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/SmbUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -46,7 +46,7 @@ import org.robolectric.annotation.Config @Suppress("StringLiteralDuplication") @RunWith(AndroidJUnit4::class) @Config( - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], shadows = [ShadowPasswordUtil::class, ShadowSmbUtil::class], ) class SmbUtilTest { diff --git a/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java b/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java index 12e9f3cd13..aeff06a154 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/TinyDBTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertNull; @@ -38,7 +38,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class TinyDBTest { private SharedPreferences prefs; diff --git a/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java b/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java index fa90467fca..d25e9e8a49 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java +++ b/app/src/test/java/com/amaze/filemanager/utils/UtilsTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.utils; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.N; import static android.os.Build.VERSION_CODES.P; import static com.amaze.filemanager.utils.Utils.formatTimer; @@ -56,7 +56,7 @@ import androidx.test.ext.junit.runners.AndroidJUnit4; @RunWith(AndroidJUnit4.class) -@Config(sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) +@Config(sdk = {M, P, Build.VERSION_CODES.R}) public class UtilsTest { @Test diff --git a/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt b/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt index fd74085121..ebfc7a2700 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/X509CertificateUtilTest.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils import android.os.Build -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.shadows.ShadowMultiDex @@ -41,7 +41,7 @@ import java.security.cert.X509Certificate @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [LOLLIPOP, P, Build.VERSION_CODES.R], + sdk = [M, P, Build.VERSION_CODES.R], ) class X509CertificateUtilTest { private lateinit var cert: X509Certificate diff --git a/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt b/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt index d937bc0c06..c8e8e9783b 100644 --- a/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt +++ b/app/src/test/java/com/amaze/filemanager/utils/smb/AbstractSubnetDiscoverDevicesStrategyTests.kt @@ -21,7 +21,7 @@ package com.amaze.filemanager.utils.smb import android.os.Build.VERSION_CODES -import android.os.Build.VERSION_CODES.LOLLIPOP +import android.os.Build.VERSION_CODES.M import android.os.Build.VERSION_CODES.P import androidx.test.ext.junit.runners.AndroidJUnit4 import com.amaze.filemanager.utils.NetworkUtil @@ -38,7 +38,7 @@ import java.net.InetAddress * Base class for [SmbDeviceScannerObservable.DiscoverDeviceStrategy] tests. */ @RunWith(AndroidJUnit4::class) -@Config(sdk = [LOLLIPOP, P, VERSION_CODES.R]) +@Config(sdk = [M, P, VERSION_CODES.R]) abstract class AbstractSubnetDiscoverDevicesStrategyTests { /** * Post test cleanup. diff --git a/app/src/testPlay/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallableTest.kt b/app/src/testPlay/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallableTest.kt index 3f4bc56889..51faea35ad 100644 --- a/app/src/testPlay/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallableTest.kt +++ b/app/src/testPlay/java/com/amaze/filemanager/asynchronous/asynctasks/compress/RarHelperCallableTest.kt @@ -21,11 +21,8 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress import android.os.Environment -import com.github.junrar.exception.UnsupportedRarV5Exception -import org.apache.commons.compress.archivers.ArchiveException import org.junit.Assert.assertEquals import org.junit.Assert.assertNotNull -import org.junit.Assert.assertNull import org.junit.Test import java.io.File @@ -72,15 +69,10 @@ class RarHelperCallableTest : AbstractCompressedHelperCallableArchiveTest() { "", false, ) - val result = - try { - callable.call() - } catch (exception: Throwable) { - assertEquals(ArchiveException::class.java, exception.javaClass) - assertEquals(UnsupportedRarV5Exception::class.java, exception.cause!!.javaClass) - null - } - assertNull(result) + val result = callable.call() + assertNotNull(result) + assertEquals(1, result.size) + assertEquals("test.bin", result.first().name) } override fun doCreateCallable( diff --git a/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt index e2538e9cf8..0ab5ac472c 100644 --- a/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt +++ b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/MultipartRarExtractorTest.kt @@ -28,8 +28,8 @@ import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil import com.amaze.filemanager.filesystem.compressed.extractcontents.Extractor.OnUpdate import com.amaze.filemanager.filesystem.compressed.extractcontents.helpers.RarExtractor import com.amaze.filemanager.shadows.ShadowMultiDex -import com.github.junrar.exception.UnsupportedRarV5Exception -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue import org.junit.Before import org.junit.Test import org.junit.runner.RunWith @@ -38,13 +38,12 @@ import org.robolectric.shadows.ShadowEnvironment import java.io.File import java.io.FileInputStream import java.io.FileOutputStream -import java.io.IOException import java.util.concurrent.CountDownLatch @RunWith(AndroidJUnit4::class) @Config( shadows = [ShadowMultiDex::class], - sdk = [Build.VERSION_CODES.LOLLIPOP, Build.VERSION_CODES.P], + sdk = [Build.VERSION_CODES.M, Build.VERSION_CODES.P], ) class MultipartRarExtractorTest { private val callback = @@ -87,8 +86,8 @@ class MultipartRarExtractorTest { override fun onFinish() { latch.countDown() val verify = File(Environment.getExternalStorageDirectory(), "test.bin") - Assert.assertTrue(verify.exists()) - Assert.assertEquals((1024 * 128).toLong(), verify.length()) + assertTrue(verify.exists()) + assertEquals((1024 * 128).toLong(), verify.length()) } }, ServiceWatcherUtil.UPDATE_POSITION, @@ -101,23 +100,25 @@ class MultipartRarExtractorTest { */ @Test fun testExtractMultiVolumeV5Rar() { - try { - RarExtractor( - ApplicationProvider.getApplicationContext(), - File( - Environment.getExternalStorageDirectory(), - "test-multipart-archive-v5.part1.rar", - ) - .absolutePath, - Environment.getExternalStorageDirectory().absolutePath, - callback, - ServiceWatcherUtil.UPDATE_POSITION, - ).extractEverything() - Assert.fail("No exception was thrown") - } catch (expected: IOException) { - expected.printStackTrace() - Assert.assertEquals(UnsupportedRarV5Exception::class.java, expected.cause!!.javaClass) - } + val latch = CountDownLatch(1) + RarExtractor( + ApplicationProvider.getApplicationContext(), + File( + Environment.getExternalStorageDirectory(), + "test-multipart-archive-v5.part1.rar", + ).absolutePath, + Environment.getExternalStorageDirectory().absolutePath, + object : OnUpdate by callback { + override fun onFinish() { + latch.countDown() + val verify = File(Environment.getExternalStorageDirectory(), "test.bin") + assertTrue(verify.exists()) + assertEquals((1024 * 128).toLong(), verify.length()) + } + }, + ServiceWatcherUtil.UPDATE_POSITION, + ).extractEverything() + latch.await() } private fun copyArchivesToStorage() { diff --git a/build.gradle b/build.gradle index 379e3c33b2..a9f3eab387 100644 --- a/build.gradle +++ b/build.gradle @@ -18,8 +18,8 @@ buildscript { } plugins { - id "com.diffplug.spotless" version "6.25.0" - id "com.google.devtools.ksp" version "1.9.25-1.0.20" apply false + id "com.diffplug.spotless" version "8.9.0" + id "com.google.devtools.ksp" version "2.2.20-2.0.4" apply false } allprojects { @@ -53,6 +53,7 @@ spotless { kotlin { licenseHeaderFile 'amaze.license.spotless.txt' target '*/src/**/*.kt' + targetExclude 'portscanner/src/**/*.kt' ktlint("1.1.1").setEditorConfigPath("$projectDir/.editorconfig") } } @@ -72,43 +73,43 @@ configurations { robo32 robo33 robo34 + robo35 + robo36 } dependencies { - robo21 "org.robolectric:android-all-instrumented:5.0.2_r3-robolectric-r0-i4" - robo22 "org.robolectric:android-all-instrumented:5.1.1_r9-robolectric-r2-i4" - robo23 "org.robolectric:android-all-instrumented:6.0.1_r3-robolectric-r1-i4" - robo24 "org.robolectric:android-all-instrumented:7.0.0_r1-robolectric-r1-i4" - robo25 "org.robolectric:android-all-instrumented:7.1.0_r7-robolectric-r1-i4" - robo26 "org.robolectric:android-all-instrumented:8.0.0_r4-robolectric-r1-i4" - robo27 "org.robolectric:android-all-instrumented:8.1.0-robolectric-4611349-i4" - robo28 "org.robolectric:android-all-instrumented:9-robolectric-4913185-2-i4" - robo29 "org.robolectric:android-all-instrumented:10-robolectric-5803371-i4" - robo30 "org.robolectric:android-all-instrumented:11-robolectric-6757853-i4" - robo31 "org.robolectric:android-all-instrumented:12-robolectric-7732740-i4" - robo32 "org.robolectric:android-all-instrumented:12.1-robolectric-8229987-i4" - robo33 "org.robolectric:android-all-instrumented:13-robolectric-9030017-i4" - robo34 "org.robolectric:android-all-instrumented:14-robolectric-10818077-i4" + robo21 "org.robolectric:android-all-instrumented:5.0.2_r3-robolectric-r0-i7" + robo22 "org.robolectric:android-all-instrumented:5.1.1_r9-robolectric-r2-i7" + robo23 "org.robolectric:android-all-instrumented:6.0.1_r3-robolectric-r1-i7" + robo24 "org.robolectric:android-all-instrumented:7.0.0_r1-robolectric-r1-i7" + robo25 "org.robolectric:android-all-instrumented:7.1.0_r7-robolectric-r1-i7" + robo26 "org.robolectric:android-all-instrumented:8.0.0_r4-robolectric-r1-i7" + robo27 "org.robolectric:android-all-instrumented:8.1.0-robolectric-4611349-i7" + robo28 "org.robolectric:android-all-instrumented:9-robolectric-4913185-2-i7" + robo29 "org.robolectric:android-all-instrumented:10-robolectric-5803371-i7" + robo30 "org.robolectric:android-all-instrumented:11-robolectric-6757853-i7" + robo31 "org.robolectric:android-all-instrumented:12-robolectric-7732740-i7" + robo32 "org.robolectric:android-all-instrumented:12.1-robolectric-8229987-i7" + robo33 "org.robolectric:android-all-instrumented:13-robolectric-9030017-i7" + robo34 "org.robolectric:android-all-instrumented:14-robolectric-10818077-i7" + robo35 "org.robolectric:android-all-instrumented:15-robolectric-13954326-i7" + robo36 "org.robolectric:android-all-instrumented:16-robolectric-13921718-i7" } def robolectricDependencies = "${rootProject.layout.buildDirectory.get().asFile}/robolectric" +def robolectricApis = (21..36) + +def fetchRobolectricApiTasks = robolectricApis.collect { apiLevel -> + def configurationName = "robo${apiLevel}" + def taskName = "fetchRobolectric${apiLevel}" + tasks.register(taskName, Copy) { + from configurations.named(configurationName) + into robolectricDependencies + } +} tasks.register('fetchRobolectricDependencies', Copy) { - from configurations.robo21 - from configurations.robo22 - from configurations.robo23 - from configurations.robo24 - from configurations.robo25 - from configurations.robo26 - from configurations.robo27 - from configurations.robo28 - from configurations.robo29 - from configurations.robo30 - from configurations.robo31 - from configurations.robo32 - from configurations.robo33 - from configurations.robo34 - into robolectricDependencies + dependsOn fetchRobolectricApiTasks } subprojects { diff --git a/commons_compress_7z/build.gradle b/commons_compress_7z/build.gradle index 74d66012b3..5f597d1d1d 100644 --- a/commons_compress_7z/build.gradle +++ b/commons_compress_7z/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'kotlin-android' android { namespace "com.amaze.filemanager.filesystem.compressed.sevenz" - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdkVersion libs.versions.compileSdk.get().toInteger() defaultConfig { minSdkVersion libs.versions.minSdk.get().toInteger() @@ -19,8 +19,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } diff --git a/commons_compress_7z/src/main/AndroidManifest.xml b/commons_compress_7z/src/main/AndroidManifest.xml index 29ba17970f..8072ee00db 100644 --- a/commons_compress_7z/src/main/AndroidManifest.xml +++ b/commons_compress_7z/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ - + + diff --git a/file_operations/build.gradle b/file_operations/build.gradle index 5400d64458..3f5cf32335 100644 --- a/file_operations/build.gradle +++ b/file_operations/build.gradle @@ -5,7 +5,7 @@ apply plugin: 'org.mozilla.rust-android-gradle.rust-android' android { namespace "com.amaze.filemanager.fileoperations" - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdkVersion libs.versions.compileSdk.get().toInteger() ndkVersion libs.versions.ndk.get() defaultConfig { @@ -26,13 +26,9 @@ android { } } - sourceSets { - test.java.srcDirs += '../testShared/src/test/java' - } - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } testOptions { @@ -41,10 +37,6 @@ android { returnDefaultValues = true } } - - kotlinOptions { - jvmTarget = '17' - } } // Rust configuration @@ -61,7 +53,7 @@ cargo { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } // Ensure Rust libraries are built before Android tasks @@ -110,6 +102,7 @@ dependencies { //TODO some libs are not needed //For tests + testImplementation project(':testShared') testImplementation libs.junit //tests the app logic testImplementation libs.robolectric //tests android interaction testImplementation libs.robolectric.shadows.httpclient //tests android interaction diff --git a/file_operations/src/main/AndroidManifest.xml b/file_operations/src/main/AndroidManifest.xml index f71066fedd..568741e54f 100644 --- a/file_operations/src/main/AndroidManifest.xml +++ b/file_operations/src/main/AndroidManifest.xml @@ -1,2 +1,2 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/gradle.properties b/gradle.properties index a7ce00a43f..3179809355 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,6 +11,59 @@ # The setting is particularly useful for tweaking memory settings. android.enableJetifier=true android.useAndroidX=true +android.jetifier.ignorelist=org.bouncycastle:bcpkix-jdk18on, \ + org.bouncycastle:bcprov-jdk18on, \ + org.bouncycastle:bcutil-jdk18on, \ + org.robolectric:annotations, \ + org.robolectric:junit, \ + org.robolectric:nativeruntime, \ + org.robolectric:pluginapi, \ + org.robolectric:plugins-maven-dependency-resolver, \ + org.robolectric:resource, \ + org.robolectric:robolectric, \ + org.robolectric:sandbox, \ + org.robolectric:shadowapi, \ + org.robolectric:shadows-framework, \ + org.robolectric:shadows-httpclient, \ + org.robolectric:utils, \ + org.robolectric:utils-reflector, \ + org.slf4j:slf4j-api, \ + net.lingala.zip4j:zip4j, \ + org.tukaani:xz, \ + org.jsoup:jsoup, \ + org.hamcrest:hamcrest, \ + org.hamcrest:hamcrest-core, \ + org.hamcrest:hamcrest-library, \ + org.awaitility:awaitility, \ + org.mockito:mockito-core, \ + org.mockito:mockito-inline, \ + io.mockk:mockk, \ + eu.agno3.jcifs:jcifs-ng, \ + commons-codec:commons-codec, \ + commons-net:commons-net, \ + commons-io:commons-io, \ + commons-logging:commons-logging, \ + com.google.guava:guava, \ + com.google.guava:listenablefuture, \ + com.github.npgall:concurrent-trees, \ + com.hierynomus:sshj, \ + com.ibm.icu:icu4j, \ + com.google.code.gson:gson, \ + com.google.guava:guava, \ + com.google.guava:listenablefuture, \ + ch.qos.logback:logback-core, \ + ch.qos.logback:logback-classic, \ + com.almworks.sqlite4java:sqlite4java, \ + org.apache.ftpserver:ftpserver, \ + com.github.topjohnwu.libsu:core, \ + com.github.topjohnwu.libsu:io, \ + org.apache.mina:mina-core, \ + org.apache.sshd:sshd-core, \ + org.apache.sshd:sshd-scp, \ + org.apache.sshd:sshd-sftp, \ + net.bytebuddy:byte-buddy, \ + net.bytebuddy:byte-buddy-agent, \ + junit:junit org.gradle.jvmargs=-Xmx4608M -XX:+UseParallelGC \ --add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8968d58db7..e36c9650f3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,74 +1,76 @@ [versions] -compileSdk = "34" -minSdk = "21" -targetSdk = "35" -kotlin = "1.9.25" +compileSdk = "36" +minSdk = "23" +targetSdk = "36" +kotlin = "2.2.20" ndk = "28.2.13676358" #r28c jacocoAndroid = "0.2.1" -gradle = "8.5.2" +gradle = "8.13.2" easylauncher = "6.1.0" legacySupportV13 = "1.0.0" -systembartint = "1.0.3" -robolectric = "4.9" -glide = "4.16.0" -sshj = "0.39.0" +systembartint = "1.0.4" +robolectric = "4.16.1" +glide = "5.0.7" +sshj = "0.40.0" jcifs = "2.1.10" eventbus = "3.3.1" fabSpeedDial = "3.3.0" room = "2.5.2" -bouncyCastle = "1.77" -awaitility = "3.1.6" -androidXCore = "1.7.0" +bouncyCastle = "1.85.2" +bouncyCastlePkix = "1.85" +awaitility = "4.3.0" +androidXActivity = "1.7.2" +androidXCore = "1.16.0" androidMaterial = "1.5.0" # Upgrade to 1.5 requires targetSdk 31 -androidXFragment = "1.5.6" -androidXAppCompat = "1.6.1" -androidXAnnotation = "1.7.1" +androidXFragment = "1.8.9" +androidXAppCompat = "1.7.1" +androidXAnnotation = "1.10.0" androidXPref = "1.2.1" androidXPalette = "1.0.0" androidXCardView = "1.0.0" -androidXConstraintLayout = "1.1.3" +androidXConstraintLayout = "2.2.2" androidXBiometric = "1.1.0" -androidXTest = "1.6.1" -androidXTestRunner = "1.6.2" -androidXTestExt = "1.2.1" +androidXTest = "1.7.0" +androidXTestRunner = "1.7.0" +androidXTestExt = "1.3.0" androidXArchCoreTest = "2.2.0" androidXMultidex = "2.0.1" autoService = "1.1.1" -kotlinxCoroutineTest = "1.7.3" -kotlinStdlibJdk8 = "1.9.20" +kotlinxCoroutineTest = "1.11.0" +kotlinStdlibJdk8 = "2.2.10" uiAutomator = "2.3.0" junit = "4.13.2" -slf4j = "2.0.13" -apacheSshd = "1.7.0" -apacheMina = "2.0.16" -mockito = "4.11.0" -mockitoInline = "4.11.0" -mockitoKotlin = "4.1.0" -androidBilling = "8.0.0" +slf4j = "2.0.18" +apacheSshd = "2.19.0" +apacheMina = "2.2.9" +mockito = "5.23.0" +mockitoInline = "5.2.0" +mockitoKotlin = "6.3.0" +androidBilling = "9.1.0" cloudrailSiAndroid = "2.22.4" -junrar = "7.4.0" +junrar = "8.1.0" vectordrawableAnimated = "1.2.0" -xz = "1.9" -zip4j = "2.6.4" -espresso = "3.6.1" +xz = "1.12" +zip4j = "2.11.6" +espresso = "3.7.0" materialDialogs = "0.9.6.0" jacoco = "0.8.11" commonsCompress = "1.22" libsu = "3.2.1" -mockk = "1.13.4" +mockk = "1.14.11" logbackAndroid = "3.0.0" -logbackClassic = "1.4.14" -commonsNet = "3.8.0" -ftpserver = "1.1.1" -jsoup = "1.16.1" -gson = "2.11.0" +logbackClassic = "1.6.1" +commonsNet = "3.13.0" +ftpserver = "1.2.1" +jsoup = "1.23.1" +gson = "2.14.0" rxAndroid = "2.1.1" -rxJava = "2.2.9" -okHttp = "4.12.0" -acraCore = "5.12.0" -leakcanaryAndroid = "2.7" +rxJava = "2.2.21" +okHttp = "5.1.0" +acraCore = "5.13.1" +leakcanaryAndroid = "2.14" mpAndroidChart = "v3.0.2" concurrentTrees = "2.6.1" aboutLibraries = "6.1.1" @@ -81,6 +83,7 @@ jacoco-android-plugin = { module = "com.mxalbert.gradle:jacoco-android", version kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } rust-android-gradle = { module = "org.mozilla.rust-android-gradle.rust-android:org.mozilla.rust-android-gradle.rust-android.gradle.plugin", version.ref = "rustAndroidGradle" } +androidX-activity = { module = "androidx.activity:activity-ktx", version.ref = "androidXActivity" } androidX-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidXAppCompat" } androidX-constraintLayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidXConstraintLayout" } androidX-core = { module = "androidx.core:core-ktx", version.ref = "androidXCore" } @@ -106,11 +109,13 @@ androidX-test-uiautomator = { module = "androidx.test.uiautomator:uiautomator", auto-service = { module = "com.google.auto.service:auto-service", version.ref = "autoService" } -bcpkix-jdk18on = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bouncyCastle" } +bcpkix-jdk18on = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bouncyCastlePkix" } bcprov-jdk18on = { module = "org.bouncycastle:bcprov-jdk18on", version.ref = "bouncyCastle" } apache-mina-core = { module = "org.apache.mina:mina-core", version.ref = "apacheMina" } apache-sshd = { module = "org.apache.sshd:sshd-core", version.ref = "apacheSshd" } +apache-sshd-scp = { module = "org.apache.sshd:sshd-scp", version.ref = "apacheSshd" } +apache-sshd-sftp = { module = "org.apache.sshd:sshd-sftp", version.ref = "apacheSshd" } apache-ftpserver-ftplet-api = { module = "org.apache.ftpserver:ftplet-api", version.ref = "ftpserver" } apache-ftpserver-core = { module = "org.apache.ftpserver:ftpserver-core", version.ref = "ftpserver" } diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 249e5832f0..1b33c55baa 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 0d1842103b..4f5eb9dcc0 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,7 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.5-bin.zip +networkTimeout=10000 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index a69d9cb6c2..23d15a9367 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -133,22 +133,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -193,16 +200,20 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index f127cfd49d..db3a6ac207 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @@ -26,6 +28,7 @@ if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -42,11 +45,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -56,22 +59,22 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/portscanner/build.gradle b/portscanner/build.gradle index ee039f9b63..cc0718f0b6 100644 --- a/portscanner/build.gradle +++ b/portscanner/build.gradle @@ -5,11 +5,11 @@ apply plugin: 'kotlin-parcelize' android { namespace 'com.stealthcopter.networktools' - compileSdk libs.versions.compileSdk.get().toInteger() + compileSdkVersion libs.versions.compileSdk.get().toInteger() defaultConfig { - minSdk libs.versions.minSdk.get().toInteger() - targetSdk libs.versions.targetSdk.get().toInteger() + minSdkVersion libs.versions.minSdk.get().toInteger() + targetSdkVersion libs.versions.targetSdk.get().toInteger() testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" consumerProguardFiles "consumer-rules.pro" @@ -22,13 +22,13 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 } } kotlin { - jvmToolchain(17) + jvmToolchain(21) } dependencies { diff --git a/settings.gradle b/settings.gradle index 70edc43f9d..cb1e87c6e5 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,3 +1,6 @@ +plugins { + id 'org.gradle.toolchains.foojay-resolver-convention' version '1.0.0' +} include ':file_operations' include ':portscanner' -include ':app', ':commons_compress_7z' +include ':app', ':commons_compress_7z', ':testShared' diff --git a/testShared/build.gradle b/testShared/build.gradle new file mode 100644 index 0000000000..12d423a853 --- /dev/null +++ b/testShared/build.gradle @@ -0,0 +1,81 @@ +apply plugin: 'com.android.library' +apply plugin: 'kotlin-android' + +android { + namespace "com.amaze.filemanager.test" + compileSdkVersion libs.versions.compileSdk.get().toInteger() + + defaultConfig { + minSdkVersion libs.versions.minSdk.get().toInteger() + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + flavorDimensions = ['static'] + + productFlavors { + fdroid { + dimension 'static' + } + + play { + dimension 'static' + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_21 + targetCompatibility JavaVersion.VERSION_21 + } + + testOptions { + unitTests { + includeAndroidResources = true + returnDefaultValues = true + } + } +} + +kotlin { + jvmToolchain(21) +} + +dependencies { + // App module dependency for accessing app classes + implementation project(':app') + + // File operations module for NativeOperations + implementation project(':file_operations') + + // Core testing dependencies + implementation libs.junit + implementation libs.robolectric + implementation libs.robolectric.shadows.httpclient + implementation libs.androidX.test.core + implementation libs.androidX.test.runner + implementation libs.androidX.test.rules + implementation libs.androidX.test.ext.junit + implementation libs.mockito.core + implementation libs.androidX.multidex + implementation libs.awaitility + + // Kotlin standard library + implementation libs.kotlin.stdlib.jdk8 + + // MockK for Kotlin mocking + implementation libs.mockk + + // RxJava for Completable and reactive types + implementation libs.rxjava + implementation libs.rxandroid + + // Room for database classes + implementation libs.room.runtime + + // SMB for shadow implementations + implementation libs.jcifs.ng + + // Android dependencies + implementation libs.androidX.appcompat + implementation libs.androidX.fragment +} + diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt b/testShared/src/main/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt similarity index 94% rename from testShared/src/test/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt rename to testShared/src/main/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt index 31e7e499e9..783c481f6a 100644 --- a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt +++ b/testShared/src/main/java/com/amaze/filemanager/shadows/ShadowFileUtils.kt @@ -1,7 +1,6 @@ /* * Copyright (C) 2014-2024 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai , - * Vishnu Sanal and Contributors. + * Emmanuel Messulam, Raymond Lai and Contributors. * * This file is part of Amaze File Manager. * diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowMultiDex.java b/testShared/src/main/java/com/amaze/filemanager/shadows/ShadowMultiDex.java similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/shadows/ShadowMultiDex.java rename to testShared/src/main/java/com/amaze/filemanager/shadows/ShadowMultiDex.java diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowSmbUtil.kt b/testShared/src/main/java/com/amaze/filemanager/shadows/ShadowSmbUtil.kt similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/shadows/ShadowSmbUtil.kt rename to testShared/src/main/java/com/amaze/filemanager/shadows/ShadowSmbUtil.kt diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java b/testShared/src/main/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java rename to testShared/src/main/java/com/amaze/filemanager/shadows/jcifs/smb/ShadowSmbFile.java diff --git a/testShared/src/test/java/com/amaze/filemanager/test/DummyFileGenerator.java b/testShared/src/main/java/com/amaze/filemanager/test/DummyFileGenerator.java similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/test/DummyFileGenerator.java rename to testShared/src/main/java/com/amaze/filemanager/test/DummyFileGenerator.java diff --git a/testShared/src/test/java/com/amaze/filemanager/test/ShadowNativeOperations.java b/testShared/src/main/java/com/amaze/filemanager/test/ShadowNativeOperations.java similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/test/ShadowNativeOperations.java rename to testShared/src/main/java/com/amaze/filemanager/test/ShadowNativeOperations.java diff --git a/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtil.kt b/testShared/src/main/java/com/amaze/filemanager/test/ShadowPasswordUtil.kt similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtil.kt rename to testShared/src/main/java/com/amaze/filemanager/test/ShadowPasswordUtil.kt diff --git a/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java b/testShared/src/main/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java similarity index 97% rename from testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java rename to testShared/src/main/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java index c1f8919b50..b0dd8d2061 100644 --- a/testShared/src/test/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java +++ b/testShared/src/main/java/com/amaze/filemanager/test/ShadowPasswordUtilTest.java @@ -20,7 +20,7 @@ package com.amaze.filemanager.test; -import static android.os.Build.VERSION_CODES.LOLLIPOP; +import static android.os.Build.VERSION_CODES.M; import static android.os.Build.VERSION_CODES.P; import static org.awaitility.Awaitility.await; import static org.junit.Assert.assertEquals; @@ -56,7 +56,7 @@ @RunWith(AndroidJUnit4.class) @Config( shadows = {ShadowMultiDex.class, ShadowPasswordUtil.class}, - sdk = {LOLLIPOP, P, Build.VERSION_CODES.R}) + sdk = {M, P, Build.VERSION_CODES.R}) public class ShadowPasswordUtilTest { @Before diff --git a/testShared/src/test/java/com/amaze/filemanager/test/ShadowTabHandler.kt b/testShared/src/main/java/com/amaze/filemanager/test/ShadowTabHandler.kt similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/test/ShadowTabHandler.kt rename to testShared/src/main/java/com/amaze/filemanager/test/ShadowTabHandler.kt diff --git a/testShared/src/test/java/com/amaze/filemanager/test/TestUtils.kt b/testShared/src/main/java/com/amaze/filemanager/test/TestUtils.kt similarity index 100% rename from testShared/src/test/java/com/amaze/filemanager/test/TestUtils.kt rename to testShared/src/main/java/com/amaze/filemanager/test/TestUtils.kt diff --git a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt b/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt deleted file mode 100644 index d037413740..0000000000 --- a/testShared/src/test/java/com/amaze/filemanager/shadows/ShadowContentResolver.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2014-2022 Arpit Khurana , Vishal Nehra , - * Emmanuel Messulam, Raymond Lai and Contributors. - * - * This file is part of Amaze File Manager. - * - * Amaze File Manager is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package com.amaze.filemanager.shadows - -import android.content.ContentResolver -import android.net.Uri -import org.robolectric.annotation.Implementation -import org.robolectric.annotation.Implements -import org.robolectric.shadows.ShadowContentResolver -import java.io.OutputStream - -/** - * [ShadowContentResolver] implementation to include - * [ContentResolver.openOutputStream] with Uri and open mode arguments. - * - * @see ContentResolver.openOutputStream(uri, String) - */ -@Implements(ContentResolver::class) -class ShadowContentResolver : ShadowContentResolver() { - /** - * Implements [ContentResolver.openOutputStream] with open mode parameter. - * - * Simply delegate to one without open mode. - */ - @Implementation - fun openOutputStream( - uri: Uri, - mode: String, - ): OutputStream? = super.openOutputStream(uri) -}