diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index 7037c85..518c6bc 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -4,7 +4,7 @@ - \ No newline at end of file + diff --git a/app/build.gradle b/app/build.gradle index 8f2cd61..843ea5f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -33,8 +33,7 @@ android { javaCompileOptions { annotationProcessorOptions { arguments = [ -// AROUTER_MODULE_NAME: project.getName() - AROUTER_MODULE_NAME: android.defaultConfig.applicationId + AROUTER_MODULE_NAME: project.getName() ] } } @@ -102,7 +101,7 @@ android { } buildTypes { release { - minifyEnabled false + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release @@ -124,9 +123,7 @@ android { debug { debuggable true - minifyEnabled false -// applicationIdSuffix ".test" // 为测试包添加包名后缀 -// resValue("string", "app_name", "秘地测试版") + minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.debug @@ -165,7 +162,7 @@ android { } kotlinOptions { - jvmTarget = '11' + jvmTarget = '17' } dexOptions { dexInProcess true @@ -193,7 +190,13 @@ dependencies { implementation files('libs/logger-2.2.2-release.aar') implementation files('libs/main-2.2.3-release.aar') + implementation files('libs/WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc.aar') + implementation files('libs/WbCloudNormal-v5.1.10-4e3e198.aar') + + implementation(libs.arouter.api.v150) + //annotationProcessor + annotationProcessor libs.arouter.compiler implementation project(':modulevocal') // 必须 annotationProcessor project(':modulevocal') // 关键! @@ -201,10 +204,6 @@ dependencies { api project(":moduleLogin") implementation project(':modulemain') - implementation(libs.arouter.api.v150) - //annotationProcessor - annotationProcessor libs.arouter.compiler - //aar的名称,例如:WbCloudFaceLiveSdk-v6.0.0-1234567.aar,填入'WbCloudFaceLiveSdk-v6.0.0-1234567' // implementation(name: 'WbCloudFaceLiveSdk-face-v6.6.2-8e4718fc', ext: 'aar') ////2. 云normal SDK, diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_app_bate.png b/app/src/main/res/mipmap-hdpi/ic_launcher_app_bate.png new file mode 100644 index 0000000..4de29e0 Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_app_bate.png differ diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_app_bate.png b/app/src/main/res/mipmap-mdpi/ic_launcher_app_bate.png new file mode 100644 index 0000000..6424c9f Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_app_bate.png differ diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_app_bate.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_app_bate.png new file mode 100644 index 0000000..2a114f7 Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_app_bate.png differ diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_app_bate.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_app_bate.png new file mode 100644 index 0000000..6fe9095 Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_app_bate.png differ diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_app_bate.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_app_bate.png new file mode 100644 index 0000000..8175262 Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_app_bate.png differ diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentPrefs.java b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentPrefs.java index a1d591a..a757b80 100644 --- a/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentPrefs.java +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/utils/config/EnvironmentPrefs.java @@ -51,7 +51,7 @@ public class EnvironmentPrefs { // } // 默认使用生产环境 - String envName = sharedPreferences.getString(KEY_ENV, EnvironmentEnum.PRODUCTION.name()); + String envName = sharedPreferences.getString(KEY_ENV, EnvironmentEnum.TEST.name()); try { return EnvironmentEnum.valueOf(envName); } catch (IllegalArgumentException e) { diff --git a/moduleUtil/src/main/java/com/xscm/moduleutil/view/RichTextView.kt b/moduleUtil/src/main/java/com/xscm/moduleutil/view/RichTextView.kt new file mode 100644 index 0000000..b9165e1 --- /dev/null +++ b/moduleUtil/src/main/java/com/xscm/moduleutil/view/RichTextView.kt @@ -0,0 +1,207 @@ +package com.xscm.moduleutil.view + +import android.content.Context +import android.graphics.Color +import android.graphics.Typeface +import android.text.Html +import android.text.Spannable +import android.text.SpannableStringBuilder +import android.text.TextPaint +import android.text.method.LinkMovementMethod +import android.text.style.* +import android.util.Log +import android.util.AttributeSet +import android.view.View +import android.widget.TextView +import androidx.annotation.ColorInt +import androidx.annotation.StringRes + +/** + * 封装了富文本展示功能的自定义TextView + * 支持HTML格式、自定义样式文本和点击事件 + */ +class RichTextView @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + defStyleAttr: Int = 0 +) : androidx.appcompat.widget.AppCompatTextView(context, attrs, defStyleAttr) { + + // 富文本构建器 + private val spannableBuilder = SpannableStringBuilder() + + init { + // 初始化配置 + movementMethod = LinkMovementMethod.getInstance() + highlightColor = Color.TRANSPARENT // 移除点击高亮 + } + + /** + * 设置HTML格式的富文本 + */ + fun setHtmlText(html: String) { + val spanned = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) { + Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT) + } else { + @Suppress("DEPRECATION") + Html.fromHtml(html) + } + text = spanned + } + + /** + * 从资源文件设置HTML富文本 + */ + fun setHtmlText(@StringRes resId: Int) { + setHtmlText(context.getString(resId)) + } + + /** + * 开始构建富文本 + */ + fun beginBuild(): RichTextBuilder { + spannableBuilder.clear() + return RichTextBuilder() + } + + /** + * 富文本构建器 + * 支持链式调用添加各种样式的文本 + */ + inner class RichTextBuilder { + + /** + * 添加普通文本 + */ + fun addText(text: String): RichTextBuilder { + spannableBuilder.append(text) + return this + } + + /** + * 添加普通文本(从资源文件) + */ + fun addText(@StringRes resId: Int): RichTextBuilder { + return addText(context.getString(resId)) + } + + /** + * 添加加粗文本 + */ + fun addBoldText(text: String): RichTextBuilder { + return addStyledText(text, StyleSpan(Typeface.BOLD)) + } + + /** + * 添加斜体文本 + */ + fun addItalicText(text: String): RichTextBuilder { + return addStyledText(text, StyleSpan(Typeface.ITALIC)) + } + + /** + * 添加下划线文本 + */ + fun addUnderlineText(text: String): RichTextBuilder { + return addStyledText(text, UnderlineSpan()) + } + + /** + * 添加删除线文本 + */ + fun addStrikethroughText(text: String): RichTextBuilder { + return addStyledText(text, StrikethroughSpan()) + } + + /** + * 添加指定颜色的文本 + */ + fun addColoredText(text: String, @ColorInt color: Int): RichTextBuilder { + return addStyledText(text, ForegroundColorSpan(color)) + } + + /** + * 添加指定背景色的文本 + */ + fun addBackgroundColoredText(text: String, @ColorInt color: Int): RichTextBuilder { + return addStyledText(text, BackgroundColorSpan(color)) + } + + /** + * 添加指定大小的文本 + * @param proportion 相对于默认大小的比例 + */ + fun addSizedText(text: String, proportion: Float): RichTextBuilder { + return addStyledText(text, RelativeSizeSpan(proportion)) + } + + /** + * 添加带有点击事件的文本 + */ + fun addClickableText( + text: String, + @ColorInt linkColor: Int = Color.BLUE, + isUnderline: Boolean = false, + onClick: () -> Unit + ): RichTextBuilder { + val start = spannableBuilder.length + spannableBuilder.append(text) + val end = spannableBuilder.length + + val clickableSpan = object : ClickableSpan() { + override fun onClick(widget: View) { + onClick.invoke() + } + + override fun updateDrawState(ds: TextPaint) { + super.updateDrawState(ds) + ds.color = linkColor + ds.isUnderlineText = isUnderline + } + } + + spannableBuilder.setSpan( + clickableSpan, + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + + return this + } + + /** + * 添加换行 + */ + fun addLineBreak(): RichTextBuilder { + spannableBuilder.append("\n") + return this + } + + /** + * 添加自定义样式的文本 + */ + fun addStyledText(text: String, vararg spans: Any): RichTextBuilder { + val start = spannableBuilder.length + spannableBuilder.append(text) + val end = spannableBuilder.length + + spans.forEach { span -> + spannableBuilder.setSpan( + span, + start, + end, + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE + ) + } + + return this + } + + /** + * 完成构建并应用到TextView + */ + fun build() { + text = spannableBuilder + } + } +} diff --git a/moduleUtil/src/main/res/drawable/bg_bttom_fff.xml b/moduleUtil/src/main/res/drawable/bg_bttom_fff.xml new file mode 100644 index 0000000..4786b09 --- /dev/null +++ b/moduleUtil/src/main/res/drawable/bg_bttom_fff.xml @@ -0,0 +1,8 @@ + + + + + \ No newline at end of file diff --git a/moduleUtil/src/main/res/layout/dialog_app_update.xml b/moduleUtil/src/main/res/layout/dialog_app_update.xml index 68da3a9..be4e23c 100644 --- a/moduleUtil/src/main/res/layout/dialog_app_update.xml +++ b/moduleUtil/src/main/res/layout/dialog_app_update.xml @@ -52,7 +52,7 @@ android:layout_height="@dimen/dp_150" app:layout_constraintTop_toTopOf="parent"> -