Skip to content

Commit 223b6a8

Browse files
committed
Enhance error handling in installer notifications with detailed messages
1 parent 7add21d commit 223b6a8

File tree

6 files changed

+87
-36
lines changed

6 files changed

+87
-36
lines changed

app/src/main/java/com/rosan/installer/data/app/model/impl/installer/IBinderInstallerRepoImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ abstract class IBinderInstallerRepoImpl : InstallerRepo, KoinComponent {
239239
) {
240240
fun special() = null
241241
val authorizer = config.authorizer
242-
Log.d("useUserservice", "calling useUserService...")
242+
Log.d("useUserService", "calling useUserService...")
243243
useUserService(
244244
config, if (authorizer == ConfigEntity.Authorizer.None
245245
|| authorizer == ConfigEntity.Authorizer.Dhizuku

app/src/main/java/com/rosan/installer/data/installer/model/impl/installer/ForegroundInfoHandler.kt

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import com.rosan.installer.R
1717
import com.rosan.installer.data.app.util.getInfo
1818
import com.rosan.installer.data.installer.model.entity.ProgressEntity
1919
import com.rosan.installer.data.installer.repo.InstallerRepo
20+
import com.rosan.installer.util.getErrorMessage
2021
import kotlinx.coroutines.CoroutineScope
2122
import kotlinx.coroutines.Job
2223
import kotlinx.coroutines.launch
@@ -237,10 +238,22 @@ class ForegroundInfoHandler(scope: CoroutineScope, installer: InstallerRepo) :
237238
.addAction(0, getString(R.string.cancel), finishIntent).build()
238239
}
239240

240-
private fun onInstallFailed(builder: NotificationCompat.Builder): Notification {
241+
private fun onInstallFailed(
242+
builder: NotificationCompat.Builder
243+
): Notification {
241244
val info = installer.entities.filter { it.selected }.map { it.app }.getInfo(context)
245+
val reason = installer.error.getErrorMessage(context)
246+
val contentText = getString(R.string.installer_install_failed)
247+
val bigTextStyle = NotificationCompat.BigTextStyle()
248+
.setBigContentTitle(info.title)
249+
.bigText(
250+
"$contentText\n" +
251+
getString(R.string.installer_error_reason) +
252+
": $reason"
253+
)
242254
return builder.setContentTitle(info.title)
243-
.setContentText(getString(R.string.installer_install_failed))
255+
.setContentText(contentText)
256+
.setStyle(bigTextStyle)
244257
.setLargeIcon(info.icon?.toBitmapOrNull())
245258
.addAction(0, getString(R.string.retry), installIntent)
246259
.addAction(0, getString(R.string.cancel), finishIntent).build()
Lines changed: 65 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.rosan.installer.util
22

3+
import android.content.Context
34
import androidx.compose.runtime.Composable
45
import androidx.compose.ui.res.stringResource
56
import com.rosan.installer.R
@@ -34,40 +35,71 @@ import com.rosan.installer.data.recycle.model.exception.DhizukuNotWorkException
3435
import com.rosan.installer.data.recycle.model.exception.RootNotWorkException
3536
import com.rosan.installer.data.recycle.model.exception.ShizukuNotWorkException
3637

38+
/**
39+
* [公共实现]
40+
*
41+
* 一个私有的辅助函数,它作为唯一的真实来源,
42+
* 负责将一个 Throwable 映射到其对应的字符串资源 ID。
43+
*
44+
* @return R.string 的资源 ID。
45+
*/
46+
private fun Throwable.getStringResourceId(): Int {
47+
return when (this) {
48+
is InstallFailedAlreadyExistsException -> R.string.exception_install_failed_already_exists
49+
is InstallFailedInvalidAPKException -> R.string.exception_install_failed_invalid_apk
50+
is InstallFailedInvalidURIException -> R.string.exception_install_failed_invalid_uri
51+
is InstallFailedInsufficientStorageException -> R.string.exception_install_failed_insufficient_storage
52+
is InstallFailedDuplicatePackageException -> R.string.exception_install_failed_duplicate_package
53+
is InstallFailedNoSharedUserException -> R.string.exception_install_failed_no_shared_user
54+
is InstallFailedUpdateIncompatibleException -> R.string.exception_install_failed_update_incompatible
55+
is InstallFailedSharedUserIncompatibleException -> R.string.exception_install_failed_shared_user_incompatible
56+
is InstallFailedMissingSharedLibraryException -> R.string.exception_install_failed_missing_shared_library
57+
is InstallFailedReplaceCouldntDeleteException -> R.string.exception_install_failed_replace_couldnt_delete
58+
is InstallFailedDexOptException -> R.string.exception_install_failed_dexopt
59+
is InstallFailedOlderSdkException -> R.string.exception_install_failed_older_sdk
60+
is InstallFailedConflictingProviderException -> R.string.exception_install_failed_conflicting_provider
61+
is InstallFailedNewerSDKException -> R.string.exception_install_failed_newer_sdk
62+
is InstallFailedTestOnlyException -> R.string.exception_install_failed_test_only
63+
is InstallFailedCpuAbiIncompatibleException -> R.string.exception_install_failed_cpu_abi_incompatible
64+
is InstallFailedMissingFeatureException -> R.string.exception_install_failed_missing_feature
65+
is InstallFailedContainerErrorException -> R.string.exception_install_failed_container_error
66+
is InstallFailedInvalidInstallLocationException -> R.string.exception_install_failed_invalid_install_location
67+
is InstallFailedMediaUnavailableException -> R.string.exception_install_failed_media_unavailable
68+
is InstallFailedVerificationTimeoutException -> R.string.exception_install_failed_verification_timeout
69+
is InstallFailedVerificationFailureException -> R.string.exception_install_failed_verification_failure
70+
is InstallFailedPackageChangedException -> R.string.exception_install_failed_package_changed
71+
is InstallFailedUidChangedException -> R.string.exception_install_failed_uid_changed
72+
is InstallFailedVersionDowngradeException -> R.string.exception_install_failed_version_downgrade
73+
is InstallFailedRejectedByBuildTypeException -> R.string.exception_install_failed_rejected_by_build_type
74+
is ShizukuNotWorkException -> R.string.exception_shizuku_not_work
75+
is DhizukuNotWorkException -> R.string.exception_dhizuku_not_work
76+
is RootNotWorkException -> R.string.exception_root_not_work
77+
is AppProcessNotWorkException -> R.string.exception_app_process_not_work
78+
else -> R.string.exception_install_failed_unknown
79+
}
80+
}
81+
82+
/**
83+
* [公开API - Composable]
84+
*
85+
* 用于在 Jetpack Compose UI 中获取用户友好的错误信息。
86+
*/
3787
@Composable
3888
fun Throwable.help(): String {
39-
return when (this) {
40-
is InstallFailedAlreadyExistsException -> stringResource(R.string.exception_install_failed_already_exists)
41-
is InstallFailedInvalidAPKException -> stringResource(R.string.exception_install_failed_invalid_apk)
42-
is InstallFailedInvalidURIException -> stringResource(R.string.exception_install_failed_invalid_uri)
43-
is InstallFailedInsufficientStorageException -> stringResource(R.string.exception_install_failed_insufficient_storage)
44-
is InstallFailedDuplicatePackageException -> stringResource(R.string.exception_install_failed_duplicate_package)
45-
is InstallFailedNoSharedUserException -> stringResource(R.string.exception_install_failed_no_shared_user)
46-
is InstallFailedUpdateIncompatibleException -> stringResource(R.string.exception_install_failed_update_incompatible)
47-
is InstallFailedSharedUserIncompatibleException -> stringResource(R.string.exception_install_failed_shared_user_incompatible)
48-
is InstallFailedMissingSharedLibraryException -> stringResource(R.string.exception_install_failed_missing_shared_library)
49-
is InstallFailedReplaceCouldntDeleteException -> stringResource(R.string.exception_install_failed_replace_couldnt_delete)
50-
is InstallFailedDexOptException -> stringResource(R.string.exception_install_failed_dexopt)
51-
is InstallFailedOlderSdkException -> stringResource(R.string.exception_install_failed_older_sdk)
52-
is InstallFailedConflictingProviderException -> stringResource(R.string.exception_install_failed_conflicting_provider)
53-
is InstallFailedNewerSDKException -> stringResource(R.string.exception_install_failed_newer_sdk)
54-
is InstallFailedTestOnlyException -> stringResource(R.string.exception_install_failed_test_only)
55-
is InstallFailedCpuAbiIncompatibleException -> stringResource(R.string.exception_install_failed_cpu_abi_incompatible)
56-
is InstallFailedMissingFeatureException -> stringResource(R.string.exception_install_failed_missing_feature)
57-
is InstallFailedContainerErrorException -> stringResource(R.string.exception_install_failed_container_error)
58-
is InstallFailedInvalidInstallLocationException -> stringResource(R.string.exception_install_failed_invalid_install_location)
59-
is InstallFailedMediaUnavailableException -> stringResource(R.string.exception_install_failed_media_unavailable)
60-
is InstallFailedVerificationTimeoutException -> stringResource(R.string.exception_install_failed_verification_timeout)
61-
is InstallFailedVerificationFailureException -> stringResource(R.string.exception_install_failed_verification_failure)
62-
is InstallFailedPackageChangedException -> stringResource(R.string.exception_install_failed_package_changed)
63-
is InstallFailedUidChangedException -> stringResource(R.string.exception_install_failed_uid_changed)
64-
is InstallFailedVersionDowngradeException -> stringResource(R.string.exception_install_failed_version_downgrade)
65-
is InstallFailedRejectedByBuildTypeException -> stringResource(R.string.exception_install_failed_rejected_by_build_type)
89+
// 1. 调用私有函数获取资源 ID
90+
val resourceId = this.getStringResourceId()
91+
// 2. 使用 Composable 的方式获取字符串
92+
return stringResource(resourceId)
93+
}
6694

67-
is ShizukuNotWorkException -> stringResource(R.string.exception_shizuku_not_work)
68-
is DhizukuNotWorkException -> stringResource(R.string.exception_dhizuku_not_work)
69-
is RootNotWorkException -> stringResource(R.string.exception_root_not_work)
70-
is AppProcessNotWorkException -> stringResource(R.string.exception_app_process_not_work)
71-
else -> stringResource(R.string.exception_install_failed_unknown)
72-
}
95+
/**
96+
* [公开API - Non-Composable]
97+
*
98+
* 用于在 Service, BroadcastReceiver, Handler 等非 Compose 环境中获取用户友好的错误信息。
99+
*/
100+
fun Throwable.getErrorMessage(context: Context): String {
101+
// 1. 调用私有函数获取资源 ID
102+
val resourceId = this.getStringResourceId()
103+
// 2. 使用标准 Context 的方式获取字符串
104+
return context.getString(resourceId)
73105
}

app/src/main/res/values-zh-rCN/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@
127127
<string name="installer_install_failed">安装失败</string>
128128
<string name="installer_install_success">安装成功</string>
129129

130+
<string name="installer_unknown_error">未知错误</string>
130131
<string name="installer_channel_name">安装通知</string>
131132
<string name="installer_progress_channel_name">安装过程通知</string>
132133
<string name="installer_background_channel_name">后台通知</string>
@@ -173,4 +174,5 @@
173174
<string name="old_version_prefix">当前</string>
174175
<string name="new_version_prefix">新</string>
175176
<string name="install_choice">安装包选择</string>
177+
<string name="installer_error_reason">错误原因</string>
176178
</resources>

app/src/main/res/values-zh-rTW/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@
126126
<string name="installer_install_failed">安裝失敗</string>
127127
<string name="installer_install_success">安裝成功</string>
128128

129+
<string name="installer_unknown_error">未知錯誤</string>
129130
<string name="installer_channel_name">安裝通知</string>
130131
<string name="installer_progress_channel_name">安裝過程通知</string>
131132
<string name="installer_background_channel_name">後臺通知</string>
@@ -172,4 +173,5 @@
172173
<string name="old_version_prefix">當前</string>
173174
<string name="new_version_prefix">新</string>
174175
<string name="install_choice">安裝包選擇</string>
176+
<string name="installer_error_reason">錯誤原因</string>
175177
</resources>

app/src/main/res/values/strings.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@
128128
<string name="installer_installing">Installing…</string>
129129
<string name="installer_install_failed">Install failed</string>
130130
<string name="installer_install_success">Install complete</string>
131+
<string name="installer_error_reason">Error Reason</string>
132+
<string name="installer_unknown_error">Unknown Error</string>
131133

132134
<string name="installer_channel_name">Install Notification</string>
133135
<string name="installer_progress_channel_name">Install Process Notification</string>

0 commit comments

Comments
 (0)