diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 83315c71ec..e35c022133 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -10,8 +10,8 @@ plugins { alias(libs.plugins.android.application) alias(libs.plugins.jetbrains.kotlin.android) alias(libs.plugins.ktlint) + alias(libs.plugins.compose.compiler) id("androidx.navigation.safeargs") - id("app.cash.exhaustive") id("kotlin-parcelize") id("com.squareup.wire") id("translations") diff --git a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt index 246f8309c1..e12c93161b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/avatar/AvatarRenderer.kt @@ -19,7 +19,6 @@ import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.IOException import java.util.Optional -import javax.annotation.meta.Exhaustive /** * Renders Avatar objects into Media objects. This can involve creating a Bitmap, depending on the @@ -39,7 +38,6 @@ object AvatarRenderer { } fun renderAvatar(context: Context, avatar: Avatar, onAvatarRendered: (Media) -> Unit, onRenderFailed: (Throwable?) -> Unit) { - @Exhaustive when (avatar) { is Avatar.Resource -> renderResource(context, avatar, onAvatarRendered, onRenderFailed) is Avatar.Vector -> renderVector(context, avatar, onAvatarRendered, onRenderFailed) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index bb683793b0..241f884cbf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -24,7 +24,6 @@ import androidx.navigation.Navigation import androidx.navigation.fragment.navArgs import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView -import app.cash.exhaustive.Exhaustive import com.google.android.flexbox.FlexboxLayoutManager import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.snackbar.Snackbar @@ -286,7 +285,6 @@ class ConversationSettingsFragment : DSLSettingsFragment( lifecycleDisposable.bindTo(viewLifecycleOwner) lifecycleDisposable += viewModel.events.subscribe { event -> - @Exhaustive when (event) { is ConversationSettingsEvent.AddToAGroup -> handleAddToAGroup(event) is ConversationSettingsEvent.AddMembersToGroup -> handleAddMembersToGroup(event) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/PnpOperations.kt b/app/src/main/java/org/thoughtcrime/securesms/database/PnpOperations.kt index 59bcfb0ec8..a65579e5a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/PnpOperations.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/PnpOperations.kt @@ -1,6 +1,5 @@ package org.thoughtcrime.securesms.database -import app.cash.exhaustive.Exhaustive import org.thoughtcrime.securesms.database.model.RecipientRecord import org.thoughtcrime.securesms.recipients.RecipientId import org.whispersystems.signalservice.api.push.ServiceId @@ -49,7 +48,6 @@ data class PnpDataSet( val records: MutableSet = listOfNotNull(e164Record, pniRecord, aciRecord).toMutableSet() for (operation in operations) { - @Exhaustive when (operation) { is PnpOperation.RemoveE164 -> { records.replace(operation.recipientId) { it.copy(e164 = null) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt index 1cfc278207..3078b7fce4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RecipientTable.kt @@ -8,7 +8,6 @@ import android.net.Uri import android.text.TextUtils import androidx.annotation.VisibleForTesting import androidx.core.content.contentValuesOf -import app.cash.exhaustive.Exhaustive import okio.ByteString.Companion.toByteString import org.signal.core.util.Base64 import org.signal.core.util.Bitmask @@ -2470,7 +2469,6 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da var changedNumberId: RecipientId? = null for (operation in changeSet.operations) { - @Exhaustive when (operation) { is PnpOperation.RemoveE164, is PnpOperation.RemovePni, @@ -2507,7 +2505,6 @@ open class RecipientTable(context: Context, databaseHelper: SignalDatabase) : Da fun writePnpChangeSetToDisk(changeSet: PnpChangeSet, inputPni: PNI?, pniVerified: Boolean): RecipientId { var hadThreadMerge = false for (operation in changeSet.operations) { - @Exhaustive when (operation) { is PnpOperation.RemoveE164 -> { writableDatabase diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt index ec9690a67d..b38263bb81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/capture/MediaCaptureFragment.kt @@ -7,7 +7,6 @@ import androidx.activity.OnBackPressedCallback import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController -import app.cash.exhaustive.Exhaustive import com.google.android.material.dialog.MaterialAlertDialogBuilder import io.reactivex.rxjava3.core.Flowable import org.signal.core.util.concurrent.LifecycleDisposable @@ -62,7 +61,6 @@ class MediaCaptureFragment : Fragment(R.layout.fragment_container), CameraFragme .commitNowAllowingStateLoss() lifecycleDisposable += viewModel.events.subscribe { event -> - @Exhaustive when (event) { MediaCaptureEvent.MediaCaptureRenderFailed -> { Log.w(TAG, "Failed to render captured media.") diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt index 569126564e..ff5dc26736 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/gallery/MediaSelectionGalleryFragment.kt @@ -8,7 +8,6 @@ import androidx.fragment.app.Fragment import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper -import app.cash.exhaustive.Exhaustive import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R @@ -72,7 +71,6 @@ class MediaSelectionGalleryFragment : Fragment(R.layout.fragment_container), Med } private fun handleError(error: MediaValidator.FilterError) { - @Exhaustive when (error) { MediaValidator.FilterError.None -> return MediaValidator.FilterError.ItemTooLarge -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show() diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt index ea6e954939..6d5b82c2fa 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/mediasend/v2/review/MediaReviewFragment.kt @@ -29,7 +29,6 @@ import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.ItemTouchHelper import androidx.recyclerview.widget.RecyclerView import androidx.viewpager2.widget.ViewPager2 -import app.cash.exhaustive.Exhaustive import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.google.android.material.imageview.ShapeableImageView import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers @@ -443,7 +442,6 @@ class MediaReviewFragment : Fragment(R.layout.v2_media_review_fragment), Schedul } private fun handleMediaValidatorFilterError(error: MediaValidator.FilterError) { - @Exhaustive when (error) { MediaValidator.FilterError.None -> return MediaValidator.FilterError.ItemTooLarge -> Toast.makeText(requireContext(), R.string.MediaReviewFragment__one_or_more_items_were_too_large, Toast.LENGTH_SHORT).show() diff --git a/build.gradle.kts b/build.gradle.kts index 9907519bbb..20e0645bcc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,7 @@ plugins { alias(libs.plugins.android.application) apply false alias(libs.plugins.jetbrains.kotlin.android) apply false alias(libs.plugins.jetbrains.kotlin.jvm) apply false + alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.ktlint) } @@ -21,7 +22,6 @@ buildscript { classpath(libs.gradle) classpath(libs.androidx.navigation.safe.args.gradle.plugin) classpath(libs.protobuf.gradle.plugin) - classpath(libs.exhaustive.gradle) classpath("com.squareup.wire:wire-gradle-plugin:4.4.3") { exclude(group = "com.squareup.wire", module = "wire-swift-generator") exclude(group = "com.squareup.wire", module = "wire-grpc-client") diff --git a/constants.gradle.kts b/constants.gradle.kts index 26207fda3b..2eeadb45d8 100644 --- a/constants.gradle.kts +++ b/constants.gradle.kts @@ -4,4 +4,4 @@ val signalTargetSdkVersion by extra(34) val signalMinSdkVersion by extra(21) val signalNdkVersion by extra("27.0.12077973") val signalJavaVersion by extra(JavaVersion.VERSION_17) -val signalKotlinJvmTarget by extra("17") \ No newline at end of file +val signalKotlinJvmTarget by extra("17") diff --git a/contacts/app/build.gradle b/contacts/app/build.gradle index 82b9d2f202..fc7c8c2b14 100644 --- a/contacts/app/build.gradle +++ b/contacts/app/build.gradle @@ -1,5 +1,6 @@ plugins { id 'signal-sample-app' + alias(libs.plugins.compose.compiler) } android { diff --git a/core-ui/build.gradle.kts b/core-ui/build.gradle.kts index aecc17e3f6..11c80e9ca4 100644 --- a/core-ui/build.gradle.kts +++ b/core-ui/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-library") + alias(libs.plugins.compose.compiler) } android { diff --git a/device-transfer/app/build.gradle.kts b/device-transfer/app/build.gradle.kts index 40b199e410..6d9c16f615 100644 --- a/device-transfer/app/build.gradle.kts +++ b/device-transfer/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } android { diff --git a/donations/app/build.gradle.kts b/donations/app/build.gradle.kts index ed7db9252e..988d9fcb33 100644 --- a/donations/app/build.gradle.kts +++ b/donations/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } android { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5e20604a0d..b108d31631 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,10 +10,9 @@ androidx-lifecycle = "2.8.5" androidx-media3 = "1.3.1" androidx-navigation = "2.8.0" androidx-window = "1.3.0" -exhaustive-gradle = "0.1.1" glide = "4.15.1" gradle = "8.7.3" -kotlin = "1.9.20" +kotlin = "2.1.0" libsignal-client = "0.64.0" mp4parser = "1.9.39" android-gradle-plugin = "8.4.0" @@ -30,6 +29,7 @@ jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = jetbrains-kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint" } androidx-navigation-safe-args = { id = "androidx.navigation.safeargs", version.ref = "navigation-safe-args-gradle-plugin" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } [libraries] # Android Plugins @@ -127,7 +127,7 @@ google-ez-vcard = "com.googlecode.ez-vcard:ez-vcard:0.9.11" google-jsr305 = "com.google.code.findbugs:jsr305:3.0.2" google-guava-android = "com.google.guava:guava:30.0-android" google-flexbox = "com.google.android.flexbox:flexbox:3.0.0" -com-google-devtools-ksp-gradle-plugin = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:1.9.20-1.0.14" +com-google-devtools-ksp-gradle-plugin = "com.google.devtools.ksp:com.google.devtools.ksp.gradle.plugin:2.1.0-1.0.29" # Firebase firebase-messaging = "com.google.firebase:firebase-messaging:23.1.2" @@ -168,7 +168,6 @@ dnsjava = "dnsjava:dnsjava:2.1.9" nanohttpd-webserver = { module = "org.nanohttpd:nanohttpd-webserver", version.ref = "nanohttpd" } nanohttpd-websocket = { module = "org.nanohttpd:nanohttpd-websocket", version.ref = "nanohttpd" } kotlinx-collections-immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.5" -exhaustive-gradle = { module = "app.cash.exhaustive:exhaustive-gradle", version.ref = "exhaustive-gradle" } # Can't use the newest version because it hits some weird NoClassDefFoundException jknack-handlebars = "com.github.jknack:handlebars:4.0.7" diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index 5e890308c6..1bc3967637 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -4441,6 +4441,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -4461,6 +4466,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -4477,11 +4487,24 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + + + @@ -4490,6 +4513,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -4498,6 +4529,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -5989,6 +6028,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -6004,6 +6051,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6025,11 +6077,26 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + + + + + @@ -6040,11 +6107,21 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + @@ -6065,6 +6142,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6075,6 +6157,16 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + @@ -6085,6 +6177,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6105,6 +6202,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6121,6 +6223,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -6131,6 +6241,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6153,6 +6268,17 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + @@ -6169,6 +6295,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -6179,6 +6313,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6195,6 +6334,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + @@ -6205,6 +6352,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6215,11 +6367,21 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + @@ -6230,16 +6392,31 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + + + + + @@ -6280,6 +6457,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6301,6 +6483,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6316,6 +6503,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6326,6 +6518,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6336,6 +6533,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6346,6 +6548,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6356,6 +6563,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6438,6 +6650,22 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + + + + + + + @@ -6493,6 +6721,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6538,6 +6771,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6583,6 +6821,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6593,6 +6836,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6603,6 +6851,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6613,6 +6866,16 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + + + @@ -6895,6 +7158,11 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + @@ -6903,6 +7171,14 @@ https://docs.gradle.org/current/userguide/dependency_verification.html + + + + + + + + diff --git a/image-editor/app/build.gradle b/image-editor/app/build.gradle index 757059bbb0..faa90f97fb 100644 --- a/image-editor/app/build.gradle +++ b/image-editor/app/build.gradle @@ -1,6 +1,7 @@ plugins { id("signal-sample-app") id("com.google.devtools.ksp") + alias(libs.plugins.compose.compiler) } android { diff --git a/libsignal-service/build.gradle.kts b/libsignal-service/build.gradle.kts index ad3b39c786..664fbb679d 100644 --- a/libsignal-service/build.gradle.kts +++ b/libsignal-service/build.gradle.kts @@ -3,6 +3,7 @@ * SPDX-License-Identifier: AGPL-3.0-only */ +import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { @@ -31,9 +32,11 @@ java { } tasks.withType().configureEach { - kotlinOptions { - jvmTarget = signalKotlinJvmTarget - freeCompilerArgs = listOf("-Xjvm-default=all") + kotlin { + compilerOptions { + jvmTarget = JvmTarget.fromTarget(signalKotlinJvmTarget) + freeCompilerArgs = listOf("-Xjvm-default=all") + } } } diff --git a/paging/app/build.gradle.kts b/paging/app/build.gradle.kts index 3c63321a5b..600e81e1f9 100644 --- a/paging/app/build.gradle.kts +++ b/paging/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } android { diff --git a/qr/app/build.gradle.kts b/qr/app/build.gradle.kts index c33e62f4f0..c343d0279f 100644 --- a/qr/app/build.gradle.kts +++ b/qr/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } android { diff --git a/spinner/app/build.gradle.kts b/spinner/app/build.gradle.kts index bb1f0e0813..519ecc6bec 100644 --- a/spinner/app/build.gradle.kts +++ b/spinner/app/build.gradle.kts @@ -1,5 +1,6 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } android { diff --git a/video/app/build.gradle.kts b/video/app/build.gradle.kts index 0de75a2042..c7de7670bf 100644 --- a/video/app/build.gradle.kts +++ b/video/app/build.gradle.kts @@ -5,6 +5,7 @@ plugins { id("signal-sample-app") + alias(libs.plugins.compose.compiler) } val signalBuildToolsVersion: String by rootProject.extra