diff --git a/.github/workflows/android-test.yml b/.github/workflows/android-test.yml index b7cf7ac0b..e89b8c15f 100644 --- a/.github/workflows/android-test.yml +++ b/.github/workflows/android-test.yml @@ -145,5 +145,13 @@ jobs: - name: Kotlin Lint run: ./gradlew detekt - - name: Android Lint - run: ./gradlew lintRelease + - name: Setup sample app environment + run: ${{ github.workspace }}/scripts/setup_storefront_env --skip-optional-prompts + env: + STOREFRONT_DOMAIN: example.myshopify.com + STOREFRONT_ACCESS_TOKEN: test-token + + - name: Sample static analysis and Android Lint + run: | + ./gradlew lintRelease + ./gradlew -p samples/CheckoutKitAndroidDemo :app:detekt :app:lintRelease diff --git a/dev.yml b/dev.yml index d4b169f4f..cbef96246 100644 --- a/dev.yml +++ b/dev.yml @@ -55,7 +55,10 @@ check: storefront-env-tests: ./scripts/test_setup_storefront_env ruby-script-tests: ./scripts/test_ruby android-detekt: platforms/android/gradlew -p platforms/android detekt - android-lint: platforms/android/gradlew -p platforms/android lintRelease + android-lint: | + scripts/check_storefront_env + platforms/android/gradlew -p platforms/android lintRelease + platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:lintRelease swift-lint: cd platforms/swift && ./Scripts/lint react-native-lint-swift: cd platforms/react-native && ./scripts/lint_swift react-native-lint-module: cd platforms/react-native && pnpm module lint @@ -252,14 +255,20 @@ commands: platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:testDebugUnitTest --console=plain lint: - desc: Check code style and lint (detekt + Android lint) + desc: Check code style and lint (detekt + Android lint, including the sample) aliases: [style] - run: platforms/android/gradlew -p platforms/android detekt lintRelease + run: | + scripts/check_storefront_env + platforms/android/gradlew -p platforms/android detekt lintRelease + platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:detekt :app:lintRelease format: - desc: Auto-format and apply safe lint autocorrections + desc: Auto-format and apply safe lint autocorrections, including the sample aliases: [fix] - run: platforms/android/gradlew -p platforms/android detekt --auto-correct + run: | + scripts/check_storefront_env + platforms/android/gradlew -p platforms/android detekt --auto-correct + platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:detekt --auto-correct check: desc: Run all Android checks (detekt, Android lint) @@ -269,11 +278,17 @@ commands: /opt/dev/bin/dev android check android-lint subcommands: detekt: - desc: Run detekt static analysis - run: platforms/android/gradlew -p platforms/android detekt + desc: Run detekt static analysis, including the sample + run: | + scripts/check_storefront_env + platforms/android/gradlew -p platforms/android detekt + platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:detekt android-lint: - desc: Run Android lint - run: platforms/android/gradlew -p platforms/android lintRelease + desc: Run Android lint, including the sample + run: | + scripts/check_storefront_env + platforms/android/gradlew -p platforms/android lintRelease + platforms/android/samples/CheckoutKitAndroidDemo/gradlew -p platforms/android/samples/CheckoutKitAndroidDemo :app:lintRelease clean: desc: Clean Android Gradle build outputs diff --git a/platforms/android/lib/src/main/res/layout/checkout_view_content.xml b/platforms/android/lib/src/main/res/layout/checkout_view_content.xml index 2171b0a42..6d641c104 100644 --- a/platforms/android/lib/src/main/res/layout/checkout_view_content.xml +++ b/platforms/android/lib/src/main/res/layout/checkout_view_content.xml @@ -10,6 +10,7 @@ android:layout_height="wrap_content" android:elevation="0dp" android:minHeight="?attr/actionBarSize" + android:paddingStart="4dp" android:paddingEnd="4dp" android:theme="@style/Theme.AppCompat.DayNight" app:contentInsetStart="22dp" diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/build.gradle b/platforms/android/samples/CheckoutKitAndroidDemo/app/build.gradle index 76fefc336..da6e24337 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/build.gradle +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/build.gradle @@ -5,6 +5,7 @@ plugins { id 'com.google.devtools.ksp' id 'org.jetbrains.kotlin.plugin.compose' id 'com.apollographql.apollo' + id 'io.gitlab.arturbosch.detekt' } import org.jetbrains.kotlin.gradle.dsl.JvmTarget @@ -94,6 +95,14 @@ android { } } + lint { + checkDependencies = true + warningsAsErrors = true + disable 'GradleDependency', 'NewerVersionAvailable', 'SimilarGradleDependency' + warning 'LintBaseline' + informational 'AndroidGradlePluginVersion' + } + buildTypes { release { minifyEnabled = false @@ -130,7 +139,15 @@ tasks.withType(KotlinJvmCompile).configureEach { } +detekt { + buildUponDefaultConfig = false + config.setFrom('../detekt.config.yml') + autoCorrect = true +} + dependencies { + detektPlugins libs.detekt.formatting + // Checkout Kit implementation project(':lib') diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/lint.xml b/platforms/android/samples/CheckoutKitAndroidDemo/app/lint.xml new file mode 100644 index 000000000..b190123c9 --- /dev/null +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/lint.xml @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/AndroidManifest.xml b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/AndroidManifest.xml index 57a174da6..25c4c3137 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/AndroidManifest.xml +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/AndroidManifest.xml @@ -50,12 +50,13 @@ android:supportsRtl="true" android:theme="@style/Theme.Androidsample" tools:targetApi="33"> + + tools:ignore="LockedOrientationActivity,DiscouragedApi"> diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/CheckoutKitApp.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/CheckoutKitApp.kt index 23a392f16..22780da49 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/CheckoutKitApp.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/CheckoutKitApp.kt @@ -27,14 +27,13 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.painterResource @@ -58,7 +57,6 @@ import com.shopify.checkout_kit_android_demo.settings.SettingsUiState import com.shopify.checkout_kit_android_demo.settings.SettingsViewModel import com.shopify.checkoutkit.CheckoutAppearance import com.shopify.checkoutkit.ColorScheme -import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel @Composable @@ -83,7 +81,6 @@ fun CheckoutKitAppRoot( val cartState = cartViewModel.cartState.collectAsState() val totalQuantity = cartState.value.totalQuantity val activity = LocalActivity.current as ComponentActivity - val context = LocalContext.current CheckoutKitSampleTheme(darkTheme = useDarkTheme) { val checkoutAppearance = (settingsUiState as? SettingsUiState.Loaded)?.settings?.appearance @@ -101,13 +98,20 @@ fun CheckoutKitAppRoot( val navController = rememberNavController() var currentScreen by remember { mutableStateOf(Screen.Product) } var presentedCheckoutUrl by remember { mutableStateOf(null) } - val scope = rememberCoroutineScope() val snackbarHostState = remember { SnackbarHostState() } + var snackbarResourceId by remember { mutableStateOf(null) } + var snackbarEventId by remember { mutableIntStateOf(0) } + val snackbarMessage = snackbarResourceId?.let { stringResource(it) } ObserveAsEvents(flow = SnackbarController.events) { event -> - scope.launch { + snackbarResourceId = event.resourceId + snackbarEventId++ + } + + LaunchedEffect(snackbarEventId) { + snackbarMessage?.let { message -> snackbarHostState.currentSnackbarData?.dismiss() - snackbarHostState.showSnackbar(message = context.resources.getText(event.resourceId).toString()) + snackbarHostState.showSnackbar(message = message) } } @@ -147,7 +151,8 @@ fun CheckoutKitAppRoot( containerColor = MaterialTheme.colorScheme.primary, contentColor = MaterialTheme.colorScheme.onPrimary, modifier = Modifier.offset( - x = -(7.5.dp), y = 20.dp + x = -(7.5.dp), + y = 20.dp ) ) { Text("$totalQuantity") @@ -157,7 +162,9 @@ fun CheckoutKitAppRoot( Icon( modifier = Modifier.height(48.dp), painter = painterResource(id = R.drawable.cart), - contentDescription = stringResource(id = R.string.cart_icon_content_description), + contentDescription = stringResource( + id = R.string.cart_icon_content_description + ), ) } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/MainActivity.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/MainActivity.kt index 74f39805c..06635f974 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/MainActivity.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/MainActivity.kt @@ -87,7 +87,9 @@ class MainActivity : ComponentActivity() { } else { geolocationPermissionCallback = callback geolocationOrigin = origin - geolocationLauncher.launch(arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION)) + geolocationLauncher.launch( + arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION) + ) } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartItem.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartItem.kt index 20f5b9a87..e9247f065 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartItem.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartItem.kt @@ -1,6 +1,5 @@ package com.shopify.checkout_kit_android_demo.cart - import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartView.kt index 21fbdc533..2a1d9bba6 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartView.kt @@ -22,9 +22,9 @@ import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -57,7 +57,6 @@ fun CartView( cartViewModel: CartViewModel, onPresentAppOwnedCheckout: (String) -> Unit, ) { - val state = cartViewModel.cartState.collectAsState().value val loading = cartViewModel.loadingState.collectAsState().value val checkoutPresentationMode = cartViewModel.checkoutPresentationMode.collectAsState().value @@ -153,7 +152,10 @@ private fun CartLines( } } item { - Column(verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier.padding(bottom = verticalPadding)) { + Column( + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier.padding(bottom = verticalPadding) + ) { Row(horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier.fillMaxWidth()) { Text( text = stringResource(id = R.string.cart_product_header), diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartViewModel.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartViewModel.kt index 047e54d67..c3d800571 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartViewModel.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/CartViewModel.kt @@ -27,7 +27,6 @@ import com.shopify.checkoutkit.CheckoutPreload import com.shopify.checkoutkit.CheckoutPresentation import com.shopify.checkoutkit.CheckoutProtocol import com.shopify.checkoutkit.ShopifyCheckoutKit -import com.shopify.ucp.embedded.checkout.Checkout import com.shopify.ucp.embedded.checkout.WindowOpenResult import com.shopify.ucp.embedded.checkout.windowOpenRejected import com.shopify.ucp.embedded.checkout.windowOpenSuccess diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/data/CartState.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/data/CartState.kt index 035b49382..642666db5 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/data/CartState.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/cart/data/CartState.kt @@ -13,7 +13,6 @@ sealed class CartState { val cartTotals: CartTotals, val checkoutUrl: String, ) : CartState() - } data class CartLine( diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/components/QuantitySelector.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/components/QuantitySelector.kt index 3b0961bbe..c8b79b626 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/components/QuantitySelector.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/components/QuantitySelector.kt @@ -22,7 +22,8 @@ fun QuantitySelector( TextButton( modifier = Modifier.width(40.dp), enabled = enabled, - onClick = { if (quantity > 1) setQuantity(quantity - 1) }) { + onClick = { if (quantity > 1) setQuantity(quantity - 1) } + ) { Text("-") } Text( diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/di/AppModule.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/di/AppModule.kt index 267657b5e..ee8529dfb 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/di/AppModule.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/di/AppModule.kt @@ -9,12 +9,12 @@ import com.shopify.checkout_kit_android_demo.BuildConfig import com.shopify.checkout_kit_android_demo.cart.CartViewModel import com.shopify.checkout_kit_android_demo.cart.data.CartRepository import com.shopify.checkout_kit_android_demo.common.client.StorefrontApiClient -import com.shopify.checkout_kit_android_demo.graphql.cache.Cache.cache import com.shopify.checkout_kit_android_demo.common.logs.LogDatabase import com.shopify.checkout_kit_android_demo.common.logs.Logger import com.shopify.checkout_kit_android_demo.common.logs.MIGRATION_1_2 import com.shopify.checkout_kit_android_demo.common.logs.MIGRATION_2_3 import com.shopify.checkout_kit_android_demo.common.logs.MIGRATION_3_4 +import com.shopify.checkout_kit_android_demo.graphql.cache.Cache.cache import com.shopify.checkout_kit_android_demo.home.HomeViewModel import com.shopify.checkout_kit_android_demo.logs.LogsViewModel import com.shopify.checkout_kit_android_demo.products.ProductsViewModel diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/logs/LogDatabase.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/logs/LogDatabase.kt index fe98f04d5..1ba7ad516 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/logs/LogDatabase.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/logs/LogDatabase.kt @@ -6,24 +6,24 @@ import androidx.room.migration.Migration import androidx.sqlite.db.SupportSQLiteDatabase @Database( - entities = [LogLine::class], - version = 4, - exportSchema = false, + entities = [LogLine::class], + version = 4, + exportSchema = false, ) abstract class LogDatabase : RoomDatabase() { - abstract fun logDao(): LogDao + abstract fun logDao(): LogDao } val MIGRATION_1_2 = object : Migration(1, 2) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL("ALTER TABLE LogLine ADD COLUMN checkout_completedorderDetails TEXT") - } + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL("ALTER TABLE LogLine ADD COLUMN checkout_completedorderDetails TEXT") + } } val MIGRATION_2_3 = object : Migration(2, 3) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL( - """ + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE LogLine_new ( id BLOB NOT NULL PRIMARY KEY, createdAt INTEGER NOT NULL, @@ -33,25 +33,25 @@ val MIGRATION_2_3 = object : Migration(2, 3) { error_detailsmessage TEXT, checkout_completedorderDetails TEXT ) - """.trimIndent() - ) - db.execSQL( - """ + """.trimIndent() + ) + db.execSQL( + """ INSERT INTO LogLine_new (id, createdAt, message, type, error_detailstype, error_detailsmessage, checkout_completedorderDetails) SELECT id, createdAt, message, type, error_detailstype, error_detailsmessage, checkout_completedorderDetails FROM LogLine WHERE type IN ('STANDARD', 'ERROR', 'CHECKOUT_COMPLETED') - """.trimIndent() - ) - db.execSQL("DROP TABLE LogLine") - db.execSQL("ALTER TABLE LogLine_new RENAME TO LogLine") - } + """.trimIndent() + ) + db.execSQL("DROP TABLE LogLine") + db.execSQL("ALTER TABLE LogLine_new RENAME TO LogLine") + } } val MIGRATION_3_4 = object : Migration(3, 4) { - override fun migrate(db: SupportSQLiteDatabase) { - db.execSQL( - """ + override fun migrate(db: SupportSQLiteDatabase) { + db.execSQL( + """ CREATE TABLE LogLine_new ( id BLOB NOT NULL PRIMARY KEY, createdAt INTEGER NOT NULL, @@ -60,10 +60,10 @@ val MIGRATION_3_4 = object : Migration(3, 4) { level TEXT NOT NULL, payload TEXT ) - """.trimIndent() - ) - db.execSQL( - """ + """.trimIndent() + ) + db.execSQL( + """ INSERT INTO LogLine_new (id, createdAt, message, source, level, payload) SELECT id, @@ -80,9 +80,9 @@ val MIGRATION_3_4 = object : Migration(3, 4) { END FROM LogLine WHERE type IN ('STANDARD', 'ERROR', 'CHECKOUT_COMPLETED') - """.trimIndent() - ) - db.execSQL("DROP TABLE LogLine") - db.execSQL("ALTER TABLE LogLine_new RENAME TO LogLine") - } + """.trimIndent() + ) + db.execSQL("DROP TABLE LogLine") + db.execSQL("ALTER TABLE LogLine_new RENAME TO LogLine") + } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/navigation/CheckoutKitNavHost.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/navigation/CheckoutKitNavHost.kt index c36c185b9..25d91e818 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/navigation/CheckoutKitNavHost.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/common/navigation/CheckoutKitNavHost.kt @@ -40,7 +40,10 @@ sealed class Screen(val route: String) { } fun route(collectionHandle: String): String { - return route.replace("{collectionHandle}", URLEncoder.encode(collectionHandle, StandardCharsets.UTF_8.name())) + return route.replace( + "{collectionHandle}", + URLEncoder.encode(collectionHandle, StandardCharsets.UTF_8.name()) + ) } } @@ -81,7 +84,6 @@ fun CheckoutKitNavHost( navController = navController, startDestination = startDestination, ) { - composable(Screen.Home.route) { HomeView(navController) } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/Featured.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/Featured.kt index fb1be6cc5..87c275706 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/Featured.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/Featured.kt @@ -41,7 +41,6 @@ fun Featured( .padding(start = 15.dp, end = 15.dp, top = 30.dp) .fillMaxSize() ) { - Header3( resourceId = R.string.featured_title, modifier = Modifier, diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HeroImage.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HeroImage.kt index ab65867ac..d9068f112 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HeroImage.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HeroImage.kt @@ -16,7 +16,8 @@ import com.shopify.checkout_kit_android_demo.R @Composable fun HeroImage() { Surface( - color = Color.Black, modifier = Modifier + color = Color.Black, + modifier = Modifier .fillMaxWidth() .alpha(0.75f) ) { diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HomeView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HomeView.kt index 11943d529..aa4f7dc23 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HomeView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/home/HomeView.kt @@ -20,7 +20,6 @@ fun HomeView( navController: NavController, homeViewModel: HomeViewModel = koinViewModel() ) { - LaunchedEffect(key1 = true) { homeViewModel.fetchHomePageData() } @@ -50,7 +49,12 @@ fun HomeView( is HomeUIState.Loaded -> { ProductCollections( productCollections = homeUiState.productCollections, - onClick = { collectionHandle -> homeViewModel.productCollectionSelected(navController, collectionHandle) } + onClick = { collectionHandle -> + homeViewModel.productCollectionSelected( + navController, + collectionHandle + ) + } ) Featured(homeUiState.productCollections.firstOrNull()?.products ?: emptyList()) { productId: ID -> homeViewModel.productSelected(navController, productId) diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsView.kt index b98525dda..42ea3d165 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsView.kt @@ -58,7 +58,6 @@ fun LogsView(logsViewModel: LogsViewModel) { .fillMaxSize() .padding(horizontal = horizontalPadding, vertical = verticalPadding) ) { - Button(shape = RectangleShape, onClick = { logsViewModel.clear() }) { diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsViewModel.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsViewModel.kt index 70335e3d2..23d07e8a8 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsViewModel.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/LogsViewModel.kt @@ -12,7 +12,7 @@ import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.launch import java.util.Date -class LogsViewModel(private val logDb: LogDatabase): ViewModel() { +class LogsViewModel(private val logDb: LogDatabase) : ViewModel() { private val _logState = MutableStateFlow(LogState.Loading) val logState: StateFlow = _logState.asStateFlow() @@ -44,14 +44,13 @@ class LogsViewModel(private val logDb: LogDatabase): ViewModel() { checkoutId = checkoutContext?.checkoutId, previousCheckoutPayload = checkoutContext?.previousCheckoutPayload, ) - } sealed class LogState { - data object Loading: LogState() + data object Loading : LogState() data class Populated( val groups: List - ): LogState() + ) : LogState() } data class CheckoutLogGroup( diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/details/LogDetailModal.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/details/LogDetailModal.kt index f27ae9d0b..c9e96f59b 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/details/LogDetailModal.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/logs/details/LogDetailModal.kt @@ -11,7 +11,6 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.window.Dialog @@ -23,7 +22,10 @@ fun LogDetailModal( logLine: LogLine?, previousCheckoutPayload: String?, onDismissRequest: () -> Unit, - prettyJson: Json = Json { prettyPrint = true; prettyPrintIndent = " " } + prettyJson: Json = Json { + prettyPrint = true + prettyPrintIndent = " " + } ) { Dialog(onDismissRequest = { onDismissRequest() }) { Card( diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/ProductsView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/ProductsView.kt index ddae6edbf..45fd05d7e 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/ProductsView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/ProductsView.kt @@ -46,7 +46,6 @@ fun ProductsView( navController: NavController, productsViewModel: ProductsViewModel = koinViewModel(), ) { - val pager = remember { Pager(PagingConfig(pageSize = 10)) { productsViewModel.pagingSource @@ -115,11 +114,14 @@ fun Product( imageHeight: Dp, onProductClick: (id: ID) -> Unit, ) { - Column(verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier - .wrapContentWidth() - .clickable { - onProductClick(product.id) - }) { + Column( + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier + .wrapContentWidth() + .clickable { + onProductClick(product.id) + } + ) { RemoteImage( url = product.image?.url, altText = product.image?.altText ?: stringResource(id = R.string.product_alt_text_default), diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionProduct.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionProduct.kt index 4aae6f95e..225edfad8 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionProduct.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionProduct.kt @@ -35,12 +35,14 @@ fun ProductCollectionProduct( ) { BoxWithConstraints { val largeScreen = maxWidth >= largeScreenBreakpoint - Column(verticalArrangement = Arrangement.spacedBy(10.dp), modifier = Modifier - .fillMaxWidth(.49f) - .clickable { - onProductClick(product.id) - }) { - + Column( + verticalArrangement = Arrangement.spacedBy(10.dp), + modifier = Modifier + .fillMaxWidth(.49f) + .clickable { + onProductClick(product.id) + } + ) { RemoteImage( url = product.image?.url, altText = product.image?.altText ?: stringResource(id = R.string.featured_default_alt_text), diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionView.kt index 0f9663aa5..ddfd56cca 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollectionView.kt @@ -84,7 +84,12 @@ fun ProductCollectionView( ProductCollectionProduct( product = collectionProduct, textColor = MaterialTheme.colorScheme.onBackground, - onProductClick = { productId -> productCollectionViewModel.productSelected(navController, productId) } + onProductClick = { productId -> + productCollectionViewModel.productSelected( + navController, + productId + ) + } ) } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollections.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollections.kt index 765304372..2d396ec18 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollections.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/ProductCollections.kt @@ -66,12 +66,13 @@ fun ProductCollection( onClick: (String) -> Unit, modifier: Modifier, ) { - Column(modifier = Modifier - .padding(bottom = verticalPadding) - .clickable { - onClick(handle) - }) { - + Column( + modifier = Modifier + .padding(bottom = verticalPadding) + .clickable { + onClick(handle) + } + ) { RemoteImage( url = image?.url, altText = image?.altText ?: stringResource(R.string.collection_img_alt_default), diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/data/ProductCollectionRepository.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/data/ProductCollectionRepository.kt index 93aa80dce..eb491007b 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/data/ProductCollectionRepository.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/collection/data/ProductCollectionRepository.kt @@ -8,7 +8,10 @@ import kotlinx.coroutines.flow.map class ProductCollectionRepository( private val client: StorefrontApiClient, ) { - suspend fun getProductCollections(numberOfCollections: Int, numberOfProductsPerCollection: Int): List { + suspend fun getProductCollections( + numberOfCollections: Int, + numberOfProductsPerCollection: Int + ): List { return observeProductCollections(numberOfCollections, numberOfProductsPerCollection).last() } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/OptionSelector.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/OptionSelector.kt index 6d62a59bd..50216a5d2 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/OptionSelector.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/OptionSelector.kt @@ -22,7 +22,6 @@ fun OptionSelector( ) { availableOptions.forEach { (optionName, optionValues) -> Column(verticalArrangement = Arrangement.spacedBy(4.dp)) { - BodySmall(optionName) Row(horizontalArrangement = Arrangement.spacedBy(8.dp)) { diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductView.kt index d5c437779..7a70d808f 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductView.kt @@ -36,7 +36,6 @@ fun ProductView( productId: String, productViewModel: ProductViewModel = koinViewModel(), ) { - LaunchedEffect(key1 = true) { productViewModel.fetchProduct(productId) } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductViewModel.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductViewModel.kt index 428367f6b..17798a96f 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductViewModel.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/products/product/ProductViewModel.kt @@ -117,7 +117,8 @@ class ProductViewModel( }?.availableForSale ?: false, ) } - }) + } + ) } // Modifies the options for the selected variant (e.g: [size: large, color: red]) by replacing one with a new option (e.g. color: blue) diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/PreferencesManager.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/PreferencesManager.kt index ccd926ccf..70cc7d6db 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/PreferencesManager.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/PreferencesManager.kt @@ -67,7 +67,10 @@ class PreferencesManager(private val context: Context) { suspend fun setCheckoutPreloadingEnabled(enabled: Boolean) = saveData(CHECKOUT_PRELOADING, enabled) - suspend fun setCheckoutPresentationMode(mode: CheckoutPresentationMode) = saveData(CHECKOUT_PRESENTATION_MODE, mode.name) + suspend fun setCheckoutPresentationMode(mode: CheckoutPresentationMode) = saveData( + CHECKOUT_PRESENTATION_MODE, + mode.name + ) suspend fun setDragToDismissEnabled(enabled: Boolean) = saveData(DRAG_TO_DISMISS, enabled) @@ -91,7 +94,6 @@ class PreferencesManager(private val context: Context) { private val TAP_AWAY_TO_DISMISS = booleanPreferencesKey("tapAwayToDismiss") private val WINDOW_OPEN_HANDLER = stringPreferencesKey("windowOpenHandler") private val CHECKOUT_SHEET_PRESET = stringPreferencesKey("checkoutSheetStyle") - } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/SettingsView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/SettingsView.kt index b102daf3b..161023f9f 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/SettingsView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/SettingsView.kt @@ -36,7 +36,6 @@ fun SettingsView( settingsViewModel: SettingsViewModel, navController: NavHostController, ) { - when (val uiState = settingsViewModel.uiState.collectAsState().value) { is SettingsUiState.Loading -> { ProgressIndicator() @@ -104,7 +103,6 @@ fun SettingsView( .background(color = MaterialTheme.colorScheme.background) .fillMaxWidth() ) - } AppearanceSection( diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/account/AccountView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/account/AccountView.kt index bc3ada630..61d29e5cd 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/account/AccountView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/account/AccountView.kt @@ -29,7 +29,6 @@ fun AccountView( navController: NavHostController, viewModel: AccountViewModel = koinViewModel(), ) { - val uiState = viewModel.uiState.collectAsState().value LaunchedEffect(key1 = true) { @@ -59,7 +58,6 @@ fun AccountView( .padding(bottom = 20.dp) .fillMaxWidth() ) { - Header2( text = customer.displayName, modifier = Modifier.padding(end = 10.dp), diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/LoginView.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/LoginView.kt index e4d139a2a..0a695dbd6 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/LoginView.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/LoginView.kt @@ -24,7 +24,6 @@ fun LoginView( navController: NavController, loginViewModel: LoginViewModel = koinViewModel(), ) { - val uiState = loginViewModel.uiState.collectAsState().value LaunchedEffect(key1 = true) { diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStore.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStore.kt index 2e767dd43..136301780 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStore.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStore.kt @@ -9,14 +9,14 @@ import androidx.datastore.preferences.core.emptyPreferences import androidx.datastore.preferences.core.stringPreferencesKey import androidx.datastore.preferences.preferencesDataStore import com.shopify.checkout_kit_android_demo.settings.authentication.data.AccessToken -import java.io.IOException -import java.security.GeneralSecurityException -import kotlin.coroutines.cancellation.CancellationException import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.serialization.encodeToString import kotlinx.serialization.json.Json import timber.log.Timber +import java.io.IOException +import java.security.GeneralSecurityException +import kotlin.coroutines.cancellation.CancellationException // Keep this name in sync with the DataStore exclusions in res/xml/data_extraction_rules.xml and // res/xml/backup_rules.xml. diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProvider.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProvider.kt index b19a00c92..07351fd0b 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProvider.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProvider.kt @@ -6,15 +6,13 @@ import com.google.crypto.tink.KeyTemplates import com.google.crypto.tink.RegistryConfiguration import com.google.crypto.tink.aead.AeadConfig import com.google.crypto.tink.integration.android.AndroidKeysetManager -import java.io.IOException -import java.security.GeneralSecurityException -import java.security.KeyStore -import kotlin.coroutines.cancellation.CancellationException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.withContext import timber.log.Timber +import java.security.KeyStore +import kotlin.coroutines.cancellation.CancellationException // SharedPreferences file name; this alone maps to // shared_prefs/customer_access_token_keyset.xml and must match the XML backup exclusions. @@ -98,6 +96,5 @@ internal class TokenAeadProvider internal constructor( Timber.w("Unable to delete customer access token master key (%s)", failure.javaClass.simpleName) } } - } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/utils/AuthenticationHelper.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/utils/AuthenticationHelper.kt index e08177b4c..9dbc95843 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/utils/AuthenticationHelper.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/java/com/shopify/checkout_kit_android_demo/settings/authentication/utils/AuthenticationHelper.kt @@ -1,6 +1,6 @@ package com.shopify.checkout_kit_android_demo.settings.authentication.utils -import android.net.Uri +import androidx.core.net.toUri import android.util.Base64 import androidx.compose.ui.text.intl.Locale import java.security.MessageDigest @@ -24,7 +24,7 @@ class AuthenticationHelper( locale: Locale, ): String { val codeChallenge = codeChallenge(codeVerifier) - val url = Uri.parse("$baseUrl/oauth/authorize").buildUpon() + val url = "$baseUrl/oauth/authorize".toUri().buildUpon() .appendQueryParameter("scope", "openid email customer-account-api:full") .appendQueryParameter("client_id", clientId) .appendQueryParameter("response_type", "code") @@ -49,7 +49,7 @@ class AuthenticationHelper( * Builds a logout URL */ fun buildLogoutURL(idToken: String): String { - return "$baseUrl/logout?id_token_hint=${idToken}" + return "$baseUrl/logout?id_token_hint=$idToken" } /** diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/drawable/hero.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/drawable-nodpi/hero.png similarity index 100% rename from platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/drawable/hero.png rename to platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/drawable-nodpi/hero.png diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_background.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_background.png deleted file mode 100644 index 89a7bb492..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_background.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png deleted file mode 100644 index cce0ead6d..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_background.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_background.png deleted file mode 100644 index d1795de41..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_background.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png deleted file mode 100644 index 39bda3c5f..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png deleted file mode 100644 index 0463dbbdc..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_background.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png deleted file mode 100644 index 89a0fb572..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png deleted file mode 100644 index d749c0755..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 4a72d13e9..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png deleted file mode 100644 index a38a57abb..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_background.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png deleted file mode 100644 index 37c1b75f9..000000000 Binary files a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png and /dev/null differ diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/values/strings.xml b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/values/strings.xml index 79efb187e..fb97b1991 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/values/strings.xml +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/main/res/values/strings.xml @@ -58,7 +58,6 @@ Log in Log out - Retry Checkout is unavailable. Please try again. @@ -92,7 +91,6 @@ Featured plant image - Taxes included Products Add to cart diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStoreTest.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStoreTest.kt index cb78e1b37..dcf32e891 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStoreTest.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/CustomerAccessTokenStoreTest.kt @@ -8,12 +8,6 @@ import androidx.datastore.preferences.core.emptyPreferences import androidx.datastore.preferences.core.stringPreferencesKey import com.google.crypto.tink.Aead import com.shopify.checkout_kit_android_demo.settings.authentication.data.AccessToken -import java.io.File -import java.io.IOException -import java.nio.charset.StandardCharsets.UTF_8 -import java.security.GeneralSecurityException -import java.util.Base64 -import java.util.concurrent.atomic.AtomicInteger import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.SupervisorJob @@ -31,6 +25,12 @@ import org.junit.Before import org.junit.Rule import org.junit.Test import org.junit.rules.TemporaryFolder +import java.io.File +import java.io.IOException +import java.nio.charset.StandardCharsets.UTF_8 +import java.security.GeneralSecurityException +import java.util.Base64 +import java.util.concurrent.atomic.AtomicInteger class CustomerAccessTokenStoreTest { @get:Rule @@ -135,13 +135,15 @@ class CustomerAccessTokenStoreTest { @Test fun `does not remove a token saved while an unreadable token is being discarded`() = runBlocking { val replacement = "v1:replacement" - val store = storeWith(DecryptFailingAead { - runBlocking { - dataStore.edit { preferences -> - preferences[TOKEN_KEY] = replacement + val store = storeWith( + DecryptFailingAead { + runBlocking { + dataStore.edit { preferences -> + preferences[TOKEN_KEY] = replacement + } } } - }) + ) store.save(token()) @@ -153,7 +155,9 @@ class CustomerAccessTokenStoreTest { fun `does not persist a token when the codec cannot be created`() = runBlocking { val store = CustomerAccessTokenStore( json = json, - tokenCodecProvider = codecProvider(codecFactory = { throw GeneralSecurityException("Unable to load keyset") }), + tokenCodecProvider = codecProvider( + codecFactory = { throw GeneralSecurityException("Unable to load keyset") } + ), dataStore = dataStore ) @@ -170,7 +174,9 @@ class CustomerAccessTokenStoreTest { } val store = CustomerAccessTokenStore( json = json, - tokenCodecProvider = codecProvider(codecFactory = { throw GeneralSecurityException("Unable to load keyset") }), + tokenCodecProvider = codecProvider( + codecFactory = { throw GeneralSecurityException("Unable to load keyset") } + ), dataStore = dataStore ) diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/EncryptedTokenCodecTest.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/EncryptedTokenCodecTest.kt index 71a002910..7e39d0c17 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/EncryptedTokenCodecTest.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/EncryptedTokenCodecTest.kt @@ -1,10 +1,10 @@ package com.shopify.checkout_kit_android_demo.settings.authentication.data.source.local import com.google.crypto.tink.Aead -import java.security.GeneralSecurityException import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test +import java.security.GeneralSecurityException class EncryptedTokenCodecTest { private val codec = EncryptedTokenCodec(FakeAead()) @@ -55,6 +55,5 @@ class EncryptedTokenCodecTest { } return ciphertext } - } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/KeysetAeadFactoryTest.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/KeysetAeadFactoryTest.kt index 06f6fc5ab..f79d609c2 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/KeysetAeadFactoryTest.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/KeysetAeadFactoryTest.kt @@ -1,12 +1,12 @@ package com.shopify.checkout_kit_android_demo.settings.authentication.data.source.local import com.google.crypto.tink.Aead -import java.io.IOException -import java.security.GeneralSecurityException -import java.util.concurrent.atomic.AtomicInteger import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test +import java.io.IOException +import java.security.GeneralSecurityException +import java.util.concurrent.atomic.AtomicInteger class KeysetAeadFactoryTest { @Test diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProviderTest.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProviderTest.kt index bca2c2a73..169005001 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProviderTest.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenAeadProviderTest.kt @@ -1,8 +1,6 @@ package com.shopify.checkout_kit_android_demo.settings.authentication.data.source.local import com.google.crypto.tink.Aead -import java.security.GeneralSecurityException -import java.util.concurrent.atomic.AtomicInteger import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -11,6 +9,8 @@ import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions.assertThat import org.assertj.core.api.Assertions.assertThatThrownBy import org.junit.Test +import java.security.GeneralSecurityException +import java.util.concurrent.atomic.AtomicInteger class TokenAeadProviderTest { @Test diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenBackupRulesTest.kt b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenBackupRulesTest.kt index ca22098d8..f7eed0580 100644 --- a/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenBackupRulesTest.kt +++ b/platforms/android/samples/CheckoutKitAndroidDemo/app/src/test/java/com/shopify/checkout_kit_android_demo/settings/authentication/data/source/local/TokenBackupRulesTest.kt @@ -1,9 +1,9 @@ package com.shopify.checkout_kit_android_demo.settings.authentication.data.source.local -import javax.xml.parsers.DocumentBuilderFactory import org.assertj.core.api.Assertions.assertThat import org.junit.Test import org.w3c.dom.Element +import javax.xml.parsers.DocumentBuilderFactory class TokenBackupRulesTest { @Test @@ -42,13 +42,17 @@ class TokenBackupRulesTest { val exclusions = section!!.getElementsByTagName("exclude") tokenDataStorePaths.forEach { tokenDataStorePath -> - assertThat((0 until exclusions.length).any { - (exclusions.item(it) as Element).getAttribute("path") == tokenDataStorePath - }).withFailMessage("Missing DataStore exclusion for $tokenDataStorePath in $sectionName").isTrue() + assertThat( + (0 until exclusions.length).any { + (exclusions.item(it) as Element).getAttribute("path") == tokenDataStorePath + } + ).withFailMessage("Missing DataStore exclusion for $tokenDataStorePath in $sectionName").isTrue() } - assertThat((0 until exclusions.length).any { - (exclusions.item(it) as Element).getAttribute("path") == keysetPath - }).withFailMessage("Missing keyset exclusion in $sectionName").isTrue() + assertThat( + (0 until exclusions.length).any { + (exclusions.item(it) as Element).getAttribute("path") == keysetPath + } + ).withFailMessage("Missing keyset exclusion in $sectionName").isTrue() } } } diff --git a/platforms/android/samples/CheckoutKitAndroidDemo/detekt.config.yml b/platforms/android/samples/CheckoutKitAndroidDemo/detekt.config.yml new file mode 100644 index 000000000..7f6cbbca9 --- /dev/null +++ b/platforms/android/samples/CheckoutKitAndroidDemo/detekt.config.yml @@ -0,0 +1,10 @@ +formatting: + active: true + autoCorrect: true + MaximumLineLength: + active: true + maxLineLength: 140 + NoUnusedImports: + active: true + NoWildcardImports: + active: true