diff --git a/app/build.gradle b/app/build.gradle index d2e9ad3f05..ebe36ad437 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\"" debuggable true //For "debug" banner on icon @@ -55,7 +66,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\"" } } @@ -87,17 +98,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 { @@ -131,6 +134,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 @@ -150,6 +154,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 @@ -162,14 +167,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 @@ -260,7 +267,7 @@ dependencies { } kotlin { - jvmToolchain(17) + jvmToolchain(21) } configurations.configureEach { @@ -268,6 +275,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/UnsupportedRarV5Exception.java deleted file mode 100644 index 4ed70a93de..0000000000 --- a/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarV5Exception.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2014-2024 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.github.junrar.exception; - -public class UnsupportedRarV5Exception extends Exception { - public UnsupportedRarV5Exception(Throwable cause) { - super(cause); - } - - public UnsupportedRarV5Exception() {} -} diff --git a/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java b/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java new file mode 100644 index 0000000000..61d9516c3a --- /dev/null +++ b/app/src/fdroid/java/com/github/junrar/exception/UnsupportedRarVersionException.java @@ -0,0 +1,46 @@ +/* + * 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.github.junrar.exception; + +/* + * This file is extracted from junrar library (https://github.com/junrar/junrar). + * The file exist to comply with F-Droid's requirement that no proprietary archive formats can be + * supported. + * + * - TranceLove + */ + +/** + * 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 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..ed44b616bc 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 @@ -22,6 +22,7 @@ package com.amaze.filemanager.asynchronous.asynctasks.compress import android.content.Context import android.net.Uri +import androidx.core.net.toUri import com.amaze.filemanager.R import com.amaze.filemanager.adapters.data.CompressedObjectParcelable import com.amaze.filemanager.application.AppConfig @@ -41,95 +42,100 @@ class ZipHelperCallable( ) : CompressedHelperCallable(goback) { private val context: WeakReference = WeakReference(c) - private val fileLocation: Uri = Uri.parse(realFileDirectory) + private val fileLocation: Uri = realFileDirectory.toUri() private val relativeDirectory: String? = dir @Throws(ArchiveException::class) @Suppress("ComplexMethod", "LongMethod") - public override fun addElements(elements: ArrayList) = + public override fun addElements(elements: ArrayList) { + val path = + fileLocation.path + ?: throw ArchiveException("Invalid zip file location: $fileLocation") try { - fileLocation.path?.run { - val zipfile = ZipFile(fileLocation.path) - val wholelist = filterValidEntryList(zipfile) - val strings = ArrayList() - for (entry in wholelist) { - val file = File(entry.path) - val y = - entry.path.let { - if (it.startsWith("/")) { - it.substring(1, it.length) - } else { - it - } + val zipfile = ZipFile(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) { + val file = File(entry.path) + val y = + entry.path.let { + if (it.startsWith("/")) { + it.substring(1, it.length) + } else { + it } - if (relativeDirectory == null || relativeDirectory.trim { it <= ' ' }.isEmpty()) { - var path: String - var zipObj: CompressedObjectParcelable - if (file.parent == null || file.parent!!.isEmpty() || file.parent == "/") { - path = y - zipObj = + } + if (relativeDirectory == null || relativeDirectory.trim { it <= ' ' }.isEmpty()) { + var path: String + var zipObj: CompressedObjectParcelable + if (file.parent == null || file.parent!!.isEmpty() || file.parent == "/") { + path = y + zipObj = + CompressedObjectParcelable( + y, + entry.date, + entry.size, + entry.directory, + ) + } else { + path = y.substring(0, y.indexOf("/") + 1) + zipObj = + CompressedObjectParcelable( + path, + entry.date, + entry.size, + true, + ) + } + if (!strings.contains(path)) { + elements.add(zipObj) + strings.add(path) + } + } else { + if (file.parent != null && + ( + file.parent == relativeDirectory || + file.parent == "/$relativeDirectory" + ) + ) { + if (!strings.contains(y)) { + elements.add( CompressedObjectParcelable( y, entry.date, entry.size, entry.directory, - ) - } else { - path = y.substring(0, y.indexOf("/") + 1) - zipObj = + ), + ) + strings.add(y) + } + } else if (y.startsWith("$relativeDirectory/") && + (y.length > (relativeDirectory.length + 1)) + ) { + val path1 = y.substring(relativeDirectory.length + 1, y.length) + val index = relativeDirectory.length + 1 + path1.indexOf("/") + val path = y.substring(0, index + 1) + if (!strings.contains(path)) { + elements.add( CompressedObjectParcelable( - path, + y.substring(0, index + 1), entry.date, entry.size, true, - ) - } - if (!strings.contains(path)) { - elements.add(zipObj) - strings.add(path) - } - } else { - if (file.parent != null && - ( - file.parent == relativeDirectory || - file.parent == "/$relativeDirectory" + ), ) - ) { - if (!strings.contains(y)) { - elements.add( - CompressedObjectParcelable( - y, - entry.date, - entry.size, - entry.directory, - ), - ) - strings.add(y) - } - } else if (y.startsWith("$relativeDirectory/") && - y.length > relativeDirectory.length + 1 - ) { - val path1 = y.substring(relativeDirectory.length + 1, y.length) - val index = relativeDirectory.length + 1 + path1.indexOf("/") - val path = y.substring(0, index + 1) - if (!strings.contains(path)) { - elements.add( - CompressedObjectParcelable( - y.substring(0, index + 1), - entry.date, - entry.size, - true, - ), - ) - strings.add(path) - } + strings.add(path) } } } - } ?: throw ArchiveException(null) + } } catch (e: ZipException) { throw ArchiveException("Zip file is corrupt", e) } + } private fun filterValidEntryList(zipFile: ZipFile): List { val retval = ArrayList() 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..765d8123e3 --- 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 @@ -30,7 +29,6 @@ import com.afollestad.materialdialogs.DialogAction import com.afollestad.materialdialogs.MaterialDialog import com.amaze.filemanager.R import com.amaze.filemanager.asynchronous.asynctasks.fromTask -import com.amaze.filemanager.asynchronous.asynctasks.movecopy.PreparePasteTask.CopyNode import com.amaze.filemanager.asynchronous.management.ServiceWatcherUtil import com.amaze.filemanager.asynchronous.services.CopyService import com.amaze.filemanager.databinding.CopyDialogBinding @@ -64,6 +62,7 @@ import java.util.LinkedList * is a directory, the conflicts are resolved by inserting a node in [CopyNode] tree and then doing * BFS on this tree. */ +@Suppress("LabeledExpression") class PreparePasteTask(strongRefMain: MainActivity) { private lateinit var targetPath: String private var isMove = false @@ -133,44 +132,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..30e3732616 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,11 +364,11 @@ 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)); + extractService.getString(R.string.error_unsupported_rar_version, compressedPath)); return false; } else { LOG.error("Error while extracting file " + compressedPath, e); diff --git a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ftp/FtpServerSslKeyStoreProvider.kt b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ftp/FtpServerSslKeyStoreProvider.kt index b0601fe983..dcb79e1f75 100644 --- a/app/src/main/java/com/amaze/filemanager/asynchronous/services/ftp/FtpServerSslKeyStoreProvider.kt +++ b/app/src/main/java/com/amaze/filemanager/asynchronous/services/ftp/FtpServerSslKeyStoreProvider.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.asynchronous.services.ftp import android.annotation.SuppressLint 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..a1fb892876 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,8 +656,11 @@ class CompressedExplorerFragment : Fragment(), BottomBarButtonPath { private fun archiveCorruptOrUnsupportedToast(e: Throwable?) { @StringRes val msg: Int = - if (e?.cause?.javaClass is UnsupportedRarV5Exception) { - R.string.error_unsupported_v5_rar + if (UnsupportedRarVersionException::class.java.isAssignableFrom( + e?.cause?.javaClass, + ) + ) { + R.string.error_unsupported_rar_version } 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/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index b9bd40287e..2043bbcd82 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -635,7 +635,6 @@ امكانية توصل للقراءة فقط استخدام كشف التركة للدليل الرئيسي اذا تم اتاحته ، استخدم الطريقة المتوارثة لعرض الملفات - ملف تخزين RAR \" %s \" لا يتم دعم أرشيف RAR v5. سيكون من الضروري اعادة بدء وحدة خدمة FTP لكي تصبح التغييرات فعالة. تم رفض التصريح كلمة سرية أرشيف غير صحيحة. diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 0c68b905e5..3017555ab8 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -650,7 +650,6 @@ Přístup pouze pro čtení Použít starší výpis souborů pro root Pokud je povoleno, používá k výpisu souborů starší metodu - RAR archív \"%s\" je nepodporovaný RAR v5 archív. Budete muset FTP server restartovat pro projevení změn. Oprávněění odmítnuto Nesprávné heslo archívu. diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 9647b78e83..e7179dd5a5 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -659,7 +659,6 @@ andernfalls wird nach Treffern gesucht. Nur-Lesen Zugriff Alte Auflistung für Root verwenden Wenn aktiviert, wird die Legacy-Methode für die Auflistung von Dateien verwendet - RAR-Archiv \"%s\" ist ein nicht unterstütztes RAR v5-Archiv. Sie müssen den FTP-Server neu starten, damit die Änderungen angewendet werden. Berechtigung verweigert Falsches Archiv-Passwort. diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 008ba75afa..5297fa3082 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -654,7 +654,6 @@ Πρόσβαση μόνο για ανάγνωση Χρήση παλαιού καταλόγου για root Εάν είναι ενεργή, χρησιμοποιεί την παλαιά μέθοδο για τη λίστα αρχείων - Το αρχείο RAR \"%s\" είναι μη υποστηριζόμενο αρχείο RAR v5. Θα χρειαστεί να επανεκκινήσετε το διακομιστή FTP για να τεθούν σε ισχύ οι αλλαγές. Απορριφθείσα άδεια Λάθος κωδικός πρόσβασης αρχείου. diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 88dd8466a3..29422d69ab 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -634,5 +634,6 @@ Solo necesita hacer esto una vez, hasta la siguiente vez que seleccione una nuev Archivos accedidos recientemente usando Amaze Archivos creados o modificados recientemente No se encontró un navegador disponible + El archivo RAR \"%s\" es un archivo RAR no compatible. diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 715e61a756..f6d72f064c 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -653,7 +653,6 @@ Accès en lecture seule Utiliser l\'ancien affichage pour root Si cette option est activée, l\'ancienne méthode est utilisée pour lister les fichiers. - L\'archive RAR \"%s\" est une archive RAR v5 non prise en charge. Vous devrez redémarrer le serveur FTP pour appliquer les changements. Permission refusée Mot de passe erroné diff --git a/app/src/main/res/values-he/strings.xml b/app/src/main/res/values-he/strings.xml index 61f74a4ec7..6e939d2073 100644 --- a/app/src/main/res/values-he/strings.xml +++ b/app/src/main/res/values-he/strings.xml @@ -708,7 +708,6 @@ גישה לקריאה בלבד להשתמש בתצוגה מיושנת למשתמש על (root) אם פעיל, ייעשה שימוש בשיטה מיושנת להצגת קבצים - ארכיון ה־RAR ‏„%s” הוא ארכיון RAR v5 שאינו נתמך. יהיה עליך להפעיל את שרת ה־FTP מחדש כדי שהשינויים ייכנסו לתוקף. ההרשאה נדחתה סיסמת הארכיון שגויה. diff --git a/app/src/main/res/values-hu-rHU/strings.xml b/app/src/main/res/values-hu-rHU/strings.xml index 3be818d478..1389f8b49b 100644 --- a/app/src/main/res/values-hu-rHU/strings.xml +++ b/app/src/main/res/values-hu-rHU/strings.xml @@ -658,7 +658,6 @@ Csak olvasási hozzáférés Örökölt lista használata a gyökérhez Ha engedélyezve van, az örökölt módszer lesz használva a fájlok listázására - A(z) \"%s\" RAR egy nem támogatott RAR V5 archívum. A módosítások érvénybe léptetéséhez újra kell indítania az FTP-kiszolgálót. Hozzáférés megtagadva Rossz archívum jelszó. diff --git a/app/src/main/res/values-id/strings.xml b/app/src/main/res/values-id/strings.xml index 5fbcaf17e0..74ebbefe58 100644 --- a/app/src/main/res/values-id/strings.xml +++ b/app/src/main/res/values-id/strings.xml @@ -652,7 +652,6 @@ Akses baca-saja Gunakan tampilan lama untuk root Jika diaktifkan, gunakan metode lama untuk menampilkan berkas - Arsip RAR \"%s\" adalah arsip RAR v5 yang tidak didukung. Anda perlu memulai ulang server FTP agar perubahan terdampak. Perizinan ditolak Sandi arsip salah. diff --git a/app/src/main/res/values-it-rIT/strings.xml b/app/src/main/res/values-it-rIT/strings.xml index 73a9bc7089..d889a645cb 100644 --- a/app/src/main/res/values-it-rIT/strings.xml +++ b/app/src/main/res/values-it-rIT/strings.xml @@ -661,7 +661,6 @@ altrimenti verrà controllata solo l\'occorrenza. Accesso di sola lettura Usa elenco legacy per root Se attivo, usa il metodo legacy per l\'elenco dei file - L\'archivio RAR \"%s\" non è un archivio RAR v5 supportato. Devi riavviare il server FTP affinché le modifiche abbiano effetto. Permesso negato Password archivio sbagliata. diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index 1fce768cd6..05fd3ce2ec 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -653,7 +653,7 @@ Read-only access Use legacy listing for root If enabled, uses legacy method to list files - RAR archive \"%s\" is unsupported RAR v5 archive. + RAR archive \"%s\" is unsupported RAR archive. You will need to restart the FTP server for changes to take effect. Permission denied Wrong archive password. diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 6fcc304b60..31719397e7 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -644,7 +644,6 @@ Dostęp tylko do odczytu Użyj starszej listy dla root Jeśli ta opcja jest włączona, używa starszej metody do wyświetlania listy plików - Archiwum RAR „%s” jest nieobsługiwanym archiwum RAR v5. Będziesz musiał ponownie uruchomić serwer FTP, aby zmiany zaczęły obowiązywać. Odmowa zezwolenia Nieprawidłowe hasło do archiwum. diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index f77620244d..f3cdd3594b 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -653,7 +653,6 @@ Apenas leitura Usar listagem legada para root Se habilitado, usa método legado para listar arquivos - Arquivo RAR \"%s\" é um arquivo RAR v5 não suportado. Você precisa reiniciar o servidor FTP para aplicar as mudanças. Permissão negada Senha incorreta do arquivo. diff --git a/app/src/main/res/values-pt-rPT/strings.xml b/app/src/main/res/values-pt-rPT/strings.xml index d3712ca1bd..e715b91a91 100644 --- a/app/src/main/res/values-pt-rPT/strings.xml +++ b/app/src/main/res/values-pt-rPT/strings.xml @@ -653,7 +653,6 @@ Se inativa, será procurada qualquer correspondência. Apenas leitura Usar listagem legada para root Se habilitado, usa método legado para listar arquivos - Arquivo RAR \"%s\" é um arquivo RAR v5 não suportado. Você precisa reiniciar o servidor FTP para aplicar as mudanças. Permissão negada Senha incorreta do arquivo. diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 9d52f3504a..87f850e272 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -641,7 +641,6 @@ Доступ только для чтения Использовать устаревший вид список для root Если включить, будет использоваться устаревший метод для вывода списка файлов - Архив RAR \"%s\" не поддерживается архивом RAR v5. Чтобы изменения вступили в силу, вам нужно будет перезапустить FTP-сервер. В доступе отказано Неверный пароль архива. diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index b06d6219ce..5fd225aeec 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -657,7 +657,6 @@ Ana bilgisayar parmak izini güncellemeye devam edebilir veya SSH bağlantı aya Salt okunur erişim Root için eski listeyi kullan Etkinleştirilirse, dosyaları listelemek için eski yöntemi kullanır - \"%s\" RAR arşivi desteklenmeyen RAR v5 arşividir. Değişikliklerin etkili olması için FTP sunucusunu yeniden başlatmanız gerekecek. İzin reddedildi Yanlış arşiv şifresi. diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 762cec223c..0f4a20e9a5 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -603,8 +603,9 @@ Очистити кеш Очищає вибрані програми відкриття файлів за замовчуванням Використовуйте застарілий список для root + Архів RAR \"%s\" є архівом RAR, який не підтримується. Дозвіл відмовлено Не вірний пароль архіву. Вимкнено - + diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index 90d3984a9c..0b208714c2 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -637,7 +637,6 @@ Truy cập chỉ đọc Sử dụng danh sách cũ cho root Nếu được bật, sẽ sử dụng phương pháp cũ để liệt kê các tệp - Lưu trữ RAR \"%s\" là lưu trữ RAR v5 không được hỗ trợ. Bạn sẽ cần khởi động lại máy chủ FTP để các thay đổi có hiệu lực. Quyền bị từ chối Mật khẩu lưu trữ sai. diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 37065f0f7b..112c5b4723 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -666,7 +666,7 @@ 只读访问权限 对根目录使用传统的文件列表方式 启用后,将使用传统方法列出文件 - 尚不支持RAR 压缩文件\"%s\",因为它是最新的第5版RAR格式。 + 尚不支持RAR 压缩文件\"%s\",因为它是最新的 RAR格式。 需要您重启文件传输协议服务器,使得新设定生效 拒绝许可 解压密码有误 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 49a150a5ea..ba1dcf480c 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -651,7 +651,7 @@ 唯讀模式 喺 Root模式使用舊有方式列出文件 開啟呢個設定嘅話,Amaze會用番原有嘅方法列出文件 - RAR 壓縮檔 \"%s\" 係未能支援嘅 RAR v5壓縮檔。 + RAR 壓縮檔 \"%s\" 係未能支援嘅 RAR壓縮檔。 要使設定生效,請重新啟動 FTP伺服器 拒絕存取 壓縮檔嘅密碼錯咗。 diff --git a/app/src/main/res/values-zh-rHN/strings.xml b/app/src/main/res/values-zh-rHN/strings.xml index 6702cd0a41..61db2071f6 100644 --- a/app/src/main/res/values-zh-rHN/strings.xml +++ b/app/src/main/res/values-zh-rHN/strings.xml @@ -651,7 +651,6 @@ 唯讀模式 喺 Root模式使用舊有方式列出文件 開啟呢個設定嘅話,Amaze會用番原有嘅方法列出文件 - RAR 压缩文件\"%s\"是尚未支持的RAR v5 文件。 要使設定生效,請重新啟動 FTP伺服器 权限不足 解压密码有误 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index b26a193a7c..144d702bff 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -651,7 +651,7 @@ 唯讀存取 在 Root模式使用舊有方式列出文件 開啟此設定的話,Amaze會使用原有的方法列出文件 - RAR 壓縮檔 \"%s\" 是未能支援的 RAR v5壓縮檔。 + RAR 壓縮檔 \"%s\" 是未能支援的 RAR壓縮檔。 請重新啟動 FTP伺服器以套用新設定。 拒絕存取 錯誤的壓縮檔密碼。 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e6bcdb1595..056dd7afd1 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -738,7 +738,7 @@ Read-only access Use legacy listing for root If enabled, uses legacy method to list files - RAR archive \"%s\" is unsupported RAR v5 archive. + RAR archive \"%s\" is an unsupported RAR archive. You will need to restart the FTP server for changes to take effect. Permission denied Wrong archive password. 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/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/PasswordProtectedRarTest.kt b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/PasswordProtectedRarTest.kt index bc43af985a..f4251c53db 100644 --- a/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/PasswordProtectedRarTest.kt +++ b/app/src/testPlay/java/com/amaze/filemanager/filesystem/compressed/extractcontents/PasswordProtectedRarTest.kt @@ -21,6 +21,7 @@ package com.amaze.filemanager.filesystem.compressed.extractcontents import com.amaze.filemanager.filesystem.compressed.extractcontents.helpers.RarExtractor +import com.github.junrar.exception.BadRarArchiveException import org.apache.commons.compress.PasswordRequiredException import org.junit.Ignore import org.junit.Test @@ -29,7 +30,12 @@ import java.io.IOException open class PasswordProtectedRarTest : AbstractExtractorPasswordProtectedArchivesTest() { override fun extractorClass(): Class = RarExtractor::class.java - override fun expectedRootExceptionClass(): Array> = arrayOf(IOException::class.java, PasswordRequiredException::class.java) + override fun expectedRootExceptionClass(): Array> = + arrayOf( + IOException::class.java, + PasswordRequiredException::class.java, + BadRarArchiveException::class.java, + ) override val archiveType: String = "rar" 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/gradle-daemon-jvm.properties b/gradle/gradle-daemon-jvm.properties new file mode 100644 index 0000000000..5c2ece29a4 --- /dev/null +++ b/gradle/gradle-daemon-jvm.properties @@ -0,0 +1,12 @@ +#This file is generated by updateDaemonJvm +toolchainUrl.FREE_BSD.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b43b10bd60d8689faca2651e270e52e7/redirect +toolchainUrl.FREE_BSD.X86_64=https\://api.foojay.io/disco/v3.0/ids/5307a953ce47831ecf5a715128766856/redirect +toolchainUrl.LINUX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b43b10bd60d8689faca2651e270e52e7/redirect +toolchainUrl.LINUX.X86_64=https\://api.foojay.io/disco/v3.0/ids/5307a953ce47831ecf5a715128766856/redirect +toolchainUrl.MAC_OS.AARCH64=https\://api.foojay.io/disco/v3.0/ids/03ffe42aae843e3c5ed7cf8ae3ae9a73/redirect +toolchainUrl.MAC_OS.X86_64=https\://api.foojay.io/disco/v3.0/ids/6ec5bdd39b6256778a046b2b37f8de26/redirect +toolchainUrl.UNIX.AARCH64=https\://api.foojay.io/disco/v3.0/ids/b43b10bd60d8689faca2651e270e52e7/redirect +toolchainUrl.UNIX.X86_64=https\://api.foojay.io/disco/v3.0/ids/5307a953ce47831ecf5a715128766856/redirect +toolchainUrl.WINDOWS.X86_64=https\://api.foojay.io/disco/v3.0/ids/6fb5075b2dcb0e97607e0bbd93459403/redirect +toolchainVendor=AMAZON +toolchainVersion=21 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8968d58db7..015ac5b1f5 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.19" +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.1" 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.2" +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) -}