27 Commits

Author SHA1 Message Date
12666e1082 <libappbase>Library Release 15.14.1 2025-12-15 17:52:05 +08:00
11a4db23db <appbase>APK 15.14.1 release Publish. 2025-12-15 17:51:52 +08:00
fab5a35067 <libappbase>Library Release 15.14.0 2025-12-15 17:45:00 +08:00
8348075df1 <appbase>APK 15.14.0 release Publish. 2025-12-15 17:43:37 +08:00
8c335cb96d 应用日志第二工具栏UI调试完成 2025-12-15 17:41:19 +08:00
460df3fc92 移除重复的不能用的冗余HorizontalListView代码 2025-12-15 17:11:34 +08:00
f83e62b05d 应用日志调试窗口第一工具栏调试完成。 2025-12-15 16:41:42 +08:00
656e58ec5c Merge branch 'winboll' into appbase 2025-12-15 12:43:55 +08:00
778a1bc98e 添加应用版本号说明 2025-12-15 12:42:50 +08:00
34a30d4635 20251215_114814_087正在调整日志UI 2025-12-15 11:48:44 +08:00
536e6eef60 源码清理 2025-12-15 10:49:25 +08:00
0963025bbd Merge branch 'winboll' into appbase 2025-12-09 15:11:25 +08:00
bb94f87597 更新说明书 2025-12-08 00:56:14 +08:00
669a6eab0c <winboll>APK 15.11.7 release Publish. 2025-12-07 03:42:32 +08:00
a0d65d9f78 <winboll>Start New Stage Version. 2025-12-07 03:41:55 +08:00
f5f9d7c46e 更新应用图标 2025-12-07 03:41:26 +08:00
7afd1a8c20 <winboll>APK 15.11.6 release Publish. 2025-12-07 03:22:51 +08:00
c00f25dbab 添加历史记录浏览 2025-12-07 03:16:49 +08:00
4bf74875ab 更新应用菜单与介绍窗口 2025-12-07 02:17:08 +08:00
03c0afb655 WinBoLL备用库 jitpack.io 测试完成 2025-12-06 18:46:01 +08:00
73c654e6ce 测试libaes类库最新版本 2025-12-06 18:31:39 +08:00
d505277f15 Merge branch 'winboll' into merge 2025-12-06 15:22:51 +08:00
0180b3225c 更新应用编译配置,适配类库外放编译时的运行环境。 2025-12-06 15:19:57 +08:00
00142a0b05 jitpack.io 库测试完成 2025-12-06 15:17:00 +08:00
382f8c3412 测试WinBoLL库发布 2025-12-06 15:03:40 +08:00
edf9d07e58 源码清理 2025-12-06 15:02:43 +08:00
34a6322f3d <libappbase>Library Release 15.12.2 2025-12-06 14:56:58 +08:00
51 changed files with 668 additions and 642 deletions

View File

@@ -5,10 +5,11 @@
## ☁ ☁ ☁ WinBoLL APP ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ WinBoLL Studio Android 应用开源项目。☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoLL 网站地址 https://www.winboll.cc/ ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoLL 源码地址 <https://gitea.winboll.cc/Studio/APPBase> ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ GitHub 源码地址 <https://github.com/ZhanGSKen/APPBase.git> ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ 码云 源码地址 <https://gitee.com/zhangsken/appbase.git> ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ WinBoLL 源码地址 <https://gitea.winboll.cc/Studio/WinBoLL.git> ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ GitHub 源码地址 <https://github.com/ZhanGSKen/WinBoLL.git> ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ 码云 源码地址 <https://gitee.com/zhangsken/winboll.git> ☁ ☁ ☁ ☁ ☁ ☁ ☁ ☁
# ☁ ☁ ☁ 在 jitpack.io 托管的 APPBase 类库源码<https://github.com/ZhanGSKen/APPBase.git> ☁ ☁ ☁ ☁
# ☁ ☁ ☁ 在 jitpack.io 托管的 AES 类库源码<https://github.com/ZhanGSKen/AES.git> ☁ ☁ ☁ ☁
## WinBoLL 提问
同样是 /sdcard 目录,在开发 Android 应用时,
能否实现手机编译与电脑编译的源码同步。
@@ -154,3 +155,11 @@ $ bash gradlew assembleBetaDebug
$ bash gradlew assembleStageDebug
### 若是 winboll.properties 文件的 [ExtraAPKOutputPath] 属性设置了路径。编译器也会复制一份 APK 到这个路径。
# 应用版本号命名方式
## statge 渠道
V<应用开发环境编号><应用功能变更号><应用调试阶段号>
APPBase_15.7.0
## beta 渠道
V<应用开发环境编号><应用功能变更号><应用调试阶段号>-beta<调试编译计数>_<调试编译时间(分钟+秒钟)>
APPBase_15.9.6-beta8_5413

View File

@@ -33,7 +33,7 @@ android {
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.12"
versionName "15.14"
if(true) {
versionName = genVersionName("${versionName}")
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Sat Dec 06 14:56:36 HKT 2025
stageCount=3
#Mon Dec 15 17:52:03 HKT 2025
stageCount=2
libraryProject=libappbase
baseVersion=15.12
publishVersion=15.12.2
baseVersion=15.14
publishVersion=15.14.1
buildCount=0
baseBetaVersion=15.12.3
baseBetaVersion=15.14.2

View File

@@ -3,9 +3,8 @@
xmlns:tools="http://schemas.android.com/tools" >
<application
tools:replace="android:icon,android:roundIcon"
android:icon="@drawable/ic_winboll_beta"
android:roundIcon="@drawable/ic_winboll_beta">
tools:replace="android:icon"
android:icon="@drawable/ic_winboll_beta">
<!-- Put flavor specific code here -->

View File

@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/item_home"
android:title="WinBoLL Home"
android:icon="@drawable/ic_winboll"/>
android:title="Home"
android:icon="@drawable/ic_winboll"
android:showAsAction="always"/>
</menu>

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyAPPBaseTheme" parent="APPBaseTheme">
<item name="attrColorPrimary">@color/colorPrimary</item>
<item name="themeGlobalCrashActivity">@style/MyGlobalCrashActivityTheme</item>
</style>

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Sat Dec 06 14:56:36 HKT 2025
stageCount=3
#Mon Dec 15 17:51:52 HKT 2025
stageCount=2
libraryProject=libappbase
baseVersion=15.12
publishVersion=15.12.2
baseVersion=15.14
publishVersion=15.14.1
buildCount=0
baseBetaVersion=15.12.3
baseBetaVersion=15.14.2

View File

@@ -3,8 +3,6 @@
xmlns:android="http://schemas.android.com/apk/res/android"
package="cc.winboll.studio.libappbase">
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application>
<activity
android:name=".CrashHandler$CrashActivity"

View File

@@ -1,240 +0,0 @@
package cc.winboll.studio.libappbase;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ListView;
import android.widget.Scroller;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/11/11 20:26
* @Describe 水平滚动 ListView 控件
* 继承自 ListView重写布局和测量逻辑实现子项水平排列和滚动替代默认垂直布局
*/
public class HorizontalListView extends ListView {
/** 日志标签,用于当前控件的日志输出标识 */
public static final String TAG = "HorizontalListView";
/** 子项垂直偏移量(用于调整子项在垂直方向的位置,默认 0 */
private int mVerticalOffset = 0;
/** 平滑滚动控制器(用于实现水平方向的平滑滚动动画) */
private Scroller mScroller;
/** 所有子项总宽度(包含内边距),用于计算滚动范围 */
private int mTotalWidth;
/**
* 构造方法:仅上下文
* @param context 上下文Activity/Fragment
*/
public HorizontalListView(Context context) {
super(context);
init();
}
/**
* 构造方法:上下文 + 自定义属性
* @param context 上下文
* @param attrs 自定义属性集合(如布局文件中设置的属性)
*/
public HorizontalListView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
/**
* 构造方法:上下文 + 自定义属性 + 样式属性
* @param context 上下文
* @param attrs 自定义属性集合
* @param defStyle 样式属性(如系统默认样式)
*/
public HorizontalListView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
/**
* 初始化控件配置
* 初始化滚动控制器,设置滚动条显示状态
*/
private void init() {
// 初始化平滑滚动器(上下文为当前控件所在上下文)
mScroller = new Scroller(getContext());
// 启用水平滚动条(默认显示)
setHorizontalScrollBarEnabled(true);
// 禁用垂直滚动条(水平列表无需垂直滚动)
setVerticalScrollBarEnabled(false);
}
/**
* 设置子项垂直偏移量
* 用于整体调整所有子项在垂直方向的位置(如居中、偏移)
* @param verticalOffset 垂直偏移像素值(正数向下偏移,负数向上偏移)
*/
public void setVerticalOffset(int verticalOffset) {
this.mVerticalOffset = verticalOffset;
}
/**
* 重写布局方法:实现子项水平排列
* 遍历所有子项,按水平方向依次布局(左对齐,叠加排列)
* @param changed 布局是否发生变化true首次布局或尺寸变化false重绘
* @param l 控件左边界坐标
* @param t 控件上边界坐标
* @param r 控件右边界坐标
* @param b 控件下边界坐标
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b); // 执行父类布局逻辑(确保基础配置生效)
int childCount = getChildCount(); // 获取当前可见子项数量
int left = getPaddingLeft(); // 子项起始左坐标(包含控件左内边距)
// 控件可用高度(总高度 - 上下内边距)
int viewHeight = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
mTotalWidth = left; // 初始化总宽度为左内边距
// 遍历子项,水平排列
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i); // 获取当前子项
int childWidth = child.getMeasuredWidth(); // 子项测量宽度
int childHeight = child.getMeasuredHeight(); // 子项测量高度
// 布局子项:水平方向从 left 开始,垂直方向偏移 mVerticalOffset
child.layout(
left, // 子项左边界
mVerticalOffset, // 子项上边界(带垂直偏移)
left + childWidth, // 子项右边界(左 + 宽度)
mVerticalOffset + childHeight // 子项下边界(偏移 + 高度)
);
left += childWidth; // 更新下一个子项的起始左坐标
}
// 计算总宽度(所有子项宽度 + 左右内边距)
mTotalWidth = left + getPaddingRight();
}
/**
* 重写测量方法:设置控件测量规则
* 水平方向:允许无限宽度(适应所有子项总宽度);垂直方向:自适应内容高度
* @param widthMeasureSpec 父控件传递的宽度测量规格
* @param heightMeasureSpec 父控件传递的高度测量规格
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 重写宽度测量规则最大值Integer.MAX_VALUE >> 2 避免溢出),自适应内容
int newWidthMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
// 重写高度测量规则:同上,自适应子项高度
int newHeightMeasureSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
// 执行父类测量逻辑(使用重写后的测量规格)
super.onMeasure(newWidthMeasureSpec, newHeightMeasureSpec);
}
/**
* 重写滚动计算方法:实现平滑滚动
* 配合 Scroller 实现水平方向的平滑滚动动画(需在滚动时调用 invalidate() 触发)
*/
@Override
public void computeScroll() {
// 判断滚动是否正在进行Scroller 计算当前滚动位置)
if (mScroller.computeScrollOffset()) {
// 滚动到当前计算的位置x 轴水平滚动y 轴固定 0
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
// 触发重绘,持续更新滚动状态
postInvalidate();
}
}
/**
* 平滑滚动到指定坐标
* 基于 Scroller 实现水平方向的平滑滚动300ms 动画时长)
* @param x 目标 x 轴坐标(水平滚动位置)
* @param y 目标 y 轴坐标(固定 0无需垂直滚动
*/
public void smoothScrollTo(int x, int y) {
// 计算滚动距离(目标坐标 - 当前滚动坐标)
int dx = x - getScrollX();
int dy = y - getScrollY();
// 启动平滑滚动起始坐标当前滚动位置、滚动距离、动画时长300ms
mScroller.startScroll(getScrollX(), getScrollY(), dx, dy, 300);
// 触发重绘,启动滚动动画
invalidate();
}
/**
* 计算水平滚动总范围(用于滚动条显示比例)
* @return 滚动总宽度(所有子项总宽度 + 内边距)
*/
@Override
public int computeHorizontalScrollRange() {
return mTotalWidth;
}
/**
* 计算当前水平滚动偏移量(用于滚动条位置)
* @return 当前 x 轴滚动坐标
*/
@Override
public int computeHorizontalScrollOffset() {
return getScrollX();
}
/**
* 计算水平滚动可视范围(用于滚动条大小)
* @return 控件可见宽度(当前显示区域宽度)
*/
@Override
public int computeHorizontalScrollExtent() {
return getWidth();
}
/**
* 滚动到指定位置的子项(水平方向)
* 定位目标子项,计算滚动坐标,执行平滑滚动
* @param position 子项索引(从 0 开始,仅当前可见子项有效)
*/
public void scrollToItem(int position) {
// 校验索引有效性(避免数组越界)
if (position < 0 || position >= getChildCount()) {
LogUtils.d(TAG, "无效的子项索引: " + position);
return;
}
View targetView = getChildAt(position); // 获取目标子项
int targetLeft = targetView.getLeft(); // 目标子项左边界坐标
// 计算目标滚动坐标(子项左边界 - 控件左内边距,确保子项左对齐显示)
int scrollX = targetLeft - getPaddingLeft();
// 修正滚动范围(避免超出总宽度或小于 0
int maxScrollX = mTotalWidth - getWidth(); // 最大滚动坐标(总宽度 - 控件宽度)
scrollX = Math.max(0, Math.min(scrollX, maxScrollX));
// 强制重新布局和绘制(确保子项位置正确)
requestLayout();
invalidateViews();
// 平滑滚动到目标坐标
smoothScrollTo(scrollX, 0);
// 打印滚动日志(调试用)
LogUtils.d(TAG, String.format(
"滚动到子项索引: %d, 目标滚动X: %d, 总滚动范围: %d",
position, scrollX, computeHorizontalScrollRange()
));
}
/**
* 重置滚动到起始位置(最左侧)
* 强制重新布局后,平滑滚动到 x=0 坐标
*/
public void resetScrollToStart() {
// 强制重新布局和绘制(确保滚动位置准确)
requestLayout();
invalidateViews();
// 平滑滚动到最左侧x=0y=0
smoothScrollTo(0, 0);
}
}

View File

@@ -24,11 +24,11 @@ import android.widget.EditText;
import android.widget.HorizontalScrollView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.Spinner;
import android.widget.TextView;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.R;
import cc.winboll.studio.libappbase.views.HorizontalListView;
import cc.winboll.studio.libappbase.widget.LogTagSpinner;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
@@ -52,7 +52,7 @@ public class LogView extends RelativeLayout {
TAGListAdapter mTAGListAdapter;
LogViewThread mLogViewThread;
LogViewHandler mLogViewHandler;
Spinner mLogLevelSpinner;
LogTagSpinner mLogLevelSpinner;
ArrayAdapter<CharSequence> mLogLevelSpinnerAdapter;
// 标签列表
HorizontalListView mListViewTags;
@@ -116,6 +116,7 @@ public class LogView extends RelativeLayout {
// 获取Log Level spinner实例
mLogLevelSpinner = findViewById(cc.winboll.studio.libappbase.R.id.viewlogSpinner1);
metTagSearch.setTextColor(mContext.getResources().getColor(R.color.white));
metTagSearch.addTextChangedListener(new TextWatcher() {
@Override
@@ -178,20 +179,25 @@ public class LogView extends RelativeLayout {
});
// 设置日志级别列表
ArrayList<String> adapterItems = new ArrayList<>();
for (LogUtils.LOG_LEVEL e : LogUtils.LOG_LEVEL.values()) {
adapterItems.add(e.name());
}
// ArrayList<String> adapterItems = new ArrayList<>();
// for (LogUtils.LOG_LEVEL e : LogUtils.LOG_LEVEL.values()) {
// adapterItems.add(e.name());
// }
String[] mLogLevelSpinnerData = new String[LogUtils.LOG_LEVEL.values().length];
for (int i = 0; i < LogUtils.LOG_LEVEL.values().length; i++) {
mLogLevelSpinnerData[i] = LogUtils.LOG_LEVEL.values()[i].name();
}
mLogLevelSpinner.setLogTagData(mLogLevelSpinnerData);
// 假设你有一个字符串数组作为选项列表
//String[] options = {"Option 1", "Option 2", "Option 3"};
// 创建一个ArrayAdapter来绑定数据到spinner
mLogLevelSpinnerAdapter = ArrayAdapter.createFromResource(
context, cc.winboll.studio.libappbase.R.array.enum_loglevel_array, android.R.layout.simple_spinner_item);
mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// mLogLevelSpinnerAdapter = ArrayAdapter.createFromResource(
// context, cc.winboll.studio.libappbase.R.array.enum_loglevel_array, android.R.layout.simple_spinner_item);
// mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 设置适配器并将它应用到spinner上
mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉视图样式
mLogLevelSpinner.setAdapter(mLogLevelSpinnerAdapter);
// // 设置适配器并将它应用到spinner上
// mLogLevelSpinnerAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 设置下拉视图样式
// mLogLevelSpinner.setAdapter(mLogLevelSpinnerAdapter);
// 为Spinner添加监听器
mLogLevelSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
@@ -235,6 +241,14 @@ public class LogView extends RelativeLayout {
mTAGListAdapter.notifyDataSetChanged();
mSelectAllTAGCheckBox = findViewById(cc.winboll.studio.libappbase.R.id.viewlogCheckBox1);
ViewGroup.LayoutParams layoutParams2 = mSelectAllTAGCheckBox.getLayoutParams();
if (layoutParams2 != null) {
layoutParams2.width = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams2.height = 75;
}
mSelectAllTAGCheckBox.setLayoutParams(layoutParams2);
//mSelectAllTAGCheckBox.setPadding(0,0,0,0);
mSelectAllTAGCheckBox.setTextColor(mContext.getResources().getColor(R.color.white));
mSelectAllTAGCheckBox.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
@@ -247,6 +261,8 @@ public class LogView extends RelativeLayout {
});
mLogLevelSpinner.updateTextSize(R.dimen.log_spinner_text_size);
// 设置滚动时不聚焦日志
setDescendantFocusability(ViewGroup.FOCUS_BLOCK_DESCENDANTS);
}
@@ -479,7 +495,17 @@ public class LogView extends RelativeLayout {
final TAGItemModel item = itemList.get(position);
holder.tvText.setText(item.getTag());
ViewGroup.LayoutParams layoutParams = holder.tvText.getLayoutParams();
if (layoutParams != null) {
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
layoutParams.height = 75;
}
holder.tvText.setLayoutParams(layoutParams);
holder.tvText.setPadding(0,0,0,0);
holder.tvText.setTextColor(mContext.getResources().getColor(R.color.white));
holder.cbChecked.setChecked(item.isChecked());
holder.cbChecked.setLayoutParams(layoutParams);
holder.cbChecked.setPadding(0,0,0,0);
holder.cbChecked.setOnClickListener(new View.OnClickListener(){
@Override

View File

@@ -0,0 +1,248 @@
package cc.winboll.studio.libappbase.widget;
import android.content.Context;
import android.graphics.Color;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.R;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/12/15 13:51
* @Describe 纯原生 LogTag 专属 Spinner无 androidx 依赖)
* 核心特性1. 继承原生 Spinner适配全 Android 版本2. dimen 统一配置所有尺寸3. 文字大小支持 dp 单位4. 简化外部初始化
*/
public class LogTagSpinner extends Spinner {
public static final String TAG = "LogTagSpinner";
Context mContext;
// 尺寸缓存dimen 解析后转 px避免重复计算
private int mSpinnerWidth; // 控件自身框度px
private int mSpinnerHeight; // 控件自身高度px
private int mItemWidth; // 下拉项单个高度px
private int mItemHeight; // 下拉项单个高度px
private float mTextSizePx; // 文字大小pxdp 转译后)
private int mTextPadding; // 文字左右内边距px
// 内置适配器(外部无需关心内部实现)
private ArrayAdapter<String> mLogTagAdapter;
// -------------------------- 构造方法(原生 Spinner 必重写 3 个)--------------------------
public LogTagSpinner(Context context) {
super(context);
initCoreLogic(context);
}
public LogTagSpinner(Context context, AttributeSet attrs) {
super(context, attrs);
initCoreLogic(context);
}
public LogTagSpinner(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initCoreLogic(context);
}
// -------------------------- 核心初始化(解析资源 + 配置样式 + 初始化适配器)--------------------------
private void initCoreLogic(Context context) {
this.mContext = context;
// 1. 读取 dimen 资源dp 转 px核心适配
parseDimenResources();
// 2. 设置 Spinner 自身基础样式(高度、背景)
configSelfStyle();
// 3. 初始化适配器(统一选中项+下拉项样式)
initCustomAdapter();
}
/**
* 步骤 1解析 dimen 资源,所有 dp 单位转为 px跨设备视觉一致
*/
private void parseDimenResources() {
Context context = this.mContext;
// 控件自身宽度dp → px
mSpinnerWidth = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_width);
// 控件自身高度dp → px
mSpinnerHeight = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_height);
// 下拉项宽度dp → px
mItemWidth = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_item_width);
// 下拉项高度dp → px
mItemHeight = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_item_height);
// 文字大小dp → px核心用 getDimensionPixelSize 确保 dp 精准转译)
mTextSizePx = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_text_size);
// 文字内边距dp → px
mTextPadding = context.getResources().getDimensionPixelSize(R.dimen.log_spinner_text_padding);
LogUtils.d("LogTagSpinner", "dimen 解析完成:高度=" + mSpinnerHeight + "px文字大小=" + mTextSizePx + "px");
}
/**
* 步骤 2配置 Spinner 自身样式(覆盖布局属性,统一控制)
*/
private void configSelfStyle() {
// 动态设置控件高度(布局中 layout_height 设 wrap_content 即可,这里统一控制)
ViewGroup.LayoutParams layoutParams = getLayoutParams();
if (layoutParams != null) {
layoutParams.width = mSpinnerWidth;
layoutParams.height = mSpinnerHeight;
} else {
// 代码创建控件时,手动初始化布局参数
layoutParams = new ViewGroup.LayoutParams(
mSpinnerWidth,
mSpinnerHeight
);
}
setLayoutParams(layoutParams);
// 统一背景色(外部可通过 setBackground 手动覆盖)
setBackgroundColor(this.mContext.getColor(R.color.btn_gray_normal));
}
/**
* 步骤 3初始化自定义适配器统一选中项+下拉项样式
*/
private void initCustomAdapter() {
// 用原生系统布局(避免自定义布局,减少依赖),后续重写样式
mLogTagAdapter = new ArrayAdapter<String>(this.mContext, android.R.layout.simple_spinner_item) {
// 重写:控制「已选中项」的样式(文字大小、高度、内边距)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView itemTv = (TextView) super.getView(position, convertView, parent);
setItemUniformStyle(itemTv);
return itemTv;
}
// 重写:控制「下拉列表项」的样式(必须重写,否则下拉项样式不生效)
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
TextView itemTv = (TextView) super.getDropDownView(position, convertView, parent);
setItemUniformStyle(itemTv);
return itemTv;
}
};
// 绑定下拉项布局(原生系统布局,确保低版本兼容)
mLogTagAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// 设置适配器到 Spinner
setAdapter(mLogTagAdapter);
}
/**
* 通用方法:统一设置列表项(选中项/下拉项)的样式
*/
private void setItemUniformStyle(TextView itemTv) {
if (itemTv == null) return;
// 1. 文字大小(核心:按 px 赋值dp 转译后无二次换算,精准适配)
itemTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSizePx);
// 2. 列表项高度(固定高度,避免文字多少导致高度不一致)
itemTv.setWidth(mItemWidth);
itemTv.setHeight(mItemHeight);
// 3. 内边距(左右留白,优化排版,避免文字贴边)
itemTv.setPadding(mTextPadding, 0, mTextPadding, 0);
// 4. 文字对齐(垂直居中+靠左,符合常规 UI 设计)
//itemTv.setGravity(View.GRAVITY_CENTER_VERTICAL | View.GRAVITY_START);
// 5. 文字颜色(统一深色,可改为项目颜色资源)
itemTv.setTextColor(this.mContext.getColor(R.color.white));
itemTv.setBackgroundColor(this.mContext.getColor(R.color.btn_gray_normal));
// 6. 文字溢出处理(最多 2 行,超出省略,避免长标签换行过多)
itemTv.setSingleLine(false);
itemTv.setMaxLines(2);
itemTv.setEllipsize(TextUtils.TruncateAt.END);
}
// -------------------------- 外部调用 API极简用法无需关心内部逻辑--------------------------
/**
* 填充日志标签数据(外部核心调用,一行代码搞定)
* @param logTagArray 日志标签数组(如:{"TAG_MAIN", "TAG_NET", "TAG_DB"}
*/
public void setLogTagData(String[] logTagArray) {
if (mLogTagAdapter == null || logTagArray == null || logTagArray.length == 0) {
LogUtils.w("LogTagSpinner", "填充数据失败:适配器为空或数据无效");
return;
}
// 清空旧数据,添加新数据,刷新适配器
mLogTagAdapter.clear();
mLogTagAdapter.addAll(logTagArray);
mLogTagAdapter.notifyDataSetChanged();
}
/**
* 设置默认选中的标签(索引从 0 开始)
* @param defaultIndex 默认选中索引(需在 setLogTagData 之后调用)
*/
public void setDefaultSelectedTag(int defaultIndex) {
if (mLogTagAdapter == null) return;
// 索引合法性校验,避免数组越界
if (defaultIndex >= 0 && defaultIndex < mLogTagAdapter.getCount()) {
setSelection(defaultIndex);
LogUtils.d("LogTagSpinner", "默认选中标签:" + mLogTagAdapter.getItem(defaultIndex));
} else {
LogUtils.w("LogTagSpinner", "默认选中索引无效:" + defaultIndex);
}
}
/**
* 获取当前选中的日志标签(外部业务逻辑调用)
* @return 当前选中的标签文字(无选中时返回空字符串)
*/
public String getCurrentSelectedTag() {
Object selectedItem = getSelectedItem();
return selectedItem != null ? selectedItem.toString() : "";
}
// -------------------------- 优化扩展(可选,提升稳定性)--------------------------
/**
* 视图附着到窗口时,确保默认有数据(避免空指针)
*/
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
if (mLogTagAdapter != null && mLogTagAdapter.getCount() == 0) {
setLogTagData(new String[]{"默认标签"});
}
}
/**
* 外部扩展动态修改文字大小dp 单位)
* @param textSizeDp 目标文字大小dp
*/
public void updateTextSize(int textSizeDp) {
mTextSizePx = this.mContext.getResources().getDimensionPixelSize(textSizeDp);
// 刷新所有列表项样式
if (mLogTagAdapter != null) {
mLogTagAdapter.notifyDataSetChanged();
}
}
/**
* 外部扩展:动态修改文字颜色
* @param textColorRes 文字颜色资源 ID如 R.color.red
*/
public void updateTextColor(int textColorRes) {
int textColor = this.mContext.getResources().getColor(textColorRes);
// 刷新选中项颜色
TextView selectedTv = (TextView) getSelectedView();
if (selectedTv != null) {
selectedTv.setTextColor(textColor);
}
// 刷新下拉项颜色
if (mLogTagAdapter != null) {
mLogTagAdapter.notifyDataSetChanged();
}
}
}

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- 按钮状态选择器:按优先级匹配(按压 > 禁用 > 默认) -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 状态 1按压时手指按住→ 深灰色 -->
<item android:color="@color/btn_gray_pressed" android:state_pressed="true"/>
<!-- 状态 2禁用时setEnabled(false))→ 浅灰色 -->
<item android:color="@color/btn_gray_disabled" android:state_enabled="false"/>
<!-- 状态 3默认态正常可点击→ 常规灰色 -->
<item android:color="@color/btn_gray_normal"/>
</selector>

View File

@@ -9,13 +9,15 @@
<TextView
android:layout_width="wrap_content"
android:layout_height="@dimen/button_height"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:layout_marginLeft="5dp"
android:id="@+id/viewlogtagTextView1"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="@dimen/button_height"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:id="@+id/viewlogtagCheckBox1"/>
</LinearLayout>

View File

@@ -7,58 +7,64 @@
android:background="#FF000000">
<RelativeLayout
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_height="34dp"
android:layout_alignParentTop="true"
android:background="@drawable/bg_toolbar_log"
android:id="@+id/viewlogRelativeLayoutToolbar">
<Button
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_width="@dimen/log_button_width"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:text="Clean"
android:textSize="14dp"
android:textColor="@color/white"
android:backgroundTint="@drawable/btn_gray_bg"
android:layout_centerVertical="true"
android:id="@+id/viewlogButtonClean"
android:layout_marginLeft="5dp"/>
<TextView
android:background="#FF000000"
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_height="20dp"
android:textSize="@dimen/log_text_size"
android:padding="@dimen/log_text_padding"
android:text="LV:"
android:layout_toRightOf="@+id/viewlogButtonClean"
android:layout_centerVertical="true"
android:id="@+id/viewlogTextView1"
android:textColor="#FFFFFFFF"/>
android:background="@color/btn_gray_normal"
android:textColor="@color/black"/>
<Spinner
android:background="#FFFFFFFF"
<cc.winboll.studio.libappbase.widget.LogTagSpinner
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/viewlogTextView1"
android:layout_centerVertical="true"
android:id="@+id/viewlogSpinner1"/>
android:id="@+id/viewlogSpinner1"
android:padding="@dimen/log_spinner_text_padding"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="24dp"
android:layout_width="@dimen/log_checkbox_width"
android:layout_height="@dimen/log_checkbox_height"
android:textSize="@dimen/log_text_size"
android:layout_toLeftOf="@+id/viewlogButtonCopy"
android:layout_centerVertical="true"
android:text="Selectable"
android:background="#FFFFFFFF"
android:paddingRight="10dp"
android:textSize="16dp"
android:id="@+id/viewlogCheckBoxSelectable"/>
android:background="@color/btn_gray_normal"
android:id="@+id/viewlogCheckBoxSelectable"
android:padding="@dimen/log_text_padding"
android:textColor="@color/white"/>
<Button
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_width="@dimen/log_button_width"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:textColor="@color/white"
android:backgroundTint="@drawable/btn_gray_bg"
android:text="Copy"
android:layout_alignParentRight="true"
android:textSize="14dp"
android:layout_centerVertical="true"
android:id="@+id/viewlogButtonCopy"
android:layout_marginRight="5dp"/>
@@ -68,7 +74,7 @@
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_height="@dimen/log_button_height"
android:layout_below="@+id/viewlogRelativeLayoutToolbar"
android:id="@+id/viewlogLinearLayout1"
android:gravity="center_vertical"
@@ -76,8 +82,10 @@
<CheckBox
android:layout_width="wrap_content"
android:layout_height="@dimen/button_height"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:text="ALL"
android:padding="2dp"
android:id="@+id/viewlogCheckBox1"
android:background="@drawable/bg_border_round"
android:layout_marginLeft="5dp"
@@ -86,7 +94,8 @@
<EditText
android:layout_width="50dp"
android:ems="10"
android:layout_height="wrap_content"
android:layout_height="@dimen/log_button_height"
android:textSize="@dimen/log_text_size"
android:singleLine="true"
android:id="@+id/tagsearch_et"/>
@@ -95,7 +104,7 @@
android:layout_height="match_parent"
android:background="@drawable/bg_border"
android:scrollbars="none"
android:padding="5dp"
android:padding="2dp"
android:layout_weight="1.0"
android:id="@+id/viewlogHorizontalScrollView1">
@@ -125,6 +134,7 @@
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize="@dimen/log_text_size"
android:text="Text"
android:textColor="#FF00FF00"
android:textIsSelectable="true"

View File

@@ -1,7 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="attrColorPrimary" format="color" />
<attr name="themeGlobalCrashActivity" format="reference"/>

View File

@@ -4,5 +4,71 @@
<color name="colorPrimaryDark">#FF005C12</color>
<color name="colorAccent">#FF8DFFA2</color>
<color name="colorText">#FFFFFB8D</color>
<!-- 通知按钮颜色(启用/禁用) -->
<color name="colorTextBackgound">#FF000000</color>
<!-- ============== 基础黑白(必含,适配文字/背景) ============== -->
<color name="white">#FFFFFF</color> <!-- 纯白色(文字/背景) -->
<color name="black">#000000</color> <!-- 近黑色(重要文字) -->
<!-- ============== 基础色系(按钮/强调色常用) ============== -->
<!-- 蓝色系(常用:确认/链接/主题色) -->
<color name="blue_light">#4A90E2</color> <!-- 浅蓝(次要按钮) -->
<color name="blue_normal">#2196F3</color> <!-- 标准蓝(主题/确认按钮) -->
<color name="blue_dark">#1976D2</color> <!-- 深蓝(按压态/重要强调) -->
<!-- 绿色系(常用:成功/完成/安全提示) -->
<color name="green_light">#66BB6A</color> <!-- 浅绿(次要成功态) -->
<color name="green_normal">#4CAF50</color> <!-- 标准绿(成功按钮/提示) -->
<color name="green_dark">#388E3C</color> <!-- 深绿(按压态/重要成功) -->
<!-- 红色系(常用:错误/警告/删除按钮) -->
<color name="red_light">#EF5350</color> <!-- 浅红(次要错误提示) -->
<color name="red_normal">#F44336</color> <!-- 标准红(删除/错误按钮) -->
<color name="red_dark">#D32F2F</color> <!-- 深红(按压态/重要错误) -->
<!-- 黄色系(常用:警告/提醒/高亮) -->
<color name="yellow_light">#FFF59D</color> <!-- 浅黄(次要提醒) -->
<color name="yellow_normal">#FFC107</color> <!-- 标准黄(警告提示/高亮) -->
<color name="yellow_dark">#FFA000</color> <!-- 深黄(重要警告) -->
<!-- 橙色系(常用:提醒/进度/活力色) -->
<color name="orange_normal">#FF9800</color> <!-- 标准橙(提醒按钮/进度) -->
<!-- 紫色系(常用:特殊强调/个性按钮) -->
<color name="purple_normal">#9C27B0</color> <!-- 标准紫(特殊功能按钮) -->
<!-- ============== 透明色(遮罩/背景叠加) ============== -->
<color name="transparent">#00000000</color> <!-- 全透明 -->
<color name="black_transparent_50">#80000000</color> <!-- 50%透明黑(遮罩) -->
<!-- 1. 不透明灰色(常用深浅梯度,直接用) -->
<color name="gray_100">#F5F5F5</color> <!-- 极浅灰(接近白色,背景用) -->
<color name="gray_200">#EEEEEE</color> <!-- 浅灰(卡片/分割线背景) -->
<color name="gray_300">#E0E0E0</color> <!-- 中浅灰(边框/次要背景) -->
<color name="gray_400">#BDBDBD</color> <!-- 中灰(次要文字/图标) -->
<color name="gray_500">#9E9E9E</color> <!-- 标准中灰(常用辅助文字) -->
<color name="gray_600">#757575</color> <!-- 中深灰(常规辅助文字) -->
<color name="gray_700">#616161</color> <!-- 深灰(重要辅助文字) -->
<color name="gray_800">#424242</color> <!-- 极深灰(接近黑色,标题副文本) -->
<color name="gray_900">#212121</color> <!-- 近黑色(特殊场景用) -->
<!-- 2. 半透明灰色(带透明度,遮罩/蒙层用) -->
<color name="gray_transparent_30">#4D9E9E9E</color> <!-- 30%透明中灰A=4D -->
<color name="gray_transparent_50">#809E9E9E</color> <!-- 50%透明中灰A=80 -->
<color name="gray_transparent_70">#B39E9E9E</color> <!-- 70%透明中灰A=B3 -->
<color name="gray_light">#EEE</color> <!-- 等价 #EEEEEE浅灰 -->
<color name="gray_mid">#999</color> <!-- 等价 #999999中灰 -->
<color name="gray_dark">#666</color> <!-- 等价 #666666深灰 -->
<color name="gray_black">#333</color> <!-- 等价 #333333极深灰 -->
<!-- 50% 透明中灰(弹窗遮罩常用) -->
<color name="mask_gray">#809E9E9E</color>
<!-- 30% 透明深灰(背景叠加) -->
<color name="bg_overlay_gray">#4D424242</color>
<!-- 1. 常规灰色(按钮默认态,常用中灰) -->
<color name="btn_gray_normal">#9E9E9E</color>
<!-- 2. 按压深色(按钮点击态,加深一级,提升交互感) -->
<color name="btn_gray_pressed">#757575</color>
<!-- 3. 禁用灰色(按钮不可点击态,浅灰) -->
<color name="btn_gray_disabled">#E0E0E0</color>
</resources>

View File

@@ -1,9 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- 定义一个名为text_size_normal的尺寸值为16sp -->
<dimen name="text_size_normal">16sp</dimen>
<!-- 定义一个名为margin_small的尺寸值为8dp -->
<dimen name="margin_small">8dp</dimen>
<!-- 定义一个名为image_width的尺寸值为200dp -->
<dimen name="button_height">24dp</dimen>
<dimen name="log_text_size">12dp</dimen>
<dimen name="log_text_padding">2dp</dimen>
<dimen name="log_button_width">65dp</dimen>
<dimen name="log_button_height">34dp</dimen>
<dimen name="log_checkbox_width">100dp</dimen>
<dimen name="log_checkbox_height">20dp</dimen>
<dimen name="log_spinner_width">60dp</dimen>
<dimen name="log_spinner_height">16dp</dimen>
<dimen name="log_spinner_item_width">@dimen/log_spinner_width</dimen>
<dimen name="log_spinner_item_height">@dimen/log_spinner_height</dimen>
<dimen name="log_spinner_text_size">@dimen/log_text_size</dimen>
<dimen name="log_spinner_text_padding">@dimen/log_text_padding</dimen>
</resources>

34
winboll/README.md Normal file
View File

@@ -0,0 +1,34 @@
# WinBoLL
#### 介绍
WinBoLL 网站浏览器。
#### 软件架构
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。
#### Gradle 编译说明
调试版编译命令 gradle assembleBetaDebug
阶段版编译命令 bash .winboll/bashPublishAPKAddTag.sh winboll
#### 使用说明
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
#### 参考文档

View File

@@ -81,8 +81,13 @@ dependencies {
api 'com.github.bumptech.glide:glide:4.9.0'
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
api 'cc.winboll.studio:libaes:15.11.8'
api 'cc.winboll.studio:libappbase:15.11.6'
// WinBoLL库 nexus.winboll.cc 地址
//api 'cc.winboll.studio:libaes:15.12.0'
//api 'cc.winboll.studio:libappbase:15.12.2'
// WinBoLL备用库 jitpack.io 地址
api 'com.github.ZhanGSKen:AES:aes-v15.12.1'
api 'com.github.ZhanGSKen:APPBase:appbase-v15.12.2'
api fileTree(dir: 'libs', include: ['*.jar'])
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Fri Dec 05 12:58:53 GMT 2025
stageCount=6
#Sun Dec 07 04:17:43 GMT 2025
stageCount=8
libraryProject=
baseVersion=15.11
publishVersion=15.11.5
buildCount=20
baseBetaVersion=15.11.6
publishVersion=15.11.7
buildCount=1
baseBetaVersion=15.11.8

View File

@@ -14,8 +14,8 @@
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher_stage"
android:roundIcon="@drawable/ic_launcher_stage"
android:icon="@drawable/ic_launcher"
android:roundIcon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/MyAppTheme"
android:resizeableActivity="true"
@@ -37,7 +37,7 @@
android:targetActivity=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:icon="@drawable/ic_launcher_stage"
android:icon="@drawable/ic_launcher"
android:enabled="true">
<intent-filter>
@@ -280,4 +280,4 @@
</application>
</manifest>
</manifest>

View File

@@ -59,6 +59,7 @@ public class App extends GlobalApplication {
public void onCreate() {
super.onCreate();
setIsDebugging(BuildConfig.DEBUG);
//setIsDebugging(false);
WinBoLLActivityManager.init(this);

View File

@@ -2,6 +2,7 @@ package cc.winboll.studio.winboll;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
@@ -9,37 +10,38 @@ import android.view.View;
import android.widget.AdapterView;
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.models.APPInfo;
import cc.winboll.studio.libaes.models.DrawerMenuBean;
import cc.winboll.studio.libaes.unittests.TestAButtonFragment;
import cc.winboll.studio.libaes.unittests.TestViewPageFragment;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.winboll.R;
import cc.winboll.studio.winboll.activities.AboutActivity;
import cc.winboll.studio.winboll.activities.SettingsActivity;
import cc.winboll.studio.winboll.fragments.BrowserFragment;
import java.util.ArrayList;
import android.content.Intent;
import cc.winboll.studio.libaes.activitys.AboutActivity;
public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActivity {
public class MainActivity extends DrawerFragmentActivity {
public static final String TAG = "MainActivity";
BrowserFragment mBrowserFragment;
@Override
public Activity getActivity() {
return null;
}
@Override
public String getTag() {
return TAG;
}
// ------------------- 新增Handler 消息定义接收URL历史更新消息 -------------------
// 消息标识URL加载历史更新刷新抽屉菜单的历史列表
public static final int MSG_URLLOADHISTORY_UPDATE = 1002;
// 自定义Handler接收应用内消息如BrowserFragment发送的历史更新消息
private static Handler _mMainHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// ------------------- 新增初始化MainActivity的Handler关键 -------------------
initMainHandler();
if (mBrowserFragment == null) {
mBrowserFragment = new BrowserFragment();
addFragment(mBrowserFragment);
@@ -47,28 +49,75 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActi
showFragment(mBrowserFragment);
}
public static void sendMessage(Message msg) {
_mMainHandler.sendMessage(msg);
}
/**
* 初始化Handler接收MSG_URLLOADHISTORY_UPDATE消息刷新抽屉历史菜单
*/
private void initMainHandler() {
// 清理旧数据
if (_mMainHandler != null) {
_mMainHandler.removeCallbacksAndMessages(null);
_mMainHandler = null;
}
// Java 7 匿名内部类实现Handler主线程创建安全更新UI/抽屉菜单)
_mMainHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_URLLOADHISTORY_UPDATE:
// 处理URL历史更新消息刷新抽屉菜单的历史列表
LogUtils.d(TAG, "收到URL历史更新消息刷新抽屉菜单");
refreshUrlHistoryDrawerMenu();
break;
default:
break;
}
}
};
}
@Override
public void initDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
super.initDrawerMenuItemList(listDrawerMenu);
LogUtils.d(TAG, "initDrawerMenuItemList");
//listDrawerMenu.clear();
// 添加抽屉菜单项
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
//LogUtils.d(TAG, "initDrawerMenuItemList");
// 加载URL历史菜单初始化时加载
refreshUrlHistoryDrawerMenu();
notifyDrawerMenuDataChanged();
}
@Override
public void reinitDrawerMenuItemList(ArrayList<DrawerMenuBean> listDrawerMenu) {
super.reinitDrawerMenuItemList(listDrawerMenu);
LogUtils.d(TAG, "reinitDrawerMenuItemList");
//listDrawerMenu.clear();
// 添加抽屉菜单项
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestAButtonFragment.TAG));
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, TestViewPageFragment.TAG));
//LogUtils.d(TAG, "reinitDrawerMenuItemList");
// 重新加载URL历史菜单菜单重置时加载
refreshUrlHistoryDrawerMenu();
notifyDrawerMenuDataChanged();
}
void loadUrlLoadHistotyMenu(ArrayList<DrawerMenuBean> listDrawerMenu) {
listDrawerMenu.clear();
if (BrowserFragment._mUrlLoadHistory != null) {
for (String url : BrowserFragment._mUrlLoadHistory) {
listDrawerMenu.add(new DrawerMenuBean(R.drawable.ic_launcher, url));
}
}
}
// ------------------- 新增刷新URL历史抽屉菜单提取独立方法复用 -------------------
private void refreshUrlHistoryDrawerMenu() {
// 获取抽屉菜单列表,重新加载历史数据并刷新
ArrayList<DrawerMenuBean> drawerMenuList = super.malDrawerMenuItem; // 假设父类提供获取菜单列表的方法
if (drawerMenuList != null) {
loadUrlLoadHistotyMenu(drawerMenuList); // 重新加载更新后的历史数据
notifyDrawerMenuDataChanged(); // 通知抽屉菜单刷新UI
}
}
@Override
public DrawerFragmentActivity.ActivityType initActivityType() {
return DrawerFragmentActivity.ActivityType.Main;
@@ -77,50 +126,75 @@ public class MainActivity extends DrawerFragmentActivity implements IWinBoLLActi
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar_main, menu);
// if (App.isDebugging()) {
// getMenuInflater().inflate(cc.winboll.studio.libapputils.R.menu.toolbar_studio_debug, menu);
// }
return super.onCreateOptionsMenu(menu);
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
super.onItemClick(parent, view, position, id);
switch (position) {
case 0 : {
if (mBrowserFragment == null) {
mBrowserFragment = new BrowserFragment();
addFragment(mBrowserFragment);
}
showFragment(mBrowserFragment);
break;
}
if (mBrowserFragment != null && mBrowserFragment.getBrowserHandler() != null) {
Message msg = Message.obtain();
msg.what = BrowserFragment.MSG_HISTORY_POSITION;
msg.obj = position;
mBrowserFragment.getBrowserHandler().sendMessage(msg);
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int nItemId = item.getItemId();
if(item.getItemId() == R.id.item_home) {
// 关键:获取BrowserFragment的Handler
if (nItemId == R.id.item_home) {
// 发送MSG_HOMEPAGE消息给BrowserFragment
if (mBrowserFragment != null && mBrowserFragment.getBrowserHandler() != null) {
// 创建消息Java 7 显式创建Message
Message msg = Message.obtain();
msg.what = BrowserFragment.MSG_HOMEPAGE; // 指定消息标识
// 发送消息可携带数据如msg.obj = "额外参数";
msg.what = BrowserFragment.MSG_HOMEPAGE;
mBrowserFragment.getBrowserHandler().sendMessage(msg);
}
}if (item.getItemId() == R.id.item_settings) {
} else if (nItemId == R.id.item_settings) {
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), SettingsActivity.class);
} else if (item.getItemId() == R.id.item_log) {
WinBoLLActivityManager.getInstance().startLogActivity(getApplicationContext());
} else if (nItemId == R.id.item_about) {
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), AboutActivity.class);
return true;
}
} else if (nItemId == cc.winboll.studio.libaes.R.id.item_about) {
Intent intent = new Intent(getApplicationContext(), AboutActivity.class);
APPInfo appInfo = genDefaultAPPInfo();
intent.putExtra(AboutActivity.EXTRA_APPINFO, appInfo);
WinBoLLActivityManager.getInstance().startWinBoLLActivity(getApplicationContext(), intent, AboutActivity.class);
} else {
return super.onOptionsItemSelected(item);
}
return super.onOptionsItemSelected(item);
return true;
}
APPInfo genDefaultAPPInfo() {
String szBranchName = "winboll";
APPInfo appInfo = new APPInfo();
appInfo.setAppName("WinBoLL");
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
appInfo.setAppDescription("WinBoLL 网站浏览器。");
appInfo.setAppGitName("WinBoLL");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=WinBoLL");
appInfo.setAppAPKName("WinBoLL");
appInfo.setAppAPKFolderName("WinBoLL");
return appInfo;
}
// ------------------- 新增对外提供Handler供其他组件发送消息如BrowserFragment -------------------
public Handler getMainHandler() {
return _mMainHandler;
}
// ------------------- 新增生命周期管理防止Handler内存泄漏 -------------------
@Override
protected void onDestroy() {
super.onDestroy();
// 清除Handler所有消息和回调避免内存泄漏
if (_mMainHandler != null) {
_mMainHandler.removeCallbacksAndMessages(null);
_mMainHandler = null;
}
}
}

View File

@@ -1,103 +0,0 @@
package cc.winboll.studio.winboll.activities;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/09/29 13:30
* @Describe 应用介绍窗口
*/
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.winboll.BuildConfig;
import cc.winboll.studio.winboll.R;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.models.APPInfo;
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
import cc.winboll.studio.libaes.views.AboutView;
public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
public static final String TAG = "AboutActivity";
Context mContext;
Toolbar mToolbar;
@Override
public Activity getActivity() {
return this;
}
@Override
public String getTag() {
return TAG;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.activity_about);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
mToolbar.setSubtitle(TAG);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
AboutView aboutView = CreateAboutView();
// 在 Activity 的 onCreate 或其他生命周期方法中调用
// LinearLayout layout = new LinearLayout(this);
// layout.setOrientation(LinearLayout.VERTICAL);
// // 创建布局参数(宽度和高度)
// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
// ViewGroup.LayoutParams.MATCH_PARENT,
// ViewGroup.LayoutParams.MATCH_PARENT
// );
// addContentView(aboutView, params);
LinearLayout layout = findViewById(R.id.aboutviewroot_ll);
// 创建布局参数(宽度和高度)
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT
);
layout.addView(aboutView, params);
WinBoLLActivityManager.getInstance().add(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
WinBoLLActivityManager.getInstance().registeRemove(this);
}
public AboutView CreateAboutView() {
String szBranchName = "winboll";
APPInfo appInfo = new APPInfo();
appInfo.setAppName("WinBoLL");
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
appInfo.setAppDescription("WinBoLL Description");
appInfo.setAppGitName("APPBase");
appInfo.setAppGitOwner("Studio");
appInfo.setAppGitAPPBranch(szBranchName);
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=3&extra=page%3D1");
appInfo.setAppAPKName("WinBoLL");
appInfo.setAppAPKFolderName("WinBoLL");
//appInfo.setIsAddDebugTools(false);
//appInfo.setIsAddDebugTools(BuildConfig.DEBUG);
return new AboutView(mContext, appInfo);
}
}

View File

@@ -15,8 +15,11 @@ import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import cc.winboll.studio.winboll.MainActivity;
import cc.winboll.studio.winboll.R;
import cc.winboll.studio.winboll.views.WinBoLLView;
import java.util.ArrayList;
import android.app.Activity;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
@@ -35,10 +38,13 @@ public class BrowserFragment extends Fragment implements View.OnClickListener, W
private Button mBtnBack;
private ProgressBar mProgressBar;
private WinBoLLView mWinBoLLView;
public static ArrayList<String> _mUrlLoadHistory = new ArrayList<String>();
// ------------------- 新增Handler 消息定义(应用内通信) -------------------
// 消息标识跳转首页winboll.cc
public static final int MSG_HOMEPAGE = 1001;
// 跳转到历史记录位置
public static final int MSG_HISTORY_POSITION = 1002;
// 自定义Handler接收应用内其他页面发送的消息
private Handler mBrowserHandler;
@@ -52,6 +58,9 @@ public class BrowserFragment extends Fragment implements View.OnClickListener, W
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// 加载布局Java 7 显式强转,无菱形语法)
View view = inflater.inflate(R.layout.fragment_browser, container, false);
// 清理旧历史记录
_mUrlLoadHistory.clear();
// 初始化控件
initViews(view);
// 绑定事件
@@ -129,7 +138,16 @@ public class BrowserFragment extends Fragment implements View.OnClickListener, W
mEtUrl.setText(homeUrl);
showToast("已跳转至首页");
break;
// 可扩展添加其他消息标识如MSG_OPEN_URL、MSG_REFRESH等
case MSG_HISTORY_POSITION:
int position = (int)msg.obj;
if(-1 < position && position < _mUrlLoadHistory.size()) {
// 处理“跳转首页”消息加载winboll.cc
String historyUrl = _mUrlLoadHistory.get(position);
mWinBoLLView.loadUrlSafe(historyUrl);
mEtUrl.setText(historyUrl);
//showToast("已跳转至" + historyUrl);
}
break;
default:
break;
}
@@ -221,6 +239,7 @@ public class BrowserFragment extends Fragment implements View.OnClickListener, W
// 页面加载完成更新输入框URL
if (mEtUrl != null && url != null) {
mEtUrl.setText(url);
addUrlToHistory(url);
}
}
@@ -273,5 +292,28 @@ public class BrowserFragment extends Fragment implements View.OnClickListener, W
mBrowserHandler = null;
}
}
// 在 BrowserFragment 中添加以下代码Java 7 语法)
/**
* 发送URL历史更新消息给MainActivity当历史列表变化时调用
*/
private void sendUrlHistoryUpdateMsg() {
Message msg = Message.obtain();
msg.what = MainActivity.MSG_URLLOADHISTORY_UPDATE;
MainActivity.sendMessage(msg);
}
// 调用时机示例在BrowserFragment加载URL并更新历史列表后调用
// 假设BrowserFragment中有添加URL到历史的方法
private void addUrlToHistory(String url) {
if (_mUrlLoadHistory == null) {
_mUrlLoadHistory = new ArrayList<String>();
}
if (!_mUrlLoadHistory.contains(url)) {
_mUrlLoadHistory.add(0, url);
// 关键添加历史后发送更新消息通知MainActivity刷新抽屉菜单
sendUrlHistoryUpdateMsg();
}
}
}

View File

@@ -1,34 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ff000000"
android:pathData="M4,1C2.89,1 2,1.89 2,3V7C2,8.11 2.89,9 4,9H1V11H13V9H10C11.11,9 12,8.11 12,7V3C12,1.89 11.11,1 10,1H4M4,3H10V7H4V3M3,12V14H5V12H3M14,13C12.89,13 12,13.89 12,15V19C12,20.11 12.89,21 14,21H11V23H23V21H20C21.11,21 22,20.11 22,19V15C22,13.89 21.11,13 20,13H14M3,15V17H5V15H3M14,15H20V19H14V15M3,18V20H5V18H3M6,18V20H8V18H6M9,18V20H11V18H9Z"/>
</vector>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ff000000"
android:pathData="M4,1C2.89,1 2,1.89 2,3V7C2,8.11 2.89,9 4,9H1V11H13V9H10C11.11,9 12,8.11 12,7V3C12,1.89 11.11,1 10,1H4M4,3H10V7H4V3M14,13C12.89,13 12,13.89 12,15V19C12,20.11 12.89,21 14,21H11V23H23V21H20C21.11,21 22,20.11 22,19V15C22,13.89 21.11,13 20,13H14M3.88,13.46L2.46,14.88L4.59,17L2.46,19.12L3.88,20.54L6,18.41L8.12,20.54L9.54,19.12L7.41,17L9.54,14.88L8.12,13.46L6,15.59L3.88,13.46M14,15H20V19H14V15Z"/>
</vector>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ff000000"
android:pathData="M22,6C22,4.9 21.1,4 20,4H4C2.9,4 2,4.9 2,6V18C2,19.1 2.9,20 4,20H20C21.1,20 22,19.1 22,18V6M20,6L12,11L4,6H20M20,18H4V8L12,13L20,8V18Z"/>
</vector>

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#ff000000"
android:pathData="M24,7H22V13H24V7M24,15H22V17H24V15M20,6C20,4.9 19.1,4 18,4H2C0.9,4 0,4.9 0,6V18C0,19.1 0.9,20 2,20H18C19.1,20 20,19.1 20,18V6M18,6L10,11L2,6H18M18,18H2V8L10,13L18,8V18Z"/>
</vector>

View File

@@ -1,35 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="1565dp"
android:height="1565dp"
android:viewportWidth="1565"
android:viewportHeight="1565">
<path
android:fillColor="#FFFFFFFF"
android:strokeColor="#FFFFFFFF"
android:strokeWidth="4.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M793.8 222.7C782.5 239.2 736.3 298.6 685.6 361.9 647 410.2 633.3 428.9 633.6 432.7 633.7 433.4 633.8 434.6 633.9 435.3 634.1 437.8 647.9 440.7 663.8 441.5 706.7 443.8 717 445.3 724.9 450.6 733.7 456.4 735.9 467.4 736 504.2 736 504.2 736 521.9 736 521.9 736 521.9 730.8 522.4 730.8 522.4 727.9 522.8 691.8 525.3 650.5 528 609.3 530.8 571.9 533.3 567.5 533.6 531.8 536 503.4 540.5 487.4 546 475 550.3 442.2 566.5 428.2 575.2 392.1 597.6 360.1 629.2 338 664.3 317 697.7 304.6 729.6 292.5 781 287.8 801 283.9 805.6 267.2 811 255.1 814.9 248.7 818.3 243.4 823.5 239.7 827.2 239.2 828.4 237.7 836.5 236.7 841.5 235.5 850 235 855.5 234.3 863.9 232.6 911.1 232.6 924.5 232.6 934.6 234.2 959.8 235 963 237.4 972 242.3 975.8 258.7 981.7 271.7 986.3 277.4 989.5 280.4 993.9 283.1 997.9 286.5 1008.7 287.4 1016.5 289.3 1031.7 293.3 1050.2 297.7 1064 306.4 1091.9 317.6 1107.7 330 1109.5 332.4 1109.9 334.7 1110.3 335 1110.5 335.3 1110.6 339.1 1111.1 343.5 1111.4 347.9 1111.8 353.8 1112.3 356.5 1112.5 370 1113.7 407.8 1115.8 430 1116.5 439.6 1116.8 453.4 1117.3 460.5 1117.5 467.7 1117.8 482.3 1118.2 493 1118.5 503.7 1118.8 520.8 1119.2 531 1119.5 587.8 1121.1 683 1122 794.5 1122 918.8 1122 996.1 1121 1075 1118.5 1083.5 1118.2 1098.6 1117.8 1108.5 1117.4 1118.4 1117.1 1129.4 1116.7 1133 1116.5 1136.6 1116.3 1144.7 1115.8 1151 1115.5 1183.3 1114 1207.5 1110.9 1221.5 1106.3 1235.3 1101.9 1244.8 1094.1 1249.9 1083.2 1253.5 1075.4 1253.7 1074.4 1259 1044 1266.4 1001.7 1269.1 993.5 1276.9 989.2 1278.9 988.1 1284.7 986.1 1289.9 984.6 1305.8 980.1 1313.3 975.5 1314.4 969.7 1316.2 959.5 1317.1 881.4 1315.7 859.5 1314 834.8 1313.1 831.4 1307 824.7 1301.2 818.3 1295 814.8 1283 811 1278 809.5 1272.4 807 1270.5 805.6 1264 800.6 1259.5 790.1 1252.5 763 1243.5 728.4 1235.9 706.8 1224.6 683.5 1202.3 637.7 1167.5 602.5 1111.8 569.1 1087.6 554.7 1054.4 542.7 1028.1 539 1024.1 538.4 1020.5 537.8 1020.1 537.6 1019.8 537.4 1016.4 536.9 1012.7 536.5 1009 536.2 1005.1 535.7 1004.2 535.5 999.7 534.7 988.4 533.6 973.5 532.5 969.7 532.2 964.5 531.8 962 531.5 959.5 531.2 940.4 530.1 919.5 529 851.7 525.4 836.1 523.7 829.5 519.4 821.2 514 825.2 495.6 837.6 481.8 843.8 474.9 844.2 474.3 856.8 448 862.6 436 868.9 425.2 879.9 408.7 888.2 396.2 895 385.5 895 385.1 895 384.6 889.7 383.3 883.3 382 851.1 375.9 812.7 367.8 806.9 365.9 792.4 361.2 790.7 358.7 790.2 342.5 789.7 326.8 792.4 303.4 800 258.5 802.1 246.1 803.3 220.9 801.9 219.6 801.7 219.4 800.5 218.9 799.3 218.6 797.4 218 796.5 218.7 793.8 222.7Z"/>
<path
android:fillColor="#FF62686C"
android:strokeColor="#FF62686C"
android:strokeWidth="4.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M570.4 704.1C553.5 706.1 539.7 713 532.9 722.7 523.5 736.3 519.9 764.2 519.6 826 519.5 859.4 519.7 860.6 530.1 872.9 543.4 888.6 560.4 900 574.1 902.1 586.7 904 601.5 898.9 615.7 887.5 632.5 874.1 633.5 868.9 632.7 793.6 632.2 742.5 631.6 736 627 725.2 620.5 710 596.2 700.9 570.4 704.1Z"/>
<path
android:fillColor="#FF62686C"
android:strokeColor="#FF62686C"
android:strokeWidth="4.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M949.2 705.5C935.1 708.7 927 716.8 922.6 732.4 918.4 746.7 917.8 757.3 917.3 816.5 917.1 847.8 917.3 874 917.7 874.6 919.2 876.7 945.3 892.3 955.5 897.1 973.4 905.5 983.5 905.4 978.9 896.8 977.1 893.4 979.1 892.6 985.9 893.9 993.6 895.4 997.8 894.3 1005.2 889.1 1010.9 885 1020.2 873.6 1023.8 866.5 1029.6 854.9 1031.1 841.6 1031.1 800.5 1031.1 750.1 1028.6 737.6 1014.9 720.4 1009.4 713.5 1004.6 709.8 996.9 706.8 992.2 704.9 989.1 704.6 973.5 704.4 960.6 704.1 953.7 704.5 949.2 705.5Z"/>
<path
android:fillColor="#FF62686C"
android:strokeColor="#FF62686C"
android:strokeWidth="4.0"
android:strokeLineCap="round"
android:strokeMiterLimit="10"
android:pathData="M717 988.7C671.1 990.4 640.9 994.2 635.6 998.8 631.5 1002.5 636.3 1017.5 643.6 1024 650.9 1030.3 661.7 1032.5 694 1034 721.9 1035.3 829.3 1035.3 857 1034 891.4 1032.4 901.4 1029.9 908.9 1021.3 914.5 1015 917.9 1003.4 915.2 999.4 910.4 992.1 856 987.9 772 988.2 745.9 988.3 721.1 988.5 717 988.7Z"/>
</vector>

View File

@@ -9,5 +9,5 @@
android:top="0dp"
android:right="0dp"
android:bottom="0dp"
android:drawable="@drawable/ic_iw"/>
android:drawable="@drawable/ic_launcher"/>
</layer-list>

View File

@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
android:clickable="true"
android:layout_width="24dp"
android:layout_height="24dp">
<item android:drawable="@drawable/ic_launcher_background"/>
<item
android:left="0dp"
android:top="0dp"
android:right="0dp"
android:bottom="0dp"
android:drawable="@drawable/ic_launcher_foreground_disable"/>
</layer-list>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
</vector>

View File

@@ -1,10 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportHeight="24"
android:viewportWidth="24">
<path
android:fillColor="#FF808080"
android:pathData="M16.61,15.15C16.15,15.15 15.77,14.78 15.77,14.32S16.15,13.5 16.61,13.5H16.61C17.07,13.5 17.45,13.86 17.45,14.32C17.45,14.78 17.07,15.15 16.61,15.15M7.41,15.15C6.95,15.15 6.57,14.78 6.57,14.32C6.57,13.86 6.95,13.5 7.41,13.5H7.41C7.87,13.5 8.24,13.86 8.24,14.32C8.24,14.78 7.87,15.15 7.41,15.15M16.91,10.14L18.58,7.26C18.67,7.09 18.61,6.88 18.45,6.79C18.28,6.69 18.07,6.75 18,6.92L16.29,9.83C14.95,9.22 13.5,8.9 12,8.91C10.47,8.91 9,9.24 7.73,9.82L6.04,6.91C5.95,6.74 5.74,6.68 5.57,6.78C5.4,6.87 5.35,7.08 5.44,7.25L7.1,10.13C4.25,11.69 2.29,14.58 2,18H22C21.72,14.59 19.77,11.7 16.91,10.14H16.91Z"/>
</vector>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/aboutviewroot_ll">
</LinearLayout>

View File

@@ -9,7 +9,7 @@
android:id="@+id/toolbar_icon"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_iw"
android:src="@drawable/ic_launcher"
android:layout_alignParentStart="true"
android:layout_centerVertical="true"
android:layout_marginStart="6dp"

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB