11package com.rosan.installer.util
22
3+ import android.content.Context
34import androidx.compose.runtime.Composable
45import androidx.compose.ui.res.stringResource
56import com.rosan.installer.R
@@ -34,40 +35,71 @@ import com.rosan.installer.data.recycle.model.exception.DhizukuNotWorkException
3435import com.rosan.installer.data.recycle.model.exception.RootNotWorkException
3536import 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
3888fun 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}
0 commit comments