diff --git a/app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java b/app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java index 3f846a6c6c..01af194719 100644 --- a/app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java +++ b/app/core/src/main/java/com/fsck/k9/mailstore/LocalStore.java @@ -651,9 +651,13 @@ public class LocalStore { if (MimeUtil.ENC_QUOTED_PRINTABLE.equals(encoding)) { return new QuotedPrintableInputStream(rawInputStream) { @Override - public void close() throws IOException { + public void close() { super.close(); - rawInputStream.close(); + try { + rawInputStream.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } }; } diff --git a/app/k9mail/build.gradle b/app/k9mail/build.gradle index 592897eb00..cde74c44d7 100644 --- a/app/k9mail/build.gradle +++ b/app/k9mail/build.gradle @@ -8,6 +8,8 @@ if (rootProject.testCoverage) { } dependencies { + coreLibraryDesugaring libs.desugar + implementation project(":app:ui:legacy") implementation project(":app:ui:message-list-widget") implementation project(":app:core") @@ -69,6 +71,10 @@ android { release } + compileOptions { + coreLibraryDesugaringEnabled true + } + buildTypes { release { if (project.hasProperty('storeFile')) { @@ -103,24 +109,32 @@ android { } } - lintOptions { + lint { checkDependencies true } packagingOptions { - exclude 'META-INF/DEPENDENCIES' - exclude 'META-INF/LICENSE' - exclude 'META-INF/LICENSE.txt' - exclude 'META-INF/NOTICE' - exclude 'META-INF/NOTICE.txt' - exclude 'META-INF/README' - exclude 'META-INF/README.md' - exclude 'META-INF/CHANGES' - exclude 'LICENSE.txt' - exclude 'META-INF/*.kotlin_module' - exclude 'META-INF/*.version' - exclude 'kotlin/**' - exclude 'DebugProbesKt.bin' + jniLibs { + excludes += ['kotlin/**'] + } + + resources { + excludes += [ + 'META-INF/DEPENDENCIES', + 'META-INF/LICENSE', + 'META-INF/LICENSE.txt', + 'META-INF/NOTICE', + 'META-INF/NOTICE.txt', + 'META-INF/README', + 'META-INF/README.md', + 'META-INF/CHANGES', + 'LICENSE.txt', + 'META-INF/*.kotlin_module', + 'META-INF/*.version', + 'kotlin/**', + 'DebugProbesKt.bin' + ] + } } dependenciesInfo { diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt index 55080bc025..046f48a51d 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/onboarding/WelcomeFragment.kt @@ -15,11 +15,11 @@ import com.fsck.k9.ui.observeNotNull import com.fsck.k9.ui.settings.import.SettingsImportResultViewModel import com.fsck.k9.ui.settings.import.SettingsImportSuccess import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import org.koin.androidx.viewmodel.ext.android.activityViewModel class WelcomeFragment : Fragment() { private val htmlToSpanned: HtmlToSpanned by inject() - private val importResultViewModel: SettingsImportResultViewModel by sharedViewModel() + private val importResultViewModel: SettingsImportResultViewModel by activityViewModel() override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { return inflater.inflate(R.layout.fragment_welcome_message, container, false) diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt index b79ef71701..8ae3d7cabe 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/account/AccountSettingsFragment.kt @@ -39,14 +39,14 @@ import com.fsck.k9.ui.settings.removeEntry import com.fsck.k9.ui.withArguments import com.takisoft.preferencex.PreferenceFragmentCompat import org.koin.android.ext.android.inject -import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.core.parameter.parametersOf import org.openintents.openpgp.OpenPgpApiManager import org.openintents.openpgp.util.OpenPgpKeyPreference import org.openintents.openpgp.util.OpenPgpProviderUtil class AccountSettingsFragment : PreferenceFragmentCompat(), ConfirmationDialogFragmentListener { - private val viewModel: AccountSettingsViewModel by sharedViewModel() + private val viewModel: AccountSettingsViewModel by activityViewModel() private val dataStoreFactory: AccountSettingsDataStoreFactory by inject() private val openPgpApiManager: OpenPgpApiManager by inject { parametersOf(this) } private val messagingController: MessagingController by inject() diff --git a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/import/SettingsImportFragment.kt b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/import/SettingsImportFragment.kt index 330b1b5711..4b3399dcbe 100644 --- a/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/import/SettingsImportFragment.kt +++ b/app/ui/legacy/src/main/java/com/fsck/k9/ui/settings/import/SettingsImportFragment.kt @@ -19,12 +19,12 @@ import com.fsck.k9.ui.R import com.fsck.k9.ui.observeNotNull import com.mikepenz.fastadapter.FastAdapter import com.mikepenz.fastadapter.adapters.ItemAdapter -import org.koin.androidx.viewmodel.ext.android.sharedViewModel +import org.koin.androidx.viewmodel.ext.android.activityViewModel import org.koin.androidx.viewmodel.ext.android.viewModel class SettingsImportFragment : Fragment() { private val viewModel: SettingsImportViewModel by viewModel() - private val resultViewModel: SettingsImportResultViewModel by sharedViewModel() + private val resultViewModel: SettingsImportResultViewModel by activityViewModel() private lateinit var settingsImportAdapter: FastAdapter> private lateinit var itemAdapter: ItemAdapter> diff --git a/backend/webdav/src/main/AndroidManifest.xml b/backend/webdav/src/main/AndroidManifest.xml deleted file mode 100644 index 7299b9e31b..0000000000 --- a/backend/webdav/src/main/AndroidManifest.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 16df906993..e58b30439e 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,20 +2,20 @@ # Please don't open pull requests upgrading dependencies if you're a new contributor. [versions] -java = "1.8" -androidGradlePlugin = "7.3.1" +java = "11" +androidGradlePlugin = "7.4.0" ktlint = "0.44.0" -kotlin = "1.7.22" +kotlin = "1.8.0" kotlinCoroutines = "1.6.4" -jetbrainsAnnotations = "23.0.0" -androidxAppCompat = "1.5.1" -androidxActivity = "1.6.0" +jetbrainsAnnotations = "24.0.0" +androidxAppCompat = "1.6.0" +androidxActivity = "1.6.1" androidxRecyclerView = "1.2.1" androidxLifecycle = "2.5.1" -androidxNavigation = "2.5.2" +androidxNavigation = "2.5.3" androidxConstraintLayout = "2.1.4" -androidxFragment = "1.5.3" +androidxFragment = "1.5.5" androidxCore = "1.9.0" androidxPreference = "1.2.0" androidxDrawerLayout = "1.1.1" @@ -23,24 +23,27 @@ androidxTransition = "1.4.1" fastAdapter = "5.7.0" preferencesFix = "1.1.0" timber = "5.0.1" -koin = "3.2.2" -mime4j = "0.8.6" +koinCore = "3.3.2" +koinAndroid = "3.3.2" +mime4j = "0.8.8" okhttp = "4.10.0" glide = "4.14.2" moshi = "1.14.0" -mockito = "4.8.0" +mockito = "5.0.0" [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } android-lint = { id = "com.android.lint", version.ref = "androidGradlePlugin" } -ksp = "com.google.devtools.ksp:1.7.22-1.0.8" +ksp = "com.google.devtools.ksp:1.8.0-1.0.8" kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } ktlint = "org.jlleitschuh.gradle.ktlint:11.0.0" [libraries] +desugar = "com.android.tools:desugar_jdk_libs:1.1.8" + kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinCoroutines" } @@ -67,8 +70,8 @@ androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx androidx-cardview = "androidx.cardview:cardview:1.0.0" androidx-preference = { module = "androidx.preference:preference", version.ref = "androidxPreference" } androidx-swiperefreshlayout = "androidx.swiperefreshlayout:swiperefreshlayout:1.1.0" -androidx-test-core = "androidx.test:core:1.4.0" -android-material = "com.google.android.material:material:1.6.1" +androidx-test-core = "androidx.test:core:1.5.0" +android-material = "com.google.android.material:material:1.7.0" fastadapter = { module = "com.mikepenz:fastadapter", version.ref = "fastAdapter" } fastadapter-extensions-drag = { module = "com.mikepenz:fastadapter-extensions-drag", version.ref = "fastAdapter" } fastadapter-extensions-utils = { module = "com.mikepenz:fastadapter-extensions-utils", version.ref = "fastAdapter" } @@ -76,19 +79,15 @@ materialdrawer = "com.mikepenz:materialdrawer:8.4.5" preferencex = { module = "com.takisoft.preferencex:preferencex", version.ref = "preferencesFix" } preferencex-datetimepicker = { module = "com.takisoft.preferencex:preferencex-datetimepicker", version.ref = "preferencesFix" } preferencex-colorpicker = { module = "com.takisoft.preferencex:preferencex-colorpicker", version.ref = "preferencesFix" } -okio = "com.squareup.okio:okio:3.2.0" +okio = "com.squareup.okio:okio:3.3.0" moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" } timber = "com.jakewharton.timber:timber:5.0.1" -koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } -koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } -koin-test = { module = "io.insert-koin:koin-test", version.ref = "koin" } -koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" } - -# We can't upgrade Commons IO beyond this version because starting with 2.7 it is using Java 8 API -# that is not available until Android API 26 (even with desugaring enabled). -# See https://issuetracker.google.com/issues/160484830 -commons-io = "commons-io:commons-io:2.6" +koin-core = { module = "io.insert-koin:koin-core", version.ref = "koinCore" } +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koinAndroid" } +koin-test = { module = "io.insert-koin:koin-test", version.ref = "koinCore" } +koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koinCore" } +commons-io = "commons-io:commons-io:2.11.0" mime4j-core = { module = "org.apache.james:apache-mime4j-core", version.ref = "mime4j" } mime4j-dom = { module = "org.apache.james:apache-mime4j-dom", version.ref = "mime4j" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } @@ -99,7 +98,7 @@ glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = jsoup = "org.jsoup:jsoup:1.15.3" apache-httpclient = "org.apache.httpcomponents:httpclient:4.5.13" apache-httpclient5 = "org.apache.httpcomponents.client5:httpclient5:5.1.3" -clikt = "com.github.ajalt.clikt:clikt:3.4.0" +clikt = "com.github.ajalt.clikt:clikt:3.5.1" jzlib = "com.jcraft:jzlib:1.0.7" jutf7 = "com.beetstra.jutf7:jutf7:1.0.0" jcip-annotations = "net.jcip:jcip-annotations:1.0" @@ -114,13 +113,13 @@ xmlpull = "com.github.cketti:xmlpull-extracted-from-android:1.0" kxml2 = "com.github.cketti:kxml2-extracted-from-android:1.0" junit = "junit:junit:4.13.2" -robolectric = "org.robolectric:robolectric:4.9" +robolectric = "org.robolectric:robolectric:4.9.2" mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mockito-inline = { module = "org.mockito:mockito-inline", version.ref = "mockito" } -mockito-kotlin = "org.mockito.kotlin:mockito-kotlin:4.0.0" +mockito-kotlin = "org.mockito.kotlin:mockito-kotlin:4.1.0" truth = "com.google.truth:truth:1.1.3" -turbine = "app.cash.turbine:turbine:0.11.0" -jdom2 = "org.jdom:jdom2:2.0.6" -icu4j-charset = "com.ibm.icu:icu4j-charset:70.1" +turbine = "app.cash.turbine:turbine:0.12.1" +jdom2 = "org.jdom:jdom2:2.0.6.1" +icu4j-charset = "com.ibm.icu:icu4j-charset:72.1" leakcanary-android = "com.squareup.leakcanary:leakcanary-android:2.9.1" diff --git a/mail/common/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java b/mail/common/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java index da138d2fa9..da697b12a0 100644 --- a/mail/common/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java +++ b/mail/common/src/main/java/com/fsck/k9/mail/internet/MimeUtility.java @@ -149,9 +149,13 @@ public class MimeUtility { } else if (MimeUtil.ENC_QUOTED_PRINTABLE.equalsIgnoreCase(encoding)) { inputStream = new QuotedPrintableInputStream(rawInputStream) { @Override - public void close() throws IOException { + public void close() { super.close(); - closeInputStreamWithoutDeletingTemporaryFiles(rawInputStream); + try { + closeInputStreamWithoutDeletingTemporaryFiles(rawInputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } } }; } else {