Compare commits

..

33 Commits

Author SHA1 Message Date
998cb3d193 <winboll>APK 15.20.0 release Publish. 2026-05-12 12:16:45 +08:00
9ba3374b16 基线版本号对齐 2026-05-12 12:11:17 +08:00
4ded8537e8 升级 WinBoLL 库依赖版本并完善应用主题配置
- 升级 WinBoLL 库依赖版本至 15.20.x 系列:
  - libaes: 15.15.10 → 15.20.2
  - libappbase: 15.15.23 → 15.20.9
- 完善 winboll 模块主题配置:
  - MyAppTheme 改用 Theme.AppCompat.Light.NoActionBar 解决 AppCompat 兼容问题
  - 添加完整的应用主题属性定义
  - 添加 MyDebugActivityTheme 调试主题
- 添加主窗口、工具栏、调试文字颜色定义
2026-05-12 12:05:28 +08:00
59e51da991 Merge remote-tracking branch 'origin/aes' into winboll 2026-05-12 11:42:13 +08:00
070e2fb4f0 Merge remote-tracking branch 'origin/appbase' into winboll 2026-05-12 11:42:07 +08:00
632ecc51d8 重构ASupportToolbar自定义控件,支持AES主题切换
- 优化ASupportToolbar控件的绘图流程
- 移除atoolbar_frame.xml依赖,改用Java代码内部绘图
- 添加notifyColorChange()方法绘制三层渐变背景
- 在onAttachedToWindow()时自动调用refreshFromTheme()刷新背景
- 主题切换时通过DrawerFragmentActivity调用refreshFromTheme()
- 添加attrs.xml属性:android:background用于自定义style
- 添加详细调试日志追踪整个绘制流程
- TestASupportToolbarActivity添加日志便于测试验证

修改文件:
- libaes/src/main/java/.../views/ASupportToolbar.java:重构绘图逻辑,添加调试日志
- libaes/src/main/java/.../activitys/DrawerFragmentActivity.java:主题切换时刷新Toolbar
- libaes/src/main/java/.../unittests/TestASupportToolbarActivity.java:添加调试日志
- libaes/src/main/res/values/attrs.xml:添加android:background属性
- aes/build.properties:版本号更新
- libaes/build.properties:版本号更新
2026-05-12 10:53:18 +08:00
58b2cace16 重构AES主题配置,继承APPBaseTheme属性支持
- AESTheme改为继承Theme.AppCompat并支持APPBaseTheme属性
- 修复运行时inflate错误:将?attr/xxx引用改为@color/xxx直接引用
- 添加DebugActivityTheme调试样式支持
- 添加必需的颜色定义(toolbarBackgroundColor、mainWindowBackgroundColor等)
- 新增夜间模式主题配置(values-night目录)
- 清理冗余注释和无用的调试配色方案
- aes模块的MyAESTheme添加themeDebug属性

修改文件:
- aes/src/main/res/values/styles.xml:添加MyDebugActivityTheme
- aes/src/main/res/values-night/:新增夜间模式样式
- libaes/src/main/res/values/colors.xml:添加主题必需颜色
- libaes/src/main/res/values/styles.xml:重构使用AppCompat主题
- libaes/src/main/res/values-night/:新增夜间模式颜色和样式
2026-05-12 09:52:57 +08:00
3648fa3361 更新基础类库版本 2026-05-12 09:26:33 +08:00
122122ef80 Merge remote-tracking branch 'origin/appbase' into aes 2026-05-12 09:22:37 +08:00
4caeb83e5e <libappbase>Library Release 15.20.9 2026-05-12 09:17:18 +08:00
f36ee0d9b1 <appbase>APK 15.20.9 release Publish. 2026-05-12 09:16:45 +08:00
fe0b2f97ea 重构日志窗口UI主题颜色系统,统一使用toolbarTextColor和toolbarBackgroundColor
【主要变更】

1. 新增主题颜色属性
   - 新增 toolbarTextColor 属性定义(普通模式:黑色, 深色模式:#E0E0E0)
   - 新增 toolbarBackgroundColor 属性定义(普通模式:绿色, 深色模式:深蓝色)

2. 移除废弃颜色属性
   - 移除 buttonTextColor 属性定义
   - 移除 buttonBackgroundColor 属性定义

3. 更新布局文件(普通模式+深色模式)
   - view_log.xml: TextView(LV:)、CheckBox(Selectable/ALL) 使用 toolbarTextColor
   - view_log.xml: Button(Clean/Copy) 使用 toolbarBackgroundColor
   - item_logtag.xml: CheckBox 使用 toolbarTextColor
   - activity_main.xml: 所有Button使用 toolbarBackgroundColor
   - activity_crash_test.xml: 所有Button使用 toolbarBackgroundColor
   - activity_nfc_rsa_operate.xml: Button使用 toolbarBackgroundColor
   - dialog_winboll_host.xml: Button使用 toolbarBackgroundColor

4. 更新Java代码
   - LogView.java: CheckBox和TextView使用主题属性获取 toolbarTextColor
   - LogTagSpinner.java: 下拉框文本颜色使用 toolbarTextColor

5. 更新样式定义
   - styles.xml: 主题属性引用新的 toolbarTextColor/toolbarBackgroundColor
   - attrs.xml: 移除废弃属性,保留 toolbarTextColor/toolbarBackgroundColor
   - colors.xml: 添加新的颜色定义

【适配说明】
- 统一普通模式和深色模式的颜色管理
- 确保日志窗口所有控件颜色与主窗口保持一致
2026-05-12 09:13:16 +08:00
43da2bc03a 统一日志窗口Clean/Copy按钮样式与主窗口保持一致 2026-05-12 00:33:14 +08:00
d26ef7bf7f Merge remote-tracking branch 'origin/appbase' into aes 2026-05-11 21:18:47 +08:00
6baca2779d 同步build.gradle至origin/winboll分支最新配置 2026-05-11 21:13:50 +08:00
83da84371c Merge remote-tracking branch 'origin/aes' into winboll 2026-05-11 20:59:23 +08:00
f0fbdaf121 <libaes>Library Release 15.20.2 2026-05-11 20:41:44 +08:00
a20f29728e <aes>APK 15.20.2 release Publish. 2026-05-11 20:41:30 +08:00
9669fe2a8d 更新应用基础类库,改进应用调试接口。 2026-05-11 20:38:17 +08:00
ff8cb2fb42 <libappbase>Library Release 15.20.8 2026-05-11 20:30:07 +08:00
e42219ac5a <appbase>APK 15.20.8 release Publish. 2026-05-11 20:29:55 +08:00
42112eb677 LibAppBase: 添加崩溃通知分享日志功能
- 在崩溃通知中添加"分享日志"按钮,点击可分享崩溃日志
- 新增 ShareLogActivity 窗口类处理分享逻辑
- 崩溃日志先保存到缓存文件,再读取分享
- 移除广播接收器方案,简化实现
- 更新 AndroidManifest 注册新 Activity

修改文件:
- libappbase/src/main/AndroidManifest.xml
- libappbase/src/main/java/.../utils/CrashHandleNotifyUtils.java
- libappbase/src/main/java/.../utils/ShareLogActivity.java (新增)

影响范围: 崩溃通知功能
2026-05-11 20:27:40 +08:00
f3114a8121 <libappbase>Library Release 15.20.7 2026-05-11 19:10:54 +08:00
ed5ab24bd3 <libaes>Library Release 15.20.1 2026-05-11 17:17:23 +08:00
b5c989b5f9 <aes>APK 15.20.1 release Publish. 2026-05-11 17:17:05 +08:00
725b336501 更新基础类库版本,提高应用调试能力。 2026-05-11 17:14:00 +08:00
57e4f8770b <libaes>Library Release 15.20.0 2026-05-11 15:02:44 +08:00
3b313e2362 <aes>APK 15.20.0 release Publish. 2026-05-11 15:02:27 +08:00
1e96cd02bc 对齐基础类库基准型号版本。 2026-05-11 14:58:21 +08:00
8f869e19cc 更新基础类库 2026-05-10 05:12:19 +08:00
270e21ed23 <libaes>Library Release 15.15.10 2026-05-10 05:04:34 +08:00
6412554096 <aes>APK 15.15.10 release Publish. 2026-05-10 05:04:15 +08:00
286f8513d4 refactor: 升级编译配置并调整最低API版本
- 升级 Gradle 编译版本为 Java 11
  根目录 build.gradle 中 JavaCompile 配置从 VERSION_1_7 改为 VERSION_11

- 调整 minSdkVersion 从 21 升级至 26
  适配 Android 8.0 (API 26) 及以上系统
  修改范围: aes/build.gradle, libaes/build.gradle

- 移除未使用的 XXPermissions 依赖
  该库使用 Java 8 字节码与 minSdkVersion 21 不兼容,项目中未引用此库
2026-05-10 04:48:29 +08:00
47 changed files with 789 additions and 442 deletions

View File

@@ -24,13 +24,13 @@ android {
defaultConfig { defaultConfig {
applicationId "cc.winboll.studio.aes" applicationId "cc.winboll.studio.aes"
minSdkVersion 21 minSdkVersion 26
targetSdkVersion 30 targetSdkVersion 30
versionCode 1 versionCode 1
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0 // 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.15" versionName "15.20"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Apr 25 04:16:42 HKT 2026 #Tue May 12 10:47:54 CST 2026
stageCount=10 stageCount=3
libraryProject=libaes libraryProject=libaes
baseVersion=15.15 baseVersion=15.20
publishVersion=15.15.9 publishVersion=15.20.2
buildCount=0 buildCount=14
baseBetaVersion=15.15.10 baseBetaVersion=15.20.3

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyAESTheme" parent="AESTheme">
<item name="themeDebug">@style/MyDebugActivityTheme</item>
</style>
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">@color/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">@color/debugTextColor</item>
<item name="colorTextBackgound">@color/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style>
</resources>

View File

@@ -1,5 +1,16 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="MyAESTheme" parent="AESTheme"> <style name="MyAESTheme" parent="AESTheme">
<item name="themeDebug">@style/MyDebugActivityTheme</item>
</style> </style>
</resources>
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">@color/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">@color/debugTextColor</item>
<item name="colorTextBackgound">@color/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style>
</resources>

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Mon May 11 19:10:34 HKT 2026 #Tue May 12 09:17:15 HKT 2026
stageCount=8 stageCount=10
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.20 baseVersion=15.20
publishVersion=15.20.7 publishVersion=15.20.9
buildCount=0 buildCount=0
baseBetaVersion=15.20.8 baseBetaVersion=15.20.10

View File

@@ -31,7 +31,7 @@
android:text="关于应用" android:text="关于应用"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onAboutActivity" android:onClick="onAboutActivity"
@@ -43,7 +43,7 @@
android:text="应用崩溃测试" android:text="应用崩溃测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onCrashTest" android:onClick="onCrashTest"
@@ -55,7 +55,7 @@
android:text="应用日志测试" android:text="应用日志测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onLogTest" android:onClick="onLogTest"
@@ -67,7 +67,7 @@
android:text="应用日志测试(新窗口)" android:text="应用日志测试(新窗口)"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onLogTestNewTask" android:onClick="onLogTestNewTask"
@@ -79,7 +79,7 @@
android:text="应用吐司测试" android:text="应用吐司测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onToastUtilsTest" android:onClick="onToastUtilsTest"
@@ -93,7 +93,7 @@
android:text="多开窗口" android:text="多开窗口"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onMultiInstance" android:onClick="onMultiInstance"

View File

@@ -35,7 +35,7 @@
android:text="返回" android:text="返回"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onBack" android:onClick="onBack"
@@ -47,7 +47,7 @@
android:text="测试崩溃" android:text="测试崩溃"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onTestCrash" android:onClick="onTestCrash"

View File

@@ -31,7 +31,7 @@
android:text="关于应用" android:text="关于应用"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onAboutActivity" android:onClick="onAboutActivity"
@@ -43,7 +43,7 @@
android:text="应用崩溃测试" android:text="应用崩溃测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onCrashTest" android:onClick="onCrashTest"
@@ -55,7 +55,7 @@
android:text="应用日志测试" android:text="应用日志测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onLogTest" android:onClick="onLogTest"
@@ -67,7 +67,7 @@
android:text="应用日志测试(新窗口)" android:text="应用日志测试(新窗口)"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onLogTestNewTask" android:onClick="onLogTestNewTask"
@@ -79,7 +79,7 @@
android:text="应用吐司测试" android:text="应用吐司测试"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onToastUtilsTest" android:onClick="onToastUtilsTest"
@@ -93,7 +93,7 @@
android:text="多开窗口" android:text="多开窗口"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/activityTextColor" android:textColor="?attr/activityTextColor"
android:background="?attr/buttonBackgroundColor" android:background="?attr/toolbarBackgroundColor"
android:paddingVertical="12dp" android:paddingVertical="12dp"
android:layout_marginHorizontal="24dp" android:layout_marginHorizontal="24dp"
android:onClick="onMultiInstance" android:onClick="onMultiInstance"

View File

@@ -6,8 +6,9 @@
<style name="MyDebugActivityTheme" parent="DebugActivityTheme"> <style name="MyDebugActivityTheme" parent="DebugActivityTheme">
<item name="colorTittle">?attr/mainWindowDarkTextColor</item> <item name="colorTittle">?attr/mainWindowDarkTextColor</item>
<item name="colorTittleBackgound">@color/buttonBackgroundColor</item> <item name="colorTittleBackgound">?attr/toolbarBackgroundColor</item>
<item name="colorText">?attr/debugTextColor</item> <item name="colorText">?attr/debugTextColor</item>
<item name="colorTextBackgound">?attr/mainWindowDarkBackgroundColor</item> <item name="colorTextBackgound">?attr/mainWindowDarkBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style> </style>
</resources> </resources>

View File

@@ -6,8 +6,9 @@
<style name="MyDebugActivityTheme" parent="DebugActivityTheme"> <style name="MyDebugActivityTheme" parent="DebugActivityTheme">
<item name="colorTittle">?attr/mainWindowTextColor</item> <item name="colorTittle">?attr/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/buttonBackgroundColor</item> <item name="colorTittleBackgound">?attr/toolbarBackgroundColor</item>
<item name="colorText">?attr/debugTextColor</item> <item name="colorText">?attr/debugTextColor</item>
<item name="colorTextBackgound">?attr/mainWindowBackgroundColor</item> <item name="colorTextBackgound">?attr/mainWindowBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style> </style>
</resources> </resources>

View File

@@ -93,11 +93,12 @@ allprojects {
} }
subprojects { subprojects {
// 1. 对纯 Java 模块的 JavaCompile 任务配置(强制Java 7 // 1. 对纯 Java 模块的 JavaCompile 任务配置(升级为 Java 11
tasks.withType(JavaCompile) { tasks.withType(JavaCompile) {
options.compilerArgs << "-parameters" options.compilerArgs << "-parameters"
sourceCompatibility = JavaVersion.VERSION_1_7 sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_1_7 targetCompatibility = JavaVersion.VERSION_11
// 可选:确保编码一致
options.encoding = "UTF-8" options.encoding = "UTF-8"
} }
} }

View File

@@ -9,7 +9,7 @@ android {
buildToolsVersion "30.0.3" buildToolsVersion "30.0.3"
defaultConfig { defaultConfig {
minSdkVersion 21 minSdkVersion 26
targetSdkVersion 30 targetSdkVersion 30
} }
@@ -27,8 +27,6 @@ android {
} }
dependencies { dependencies {
// 权限请求框架https://github.com/getActivity/XXPermissions
api 'com.github.getActivity:XXPermissions:18.63'
// 下拉控件 // 下拉控件
api 'com.baoyz.pullrefreshlayout:library:1.2.0' api 'com.baoyz.pullrefreshlayout:library:1.2.0'
// 拼音搜索 // 拼音搜索
@@ -63,7 +61,7 @@ dependencies {
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' //annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
// WinBoLL库 nexus.winboll.cc 地址 // WinBoLL库 nexus.winboll.cc 地址
api 'cc.winboll.studio:libappbase:15.15.19' api 'cc.winboll.studio:libappbase:15.20.9'
// 备用库 jitpack.io 地址 // 备用库 jitpack.io 地址
//api 'com.github.ZhanGSKen:APPBase:appbase-v15.15.3' //api 'com.github.ZhanGSKen:APPBase:appbase-v15.15.3'

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat Apr 25 04:16:30 HKT 2026 #Tue May 12 10:47:54 CST 2026
stageCount=10 stageCount=3
libraryProject=libaes libraryProject=libaes
baseVersion=15.15 baseVersion=15.20
publishVersion=15.15.9 publishVersion=15.20.2
buildCount=0 buildCount=14
baseBetaVersion=15.15.10 baseBetaVersion=15.20.3

View File

@@ -31,6 +31,7 @@ import cc.winboll.studio.libaes.utils.DevelopUtils;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libaes.views.ADrawerMenuListView; import cc.winboll.studio.libaes.views.ADrawerMenuListView;
import cc.winboll.studio.libaes.views.ADsBannerView; import cc.winboll.studio.libaes.views.ADsBannerView;
import cc.winboll.studio.libaes.views.ASupportToolbar;
import cc.winboll.studio.libappbase.GlobalApplication; import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import com.baoyz.widget.PullRefreshLayout; import com.baoyz.widget.PullRefreshLayout;
@@ -174,6 +175,9 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
if (AESThemeUtil.onAppThemeItemSelected(this, item)) { if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
if (mToolbar instanceof ASupportToolbar) {
((ASupportToolbar) mToolbar).refreshFromTheme();
}
recreate(); recreate();
} if (DevelopUtils.onDevelopItemSelected(this, item)) { } if (DevelopUtils.onDevelopItemSelected(this, item)) {
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId())); LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));

View File

@@ -12,6 +12,8 @@ import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libaes.R; import cc.winboll.studio.libaes.R;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.utils.AESThemeUtil; import cc.winboll.studio.libaes.utils.AESThemeUtil;
import cc.winboll.studio.libaes.views.ASupportToolbar;
import cc.winboll.studio.libappbase.LogUtils;
public class TestASupportToolbarActivity extends AppCompatActivity implements IWinBoLLActivity { public class TestASupportToolbarActivity extends AppCompatActivity implements IWinBoLLActivity {
@@ -29,14 +31,17 @@ public class TestASupportToolbarActivity extends AppCompatActivity implements IW
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
LogUtils.d(TAG, "onCreate() start");
AESThemeUtil.applyAppTheme(this); AESThemeUtil.applyAppTheme(this);
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_testasupporttoolbar); setContentView(R.layout.activity_testasupporttoolbar);
LogUtils.d(TAG, "setContentView() done");
Toolbar toolbar = findViewById(R.id.activitytestasupporttoolbarASupportToolbar1); Toolbar toolbar = findViewById(R.id.activitytestasupporttoolbarASupportToolbar1);
LogUtils.d(TAG, "findViewById() done, toolbar=" + toolbar.getClass().getSimpleName());
setSupportActionBar(toolbar); setSupportActionBar(toolbar);
LogUtils.d(TAG, "setSupportActionBar() done");
getSupportActionBar().setTitle(TAG); getSupportActionBar().setTitle(TAG);
LogUtils.d(TAG, "setTitle() done");
LogUtils.d(TAG, "onCreate() end");
} }
} }

View File

@@ -7,15 +7,12 @@ package cc.winboll.studio.libaes.views;
*/ */
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable; import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
import android.util.AttributeSet; import android.util.AttributeSet;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libaes.R; import cc.winboll.studio.libaes.R;
import android.graphics.drawable.Drawable; import cc.winboll.studio.libappbase.LogUtils;
import androidx.core.content.ContextCompat;
import android.graphics.PorterDuff;
public class ASupportToolbar extends Toolbar { public class ASupportToolbar extends Toolbar {
@@ -25,65 +22,120 @@ public class ASupportToolbar extends Toolbar {
int mStartColor; int mStartColor;
int mCenterColor; int mCenterColor;
int mEndColor; int mEndColor;
LayerDrawable ld;
GradientDrawable[] array = new GradientDrawable[3]; GradientDrawable[] array = new GradientDrawable[3];
//private GradientDrawable gradientDrawable; LayerDrawable ld;
public ASupportToolbar(Context context) { public ASupportToolbar(Context context) {
super(context); super(context);
LogUtils.d(TAG, "ASupportToolbar() constructor");
} }
public ASupportToolbar(Context context, AttributeSet attrs) { public ASupportToolbar(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ASupportToolbar, R.attr.aSupportToolbar, 0); LogUtils.d(TAG, "ASupportToolbar() attrs constructor");
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, Color.GREEN); initStyledAttributes(attrs, R.attr.aSupportToolbar);
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, Color.BLUE);
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, Color.RED);
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, Color.YELLOW);
// 返回一个绑定资源结束的信号给资源
a.recycle();
notifyColorChange();
} }
public ASupportToolbar(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
LogUtils.d(TAG, "ASupportToolbar() attrs defStyleAttr constructor");
initStyledAttributes(attrs, defStyleAttr);
}
void initStyledAttributes(AttributeSet attrs, int defStyleAttr) {
LogUtils.d(TAG, "initStyledAttributes() start");
TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ASupportToolbar, defStyleAttr, 0);
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, 0xFF00FF00);
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, 0xFF03AB4E);
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, 0xFF03AB4E);
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, 0xFF3DDC84);
LogUtils.d(TAG, String.format("initStyledAttributes() colors: title=0x%x, start=0x%x, center=0x%x, end=0x%x", mTitleTextColor, mStartColor, mCenterColor, mEndColor));
a.recycle();
setTitleTextColor(mTitleTextColor);
LogUtils.d(TAG, "initStyledAttributes() end");
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
LogUtils.d(TAG, "onAttachedToWindow() start");
refreshFromTheme();
LogUtils.d(TAG, "onAttachedToWindow() end");
}
public void refreshFromTheme() {
LogUtils.d(TAG, "refreshFromTheme() start");
TypedArray a = getContext().obtainStyledAttributes(R.styleable.ASupportToolbar);
try {
mTitleTextColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarTitleTextColor, 0xFF00FF00);
mStartColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarStartColor, 0xFF03AB4E);
mCenterColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarCenterColor, 0xFF03AB4E);
mEndColor = a.getColor(R.styleable.ASupportToolbar_attrASupportToolbarEndColor, 0xFF3DDC84);
LogUtils.d(TAG, String.format("refreshFromTheme() colors: title=0x%x, start=0x%x, center=0x%x, end=0x%x", mTitleTextColor, mStartColor, mCenterColor, mEndColor));
} finally {
a.recycle();
}
postNotifyColorChange();
LogUtils.d(TAG, "refreshFromTheme() end");
}
void postNotifyColorChange() {
LogUtils.d(TAG, "postNotifyColorChange()");
removeCallbacks(mRefreshRunnable);
post(mRefreshRunnable);
}
Runnable mRefreshRunnable = new Runnable() {
@Override
public void run() {
LogUtils.d(TAG, "mRefreshRunnable.run() start");
notifyColorChange();
LogUtils.d(TAG, "mRefreshRunnable.run() end");
}
};
void notifyColorChange() { void notifyColorChange() {
// 工具栏描边 LogUtils.d(TAG, "notifyColorChange() start");
LogUtils.d(TAG, String.format("notifyColorChange() size: width=%d, height=%d", getWidth(), getHeight()));
int nWidth = getWidth();
int nHeight = getHeight();
if (nWidth == 0 || nHeight == 0) {
LogUtils.d(TAG, "notifyColorChange() skipped: width or height is 0");
return;
}
int nStroke = 5; int nStroke = 5;
//分别为开始颜色,中间夜色,结束颜色 int colors0[] = { mEndColor , mCenterColor, mStartColor };
int colors0[] = { mEndColor , mCenterColor, mStartColor};
GradientDrawable gradientDrawable0;
array[2] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors0); array[2] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors0);
gradientDrawable0 = array[2]; array[2].setShape(GradientDrawable.RECTANGLE);
gradientDrawable0.setShape(GradientDrawable.RECTANGLE); array[2].setColors(colors0);
gradientDrawable0.setColors(colors0); //添加颜色组 array[2].setGradientType(GradientDrawable.LINEAR_GRADIENT);
gradientDrawable0.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变 array[2].setCornerRadius(20);
gradientDrawable0.setCornerRadius(20);
int colors1[] = { mCenterColor , mCenterColor, mCenterColor }; int colors1[] = { mCenterColor, mCenterColor, mCenterColor };
GradientDrawable gradientDrawable1;
array[1] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors1); array[1] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors1);
gradientDrawable1 = array[1]; array[1].setShape(GradientDrawable.RECTANGLE);
gradientDrawable1.setShape(GradientDrawable.RECTANGLE); array[1].setColors(colors1);
gradientDrawable1.setColors(colors1); //添加颜色组 array[1].setGradientType(GradientDrawable.LINEAR_GRADIENT);
gradientDrawable1.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变 array[1].setCornerRadius(20);
gradientDrawable1.setCornerRadius(20);
int colors2[] = { mEndColor, mCenterColor, mStartColor }; int colors2[] = { mEndColor, mCenterColor, mStartColor };
GradientDrawable gradientDrawable2;
array[0] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors2); array[0] = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors2);
gradientDrawable2 = array[0]; array[0].setShape(GradientDrawable.RECTANGLE);
gradientDrawable2.setShape(GradientDrawable.RECTANGLE); array[0].setColors(colors2);
gradientDrawable2.setColors(colors2); //添加颜色组 array[0].setGradientType(GradientDrawable.LINEAR_GRADIENT);
gradientDrawable2.setGradientType(GradientDrawable.LINEAR_GRADIENT);//设置线性渐变 array[0].setCornerRadius(20);
gradientDrawable2.setCornerRadius(20);
ld = new LayerDrawable(array); //参数为上面的Drawable数组 ld = new LayerDrawable(array);
ld.setLayerInset(2, nStroke * 2, nStroke * 2, getWidth() + nStroke * 2, getHeight() + nStroke * 2); ld.setLayerInset(2, nStroke * 2, nStroke * 2, nWidth + nStroke * 2, nHeight + nStroke * 2);
ld.setLayerInset(1, nStroke, nStroke, getWidth() + nStroke, getHeight() + nStroke); ld.setLayerInset(1, nStroke, nStroke, nWidth + nStroke, nHeight + nStroke);
ld.setLayerInset(0, 0, 0, getWidth(), getHeight()); ld.setLayerInset(0, 0, 0, nWidth, nHeight);
setBackgroundDrawable(ld); setBackgroundDrawable(ld);
setTitleTextColor(mTitleTextColor); setTitleTextColor(mTitleTextColor);
setSubtitleTextColor(mTitleTextColor); setSubtitleTextColor(mTitleTextColor);
LogUtils.d(TAG, "notifyColorChange() end");
} }
} }

View File

@@ -0,0 +1,33 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="colorTextColor">#FFFFFFFF</color>
<color name="colorPrimary">#FF03AB4E</color>
<color name="colorPrimaryDark">#FF027C39</color>
<color name="colorAccent">#FF3DDC84</color>
<color name="colorText">#FFFFFB8D</color>
<color name="colorToastFrame">#FFA9A9A9</color>
<color name="colorToastShadow">#FF000000</color>
<color name="colorToastBackgroung">#FFFFFFFF</color>
<color name="colorAToolbarStartColor">#FF7D3F12</color>
<color name="colorAToolbarCenterColor">#FFCC6E2B</color>
<color name="colorAToolbarEndColor">#FFF4B98F</color>
<color name="colorACardShadow">@color/colorPrimaryDark</color>
<color name="colorACardFrame">@color/colorPrimary</color>
<color name="colorACardBackgroung">@color/colorAccent</color>
<color name="colorATickProgressBarBackgroung">@color/colorAccent</color>
<color name="colorATickProgressBarProgress">@color/colorPrimary</color>
<color name="colorOHPCTSBackground">@color/colorAccent</color>
<color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color>
<color name="colorOHPCTSProgress">@color/colorPrimaryDark</color>
<color name="toolbarBackgroundColor">#FF03AB4E</color>
<color name="toolbarTextColor">#FFFFFFFF</color>
<color name="mainWindowBackgroundColor">#FF2C2C2C</color>
<color name="mainWindowTextColor">#FFFFFFFF</color>
<color name="debugTextColor">#FFFF0000</color>
</resources>

View File

@@ -0,0 +1,112 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AESTheme" parent="Theme.AppCompat.NoActionBar">
<item name="themeDebug">@style/DebugActivityTheme</item>
<item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="aboutViewTextColor">@color/mainWindowTextColor</item>
<item name="aboutViewTitleColor">@color/mainWindowTextColor</item>
<item name="aboutViewDividerColor">@color/mainWindowTextColor</item>
<item name="dialogBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="dialogTextColor">@color/mainWindowTextColor</item>
<item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="textViewTextColor">@color/mainWindowTextColor</item>
<item name="editTextBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="editTextTextColor">@color/mainWindowTextColor</item>
<item name="scrollViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowDarkBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowDarkTextColor">@color/mainWindowTextColor</item>
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="aToolbar">@style/AESAToolbar</item>
<item name="aSupportToolbar">@style/AESASupportToolbar</item>
</style>
<style name="DebugActivityTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">@color/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">@color/debugTextColor</item>
<item name="colorTextBackgound">@color/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style>
<style name="AESAToolbar">
<item name="attrAToolbarTitleTextColor">@color/colorTextColor</item>
<item name="attrAToolbarStartColor">@color/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">@color/colorPrimary</item>
<item name="attrAToolbarEndColor">@color/colorAccent</item>
</style>
<style name="AESASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">@color/colorTextColor</item>
<item name="attrASupportToolbarStartColor">@color/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">@color/colorPrimary</item>
<item name="attrASupportToolbarEndColor">@color/colorAccent</item>
</style>
<style name="DepthAESTheme" parent="AESTheme">
<item name="colorPrimary">#FF0065EC</item>
<item name="colorPrimaryDark">#FF004DB4</item>
<item name="colorAccent">#FF4A97FF</item>
</style>
<style name="SkyAESTheme" parent="AESTheme">
<item name="colorPrimary">#FF00A6FF</item>
<item name="colorPrimaryDark">#FF007ABB</item>
<item name="colorAccent">#FF84D4FF</item>
</style>
<style name="GoldenAESTheme" parent="AESTheme">
<item name="colorPrimary">#FFF0CA11</item>
<item name="colorPrimaryDark">#FFD3AF00</item>
<item name="colorAccent">#FFFFE35C</item>
</style>
<style name="BearingAESTheme" parent="AESTheme">
<item name="colorPrimary">#FF840FFF</item>
<item name="colorPrimaryDark">#FF6900D7</item>
<item name="colorAccent">#FFBA78FF</item>
</style>
<style name="MemorAESTheme" parent="AESTheme">
<item name="colorPrimary">#FFFF00F5</item>
<item name="colorPrimaryDark">#FFE500DC</item>
<item name="colorAccent">#FFFF76FA</item>
</style>
<style name="TaoAESTheme" parent="AESTheme">
<item name="colorPrimary">#FFACACAC</item>
<item name="colorPrimaryDark">#FF898989</item>
<item name="colorAccent">#FFD8D8D8</item>
</style>
<style name="NormalDialogStyle" parent="Theme.AppCompat.Dialog">
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowFrame">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">true</item>
<item name="android:windowIsTranslucent">false</item>
<item name="android:windowContentOverlay">@null</item>
<item name="android:windowAnimationStyle">@style/cornerDialogAnim</item>
<item name="android:backgroundDimEnabled">true</item>
</style>
<style name="centerDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_center</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit_center</item>
</style>
<style name="cornerDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_corner</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit_corner</item>
</style>
</resources>

View File

@@ -43,6 +43,7 @@
<attr name="attrASupportToolbarStartColor"/> <attr name="attrASupportToolbarStartColor"/>
<attr name="attrASupportToolbarCenterColor"/> <attr name="attrASupportToolbarCenterColor"/>
<attr name="attrASupportToolbarEndColor"/> <attr name="attrASupportToolbarEndColor"/>
<attr name="android:background"/>
</declare-styleable> </declare-styleable>
<declare-styleable name="AButton"> <declare-styleable name="AButton">

View File

@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<!-- 默认方案 --> <color name="colorTextColor">#FF000000</color>
<color name="colorPrimary">#FF03AB4E</color> <color name="colorPrimary">#FF03AB4E</color>
<color name="colorPrimaryDark">#FF027C39</color> <color name="colorPrimaryDark">#FF027C39</color>
<color name="colorAccent">#FF3DDC84</color> <color name="colorAccent">#FF3DDC84</color>
<color name="colorText">#FFFFFB8D</color> <color name="colorText">#FFFFFB8D</color>
<color name="colorToastFrame">#FFA9A9A9</color> <color name="colorToastFrame">#FFA9A9A9</color>
<color name="colorToastShadow">#FF000000</color> <color name="colorToastShadow">#FF000000</color>
<color name="colorToastBackgroung">#FFFFFFFF</color> <color name="colorToastBackgroung">#FFFFFFFF</color>
@@ -24,22 +24,10 @@
<color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color> <color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color>
<color name="colorOHPCTSProgress">@color/colorPrimaryDark</color> <color name="colorOHPCTSProgress">@color/colorPrimaryDark</color>
<!-- --> <color name="toolbarBackgroundColor">#FF03AB4E</color>
<color name="toolbarTextColor">#FFFFFFFF</color>
<color name="mainWindowBackgroundColor">#FFFFFFFF</color>
<color name="mainWindowTextColor">#FF000000</color>
<color name="debugTextColor">#FFFF0000</color>
<!-- 调试方案 </resources>
<color name="colorPrimary">#FF727272</color>
<color name="colorPrimaryDark">#FF444444</color>
<color name="colorAccent">#FF9EA19F</color>
<color name="colorAToolbarStartColor">#FF4776EB</color>
<color name="colorAToolbarCenterColor">#FF0D4BE7</color>
<color name="colorAToolbarEndColor">#FF8FA7E3</color>
<color name="colorACardShadow">#FF22A200</color>
<color name="colorACardFrame">#FF3FCC19</color>
<color name="colorACardBackgroung">#FF88F16B</color>
<color name="colorATickProgressBarBackgroung">#FF6DC4E2</color>
<color name="colorATickProgressBarProgress">#FF22B0E1</color>
-->
</resources>

View File

@@ -1,255 +1,112 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<resources> <resources>
<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar"> <style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item> <item name="themeDebug">@style/DebugActivityTheme</item>
<item name="colorPrimary">#FF18B05C</item> <item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="colorPrimaryDark">#FF008C3F</item> <item name="aboutViewTextColor">@color/mainWindowTextColor</item>
<item name="colorAccent">#FF24DC77</item> <item name="aboutViewTitleColor">@color/mainWindowTextColor</item>
<item name="android:textColor">#FF000000</item> <item name="aboutViewDividerColor">@color/mainWindowTextColor</item>
<item name="dialogBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="dialogTextColor">@color/mainWindowTextColor</item>
<item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="textViewTextColor">@color/mainWindowTextColor</item>
<item name="editTextBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="editTextTextColor">@color/mainWindowTextColor</item>
<item name="scrollViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowDarkBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowDarkTextColor">@color/mainWindowTextColor</item>
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="aToolbar">@style/AESAToolbar</item> <item name="aToolbar">@style/AESAToolbar</item>
<item name="aSupportToolbar">@style/AESASupportToolbar</item> <item name="aSupportToolbar">@style/AESASupportToolbar</item>
</style> </style>
<style name="DebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">@color/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">@color/debugTextColor</item>
<item name="colorTextBackgound">@color/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style>
<style name="AESAToolbar"> <style name="AESAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item> <item name="attrAToolbarTitleTextColor">@color/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item> <item name="attrAToolbarStartColor">@color/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item> <item name="attrAToolbarCenterColor">@color/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item> <item name="attrAToolbarEndColor">@color/colorAccent</item>
</style> </style>
<style name="AESASupportToolbar"> <style name="AESASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item> <item name="attrASupportToolbarTitleTextColor">@color/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item> <item name="attrASupportToolbarStartColor">@color/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item> <item name="attrASupportToolbarCenterColor">@color/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item> <item name="attrASupportToolbarEndColor">@color/colorAccent</item>
</style> </style>
<style name="DepthAESTheme" parent="AESTheme"> <style name="DepthAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF0065EC</item> <item name="colorPrimary">#FF0065EC</item>
<item name="colorPrimaryDark">#FF004DB4</item> <item name="colorPrimaryDark">#FF004DB4</item>
<item name="colorAccent">#FF4A97FF</item> <item name="colorAccent">#FF4A97FF</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<style name="SkyAESTheme" parent="AESTheme"> <style name="SkyAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF00A6FF</item> <item name="colorPrimary">#FF00A6FF</item>
<item name="colorPrimaryDark">#FF007ABB</item> <item name="colorPrimaryDark">#FF007ABB</item>
<item name="colorAccent">#FF84D4FF</item> <item name="colorAccent">#FF84D4FF</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<style name="GoldenAESTheme" parent="AESTheme"> <style name="GoldenAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FFF0CA11</item> <item name="colorPrimary">#FFF0CA11</item>
<item name="colorPrimaryDark">#FFD3AF00</item> <item name="colorPrimaryDark">#FFD3AF00</item>
<item name="colorAccent">#FFFFE35C</item> <item name="colorAccent">#FFFFE35C</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<style name="BearingAESTheme" parent="AESTheme"> <style name="BearingAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF840FFF</item> <item name="colorPrimary">#FF840FFF</item>
<item name="colorPrimaryDark">#FF6900D7</item> <item name="colorPrimaryDark">#FF6900D7</item>
<item name="colorAccent">#FFBA78FF</item> <item name="colorAccent">#FFBA78FF</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<style name="MemorAESTheme" parent="AESTheme"> <style name="MemorAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FFFF00F5</item> <item name="colorPrimary">#FFFF00F5</item>
<item name="colorPrimaryDark">#FFE500DC</item> <item name="colorPrimaryDark">#FFE500DC</item>
<item name="colorAccent">#FFFF76FA</item> <item name="colorAccent">#FFFF76FA</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<style name="TaoAESTheme" parent="AESTheme"> <style name="TaoAESTheme" parent="AESTheme">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FFACACAC</item> <item name="colorPrimary">#FFACACAC</item>
<item name="colorPrimaryDark">#FF898989</item> <item name="colorPrimaryDark">#FF898989</item>
<item name="colorAccent">#FFD8D8D8</item> <item name="colorAccent">#FFD8D8D8</item>
<item name="android:textColor">#FF000000</item>
</style> </style>
<!--<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar"> <style name="NormalDialogStyle" parent="Theme.AppCompat.Light.Dialog">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/AESAToolbar</item>
<item name="aSupportToolbar">@style/AESASupportToolbar</item>
</style>
<style name="AESAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="AESASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>-->
<!--<style name="DepthAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF2566FE</item>
<item name="colorPrimaryDark">#FF1359FF</item>
<item name="colorAccent">#FF8BAEFF</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/DepthAToolbar</item>
<item name="aSupportToolbar">@style/DepthASupportToolbar</item>
</style>
<style name="DepthAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="DepthASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="SkyAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF1E98D4</item>
<item name="colorPrimaryDark">#FF046A9C</item>
<item name="colorAccent">#FF8CD9FF</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/SkyAToolbar</item>
<item name="aSupportToolbar">@style/SkyASupportToolbar</item>
</style>
<style name="SkyAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="SkyASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="GoldenAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FFFFE22A</item>
<item name="colorPrimaryDark">#FFAE9600</item>
<item name="colorAccent">#FFFFED78</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/GoldenAToolbar</item>
<item name="aSupportToolbar">@style/GoldenASupportToolbar</item>
</style>
<style name="GoldenAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="GoldenASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="MemorAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FFCE1ED4</item>
<item name="colorPrimaryDark">#FFB500BC</item>
<item name="colorAccent">#FFE653EB</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/MemorAToolbar</item>
<item name="aSupportToolbar">@style/MemorASupportToolbar</item>
</style>
<style name="MemorAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="MemorASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="TaoAESTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="colorTextColor">#FF000000</item>
<item name="colorPrimary">#FF9F9F9F</item>
<item name="colorPrimaryDark">#FF5E5E5E</item>
<item name="colorAccent">#FFD9D9D9</item>
<item name="android:textColor">#FF000000</item>
<item name="aToolbar">@style/TaoAToolbar</item>
<item name="aSupportToolbar">@style/TaoASupportToolbar</item>
</style>
<style name="TaoAToolbar">
<item name="attrAToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
</style>
<style name="TaoASupportToolbar">
<item name="attrASupportToolbarTitleTextColor">?attr/colorTextColor</item>
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
</style>-->
<!--<style name="AToolbar">
<item name="attrAToolbarTitleTextColor">#FF2DDA27</item>
<item name="attrAToolbarStartColor">#FF2DDA27</item>
<item name="attrAToolbarCenterColor">#FF2DDA27</item>
<item name="attrAToolbarEndColor">#FF2DDA27</item>
</style>-->
<!--对话框的样式-->
<style name="NormalDialogStyle">
<!--对话框背景 -->
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<!--边框 -->
<item name="android:windowFrame">@null</item> <item name="android:windowFrame">@null</item>
<!--没有标题 -->
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
<!-- 是否浮现在Activity之上 -->
<item name="android:windowIsFloating">true</item> <item name="android:windowIsFloating">true</item>
<!--背景透明 -->
<item name="android:windowIsTranslucent">false</item> <item name="android:windowIsTranslucent">false</item>
<!-- 是否有覆盖 -->
<item name="android:windowContentOverlay">@null</item> <item name="android:windowContentOverlay">@null</item>
<!--进出的显示动画 -->
<item name="android:windowAnimationStyle">@style/cornerDialogAnim</item> <item name="android:windowAnimationStyle">@style/cornerDialogAnim</item>
<!--背景变暗-->
<item name="android:backgroundDimEnabled">true</item> <item name="android:backgroundDimEnabled">true</item>
</style> </style>
<!--对话框动画,中间弹出-->
<style name="centerDialogAnim" parent="android:Animation"> <style name="centerDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_center</item> <item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_center</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit_center</item> <item name="@android:windowExitAnimation">@anim/normal_dialog_exit_center</item>
</style> </style>
<!--对话框动画,角落弹出-->
<style name="cornerDialogAnim" parent="android:Animation"> <style name="cornerDialogAnim" parent="android:Animation">
<item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_corner</item> <item name="@android:windowEnterAnimation">@anim/normal_dialog_enter_corner</item>
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit_corner</item> <item name="@android:windowExitAnimation">@anim/normal_dialog_exit_corner</item>
</style> </style>
</resources>
</resources>

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Mon May 11 19:10:34 HKT 2026 #Tue May 12 09:16:45 HKT 2026
stageCount=8 stageCount=10
libraryProject=libappbase libraryProject=libappbase
baseVersion=15.20 baseVersion=15.20
publishVersion=15.20.7 publishVersion=15.20.9
buildCount=0 buildCount=0
baseBetaVersion=15.20.8 baseBetaVersion=15.20.10

View File

@@ -47,6 +47,13 @@
<activity android:name="cc.winboll.studio.libappbase.activities.FTPBackupsActivity"/> <activity android:name="cc.winboll.studio.libappbase.activities.FTPBackupsActivity"/>
<activity
android:name=".utils.ShareLogActivity"
android:label="ShareLogActivity"
android:exported="true"
android:launchMode="singleTask"
android:theme="@android:style/Theme.NoDisplay"/>
</application> </application>
</manifest> </manifest>

View File

@@ -8,6 +8,7 @@ package cc.winboll.studio.libappbase;
import android.content.ClipData; import android.content.ClipData;
import android.content.ClipboardManager; import android.content.ClipboardManager;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray;
import android.os.Handler; import android.os.Handler;
import android.os.Message; import android.os.Message;
import android.text.Editable; import android.text.Editable;
@@ -248,7 +249,10 @@ public class LogView extends RelativeLayout {
} }
mSelectAllTAGCheckBox.setLayoutParams(layoutParams2); mSelectAllTAGCheckBox.setLayoutParams(layoutParams2);
//mSelectAllTAGCheckBox.setPadding(0,0,0,0); //mSelectAllTAGCheckBox.setPadding(0,0,0,0);
mSelectAllTAGCheckBox.setTextColor(mContext.getResources().getColor(R.color.white)); TypedArray ta1 = mContext.obtainStyledAttributes(new int[] { R.attr.toolbarTextColor });
int toolbarTextColor1 = ta1.getColor(0, mContext.getResources().getColor(R.color.white));
ta1.recycle();
mSelectAllTAGCheckBox.setTextColor(toolbarTextColor1);
mSelectAllTAGCheckBox.setOnClickListener(new View.OnClickListener(){ mSelectAllTAGCheckBox.setOnClickListener(new View.OnClickListener(){
@Override @Override
public void onClick(View v) { public void onClick(View v) {
@@ -502,10 +506,17 @@ public class LogView extends RelativeLayout {
} }
holder.tvText.setLayoutParams(layoutParams); holder.tvText.setLayoutParams(layoutParams);
holder.tvText.setPadding(0,0,0,0); holder.tvText.setPadding(0,0,0,0);
holder.tvText.setTextColor(mContext.getResources().getColor(R.color.white)); TypedArray ta2 = mContext.obtainStyledAttributes(new int[] { R.attr.toolbarTextColor });
int toolbarTextColor2 = ta2.getColor(0, mContext.getResources().getColor(R.color.white));
ta2.recycle();
holder.tvText.setTextColor(toolbarTextColor2);
holder.cbChecked.setChecked(item.isChecked()); holder.cbChecked.setChecked(item.isChecked());
holder.cbChecked.setLayoutParams(layoutParams); holder.cbChecked.setLayoutParams(layoutParams);
holder.cbChecked.setPadding(0,0,0,0); holder.cbChecked.setPadding(0,0,0,0);
TypedArray ta3 = mContext.obtainStyledAttributes(new int[] { R.attr.toolbarTextColor });
int toolbarTextColor3 = ta3.getColor(0, mContext.getResources().getColor(R.color.white));
ta3.recycle();
holder.cbChecked.setTextColor(toolbarTextColor3);
holder.cbChecked.setOnClickListener(new View.OnClickListener(){ holder.cbChecked.setOnClickListener(new View.OnClickListener(){
@Override @Override

View File

@@ -1,11 +1,11 @@
package cc.winboll.studio.libappbase.utils; package cc.winboll.studio.libappbase.utils;
import android.app.Application;
import android.app.Notification; import android.app.Notification;
import android.app.NotificationManager; import android.app.NotificationManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.text.TextUtils; import android.text.TextUtils;
@@ -13,13 +13,19 @@ import cc.winboll.studio.libappbase.CrashHandler;
import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.R; import cc.winboll.studio.libappbase.R;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
/** /**
* 应用崩溃处理通知实用工具集(类库兼容版) * 应用崩溃处理通知实用工具集(类库兼容版)
* 核心功能:作为独立类库使用,发送崩溃通知,点击跳转宿主应用的 GlobalCrashActivity 并传递日志 * 核心功能:作为独立类库使用,发送崩溃通知,点击跳转宿主应用的 GlobalCrashActivity 并传递日志
* 适配说明:移除固定包名依赖,通过外部传入宿主包名,支持任意应用集成使用 * 适配说明:移除固定包名依赖,通过外部传入宿主包名,支持任意应用集成使用
* @Author 豆包&ZhanGSKen<zhangsken@qq.com> * @Author 豆包&ZhanGSKen<zhangsken@qq.com>
* @CreateTime 2025/11/29 21:12:00 * @CreateTime 2025/11/29 21:12:00
* @EditTime 2026/05/11 15:38:21 * @EditTime 2026/05/11 21:55:00
*/ */
public class CrashHandleNotifyUtils { public class CrashHandleNotifyUtils {
@@ -35,17 +41,18 @@ public class CrashHandleNotifyUtils {
private static final int API_LEVEL_ANDROID_12 = 31; private static final int API_LEVEL_ANDROID_12 = 31;
/** PendingIntent.FLAG_IMMUTABLE 常量值API 31+ */ /** PendingIntent.FLAG_IMMUTABLE 常量值API 31+ */
private static final int FLAG_IMMUTABLE = 0x00000040; private static final int FLAG_IMMUTABLE = 0x00000040;
/** 通知内容最大行数控制在3行超出部分省略 */
private static final int NOTIFICATION_MAX_LINES = 3;
/** 通知摘要最大长度 */ /** 通知摘要最大长度 */
private static final int SUMMARY_MAX_LENGTH = 200; private static final int SUMMARY_MAX_LENGTH = 200;
/** 展开按钮广播Action */ /** 分享日志请求码 */
private static final String ACTION_EXPAND = "cc.winboll.studio.libappbase.ACTION_EXPAND_CRASH"; private static final int REQUEST_CODE_SHARE_LOG = 0x002;
/** 缓存崩溃日志子目录 */
private static final String CRASH_LOG_CACHE_SUBDIR = "crashnotify";
/** 缓存崩溃日志文件名 */
private static final String CRASH_LOG_CACHE_FILENAME = "crash_log.txt";
private static Context sHostContext = null; // ====================== 静态成员 ======================
private static String sHostPackageName = ""; private static String sHostPackageName = "";
private static String sHostAppName = ""; private static String sCrashLogCacheFilePath = "";
private static Class<?> sReportCrashActivity = null;
// ====================== 正则表达式定义 ====================== // ====================== 正则表达式定义 ======================
private static final String REGEX_EXCEPTION_TYPE = "([\\w.]+Exception|[\\w.]+Error)"; private static final String REGEX_EXCEPTION_TYPE = "([\\w.]+Exception|[\\w.]+Error)";
@@ -61,18 +68,29 @@ public class CrashHandleNotifyUtils {
* @param errorLog 崩溃日志内容 * @param errorLog 崩溃日志内容
* @param reportCrashActivity 崩溃详情跳转Activity类 * @param reportCrashActivity 崩溃详情跳转Activity类
*/ */
public static void handleUncaughtException(final Application hostApp, public static void handleUncaughtException(final android.app.Application hostApp,
final String hostPackageName, final String hostPackageName,
final String errorLog, final String errorLog,
final Class<?> reportCrashActivity) { final Class<?> reportCrashActivity) {
LogUtils.d(TAG, "handleUncaughtException 进入方法"); LogUtils.d(TAG, "handleUncaughtException 进入方法");
// 校验入参
if (hostApp == null || TextUtils.isEmpty(hostPackageName) || TextUtils.isEmpty(errorLog)) { if (hostApp == null || TextUtils.isEmpty(hostPackageName) || TextUtils.isEmpty(errorLog)) {
LogUtils.e(TAG, "handleUncaughtException 参数为空校验不通过"); LogUtils.e(TAG, "handleUncaughtException 参数为空校验不通过");
return; return;
} }
sHostPackageName = hostPackageName;
final String hostAppName = getHostAppName(hostApp, hostPackageName); final String hostAppName = getHostAppName(hostApp, hostPackageName);
sendCrashNotification(hostApp, hostPackageName, hostAppName, errorLog, reportCrashActivity); final String crashLogFilePath = saveCrashLogToCache(hostApp, errorLog);
if (TextUtils.isEmpty(crashLogFilePath)) {
LogUtils.e(TAG, "保存崩溃日志到缓存文件失败");
return;
}
sCrashLogCacheFilePath = crashLogFilePath;
final Intent shareIntent = new Intent(hostApp, ShareLogActivity.class);
shareIntent.putExtra(ShareLogActivity.EXTRA_CRASH_LOG_FILEPATH, crashLogFilePath);
shareIntent.putExtra(ShareLogActivity.EXTRA_CRASH_LOG_SUBJECT, "崩溃日志");
shareIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
final PendingIntent sharePendingIntent = createSharePendingIntent(hostApp, shareIntent);
sendCrashNotification(hostApp, hostPackageName, hostAppName, errorLog, reportCrashActivity, sharePendingIntent);
} }
/** /**
@@ -81,9 +99,9 @@ public class CrashHandleNotifyUtils {
* @param intent 携带崩溃信息Intent * @param intent 携带崩溃信息Intent
* @param reportCrashActivity 崩溃详情Activity * @param reportCrashActivity 崩溃详情Activity
*/ */
public static void handleUncaughtException(final Application hostApp, public static void handleUncaughtException(final android.app.Application hostApp,
final Intent intent, final Intent intent,
final Class<?> reportCrashActivity) { final Class<?> reportCrashActivity) {
LogUtils.d(TAG, "handleUncaughtException 重载方法进入"); LogUtils.d(TAG, "handleUncaughtException 重载方法进入");
String hostPackageName = intent.getStringExtra("EXTRA_HOST_PACKAGE_NAME"); String hostPackageName = intent.getStringExtra("EXTRA_HOST_PACKAGE_NAME");
if (TextUtils.isEmpty(hostPackageName)) { if (TextUtils.isEmpty(hostPackageName)) {
@@ -94,6 +112,16 @@ public class CrashHandleNotifyUtils {
handleUncaughtException(hostApp, hostPackageName, errorLog, reportCrashActivity); handleUncaughtException(hostApp, hostPackageName, errorLog, reportCrashActivity);
} }
/**
* 资源释放
* @param hostContext 宿主上下文
*/
public static void release(final Context hostContext) {
LogUtils.d(TAG, "release 执行资源释放");
sHostPackageName = "";
sCrashLogCacheFilePath = "";
}
// ====================== 内部工具方法 ====================== // ====================== 内部工具方法 ======================
/** /**
* 获取宿主应用名称 * 获取宿主应用名称
@@ -104,14 +132,87 @@ public class CrashHandleNotifyUtils {
private static String getHostAppName(final Context hostContext, final String hostPackageName) { private static String getHostAppName(final Context hostContext, final String hostPackageName) {
try { try {
return hostContext.getPackageManager() return hostContext.getPackageManager()
.getApplicationLabel(hostContext.getPackageManager() .getApplicationLabel(hostContext.getPackageManager()
.getApplicationInfo(hostPackageName, 0)).toString(); .getApplicationInfo(hostPackageName, 0)).toString();
} catch (Exception e) { } catch (Exception e) {
LogUtils.e(TAG, "获取宿主应用名称失败", e); LogUtils.e(TAG, "获取宿主应用名称失败", e);
return "未知应用"; return "未知应用";
} }
} }
/**
* 保存崩溃日志到缓存文件
* @param hostContext 宿主上下文
* @param crashLog 崩溃日志内容
* @return 缓存文件路径,失败返回空字符串
*/
private static String saveCrashLogToCache(final Context hostContext, final String crashLog) {
if (hostContext == null || TextUtils.isEmpty(crashLog)) {
return "";
}
BufferedReader reader = null;
FileOutputStream fos = null;
try {
final File cacheDir = new File(hostContext.getCacheDir(), CRASH_LOG_CACHE_SUBDIR);
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
final File cacheFile = new File(cacheDir, CRASH_LOG_CACHE_FILENAME);
if (cacheFile.exists()) {
cacheFile.delete();
}
cacheFile.createNewFile();
fos = new FileOutputStream(cacheFile);
fos.write(crashLog.getBytes("UTF-8"));
fos.flush();
LogUtils.d(TAG, "saveCrashLogToCache 保存崩溃日志到缓存: " + cacheFile.getAbsolutePath());
return cacheFile.getAbsolutePath();
} catch (Exception e) {
LogUtils.e(TAG, "saveCrashLogToCache 异常", e);
return "";
} finally {
if (reader != null) {
try { reader.close(); } catch (Exception e) {}
}
if (fos != null) {
try { fos.close(); } catch (Exception e) {}
}
}
}
/**
* 读取缓存的崩溃日志文件内容
* @param hostContext 宿主上下文
* @return 日志内容,失败返回空字符串
*/
private static String readCachedCrashLog(final Context hostContext) {
if (hostContext == null || TextUtils.isEmpty(sCrashLogCacheFilePath)) {
return "";
}
BufferedReader reader = null;
try {
final File cacheFile = new File(sCrashLogCacheFilePath);
if (!cacheFile.exists()) {
LogUtils.w(TAG, "readCachedCrashLog 缓存文件不存在");
return "";
}
reader = new BufferedReader(new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"));
final StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
return sb.toString();
} catch (Exception e) {
LogUtils.e(TAG, "readCachedCrashLog 异常", e);
return "";
} finally {
if (reader != null) {
try { reader.close(); } catch (Exception e) {}
}
}
}
/** /**
* 发送崩溃系统通知 * 发送崩溃系统通知
* @param hostContext 宿主上下文 * @param hostContext 宿主上下文
@@ -119,45 +220,65 @@ public class CrashHandleNotifyUtils {
* @param hostAppName 宿主应用名 * @param hostAppName 宿主应用名
* @param errorLog 崩溃日志 * @param errorLog 崩溃日志
* @param reportCrashActivity 跳转Activity * @param reportCrashActivity 跳转Activity
* @param sharePendingIntent 分享日志PendingIntent
*/ */
private static void sendCrashNotification(final Context hostContext, private static void sendCrashNotification(final Context hostContext,
final String hostPackageName, final String hostPackageName,
final String hostAppName, final String hostAppName,
final String errorLog, final String errorLog,
final Class<?> reportCrashActivity) { final Class<?> reportCrashActivity,
final PendingIntent sharePendingIntent) {
final NotificationManager notificationManager = final NotificationManager notificationManager =
(NotificationManager) hostContext.getSystemService(Context.NOTIFICATION_SERVICE); (NotificationManager) hostContext.getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager == null) { if (notificationManager == null) {
LogUtils.e(TAG, "获取NotificationManager失败"); LogUtils.e(TAG, "获取NotificationManager失败");
return; return;
} }
// 8.0以上创建通知渠道
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
createCrashNotifyChannel(hostContext, notificationManager); createCrashNotifyChannel(hostContext, notificationManager);
} }
final PendingIntent jumpIntent = getGlobalCrashPendingIntent(hostContext, final PendingIntent jumpIntent = getGlobalCrashPendingIntent(hostContext,
hostPackageName, errorLog, reportCrashActivity); hostPackageName, errorLog, reportCrashActivity);
if (jumpIntent == null) { if (jumpIntent == null) {
LogUtils.e(TAG, "构建跳转PendingIntent失败"); LogUtils.e(TAG, "构建跳转PendingIntent失败");
return; return;
} }
final Notification notification = buildNotification(hostContext, hostPackageName, hostAppName, errorLog, jumpIntent); final Notification notification = buildNotification(hostContext, hostPackageName, hostAppName, errorLog, jumpIntent, sharePendingIntent);
notificationManager.notify(CRASH_NOTIFY_ID, notification); notificationManager.notify(CRASH_NOTIFY_ID, notification);
LogUtils.d(TAG, "崩溃通知发送成功,宿主包名:" + hostPackageName); LogUtils.d(TAG, "崩溃通知发送成功,宿主包名:" + hostPackageName);
} }
/**
* 创建分享日志PendingIntent
* @param hostContext 宿主上下文
* @param shareIntent 分享意图
* @return PendingIntent实例
*/
private static PendingIntent createSharePendingIntent(final Context hostContext, final Intent shareIntent) {
int flags = PendingIntent.FLAG_UPDATE_CURRENT;
if (Build.VERSION.SDK_INT >= API_LEVEL_ANDROID_12) {
flags |= FLAG_IMMUTABLE;
}
return PendingIntent.getActivity(
hostContext,
REQUEST_CODE_SHARE_LOG,
shareIntent,
flags
);
}
/** /**
* 创建通知渠道适配Android O及以上 * 创建通知渠道适配Android O及以上
* @param hostContext 宿主上下文 * @param hostContext 宿主上下文
* @param notificationManager 通知管理器 * @param notificationManager 通知管理器
*/ */
private static void createCrashNotifyChannel(final Context hostContext, private static void createCrashNotifyChannel(final Context hostContext,
final NotificationManager notificationManager) { final NotificationManager notificationManager) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
android.app.NotificationChannel channel = new android.app.NotificationChannel( android.app.NotificationChannel channel = new android.app.NotificationChannel(
CRASH_NOTIFY_CHANNEL_ID, CRASH_NOTIFY_CHANNEL_ID,
CRASH_NOTIFY_CHANNEL_NAME, CRASH_NOTIFY_CHANNEL_NAME,
NotificationManager.IMPORTANCE_DEFAULT NotificationManager.IMPORTANCE_DEFAULT
); );
channel.setDescription("应用崩溃通知(由 WinBoLL Studio 类库提供,点击查看详情)"); channel.setDescription("应用崩溃通知(由 WinBoLL Studio 类库提供,点击查看详情)");
notificationManager.createNotificationChannel(channel); notificationManager.createNotificationChannel(channel);
@@ -174,9 +295,9 @@ private static void sendCrashNotification(final Context hostContext,
* @return PendingIntent实例 * @return PendingIntent实例
*/ */
private static PendingIntent getGlobalCrashPendingIntent(final Context hostContext, private static PendingIntent getGlobalCrashPendingIntent(final Context hostContext,
final String hostPackageName, final String hostPackageName,
final String errorLog, final String errorLog,
final Class<?> reportCrashActivity) { final Class<?> reportCrashActivity) {
try { try {
final Intent crashIntent = new Intent(hostContext, reportCrashActivity); final Intent crashIntent = new Intent(hostContext, reportCrashActivity);
crashIntent.setPackage(hostPackageName); crashIntent.setPackage(hostPackageName);
@@ -187,11 +308,11 @@ private static void sendCrashNotification(final Context hostContext,
if (Build.VERSION.SDK_INT >= API_LEVEL_ANDROID_12) { if (Build.VERSION.SDK_INT >= API_LEVEL_ANDROID_12) {
flags |= FLAG_IMMUTABLE; flags |= FLAG_IMMUTABLE;
} }
return PendingIntent.getActivity( return PendingIntent.getActivity(
hostContext, hostContext,
CRASH_NOTIFY_ID, CRASH_NOTIFY_ID,
crashIntent, crashIntent,
flags flags
); );
} catch (Exception e) { } catch (Exception e) {
LogUtils.e(TAG, "构建跳转Intent异常", e); LogUtils.e(TAG, "构建跳转Intent异常", e);
@@ -206,32 +327,36 @@ return PendingIntent.getActivity(
* @param hostAppName 宿主应用名 * @param hostAppName 宿主应用名
* @param errorLog 崩溃日志 * @param errorLog 崩溃日志
* @param jumpIntent 点击跳转意图 * @param jumpIntent 点击跳转意图
* @param shareIntent 分享日志意图
* @return 构建好的Notification * @return 构建好的Notification
*/ */
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static Notification buildNotification(final Context hostContext, private static Notification buildNotification(final Context hostContext,
final String hostPackageName, final String hostPackageName,
final String hostAppName, final String hostAppName,
final String errorLog, final String errorLog,
final PendingIntent jumpIntent) { final PendingIntent jumpIntent,
final PendingIntent shareIntent) {
Notification.Builder builder = new Notification.Builder(hostContext); Notification.Builder builder = new Notification.Builder(hostContext);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
builder.setChannelId(CRASH_NOTIFY_CHANNEL_ID); builder.setChannelId(CRASH_NOTIFY_CHANNEL_ID);
} }
String briefInfo = extractBriefInfo(errorLog); final String briefInfo = extractBriefInfo(errorLog);
Notification.BigTextStyle bigTextStyle = new Notification.BigTextStyle(); final Notification.BigTextStyle bigTextStyle = new Notification.BigTextStyle();
bigTextStyle.setBigContentTitle(hostAppName + " 崩溃"); bigTextStyle.setBigContentTitle(hostAppName + " 崩溃");
bigTextStyle.bigText(briefInfo); bigTextStyle.bigText(briefInfo);
bigTextStyle.setSummaryText("点击查看详情"); bigTextStyle.setSummaryText("点击查看详情");
builder.setStyle(bigTextStyle); builder.setStyle(bigTextStyle);
builder.setSmallIcon(hostContext.getApplicationInfo().icon) builder.setSmallIcon(hostContext.getApplicationInfo().icon)
.setContentTitle(hostAppName + " 崩溃") .setContentTitle(hostAppName + " 崩溃")
.setContentText(briefInfo.split("\n")[0]) .setContentText(briefInfo.split("\n")[0])
.setContentIntent(jumpIntent) .setContentIntent(jumpIntent)
.setAutoCancel(true) .setAutoCancel(true)
.setWhen(System.currentTimeMillis()) .setWhen(System.currentTimeMillis())
.setPriority(Notification.PRIORITY_DEFAULT); .setPriority(Notification.PRIORITY_DEFAULT);
if (shareIntent != null) {
builder.addAction(android.R.drawable.ic_menu_send, "分享日志", shareIntent);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
return builder.build(); return builder.build();
} else { } else {
@@ -248,10 +373,10 @@ return PendingIntent.getActivity(
if (errorLog == null || errorLog.isEmpty()) { if (errorLog == null || errorLog.isEmpty()) {
return "无崩溃日志"; return "无崩溃日志";
} }
String brief = extractBriefInfo(errorLog); final String brief = extractBriefInfo(errorLog);
String firstLine = brief.split("\n")[0]; final String firstLine = brief.split("\n")[0];
if (firstLine.length() > 80) { if (firstLine.length() > 80) {
firstLine = firstLine.substring(0, 80) + "..."; return firstLine.substring(0, 80) + "...";
} }
return firstLine; return firstLine;
} }
@@ -265,7 +390,7 @@ return PendingIntent.getActivity(
if (crashLog == null || crashLog.isEmpty()) { if (crashLog == null || crashLog.isEmpty()) {
return "无崩溃日志"; return "无崩溃日志";
} }
StringBuilder brief = new StringBuilder(); final StringBuilder brief = new StringBuilder();
try { try {
java.util.regex.Pattern exceptionPattern = java.util.regex.Pattern.compile(REGEX_EXCEPTION_TYPE); java.util.regex.Pattern exceptionPattern = java.util.regex.Pattern.compile(REGEX_EXCEPTION_TYPE);
java.util.regex.Matcher exceptionMatcher = exceptionPattern.matcher(crashLog); java.util.regex.Matcher exceptionMatcher = exceptionPattern.matcher(crashLog);
@@ -315,13 +440,4 @@ return PendingIntent.getActivity(
} }
return brief.toString(); return brief.toString();
} }
}
/**
* 资源释放预留方法
* @param hostContext 宿主上下文
*/
public static void release(final Context hostContext) {
LogUtils.d(TAG, "CrashHandleNotifyUtils 执行资源释放");
}
}

View File

@@ -0,0 +1,91 @@
package cc.winboll.studio.libappbase.utils;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
/**
* 分享崩溃日志窗口类
* @Author ZhanGSKen<zhangsken@qq.com>
* @CreateTime 2026/05/11 22:30:00
*/
public class ShareLogActivity extends Activity {
public static final String TAG = "ShareLogActivity";
public static final String EXTRA_CRASH_LOG_FILEPATH = "crash_log_filepath";
public static final String EXTRA_CRASH_LOG_SUBJECT = "crash_log_subject";
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate 进入方法");
final Intent intent = getIntent();
if (intent == null) {
Log.e(TAG, "onCreate intent 为空");
finish();
return;
}
final String crashLogFilePath = intent.getStringExtra(EXTRA_CRASH_LOG_FILEPATH);
if (crashLogFilePath == null || crashLogFilePath.isEmpty()) {
Log.e(TAG, "onCreate crashLogFilePath 为空");
Toast.makeText(this, "日志文件路径无效", Toast.LENGTH_SHORT).show();
finish();
return;
}
final String subject = intent.getStringExtra(EXTRA_CRASH_LOG_SUBJECT);
handleShareCrashLog(crashLogFilePath, subject);
}
private void handleShareCrashLog(final String crashLogFilePath, final String subject) {
Log.d(TAG, "handleShareCrashLog crashLogFilePath = " + crashLogFilePath);
final File crashLogFile = new File(crashLogFilePath);
if (!crashLogFile.exists()) {
Log.e(TAG, "handleShareCrashLog 文件不存在");
Toast.makeText(this, "日志文件不存在", Toast.LENGTH_SHORT).show();
finish();
return;
}
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(new FileInputStream(crashLogFile), "UTF-8"));
final StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
sb.append(line).append("\n");
}
final String logContent = sb.toString();
final Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
shareIntent.putExtra(Intent.EXTRA_TEXT, logContent);
if (subject != null && !subject.isEmpty()) {
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
} else {
shareIntent.putExtra(Intent.EXTRA_SUBJECT, "崩溃日志");
}
startActivity(Intent.createChooser(shareIntent, "分享日志到"));
Log.d(TAG, "handleShareCrashLog 分享成功");
} catch (Exception e) {
Log.e(TAG, "handleShareCrashLog 异常", e);
Toast.makeText(this, "分享失败: " + e.getMessage(), Toast.LENGTH_SHORT).show();
} finally {
if (reader != null) {
try { reader.close(); } catch (Exception e) {}
}
finish();
}
}
}

View File

@@ -3,6 +3,7 @@ package cc.winboll.studio.libappbase.widget;
import android.content.Context; import android.content.Context;
import android.graphics.Color; import android.graphics.Color;
import android.text.TextUtils; import android.text.TextUtils;
import android.content.res.TypedArray;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.View; import android.view.View;
@@ -153,9 +154,12 @@ public class LogTagSpinner extends Spinner {
itemTv.setPadding(mTextPadding, 0, mTextPadding, 0); itemTv.setPadding(mTextPadding, 0, mTextPadding, 0);
// 4. 文字对齐(垂直居中+靠左,符合常规 UI 设计) // 4. 文字对齐(垂直居中+靠左,符合常规 UI 设计)
//itemTv.setGravity(View.GRAVITY_CENTER_VERTICAL | View.GRAVITY_START); //itemTv.setGravity(View.GRAVITY_CENTER_VERTICAL | View.GRAVITY_START);
// 5. 文字颜色(统一深色,可改为项目颜色资源 // 5. 文字颜色(使用主题属性 ?attr/toolbarTextColor
itemTv.setTextColor(this.mContext.getColor(R.color.white)); TypedArray ta = mContext.obtainStyledAttributes(new int[] { R.attr.toolbarTextColor });
itemTv.setBackgroundColor(this.mContext.getColor(R.color.btn_gray_normal)); int toolbarTextColor = ta.getColor(0, mContext.getResources().getColor(R.color.white));
ta.recycle();
itemTv.setTextColor(toolbarTextColor);
itemTv.setBackgroundColor(this.mContext.getResources().getColor(R.color.btn_gray_normal));
// 6. 文字溢出处理(最多 2 行,超出省略,避免长标签换行过多) // 6. 文字溢出处理(最多 2 行,超出省略,避免长标签换行过多)
itemTv.setSingleLine(false); itemTv.setSingleLine(false);
itemTv.setMaxLines(2); itemTv.setMaxLines(2);

View File

@@ -50,8 +50,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="功能按钮待激活" android:text="功能按钮待激活"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/buttonTextColor" android:textColor="?attr/toolbarTextColor"
android:backgroundTint="?attr/buttonBackgroundColor" android:backgroundTint="?attr/toolbarBackgroundColor"
android:padding="14dp" android:padding="14dp"
android:enabled="false"/> android:enabled="false"/>

View File

@@ -53,8 +53,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="确认" android:text="确认"
android:textSize="14sp" android:textSize="14sp"
android:backgroundTint="?attr/buttonBackgroundColor" android:backgroundTint="?attr/toolbarBackgroundColor"
android:textColor="?attr/buttonTextColor"/> android:textColor="?attr/toolbarTextColor"/>
</LinearLayout> </LinearLayout>

View File

@@ -18,6 +18,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:textColor="?attr/toolbarTextColor"
android:id="@+id/viewlogtagCheckBox1"/> android:id="@+id/viewlogtagCheckBox1"/>
</LinearLayout> </LinearLayout>

View File

@@ -15,13 +15,13 @@
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:id="@+id/viewlogRelativeLayoutToolbar"> android:id="@+id/viewlogRelativeLayoutToolbar">
<Button <Button
android:layout_width="@dimen/log_button_width" android:layout_width="@dimen/log_button_width"
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:text="Clean" android:text="Clean"
android:textColor="?attr/colorText" android:textColor="?attr/activityTextColor"
android:backgroundTint="?attr/colorTittleBackgound" android:background="?attr/toolbarBackgroundColor"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:id="@+id/viewlogButtonClean" android:id="@+id/viewlogButtonClean"
android:layout_marginLeft="5dp"/> android:layout_marginLeft="5dp"/>
@@ -36,7 +36,7 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:id="@+id/viewlogTextView1" android:id="@+id/viewlogTextView1"
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:textColor="?attr/colorText"/> android:textColor="?attr/toolbarTextColor"/>
<cc.winboll.studio.libappbase.widget.LogTagSpinner <cc.winboll.studio.libappbase.widget.LogTagSpinner
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -56,14 +56,14 @@
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:id="@+id/viewlogCheckBoxSelectable" android:id="@+id/viewlogCheckBoxSelectable"
android:padding="@dimen/log_text_padding" android:padding="@dimen/log_text_padding"
android:textColor="?attr/colorText"/> android:textColor="?attr/toolbarTextColor"/>
<Button <Button
android:layout_width="@dimen/log_button_width" android:layout_width="@dimen/log_button_width"
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:textColor="?attr/colorText" android:textColor="?attr/activityTextColor"
android:backgroundTint="?attr/colorTittleBackgound" android:background="?attr/toolbarBackgroundColor"
android:text="Copy" android:text="Copy"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
@@ -89,7 +89,7 @@
android:padding="2dp" android:padding="2dp"
android:id="@+id/viewlogCheckBox1" android:id="@+id/viewlogCheckBox1"
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:textColor="?attr/colorText" android:textColor="?attr/toolbarTextColor"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"/> android:layout_marginRight="5dp"/>

View File

@@ -50,8 +50,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="功能按钮待激活" android:text="功能按钮待激活"
android:textSize="16sp" android:textSize="16sp"
android:textColor="?attr/buttonTextColor" android:textColor="?attr/toolbarTextColor"
android:backgroundTint="?attr/buttonBackgroundColor" android:backgroundTint="?attr/toolbarBackgroundColor"
android:padding="14dp" android:padding="14dp"
android:enabled="false"/> android:enabled="false"/>

View File

@@ -53,8 +53,8 @@
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="确认" android:text="确认"
android:textSize="14sp" android:textSize="14sp"
android:backgroundTint="?attr/buttonBackgroundColor" android:backgroundTint="?attr/toolbarBackgroundColor"
android:textColor="?attr/buttonTextColor"/> android:textColor="?attr/toolbarTextColor"/>
</LinearLayout> </LinearLayout>

View File

@@ -18,6 +18,7 @@
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:textColor="?attr/toolbarTextColor"
android:id="@+id/viewlogtagCheckBox1"/> android:id="@+id/viewlogtagCheckBox1"/>
</LinearLayout> </LinearLayout>

View File

@@ -20,8 +20,8 @@
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:text="Clean" android:text="Clean"
android:textColor="?attr/colorText" android:textColor="?attr/activityTextColor"
android:backgroundTint="?attr/colorTittleBackgound" android:background="?attr/toolbarBackgroundColor"
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:id="@+id/viewlogButtonClean" android:id="@+id/viewlogButtonClean"
android:layout_marginLeft="5dp"/> android:layout_marginLeft="5dp"/>
@@ -36,7 +36,7 @@
android:layout_centerVertical="true" android:layout_centerVertical="true"
android:id="@+id/viewlogTextView1" android:id="@+id/viewlogTextView1"
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:textColor="?attr/colorText"/> android:textColor="?attr/toolbarTextColor"/>
<cc.winboll.studio.libappbase.widget.LogTagSpinner <cc.winboll.studio.libappbase.widget.LogTagSpinner
android:layout_width="wrap_content" android:layout_width="wrap_content"
@@ -56,14 +56,14 @@
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:id="@+id/viewlogCheckBoxSelectable" android:id="@+id/viewlogCheckBoxSelectable"
android:padding="@dimen/log_text_padding" android:padding="@dimen/log_text_padding"
android:textColor="?attr/colorText"/> android:textColor="?attr/toolbarTextColor"/>
<Button <Button
android:layout_width="@dimen/log_button_width" android:layout_width="@dimen/log_button_width"
android:layout_height="@dimen/log_button_height" android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size" android:textSize="@dimen/log_text_size"
android:textColor="?attr/colorText" android:textColor="?attr/activityTextColor"
android:backgroundTint="?attr/colorTittleBackgound" android:background="?attr/toolbarBackgroundColor"
android:text="Copy" android:text="Copy"
android:layout_alignParentRight="true" android:layout_alignParentRight="true"
android:layout_centerVertical="true" android:layout_centerVertical="true"
@@ -89,7 +89,7 @@
android:padding="2dp" android:padding="2dp"
android:id="@+id/viewlogCheckBox1" android:id="@+id/viewlogCheckBox1"
android:background="?attr/colorTittleBackgound" android:background="?attr/colorTittleBackgound"
android:textColor="?attr/colorText" android:textColor="?attr/toolbarTextColor"
android:layout_marginLeft="5dp" android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"/> android:layout_marginRight="5dp"/>

View File

@@ -20,11 +20,7 @@
<attr name="aboutViewDividerColor" format="color" /> <attr name="aboutViewDividerColor" format="color" />
</declare-styleable> </declare-styleable>
<!-- ButtonStyle 样式属性 -->
<declare-styleable name="ButtonStyle">
<attr name="buttonBackgroundColor" format="color" />
<attr name="buttonTextColor" format="color" />
</declare-styleable>
<!-- DialogStyle 样式属性 --> <!-- DialogStyle 样式属性 -->
<declare-styleable name="DialogStyle"> <declare-styleable name="DialogStyle">

View File

@@ -63,7 +63,9 @@
<!-- ============== 主题颜色 ============== --> <!-- ============== 主题颜色 ============== -->
<color name="mainWindowBackgroundColor">#FF0D1B2A</color> <color name="mainWindowBackgroundColor">#FF0D1B2A</color>
<color name="mainWindowTextColor">#FFE0E0E0</color> <color name="mainWindowTextColor">#FFE0E0E0</color>
<color name="buttonBackgroundColor">#FF1E3A5F</color> <color name="toolbarTextColor">#FFE0E0E0</color>
<color name="toolbarBackgroundColor">#FF1E3A5F</color>
<color name="debugTextColor">#FF00FF00</color> <color name="debugTextColor">#FF00FF00</color>
</resources> </resources>

View File

@@ -8,12 +8,12 @@
<item name="aboutViewTextColor">?attr/mainWindowDarkTextColor</item> <item name="aboutViewTextColor">?attr/mainWindowDarkTextColor</item>
<item name="aboutViewTitleColor">?attr/mainWindowDarkTextColor</item> <item name="aboutViewTitleColor">?attr/mainWindowDarkTextColor</item>
<item name="aboutViewDividerColor">?attr/mainWindowTextColor</item> <item name="aboutViewDividerColor">?attr/mainWindowTextColor</item>
<item name="buttonBackgroundColor">@color/buttonBackgroundColor</item>
<item name="buttonTextColor">?attr/mainWindowDarkTextColor</item>
<item name="dialogBackgroundColor">?attr/mainWindowDarkBackgroundColor</item> <item name="dialogBackgroundColor">?attr/mainWindowDarkBackgroundColor</item>
<item name="dialogTextColor">?attr/mainWindowDarkTextColor</item> <item name="dialogTextColor">?attr/mainWindowDarkTextColor</item>
<item name="toolbarBackgroundColor">?attr/buttonBackgroundColor</item> <item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">?attr/mainWindowDarkTextColor</item> <item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">?attr/mainWindowDarkBackgroundColor</item> <item name="textViewBackgroundColor">?attr/mainWindowDarkBackgroundColor</item>
<item name="textViewTextColor">?attr/mainWindowDarkTextColor</item> <item name="textViewTextColor">?attr/mainWindowDarkTextColor</item>
<item name="editTextBackgroundColor">?attr/mainWindowDarkBackgroundColor</item> <item name="editTextBackgroundColor">?attr/mainWindowDarkBackgroundColor</item>
@@ -29,12 +29,14 @@
<!-- DebugActivityTheme 深色模式样式 --> <!-- DebugActivityTheme 深色模式样式 -->
<style name="DebugActivityTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar"> <style name="DebugActivityTheme" parent="@android:style/Theme.DeviceDefault.NoActionBar">
<item name="android:statusBarColor">@color/mainWindowBackgroundColor</item> <item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">?attr/mainWindowDarkTextColor</item> <item name="colorTittle">?attr/mainWindowDarkTextColor</item>
<item name="colorTittleBackgound">@color/buttonBackgroundColor</item> <item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">?attr/debugTextColor</item> <item name="colorText">?attr/debugTextColor</item>
<item name="colorTextBackgound">?attr/mainWindowDarkBackgroundColor</item> <item name="colorTextBackgound">?attr/mainWindowDarkBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item> <item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style> </style>
<!-- DialogStyle 对话框样式 --> <!-- DialogStyle 对话框样式 -->

View File

@@ -26,11 +26,7 @@
<attr name="aboutViewDividerColor" format="color" /> <attr name="aboutViewDividerColor" format="color" />
</declare-styleable> </declare-styleable>
<!-- ButtonStyle 样式属性 -->
<declare-styleable name="ButtonStyle">
<attr name="buttonBackgroundColor" format="color" />
<attr name="buttonTextColor" format="color" />
</declare-styleable>
<!-- DialogStyle 样式属性 --> <!-- DialogStyle 样式属性 -->
<declare-styleable name="DialogStyle"> <declare-styleable name="DialogStyle">

View File

@@ -63,7 +63,9 @@
<!-- ============== 主题颜色 ============== --> <!-- ============== 主题颜色 ============== -->
<color name="mainWindowBackgroundColor">#FFF5F5F5</color> <color name="mainWindowBackgroundColor">#FFF5F5F5</color>
<color name="mainWindowTextColor">#FF000000</color> <color name="mainWindowTextColor">#FF000000</color>
<color name="buttonBackgroundColor">#FF00B322</color> <color name="toolbarTextColor">#FF000000</color>
<color name="toolbarBackgroundColor">#FF00B322</color>
<color name="debugTextColor">#FF808080</color> <color name="debugTextColor">#FF808080</color>
</resources> </resources>

View File

@@ -8,12 +8,12 @@
<item name="aboutViewTextColor">?attr/mainWindowTextColor</item> <item name="aboutViewTextColor">?attr/mainWindowTextColor</item>
<item name="aboutViewTitleColor">?attr/mainWindowTextColor</item> <item name="aboutViewTitleColor">?attr/mainWindowTextColor</item>
<item name="aboutViewDividerColor">?attr/mainWindowDarkTextColor</item> <item name="aboutViewDividerColor">?attr/mainWindowDarkTextColor</item>
<item name="buttonBackgroundColor">@color/buttonBackgroundColor</item>
<item name="buttonTextColor">?attr/mainWindowTextColor</item>
<item name="dialogBackgroundColor">?attr/mainWindowBackgroundColor</item> <item name="dialogBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="dialogTextColor">?attr/mainWindowTextColor</item> <item name="dialogTextColor">?attr/mainWindowTextColor</item>
<item name="toolbarBackgroundColor">?attr/buttonBackgroundColor</item> <item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">?attr/mainWindowTextColor</item> <item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">?attr/mainWindowBackgroundColor</item> <item name="textViewBackgroundColor">?attr/mainWindowBackgroundColor</item>
<item name="textViewTextColor">?attr/mainWindowTextColor</item> <item name="textViewTextColor">?attr/mainWindowTextColor</item>
<item name="editTextBackgroundColor">?attr/mainWindowBackgroundColor</item> <item name="editTextBackgroundColor">?attr/mainWindowBackgroundColor</item>
@@ -29,12 +29,14 @@
<!-- DebugActivityTheme 普通模式样式 --> <!-- DebugActivityTheme 普通模式样式 -->
<style name="DebugActivityTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar"> <style name="DebugActivityTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:statusBarColor">@color/buttonBackgroundColor</item> <item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">?attr/mainWindowTextColor</item> <item name="colorTittle">?attr/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/buttonBackgroundColor</item> <item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">?attr/debugTextColor</item> <item name="colorText">?attr/debugTextColor</item>
<item name="colorTextBackgound">?attr/mainWindowBackgroundColor</item> <item name="colorTextBackgound">?attr/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item> <item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style> </style>
<!-- DialogStyle 对话框样式 --> <!-- DialogStyle 对话框样式 -->

View File

@@ -31,8 +31,8 @@ dependencies {
api 'com.jcraft:jsch:0.1.54' api 'com.jcraft:jsch:0.1.54'
// WinBoLL库 nexus.winboll.cc 地址 // WinBoLL库 nexus.winboll.cc 地址
api 'cc.winboll.studio:libaes:15.15.2' api 'cc.winboll.studio:libaes:15.20.2'
api 'cc.winboll.studio:libappbase:15.15.11' api 'cc.winboll.studio:libappbase:15.20.9'
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat May 09 19:01:46 GMT 2026 #Tue May 12 12:16:45 HKT 2026
stageCount=27 stageCount=1
libraryProject=libwinboll libraryProject=libwinboll
baseVersion=15.11 baseVersion=15.20
publishVersion=15.11.26 publishVersion=15.20.0
buildCount=29 buildCount=0
baseBetaVersion=15.11.27 baseBetaVersion=15.20.1

View File

@@ -31,7 +31,7 @@ android {
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0 // .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.11" versionName "15.20"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@@ -109,8 +109,8 @@ dependencies {
implementation 'com.termux:termux-shared:0.118.0' implementation 'com.termux:termux-shared:0.118.0'
// WinBoLL库 nexus.winboll.cc 地址 // WinBoLL库 nexus.winboll.cc 地址
api 'cc.winboll.studio:libaes:15.15.2' api 'cc.winboll.studio:libaes:15.20.2'
api 'cc.winboll.studio:libappbase:15.15.11' api 'cc.winboll.studio:libappbase:15.20.9'
// WinBoLL备用库 jitpack.io 地址 // WinBoLL备用库 jitpack.io 地址
//api 'com.github.ZhanGSKen:AES:aes-v15.15.7' //api 'com.github.ZhanGSKen:AES:aes-v15.15.7'

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sat May 09 19:01:46 GMT 2026 #Tue May 12 12:16:45 HKT 2026
stageCount=27 stageCount=1
libraryProject=libwinboll libraryProject=libwinboll
baseVersion=15.11 baseVersion=15.20
publishVersion=15.11.26 publishVersion=15.20.0
buildCount=29 buildCount=0
baseBetaVersion=15.11.27 baseBetaVersion=15.20.1

View File

@@ -4,4 +4,10 @@
<color name="colorPrimaryDark">#00796B</color> <color name="colorPrimaryDark">#00796B</color>
<color name="colorAccent">#FF9800</color> <color name="colorAccent">#FF9800</color>
<color name="pattern_lock_black">#000000</color> <color name="pattern_lock_black">#000000</color>
<color name="mainWindowBackgroundColor">#FFF5F5F5</color>
<color name="mainWindowTextColor">#FF000000</color>
<color name="toolbarTextColor">#FF000000</color>
<color name="toolbarBackgroundColor">#FF00B322</color>
<color name="debugTextColor">#FF808080</color>
</resources> </resources>

View File

@@ -1,5 +1,35 @@
<resources> <resources>
<style name="MyAppTheme" parent="AESTheme"> <style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="themeDebug">@style/MyDebugActivityTheme</item>
<item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="aboutViewTextColor">@color/mainWindowTextColor</item>
<item name="aboutViewTitleColor">@color/mainWindowTextColor</item>
<item name="aboutViewDividerColor">@color/mainWindowTextColor</item>
<item name="dialogBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="dialogTextColor">@color/mainWindowTextColor</item>
<item name="toolbarBackgroundColor">@color/toolbarBackgroundColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
<item name="textViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="textViewTextColor">@color/mainWindowTextColor</item>
<item name="editTextBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="editTextTextColor">@color/mainWindowTextColor</item>
<item name="scrollViewBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="activityTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowTextColor">@color/mainWindowTextColor</item>
<item name="mainWindowDarkBackgroundColor">@color/mainWindowBackgroundColor</item>
<item name="mainWindowDarkTextColor">@color/mainWindowTextColor</item>
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
</style>
<style name="MyDebugActivityTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:statusBarColor">@color/toolbarBackgroundColor</item>
<item name="colorTittle">@color/mainWindowTextColor</item>
<item name="colorTittleBackgound">@color/toolbarBackgroundColor</item>
<item name="colorText">@color/debugTextColor</item>
<item name="colorTextBackgound">@color/mainWindowBackgroundColor</item>
<item name="debugTextColor">@color/debugTextColor</item>
<item name="toolbarTextColor">@color/toolbarTextColor</item>
</style> </style>
</resources> </resources>