From b85cd1902b274568f48587d36d4b1693e1f0f1ef Mon Sep 17 00:00:00 2001 From: fankesyooni Date: Tue, 4 Mar 2025 02:19:00 +0800 Subject: [PATCH] feat: add try-catch for process function in PanguWidget --- .../pangutext/android/factory/PanguWidget.kt | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt b/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt index edac4e7..79e5cf1 100644 --- a/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt +++ b/pangutext-android/src/main/java/com/highcapable/pangutext/android/factory/PanguWidget.kt @@ -65,16 +65,23 @@ internal object PanguWidget { val instance = view ?: name.let { // There will be commonly used view class names in the XML layout, which is converted here. if (!it.contains(".")) "android.widget.$it" else it - }.toClassOrNull()?.let { + }.toClassOrNull()?.let { viewClass -> // Avoid creating unnecessary components for waste. - if (it notExtends classOf()) return null - val twoParams = it.constructor { + if (viewClass notExtends classOf()) return null + val twoParams = viewClass.constructor { param(ContextClass, AttributeSetClass) }.ignored().get() - val onceParam = it.constructor { + val onceParam = viewClass.constructor { param(ContextClass) }.ignored().get() - twoParams.newInstance(context, attrs) ?: onceParam.newInstance(context) + // Catching when the attrs value initialization failed. + runCatching { twoParams.newInstance(context, attrs) }.onFailure { + Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass using (Context, AttributeSet).", it) + }.getOrNull() + // Try to initialize with the default constructor again, otherwise return null. + ?: runCatching { onceParam.newInstance(context) }.onFailure { + Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass, this process will be ignored.", it) + }.getOrNull() } // Ignore if the instance is not a [TextView]. if (instance !is TextView) return null