From a2340ac725cd2dce095d6e1b0cfb8834319a6ea9 Mon Sep 17 00:00:00 2001 From: dadachi Date: Sun, 29 Mar 2026 11:12:41 +0900 Subject: [PATCH] Fix null safety bugs and resource leak Co-Authored-By: Claude Opus 4.6 (1M context) --- .../ui/shop_detail/ShopDetailView.kt | 2 +- .../ui/shop_settings/ShopSettingsView.kt | 10 +++++----- .../nativeapptemplatefree/utils/Utility.kt | 17 ++++++----------- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_detail/ShopDetailView.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_detail/ShopDetailView.kt index 5e0e016..8b7bf2a 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_detail/ShopDetailView.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_detail/ShopDetailView.kt @@ -361,7 +361,7 @@ private fun TopAppBar( IconButton( onClick = { if (uiState.success) { - onSettingsClick(uiState.shop.getData()?.id!!) + uiState.shop.getData()?.id?.let { onSettingsClick(it) } } }, ) { diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_settings/ShopSettingsView.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_settings/ShopSettingsView.kt index ba828b6..f400ec8 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_settings/ShopSettingsView.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/ui/shop_settings/ShopSettingsView.kt @@ -169,7 +169,7 @@ private fun ShopSettingsContentView( dialogTitle = stringResource(R.string.are_you_sure), confirmButtonTitle = stringResource(R.string.title_reset_number_tags), onDismissRequest = { isShowingResetConfirmationDialog = false }, - onConfirmation = { viewModel.resetShop(uiState.shop.getData()?.id!!) }, + onConfirmation = { uiState.shop.getData()?.id?.let { viewModel.resetShop(it) } }, icon = Icons.Outlined.AddAlert, ) } @@ -179,7 +179,7 @@ private fun ShopSettingsContentView( dialogTitle = stringResource(R.string.are_you_sure), confirmButtonTitle = stringResource(R.string.title_delete_shop), onDismissRequest = { isShowingDeleteConfirmationDialog = false }, - onConfirmation = { viewModel.deleteShop(uiState.shop.getData()?.id!!) }, + onConfirmation = { uiState.shop.getData()?.id?.let { viewModel.deleteShop(it) } }, icon = Icons.Outlined.AddAlert, ) } @@ -230,7 +230,7 @@ private fun ShopSettingsContentView( ) }, modifier = Modifier - .clickable { onShowBasicSettingsClick(uiState.shop.getData()?.id!!) }, + .clickable { uiState.shop.getData()?.id?.let { onShowBasicSettingsClick(it) } }, ) HorizontalDivider() @@ -265,7 +265,7 @@ private fun ShopSettingsContentView( ) }, modifier = Modifier - .clickable { onShowItemTagListClick(uiState.shop.getData()?.id!!) }, + .clickable { uiState.shop.getData()?.id?.let { onShowItemTagListClick(it) } }, ) HorizontalDivider() @@ -300,7 +300,7 @@ private fun ShopSettingsContentView( ) }, modifier = Modifier - .clickable { onShowNumberTagsWebpageListClick(uiState.shop.getData()?.id!!) }, + .clickable { uiState.shop.getData()?.id?.let { onShowNumberTagsWebpageListClick(it) } }, ) HorizontalDivider() diff --git a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt index 01b3018..f907eba 100644 --- a/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt +++ b/app/src/main/kotlin/com/nativeapptemplate/nativeapptemplatefree/utils/Utility.kt @@ -116,15 +116,10 @@ object Utility { // https://stackoverflow.com/a/75714502/1160200 // https://qiita.com/irgaly/items/b942bd985a4647e372ea fun Context.shareImage(title: String, image: ImageBitmap, filename: String) { - val file = try { - val outputFile = File(cacheDir, "$filename.png") - val outPutStream = FileOutputStream(outputFile) - image.asAndroidBitmap().compress(Bitmap.CompressFormat.PNG, 100, outPutStream) - outPutStream.flush() - outPutStream.close() - outputFile - } catch (e: Throwable) { - throw e + val file = File(cacheDir, "$filename.png").also { outputFile -> + FileOutputStream(outputFile).use { outputStream -> + image.asAndroidBitmap().compress(Bitmap.CompressFormat.PNG, 100, outputStream) + } } val uri = file.toUriCompat(this) @@ -145,8 +140,8 @@ object Utility { // https://stackoverflow.com/a/78039163/1160200 fun Context.restartApp() { val packageManager = packageManager - val intent = packageManager.getLaunchIntentForPackage(packageName)!! - val componentName = intent.component!! + val intent = packageManager.getLaunchIntentForPackage(packageName) ?: return + val componentName = intent.component ?: return val restartIntent = Intent.makeRestartActivityTask(componentName) startActivity(restartIntent) Runtime.getRuntime().exit(0)