mirror of
https://github.com/BetterAndroid/PanguText.git
synced 2025-09-04 01:35:37 +08:00
refactor: migration to KavaRef
This commit is contained in:
@@ -13,7 +13,7 @@ repositories:
|
|||||||
plugins:
|
plugins:
|
||||||
com.android.application:
|
com.android.application:
|
||||||
alias: android-application
|
alias: android-application
|
||||||
version: 8.9.0
|
version: 8.9.3
|
||||||
com.android.library:
|
com.android.library:
|
||||||
alias: android-library
|
alias: android-library
|
||||||
version-ref: com.android.application
|
version-ref: com.android.application
|
||||||
@@ -26,7 +26,7 @@ plugins:
|
|||||||
auto-update: false
|
auto-update: false
|
||||||
com.vanniktech.maven.publish:
|
com.vanniktech.maven.publish:
|
||||||
alias: maven-publish
|
alias: maven-publish
|
||||||
version: 0.31.0
|
version: 0.33.0
|
||||||
|
|
||||||
libraries:
|
libraries:
|
||||||
com.highcapable.betterandroid:
|
com.highcapable.betterandroid:
|
||||||
@@ -36,17 +36,19 @@ libraries:
|
|||||||
version: 1.0.6
|
version: 1.0.6
|
||||||
system-extension:
|
system-extension:
|
||||||
version: 1.0.2
|
version: 1.0.2
|
||||||
com.highcapable.yukireflection:
|
com.highcapable.kavaref:
|
||||||
api:
|
kavaref-core:
|
||||||
version: 1.0.3
|
version: 1.0.0
|
||||||
|
kavaref-extension:
|
||||||
|
version: 1.0.0
|
||||||
androidx.core:
|
androidx.core:
|
||||||
core:
|
core:
|
||||||
version: 1.15.0
|
version: 1.16.0
|
||||||
core-ktx:
|
core-ktx:
|
||||||
version-ref: <this>::core
|
version-ref: <this>::core
|
||||||
androidx.appcompat:
|
androidx.appcompat:
|
||||||
appcompat:
|
appcompat:
|
||||||
version: 1.7.0
|
version: 1.7.1
|
||||||
com.google.android.material:
|
com.google.android.material:
|
||||||
material:
|
material:
|
||||||
# Workaround for a bug in version 1.12.0
|
# Workaround for a bug in version 1.12.0
|
||||||
|
@@ -38,7 +38,8 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(com.highcapable.yukireflection.api)
|
implementation(com.highcapable.kavaref.kavaref.core)
|
||||||
|
implementation(com.highcapable.kavaref.kavaref.extension)
|
||||||
implementation(com.highcapable.betterandroid.ui.extension)
|
implementation(com.highcapable.betterandroid.ui.extension)
|
||||||
implementation(com.highcapable.betterandroid.system.extension)
|
implementation(com.highcapable.betterandroid.system.extension)
|
||||||
implementation(androidx.core.core.ktx)
|
implementation(androidx.core.core.ktx)
|
||||||
|
@@ -31,13 +31,13 @@ import android.text.Spanned
|
|||||||
import android.text.style.CharacterStyle
|
import android.text.style.CharacterStyle
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import androidx.annotation.Px
|
import androidx.annotation.Px
|
||||||
|
import com.highcapable.kavaref.extension.classOf
|
||||||
import com.highcapable.pangutext.android.core.PanguMarginSpan
|
import com.highcapable.pangutext.android.core.PanguMarginSpan
|
||||||
import com.highcapable.pangutext.android.core.PanguPatterns
|
import com.highcapable.pangutext.android.core.PanguPatterns
|
||||||
import com.highcapable.pangutext.android.extension.injectPanguText
|
import com.highcapable.pangutext.android.extension.injectPanguText
|
||||||
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
||||||
import com.highcapable.pangutext.android.extension.setHintWithPangu
|
import com.highcapable.pangutext.android.extension.setHintWithPangu
|
||||||
import com.highcapable.pangutext.android.extension.setTextWithPangu
|
import com.highcapable.pangutext.android.extension.setTextWithPangu
|
||||||
import com.highcapable.yukireflection.factory.classOf
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The library core of Pangu text processor.
|
* The library core of Pangu text processor.
|
||||||
@@ -52,7 +52,7 @@ object PanguText {
|
|||||||
* with no actual meaning.
|
* with no actual meaning.
|
||||||
*/
|
*/
|
||||||
private const val PH = '\u001C'
|
private const val PH = '\u001C'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The global configuration of [PanguText].
|
* The global configuration of [PanguText].
|
||||||
*/
|
*/
|
||||||
|
@@ -26,10 +26,10 @@ import android.text.TextWatcher
|
|||||||
import android.widget.EditText
|
import android.widget.EditText
|
||||||
import android.widget.TextView
|
import android.widget.TextView
|
||||||
import com.highcapable.betterandroid.system.extension.tool.SystemVersion
|
import com.highcapable.betterandroid.system.extension.tool.SystemVersion
|
||||||
|
import com.highcapable.kavaref.KavaRef.Companion.resolve
|
||||||
import com.highcapable.pangutext.android.PanguText
|
import com.highcapable.pangutext.android.PanguText
|
||||||
import com.highcapable.pangutext.android.PanguTextConfig
|
import com.highcapable.pangutext.android.PanguTextConfig
|
||||||
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
||||||
import com.highcapable.yukireflection.factory.current
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A [TextWatcher] that automatically applies [PanguText] to the text content.
|
* A [TextWatcher] that automatically applies [PanguText] to the text content.
|
||||||
@@ -45,10 +45,10 @@ class PanguTextWatcher internal constructor(private val base: TextView, private
|
|||||||
* @return [ArrayList]<[TextWatcher]>.
|
* @return [ArrayList]<[TextWatcher]>.
|
||||||
*/
|
*/
|
||||||
private val textWatchers
|
private val textWatchers
|
||||||
get() = base.current(ignored = true).field {
|
get() = base.resolve().optional(silent = true).firstFieldOrNull {
|
||||||
name = "mListeners"
|
name = "mListeners"
|
||||||
superClass()
|
superclass()
|
||||||
}.cast<ArrayList<TextWatcher>>()
|
}?.getQuietly<ArrayList<TextWatcher>>()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether to automatically re-measure the text width after processing.
|
* Whether to automatically re-measure the text width after processing.
|
||||||
|
@@ -25,9 +25,8 @@ package com.highcapable.pangutext.android.extension
|
|||||||
|
|
||||||
import android.text.SpannableStringBuilder
|
import android.text.SpannableStringBuilder
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
import com.highcapable.kavaref.KavaRef.Companion.resolve
|
||||||
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
||||||
import com.highcapable.yukireflection.factory.classOf
|
|
||||||
import com.highcapable.yukireflection.factory.field
|
|
||||||
import java.util.regex.Matcher
|
import java.util.regex.Matcher
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -101,10 +100,10 @@ private fun Matcher.buildReplacementText(replacement: String): String {
|
|||||||
* @return [Int]
|
* @return [Int]
|
||||||
*/
|
*/
|
||||||
private fun Matcher.getNamedGroupIndex(groupName: String): Int {
|
private fun Matcher.getNamedGroupIndex(groupName: String): Int {
|
||||||
val namedGroups = classOf<Matcher>()
|
val namedGroups = Matcher::class.resolve()
|
||||||
.field { name = "namedGroups" }
|
.optional(silent = true)
|
||||||
.ignored()
|
.firstFieldOrNull {
|
||||||
.get(this)
|
name = "namedGroups"
|
||||||
.cast<Map<String, Int>>()
|
}?.of(this)?.getQuietly<Map<String, Int>>()
|
||||||
return namedGroups?.get(groupName) ?: -1
|
return namedGroups?.get(groupName) ?: -1
|
||||||
}
|
}
|
@@ -29,9 +29,8 @@ import android.util.Log
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import com.highcapable.betterandroid.ui.extension.view.layoutInflater
|
import com.highcapable.betterandroid.ui.extension.view.layoutInflater
|
||||||
|
import com.highcapable.kavaref.KavaRef.Companion.resolve
|
||||||
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
||||||
import com.highcapable.yukireflection.factory.field
|
|
||||||
import com.highcapable.yukireflection.type.android.LayoutInflaterClass
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pangu text factory 2 for [LayoutInflater.Factory2].
|
* Pangu text factory 2 for [LayoutInflater.Factory2].
|
||||||
@@ -110,11 +109,10 @@ class PanguTextFactory2 private constructor(private val base: LayoutInflater.Fac
|
|||||||
}
|
}
|
||||||
val replacement = PanguTextFactory2(original)
|
val replacement = PanguTextFactory2(original)
|
||||||
if (original != null)
|
if (original != null)
|
||||||
LayoutInflaterClass.field {
|
inflater.resolve().optional(silent = true).firstFieldOrNull {
|
||||||
name = "mFactory2"
|
name = "mFactory2"
|
||||||
}.ignored().onNoSuchField {
|
superclass()
|
||||||
Log.e(PangutextAndroidProperties.PROJECT_NAME, "LayoutInflater.mFactory2 not found.", it)
|
}?.setQuietly(replacement) ?: Log.e(PangutextAndroidProperties.PROJECT_NAME, "LayoutInflater.mFactory2 not found.")
|
||||||
}.get(inflater).set(replacement)
|
|
||||||
else inflater.factory2 = replacement
|
else inflater.factory2 = replacement
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -31,6 +31,10 @@ import com.highcapable.betterandroid.ui.extension.component.base.getBooleanOrNul
|
|||||||
import com.highcapable.betterandroid.ui.extension.component.base.getFloatOrNull
|
import com.highcapable.betterandroid.ui.extension.component.base.getFloatOrNull
|
||||||
import com.highcapable.betterandroid.ui.extension.component.base.getStringOrNull
|
import com.highcapable.betterandroid.ui.extension.component.base.getStringOrNull
|
||||||
import com.highcapable.betterandroid.ui.extension.component.base.obtainStyledAttributes
|
import com.highcapable.betterandroid.ui.extension.component.base.obtainStyledAttributes
|
||||||
|
import com.highcapable.kavaref.KavaRef.Companion.resolve
|
||||||
|
import com.highcapable.kavaref.extension.classOf
|
||||||
|
import com.highcapable.kavaref.extension.isNotSubclassOf
|
||||||
|
import com.highcapable.kavaref.extension.toClassOrNull
|
||||||
import com.highcapable.pangutext.android.PanguText
|
import com.highcapable.pangutext.android.PanguText
|
||||||
import com.highcapable.pangutext.android.PanguTextConfig
|
import com.highcapable.pangutext.android.PanguTextConfig
|
||||||
import com.highcapable.pangutext.android.R
|
import com.highcapable.pangutext.android.R
|
||||||
@@ -38,12 +42,6 @@ import com.highcapable.pangutext.android.core.PanguTextView
|
|||||||
import com.highcapable.pangutext.android.extension.injectPanguText
|
import com.highcapable.pangutext.android.extension.injectPanguText
|
||||||
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
import com.highcapable.pangutext.android.extension.injectRealTimePanguText
|
||||||
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
import com.highcapable.pangutext.android.generated.PangutextAndroidProperties
|
||||||
import com.highcapable.yukireflection.factory.classOf
|
|
||||||
import com.highcapable.yukireflection.factory.constructor
|
|
||||||
import com.highcapable.yukireflection.factory.notExtends
|
|
||||||
import com.highcapable.yukireflection.factory.toClassOrNull
|
|
||||||
import com.highcapable.yukireflection.type.android.AttributeSetClass
|
|
||||||
import com.highcapable.yukireflection.type.android.ContextClass
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A widgets processor that automatically applies [PanguText] to the text content.
|
* A widgets processor that automatically applies [PanguText] to the text content.
|
||||||
@@ -67,19 +65,19 @@ internal object PanguWidget {
|
|||||||
if (!it.contains(".")) "android.widget.$it" else it
|
if (!it.contains(".")) "android.widget.$it" else it
|
||||||
}.toClassOrNull()?.let { viewClass ->
|
}.toClassOrNull()?.let { viewClass ->
|
||||||
// Avoid creating unnecessary components for waste.
|
// Avoid creating unnecessary components for waste.
|
||||||
if (viewClass notExtends classOf<TextView>()) return null
|
if (viewClass isNotSubclassOf classOf<TextView>()) return null
|
||||||
val twoParams = viewClass.constructor {
|
val twoParams = viewClass.resolve()
|
||||||
param(ContextClass, AttributeSetClass)
|
.optional(silent = true)
|
||||||
}.ignored().get()
|
.firstConstructorOrNull { parameters(Context::class, AttributeSet::class) }
|
||||||
val onceParam = viewClass.constructor {
|
val onceParam = viewClass.resolve()
|
||||||
param(ContextClass)
|
.optional(silent = true)
|
||||||
}.ignored().get()
|
.firstConstructorOrNull { parameters(Context::class) }
|
||||||
// Catching when the attrs value initialization failed.
|
// Catching when the attrs value initialization failed.
|
||||||
runCatching { twoParams.newInstance<View>(context, attrs) }.onFailure {
|
runCatching { twoParams?.create(context, attrs) }.onFailure {
|
||||||
Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass using (Context, AttributeSet).", it)
|
Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass using (Context, AttributeSet).", it)
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
// Try to initialize with the default constructor again, otherwise return null.
|
// Try to initialize with the default constructor again, otherwise return null.
|
||||||
?: runCatching { onceParam.newInstance<View>(context) }.onFailure {
|
?: runCatching { onceParam?.create(context) }.onFailure {
|
||||||
Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass, this process will be ignored.", it)
|
Log.w(PangutextAndroidProperties.PROJECT_NAME, "Failed to create instance of $viewClass, this process will be ignored.", it)
|
||||||
}.getOrNull()
|
}.getOrNull()
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user