diff --git a/.gitignore b/.gitignore index 3be31ff..8418371 100644 --- a/.gitignore +++ b/.gitignore @@ -98,4 +98,39 @@ lint-results.html /winboll.properties /local.properties /settings.gradle -/gradle.properties \ No newline at end of file +/gradle.properties + +## WinBoLL-Demo 项目配置 +#.git +#.gitignore +#.gitmodules +#.winboll +#GenKeyStore +#LICENSE +#LICENSE-Private-Demo +#LICENSE-Private-Demo_docs +#README.md +aes +appbase +autonfc +#build.gradle +contacts +#debugtemp +gallery +gpsrelaysentinel +#gradle +#gradle.properties-android-demo +#gradle.properties-androidx-demo +#gradlew +libaes +libappbase +#libdebugtemp +libgpsrelaysentinel +libwinboll +#local.properties-demo +mymessagemanager +positions +powerbell +#settings.gradle-demo +winboll +#winboll.properties-demo diff --git a/BaseVersion.flag b/BaseVersion.flag new file mode 100644 index 0000000..066f8fd --- /dev/null +++ b/BaseVersion.flag @@ -0,0 +1 @@ +15.20 diff --git a/aes/.gitignore b/aes/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/aes/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/aes/README.md b/aes/README.md deleted file mode 100644 index 1606637..0000000 --- a/aes/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# AES -[![](https://jitpack.io/v/ZhanGSKen/AES.svg)](https://jitpack.io/#ZhanGSKen/AES) - -#### 介绍 -WinBoLL AndroidX 可视化元素类库。 - -#### 软件架构 -适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。 -也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。 - - -#### Gradle 编译说明 -调试版编译命令 :gradle assembleBetaDebug -阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh aes -阶段版类库发布命令 :git pull &&bash .winboll/bashPublishLIBAddTag.sh libaes - -#### 使用说明 - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 : ZhanGSKen(ZhanGSKen) -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/) - -#### 参考文档 diff --git a/aes/app_update_description.txt b/aes/app_update_description.txt deleted file mode 100644 index 8b13789..0000000 --- a/aes/app_update_description.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/aes/build.gradle b/aes/build.gradle deleted file mode 100644 index 8039c8c..0000000 --- a/aes/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -apply plugin: 'com.android.application' -apply from: '../.winboll/winboll_app_build.gradle' -apply from: '../.winboll/winboll_lint_build.gradle' - -def genVersionName(def versionName){ - // 检查编译标志位配置 - assert (winbollBuildProps['stageCount'] != null) - assert (winbollBuildProps['baseVersion'] != null) - // 保存基础版本号 - winbollBuildProps.setProperty("baseVersion", "${versionName}"); - //保存编译标志配置 - FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) - winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); - fos.close(); - - // 返回编译版本号 - return "${versionName}." + winbollBuildProps['stageCount'] -} - -android { - // 适配MIUI12 - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - applicationId "cc.winboll.studio.aes" - minSdkVersion 26 - targetSdkVersion 30 - versionCode 1 - // versionName 更新后需要手动设置 - // 项目模块目录的 build.gradle 文件的 stageCount=0 - // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "15.20" - if(true) { - versionName = genVersionName("${versionName}") - } - } - - // 米盟 SDK - packagingOptions { - doNotStrip "*/*/libmimo_1011.so" - } -} - -dependencies { - api project(':libaes') - api fileTree(dir: 'libs', include: ['*.jar']) -} diff --git a/aes/build.properties b/aes/build.properties deleted file mode 100644 index 4e746cb..0000000 --- a/aes/build.properties +++ /dev/null @@ -1,8 +0,0 @@ -#Created by .winboll/winboll_app_build.gradle -#Tue May 12 13:11:28 HKT 2026 -stageCount=4 -libraryProject=libaes -baseVersion=15.20 -publishVersion=15.20.3 -buildCount=0 -baseBetaVersion=15.20.4 diff --git a/aes/proguard-rules.pro b/aes/proguard-rules.pro deleted file mode 100644 index a18de74..0000000 --- a/aes/proguard-rules.pro +++ /dev/null @@ -1,137 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# ============================== 基础通用规则 ============================== -# 保留系统组件 --keep public class * extends android.app.Activity --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference - -# 保留 WinBoLL 核心包及子类(合并简化规则) --keep class cc.winboll.studio.** { *; } --keepclassmembers class cc.winboll.studio.** { *; } - -# 保留所有类中的 public static final String TAG 字段(便于日志定位) --keepclassmembers class * { - public static final java.lang.String TAG; -} - -# 保留序列化类(避免Parcelable/Gson解析异常) --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - private static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# 保留 R 文件(避免资源ID混淆) --keepclassmembers class **.R$* { - public static ; -} - -# 保留 native 方法(避免JNI调用失败) --keepclasseswithmembernames class * { - native ; -} - -# 保留注解和泛型(避免反射/序列化异常) --keepattributes *Annotation* --keepattributes Signature - -# 屏蔽 Java 8+ 警告(适配 Java 7 语法) --dontwarn java.lang.invoke.* --dontwarn android.support.v8.renderscript.* --dontwarn java.util.function.** - -# ============================== 第三方框架专项规则 ============================== -# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容) --keep class okhttp3.** { *; } --keep interface okhttp3.** { *; } --keep class okhttp3.internal.** { *; } --keep class okio.** { *; } --dontwarn okhttp3.internal.platform.** --dontwarn okio.** - -# Glide 4.9.0(米盟广告图片加载依赖) --keep public class * implements com.bumptech.glide.module.GlideModule --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType { - **[] $VALUES; - public *; -} --keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule { - (); -} --dontwarn com.bumptech.glide.** - -# Gson 2.8.5(米盟广告数据序列化依赖) --keep class com.google.gson.** { *; } --keep interface com.google.gson.** { *; } --keepclassmembers class * { - @com.google.gson.annotations.SerializedName ; -} - -# 米盟 SDK(核心广告组件,完整保留避免加载失败) --keep class com.miui.zeus.** { *; } --keep interface com.miui.zeus.** { *; } -# 保留米盟日志字段(便于广告加载失败排查) --keepclassmembers class com.miui.zeus.mimo.sdk.** { - public static final java.lang.String TAG; -} - -# RecyclerView 1.0.0(米盟广告布局渲染依赖) --keep class androidx.recyclerview.** { *; } --keep interface androidx.recyclerview.** { *; } --keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter { - public *; -} - -# 其他第三方框架(按引入依赖保留,无则可删除) -# XXPermissions 18.63 --keep class com.hjq.permissions.** { *; } --keep interface com.hjq.permissions.** { *; } - -# ZXing 二维码(核心解析组件) --keep class com.google.zxing.** { *; } --keep class com.journeyapps.zxing.** { *; } - -# Jsoup HTML解析 --keep class org.jsoup.** { *; } - -# Pinyin4j 拼音搜索 --keep class net.sourceforge.pinyin4j.** { *; } - -# JSch SSH组件 --keep class com.jcraft.jsch.** { *; } - -# AndroidX 基础组件 --keep class androidx.appcompat.** { *; } --keep interface androidx.appcompat.** { *; } - -# ============================== 优化与调试配置 ============================== -# 优化级别(平衡混淆效果与性能) --optimizationpasses 5 --optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* - -# 调试辅助(保留行号便于崩溃定位) --verbose --dontpreverify --dontusemixedcaseclassnames --keepattributes SourceFile,LineNumberTable - diff --git a/aes/src/beta/AndroidManifest.xml b/aes/src/beta/AndroidManifest.xml deleted file mode 100644 index ee78d9f..0000000 --- a/aes/src/beta/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/aes/src/beta/res/values/strings.xml b/aes/src/beta/res/values/strings.xml deleted file mode 100644 index 6f287f2..0000000 --- a/aes/src/beta/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - AES+ - diff --git a/aes/src/main/AndroidManifest.xml b/aes/src/main/AndroidManifest.xml deleted file mode 100644 index c732afa..0000000 --- a/aes/src/main/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java b/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java deleted file mode 100644 index 26c89bf..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java +++ /dev/null @@ -1,78 +0,0 @@ -package cc.winboll.studio.aes; - -import android.os.Bundle; -import android.view.View; -import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.aes.R; -import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.models.APPInfo; -import cc.winboll.studio.libappbase.views.AboutView; - -/** - * @Author 豆包&ZhanGSKen - * @Date 2026/01/13 11:25 - * @Describe 应用介绍窗口 - */ -public class AboutActivity extends BaseWinBoLLActivity { - - public static final String TAG = "AboutActivity"; - - private Toolbar mToolbar; - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_about); - - // 设置工具栏 - initToolbar(); - - AboutView aboutView = findViewById(R.id.aboutview); - aboutView.setAPPInfo(genDefaultAppInfo()); - } - - private void initToolbar() { - LogUtils.d(TAG, "initToolbar() 开始初始化"); - mToolbar = findViewById(R.id.toolbar); - if (mToolbar == null) { - LogUtils.e(TAG, "initToolbar() | Toolbar未找到"); - return; - } - setSupportActionBar(mToolbar); - mToolbar.setSubtitle(getTag()); - getSupportActionBar().setDisplayHomeAsUpEnabled(true); - mToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - LogUtils.d(TAG, "导航栏 点击返回按钮"); - WinBoLLActivityManager.getInstance().resumeActivity(MainActivity.class); - WinBoLLActivityManager.getInstance().finish(AboutActivity.this); - } - }); - LogUtils.d(TAG, "initToolbar() 配置完成"); - } - - private APPInfo genDefaultAppInfo() { - LogUtils.d(TAG, "genDefaultAppInfo() 调用"); - String branchName = "aes"; - APPInfo appInfo = new APPInfo(); - appInfo.setAppName(getString(R.string.app_name)); - appInfo.setAppIcon(R.drawable.ic_winboll); - appInfo.setAppDescription(getString(R.string.app_description)); - appInfo.setAppGitName("AES"); - appInfo.setAppGitOwner("Studio"); - appInfo.setAppGitAPPBranch(branchName); - appInfo.setAppGitAPPSubProjectFolder(branchName); - appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=AES"); - appInfo.setAppAPKName("AES"); - appInfo.setAppAPKFolderName("AES"); - LogUtils.d(TAG, "genDefaultAppInfo: 应用信息已生成"); - return appInfo; - } -} diff --git a/aes/src/main/java/cc/winboll/studio/aes/App.java b/aes/src/main/java/cc/winboll/studio/aes/App.java deleted file mode 100644 index f6816f7..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/App.java +++ /dev/null @@ -1,34 +0,0 @@ -package cc.winboll.studio.aes; - -/** - * @Author ZhanGSKen - * @Date 2024/06/13 19:03:58 - * @Describe AES应用类 - */ -import android.view.Gravity; -import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; -import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.ToastUtils; - - -public class App extends GlobalApplication { - - public static final String TAG = "App"; - - @Override - public void onCreate() { - super.onCreate(); - setIsDebugging(BuildConfig.DEBUG); - //setIsDebugging(false); - WinBoLLActivityManager.init(this); - - // 初始化 Toast 框架 - ToastUtils.init(this); - } - - @Override - public void onTerminate() { - super.onTerminate(); - ToastUtils.release(); - } -} diff --git a/aes/src/main/java/cc/winboll/studio/aes/BaseWinBoLLActivity.java b/aes/src/main/java/cc/winboll/studio/aes/BaseWinBoLLActivity.java deleted file mode 100644 index 0526f82..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/BaseWinBoLLActivity.java +++ /dev/null @@ -1,45 +0,0 @@ -package cc.winboll.studio.aes; - -import android.app.Activity; -import android.os.Bundle; -import androidx.appcompat.app.AppCompatActivity; -import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; -import cc.winboll.studio.libaes.models.AESThemeBean; -import cc.winboll.studio.libaes.utils.AESThemeUtil; -import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; - -/** - * @Author 豆包&ZhanGSKen - * @Date 2026/01/13 16:35 - * @Describe BaseWinBollActivity 【继承AppCompatActivity,保留核心能力,不额外暴露方法】 - * 继承链路:BaseWinBoLLActivity → AppCompatActivity → FragmentActivity,AppCompat能力天然继承可用 - */ -public abstract class BaseWinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity { - public static final String TAG = "BaseWinBoLLActivity"; - - protected volatile AESThemeBean.ThemeType mThemeType; - - @Override - protected void onCreate(Bundle savedInstanceState) { - mThemeType = AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext())); - setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext())); - super.onCreate(savedInstanceState); - WinBoLLActivityManager.getInstance().add(this); - } - - @Override - protected void onDestroy() { - WinBoLLActivityManager.getInstance().registeRemove(this); - super.onDestroy(); - } - - // 子类必须实现getTag(),确保唯一标识 - @Override - public abstract String getTag(); - - @Override - public Activity getActivity() { - return this; - } -} - diff --git a/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java b/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java deleted file mode 100644 index 927c852..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java +++ /dev/null @@ -1,196 +0,0 @@ -package cc.winboll.studio.aes; - -/** - * @Author ZhanGSKen - * @Date 2024/06/13 19:05:52 - * @Describe 应用主窗口 - */ -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.AdapterView; -import android.widget.Toast; -import cc.winboll.studio.aes.R; -import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity; -import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog; -import cc.winboll.studio.libaes.dialogs.StoragePathDialog; -import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; -import cc.winboll.studio.libaes.models.DrawerMenuBean; -import cc.winboll.studio.libaes.unittests.SecondaryLibraryActivity; -import cc.winboll.studio.libaes.unittests.TestAButtonFragment; -import cc.winboll.studio.libaes.unittests.TestASupportToolbarActivity; -import cc.winboll.studio.libaes.unittests.TestAToolbarActivity; -import cc.winboll.studio.libaes.unittests.TestDrawerFragmentActivity; -import cc.winboll.studio.libaes.unittests.TestViewPageFragment; -import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; -import cc.winboll.studio.libappbase.LogUtils; -import com.a4455jkjh.colorpicker.ColorPickerDialog; -import java.util.ArrayList; - -public class MainActivity extends DrawerFragmentActivity { - - - public static final String TAG = "MainActivity"; - - TestAButtonFragment mTestAButtonFragment; - TestViewPageFragment mTestViewPageFragment; - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (mTestAButtonFragment == null) { - mTestAButtonFragment = new TestAButtonFragment(); - addFragment(mTestAButtonFragment); - } - showFragment(mTestAButtonFragment); - //setSubtitle(TAG); - //ToastUtils.show("onCreate"); - } - - @Override - public void initDrawerMenuItemList(ArrayList 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)); - notifyDrawerMenuDataChanged(); - } - - @Override - public void reinitDrawerMenuItemList(ArrayList 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)); - notifyDrawerMenuDataChanged(); - } - - @Override - public DrawerFragmentActivity.ActivityType initActivityType() { - return DrawerFragmentActivity.ActivityType.Main; - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.toolbar_main, menu); -// if(App.isDebugging()) { -// getMenuInflater().inflate(cc.winboll.studio.libaes.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 (mTestAButtonFragment == null) { - mTestAButtonFragment = new TestAButtonFragment(); - addFragment(mTestAButtonFragment); - } - showFragment(mTestAButtonFragment); - break; - } - case 1 : { - if (mTestViewPageFragment == null) { - mTestViewPageFragment = new TestViewPageFragment(); - addFragment(mTestViewPageFragment); - } - showFragment(mTestViewPageFragment); - break; - } - } - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - int nItemId = item.getItemId(); - if (item.getItemId() == R.id.item_testactivitymanager) { - WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, TestActivityManagerActivity.class); - //ToastUtils.show("item_testactivitymanager"); - } else - if (nItemId == R.id.item_atoast) { - Toast.makeText(getApplication(), "item_testatoast", Toast.LENGTH_SHORT).show(); - } else if (nItemId == R.id.item_atoolbar) { - Intent intent = new Intent(this, TestAToolbarActivity.class); - startActivity(intent); - - } else if (nItemId == R.id.item_asupporttoolbar) { - Intent intent = new Intent(this, TestASupportToolbarActivity.class); - startActivity(intent); - - } else if (nItemId == R.id.item_colordialog) { - ColorPickerDialog dlg = new ColorPickerDialog(this, getResources().getColor(R.color.colorPrimary)); - dlg.setOnColorChangedListener(new com.a4455jkjh.colorpicker.view.OnColorChangedListener() { - - @Override - public void beforeColorChanged() { - } - - @Override - public void onColorChanged(int color) { - - } - - @Override - public void afterColorChanged() { - } - - - }); - dlg.show(); - - } else if (nItemId == R.id.item_dialogstoragepath) { - final StoragePathDialog dialog = new StoragePathDialog(this, 0); - dialog.setOnOKClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - dialog.dismiss(); - } - }); - dialog.show(); - - } else if (nItemId == R.id.item_localfileselectdialog) { - final LocalFileSelectDialog dialog = new LocalFileSelectDialog(this); - dialog.setOnOKClickListener(new LocalFileSelectDialog.OKClickListener() { - @Override - public void onOKClick(String sz) { - Toast.makeText(getApplication(), sz, Toast.LENGTH_SHORT).show(); - //dialog.dismiss(); - } - }); - dialog.open(); - - } else if (nItemId == R.id.item_secondarylibraryactivity) { - Intent intent = new Intent(this, SecondaryLibraryActivity.class); - startActivity(intent); - } else if (nItemId == R.id.item_drawerfragmentactivity) { - Intent intent = new Intent(this, TestDrawerFragmentActivity.class); - startActivity(intent); - } else if (nItemId == R.id.item_settings) { - Intent intent = new Intent(this, SettingsActivity.class); - startActivity(intent); - } else if (nItemId == R.id.item_about) { -// Intent intent = new Intent(this, AboutActivity.class); -// startActivity(intent); - WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, AboutActivity.class); - } - - - return super.onOptionsItemSelected(item); - } - - -} diff --git a/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java b/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java deleted file mode 100644 index 1767c02..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/SettingsActivity.java +++ /dev/null @@ -1,39 +0,0 @@ -package cc.winboll.studio.aes; - -import android.app.Activity; -import android.content.Intent; -import android.os.Bundle; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import cc.winboll.studio.libaes.views.ADsControlView; - -/** - * @Author ZhanGSKen&豆包大模型 - * @Date 2025/11/26 18:01 - * @Describe SettingsActivity - */ -public class SettingsActivity extends Activity { - - public static final String TAG = "SettingsActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_settings); - ADsControlView adsControlView = (ADsControlView) findViewById(R.id.ads_control_view); - -// adsControlView.setOnAdsModeSelectedListener(new ADsControlView.OnAdsModeSelectedListener() { -// @Override -// public void onModeSelected(ADsMode selectedMode) { -// if (selectedMode == ADsMode.STANDALONE) { -// // 处理单机模式逻辑(如释放米盟资源) -// ToastUtils.show("STANDALONE"); -// } else if (selectedMode == ADsMode.MIMO_SDK) { -// // 处理米盟SDK模式逻辑(如初始化SDK) -// ToastUtils.show("MIMO_SDK"); -// } -// } -// }); - } - -} diff --git a/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java b/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java deleted file mode 100644 index 71d114d..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/TestActivityManagerActivity.java +++ /dev/null @@ -1,33 +0,0 @@ -package cc.winboll.studio.aes; - -import android.app.Activity; -import android.os.Bundle; -import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; - -/** - * @Author ZhanGSKen&豆包大模型 - * @Date 2025/09/28 21:07 - * @Describe 窗口管理类测试窗口 - */ -public class TestActivityManagerActivity extends WinBoLLActivity implements IWinBoLLActivity { - - public static final String TAG = "TestActivityManagerActivity"; - - @Override - public Activity getActivity() { - return this; - } - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_testactivitymanager); - - } - -} diff --git a/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java b/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java deleted file mode 100644 index bc45765..0000000 --- a/aes/src/main/java/cc/winboll/studio/aes/WinBoLLActivity.java +++ /dev/null @@ -1,60 +0,0 @@ -package cc.winboll.studio.aes; - -/** - * @Author ZhanGSKen&豆包大模型 - * @Date 2025/09/29 00:11 - * @Describe WinBoLL 窗口基础类 - */ -import android.app.Activity; -import android.os.Bundle; -import android.view.MenuItem; -import androidx.appcompat.app.AppCompatActivity; -import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity; -import cc.winboll.studio.libaes.utils.WinBoLLActivityManager; -import cc.winboll.studio.libappbase.LogUtils; - -public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity { - - public static final String TAG = "WinBoLLActivity"; - - @Override - public Activity getActivity() { - return this; - } - - @Override - public String getTag() { - return TAG; - } - - @Override - protected void onResume() { - super.onResume(); - LogUtils.d(TAG, String.format("onResume %s", getTag())); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - /*if (item.getItemId() == R.id.item_log) { - WinBoLLActivityManager.getInstance().startLogActivity(this); - return true; - } else if (item.getItemId() == R.id.item_home) { - startActivity(new Intent(this, MainActivity.class)); - return true; - }*/ - // 在switch语句中处理每个ID,并在处理完后返回true,未处理的情况返回false。 - return super.onOptionsItemSelected(item); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - WinBoLLActivityManager.getInstance().add(this); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - WinBoLLActivityManager.getInstance().finish(this); - } -} diff --git a/aes/src/main/res/drawable-night/bg_frame.xml b/aes/src/main/res/drawable-night/bg_frame.xml deleted file mode 100644 index bf2fe54..0000000 --- a/aes/src/main/res/drawable-night/bg_frame.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/aes/src/main/res/drawable/bg_frame.xml b/aes/src/main/res/drawable/bg_frame.xml deleted file mode 100644 index 2f208a6..0000000 --- a/aes/src/main/res/drawable/bg_frame.xml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/aes/src/main/res/layout/activity_about.xml b/aes/src/main/res/layout/activity_about.xml deleted file mode 100644 index 5cbe3fd..0000000 --- a/aes/src/main/res/layout/activity_about.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - diff --git a/aes/src/main/res/layout/activity_settings.xml b/aes/src/main/res/layout/activity_settings.xml deleted file mode 100644 index 99dee06..0000000 --- a/aes/src/main/res/layout/activity_settings.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - diff --git a/aes/src/main/res/layout/activity_testactivitymanager.xml b/aes/src/main/res/layout/activity_testactivitymanager.xml deleted file mode 100644 index f46d824..0000000 --- a/aes/src/main/res/layout/activity_testactivitymanager.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - diff --git a/aes/src/main/res/menu/toolbar_main.xml b/aes/src/main/res/menu/toolbar_main.xml deleted file mode 100644 index b87657a..0000000 --- a/aes/src/main/res/menu/toolbar_main.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/aes/src/main/res/values-night/styles.xml b/aes/src/main/res/values-night/styles.xml deleted file mode 100644 index 5ac0e76..0000000 --- a/aes/src/main/res/values-night/styles.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/aes/src/main/res/values/colors.xml b/aes/src/main/res/values/colors.xml deleted file mode 100644 index 87d3836..0000000 --- a/aes/src/main/res/values/colors.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - #FF00B322 - #FF005C12 - #FF8DFFA2 - #FFFFFB8D - diff --git a/aes/src/main/res/values/strings.xml b/aes/src/main/res/values/strings.xml deleted file mode 100644 index 664f43a..0000000 --- a/aes/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - AES - WinBoLL AndroidX 可视化元素类库。 - - diff --git a/aes/src/main/res/values/styles.xml b/aes/src/main/res/values/styles.xml deleted file mode 100644 index 267068a..0000000 --- a/aes/src/main/res/values/styles.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/aes/src/main/res/xml/network_security_config.xml b/aes/src/main/res/xml/network_security_config.xml deleted file mode 100644 index ee39aa4..0000000 --- a/aes/src/main/res/xml/network_security_config.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - winboll.cc - - diff --git a/aes/src/stage/AndroidManifest.xml b/aes/src/stage/AndroidManifest.xml deleted file mode 100644 index ee78d9f..0000000 --- a/aes/src/stage/AndroidManifest.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - diff --git a/aes/src/stage/res/values/strings.xml b/aes/src/stage/res/values/strings.xml deleted file mode 100644 index ace0c41..0000000 --- a/aes/src/stage/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/appbase/.gitignore b/appbase/.gitignore deleted file mode 100644 index 42afabf..0000000 --- a/appbase/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build \ No newline at end of file diff --git a/appbase/README.md b/appbase/README.md deleted file mode 100644 index 97cdffc..0000000 --- a/appbase/README.md +++ /dev/null @@ -1,36 +0,0 @@ -# APPBase -[![](https://jitpack.io/v/ZhanGSKen/APPBase.svg)](https://jitpack.io/#ZhanGSKen/APPBase) - -#### 介绍 -WinBoLL 安卓手机端安卓应用开发基础类库。 - -#### 软件架构 -适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。 -也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。 - - -#### Gradle 编译说明 -调试版编译命令 :gradle assembleBetaDebug -阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh appbase -阶段版类库发布命令 :git pull &&bash .winboll/bashPublishLIBAddTag.sh libappbase - -#### 使用说明 - -#### 参与贡献 - -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 : ZhanGSKen(ZhanGSKen) -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/) - -#### 参考文档 diff --git a/appbase/app_update_description.txt b/appbase/app_update_description.txt deleted file mode 100644 index 8b13789..0000000 --- a/appbase/app_update_description.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/appbase/build.gradle b/appbase/build.gradle deleted file mode 100644 index b95d796..0000000 --- a/appbase/build.gradle +++ /dev/null @@ -1,50 +0,0 @@ -apply plugin: 'com.android.application' -apply from: '../.winboll/winboll_app_build.gradle' -apply from: '../.winboll/winboll_lint_build.gradle' - -def genVersionName(def versionName){ - // 检查编译标志位配置 - assert (winbollBuildProps['stageCount'] != null) - assert (winbollBuildProps['baseVersion'] != null) - // 保存基础版本号 - winbollBuildProps.setProperty("baseVersion", "${versionName}"); - //保存编译标志配置 - FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile) - winbollBuildProps.store(fos, "${winbollBuildPropsDesc}"); - fos.close(); - - // 返回编译版本号 - return "${versionName}." + winbollBuildProps['stageCount'] -} - -android { - // 适配MIUI12 - compileSdkVersion 30 - buildToolsVersion "30.0.3" - - defaultConfig { - applicationId "cc.winboll.studio.appbase" - minSdkVersion 26 - targetSdkVersion 30 - versionCode 1 - // versionName 更新后需要手动设置 - // .winboll/winbollBuildProps.properties 文件的 stageCount=0 - // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "15.20" - if(true) { - versionName = genVersionName("${versionName}") - } - } - - // 确保 Java 7 兼容性(已适配项目技术栈) - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } -} - -dependencies { - api project(':libappbase') - - api fileTree(dir: 'libs', include: ['*.jar']) -} diff --git a/appbase/build.properties b/appbase/build.properties deleted file mode 100644 index 68642b1..0000000 --- a/appbase/build.properties +++ /dev/null @@ -1,8 +0,0 @@ -#Created by .winboll/winboll_app_build.gradle -#Tue May 12 09:17:15 HKT 2026 -stageCount=10 -libraryProject=libappbase -baseVersion=15.20 -publishVersion=15.20.9 -buildCount=0 -baseBetaVersion=15.20.10 diff --git a/appbase/proguard-rules.pro b/appbase/proguard-rules.pro deleted file mode 100644 index 574eeec..0000000 --- a/appbase/proguard-rules.pro +++ /dev/null @@ -1,126 +0,0 @@ -# Add project specific ProGuard rules here. -# By default, the flags in this file are appended to flags specified -# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt -# You can edit the include path and order by changing the proguardFiles -# directive in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# Add any project specific keep options here: - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# ============================== 基础通用规则 ============================== -# 保留系统组件 --keep public class * extends android.app.Activity --keep public class * extends android.app.Service --keep public class * extends android.content.BroadcastReceiver --keep public class * extends android.content.ContentProvider --keep public class * extends android.app.backup.BackupAgentHelper --keep public class * extends android.preference.Preference - -# 保留 WinBoLL 核心包及子类(适配你的两个包名) -#-keep public class * extends com.winboll.WinBoLLActivity -#-keep public class * extends com.winboll.WinBoLLFragment -# 主包名 --keep class cc.winboll.studio.*.** { *; } -# beta包名 --keep class cc.winboll.studio.*.beta.** { *; } --keepclassmembers class cc.winboll.studio.*.** { *; } --keepclassmembers class cc.winboll.studio.*.beta.** { *; } - -# 保留所有类中的 public static final String TAG 字段 --keepclassmembers class * { - public static final java.lang.String TAG; -} - -# 保留序列化类 --keep class * implements android.os.Parcelable { - public static final android.os.Parcelable$Creator *; -} --keepclassmembers class * implements java.io.Serializable { - static final long serialVersionUID; - private static final java.io.ObjectStreamField[] serialPersistentFields; - private void writeObject(java.io.ObjectOutputStream); - private void readObject(java.io.ObjectInputStream); - java.lang.Object writeReplace(); - java.lang.Object readResolve(); -} - -# 保留 R 文件 --keepclassmembers class **.R$* { - public static ; -} - -# 保留 native 方法 --keepclasseswithmembernames class * { - native ; -} - -# 保留注解和泛型 --keepattributes *Annotation* --keepattributes Signature - -# 屏蔽 Java 8+ 警告(适配 Java 7) --dontwarn java.lang.invoke.* --dontwarn android.support.v8.renderscript.* --dontwarn java.util.function.** - -# ============================== 第三方框架规则 ============================== -# Retrofit + OkHttp --keep class retrofit2.** { *; } --keep interface retrofit2.** { *; } --keep class okhttp3.** { *; } --keep interface okhttp3.** { *; } --keep class okio.** { *; } --keepclasseswithmembers class * { - @retrofit2.http.* ; -} - -# Glide 4.x --keep public class * implements com.bumptech.glide.module.GlideModule --keep public class * extends com.bumptech.glide.module.AppGlideModule --keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType { - **[] $VALUES; - public *; -} --dontwarn com.bumptech.glide.load.resource.bitmap.VideoDecoder - -# GreenDAO 3.x --keepclassmembers class * extends org.greenrobot.greendao.AbstractDao { - public static java.lang.String TABLENAME; -} --keep class **$Properties -# 实体类包名(按实际调整) -#-keep class cc.winboll.studio.appbase.model.** { *; } - -# ButterKnife 8.x --keep class butterknife.** { *; } --dontwarn butterknife.internal.** --keep class **$$ViewBinder { *; } --keepclasseswithmembernames class * { - @butterknife.BindView ; - @butterknife.OnClick ; -} - -# EventBus 3.x --keepclassmembers class ** { - @org.greenrobot.eventbus.Subscribe ; -} --keep enum org.greenrobot.eventbus.ThreadMode { *; } - -# ============================== 优化与调试 ============================== --optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* --optimizationpasses 5 --verbose --dontpreverify --dontusemixedcaseclassnames -# 保留行号(便于崩溃定位) --keepattributes SourceFile,LineNumberTable - diff --git a/appbase/src/beta/AndroidManifest.xml b/appbase/src/beta/AndroidManifest.xml deleted file mode 100644 index 32817e8..0000000 --- a/appbase/src/beta/AndroidManifest.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/appbase/src/beta/res/values/strings.xml b/appbase/src/beta/res/values/strings.xml deleted file mode 100644 index 49fc4c9..0000000 --- a/appbase/src/beta/res/values/strings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - APPBase+ - - diff --git a/appbase/src/main/AndroidManifest.xml b/appbase/src/main/AndroidManifest.xml deleted file mode 100644 index 4c0df09..0000000 --- a/appbase/src/main/AndroidManifest.xml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java deleted file mode 100644 index 060bded..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/AboutActivity.java +++ /dev/null @@ -1,50 +0,0 @@ -package cc.winboll.studio.appbase; - -import android.app.Activity; -import android.os.Bundle; -import android.view.View; -import android.widget.Toolbar; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.models.APPInfo; -import cc.winboll.studio.libappbase.views.AboutView; - -/** - * @Author 豆包&ZhanGSKen - * @Date 2026/01/11 12:55 - * @Describe AboutActivity - */ -public class AboutActivity extends Activity { - - public static final String TAG = "AboutActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_about); - - Toolbar toolbar = findViewById(R.id.toolbar); - setActionBar(toolbar); - - AboutView aboutView = findViewById(R.id.aboutview); - aboutView.setAPPInfo(genDefaultAppInfo()); - } - - private APPInfo genDefaultAppInfo() { - LogUtils.d(TAG, "genDefaultAppInfo() 调用"); - String branchName = "appbase"; - APPInfo appInfo = new APPInfo(); - appInfo.setAppName("APPBase"); - appInfo.setAppIcon(R.drawable.ic_winboll); - appInfo.setAppDescription(getString(R.string.app_description)); - appInfo.setAppGitName("WinBoLL"); - appInfo.setAppGitOwner("Studio"); - appInfo.setAppGitAPPBranch(branchName); - appInfo.setAppGitAPPSubProjectFolder(branchName); - appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=APPBase"); - appInfo.setAppAPKName("APPBase"); - appInfo.setAppAPKFolderName("APPBase"); - LogUtils.d(TAG, "genDefaultAppInfo: 应用信息已生成"); - return appInfo; - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/App.java b/appbase/src/main/java/cc/winboll/studio/appbase/App.java deleted file mode 100644 index 9df2ed8..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/App.java +++ /dev/null @@ -1,48 +0,0 @@ -package cc.winboll.studio.appbase; - -import cc.winboll.studio.libappbase.GlobalApplication; -import cc.winboll.studio.libappbase.ToastUtils; -import cc.winboll.studio.libappbase.BuildConfig; - -/** - * @Author ZhanGSKen - * @Date 2025/01/05 09:54:42 - * @Describe 应用全局入口类(继承基础库 GlobalApplication) - * 负责应用初始化、全局资源管理与生命周期回调处理,是整个应用的核心入口 - */ -public class App extends GlobalApplication { - - /** 当前应用类的日志 TAG(用于调试输出,标识日志来源) */ - public static final String TAG = "App"; - - /** - * 应用创建时回调(全局初始化入口) - * 在应用进程启动时执行,仅调用一次,用于初始化全局工具类、第三方库等 - */ - @Override - public void onCreate() { - super.onCreate(); - // 如果应用不在调试状态,就根据编译类型设置调试状态 - if (isDebugging() != true) { - setIsDebugging(BuildConfig.DEBUG); - } - // release 版调试码 - //setIsDebugging(!BuildConfig.DEBUG); - - // 初始化 Toast 工具类(传入应用全局上下文,确保 Toast 可在任意地方调用) - ToastUtils.init(getApplicationContext()); - } - - /** - * 应用终止时回调(资源释放入口) - * 仅在模拟环境(如 Android Studio 模拟器)中可靠触发,真机上可能因系统回收进程不执行 - * 用于释放全局资源,避免内存泄漏 - */ - @Override - public void onTerminate() { - super.onTerminate(); // 调用父类终止逻辑(如基础库资源释放) - // 释放 Toast 工具类资源(销毁全局 Toast 实例,避免内存泄漏) - ToastUtils.release(); - } -} - diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/CrashTestActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/CrashTestActivity.java deleted file mode 100644 index 6f2a687..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/CrashTestActivity.java +++ /dev/null @@ -1,28 +0,0 @@ -package cc.winboll.studio.appbase; - -import android.app.Activity; -import android.os.Bundle; -import android.view.View; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.ToastUtils; - -public class CrashTestActivity extends Activity { - - public static final String TAG = "CrashTestActivity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_crash_test); - LogUtils.d(TAG, "CrashTestActivity onCreate()"); - } - - public void onBack(View view) { - finish(); - } - - public void onTestCrash(View view) { - LogUtils.d(TAG, "onTestCrash()"); - ToastUtils.show("测试布局崩溃..."); - } -} diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/Main2Activity.java b/appbase/src/main/java/cc/winboll/studio/appbase/Main2Activity.java deleted file mode 100644 index 1b989f7..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/Main2Activity.java +++ /dev/null @@ -1,20 +0,0 @@ -package cc.winboll.studio.appbase; - -import android.os.Bundle; -import android.widget.Toolbar; -import cc.winboll.studio.appbase.R; - -public class Main2Activity extends MainActivity { - - public static final String TAG = "Main2Activity"; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main2); - Toolbar toolbar = findViewById(R.id.toolbar); - if (toolbar != null) { - setActionBar(toolbar); - } - } -} \ No newline at end of file diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java b/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java deleted file mode 100644 index 96b99c4..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/MainActivity.java +++ /dev/null @@ -1,177 +0,0 @@ -package cc.winboll.studio.appbase; - -import android.app.Activity; -import android.content.Context; -import android.content.Intent; -import android.net.Uri; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.widget.Toolbar; -import cc.winboll.studio.appbase.R; -import cc.winboll.studio.appbase.model.TestBean; -import cc.winboll.studio.libappbase.LogActivity; -import cc.winboll.studio.libappbase.LogUtils; -import cc.winboll.studio.libappbase.ToastUtils; - -/** - * @Author ZhanGSKen - * @Date 未标注(建议补充创建日期) - * @Describe 应用主界面 Activity(入口界面) - * 包含功能测试按钮(崩溃测试、日志查看、Toast测试)、顶部工具栏(菜单功能),是应用交互的核心入口 - */ -public class MainActivity extends Activity { - - /** 当前 Activity 的日志 TAG(用于调试输出,标识日志来源) */ - public static final String TAG = "MainActivity"; - - /** 顶部工具栏(用于展示标题、菜单,绑定布局中的 Toolbar 控件) */ - private Toolbar mToolbar; - - /** - * Activity 创建时回调(初始化界面) - * 在 Activity 首次创建时执行,用于加载布局、初始化控件、设置事件监听 - * @param savedInstanceState 保存 Activity 状态的 Bundle(如屏幕旋转时的数据恢复) - */ - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - //ToastUtils.show("onCreate"); // 显示 Activity 创建提示(调试用) - setContentView(R.layout.activity_main); // 加载主界面布局 - - // 初始化 Toolbar 并设置为 ActionBar - mToolbar = findViewById(R.id.toolbar); - setActionBar(mToolbar); // 将 Toolbar 替代系统默认 ActionBar - - initTestData(); - } - - void initTestData() { - TestBean bean1 = new TestBean(); - bean1.setTestNum1(456); - TestBean.saveBeanToFile(getFilesDir().getAbsolutePath() + getTestBeanRelativePath(), bean1); - TestBean bean2 = new TestBean(); - bean2.setTestNum1(789); - TestBean.saveBeanToFile(getExternalFilesDir(null).getAbsolutePath() + getTestBeanRelativePath(), bean2); - } - - String getTestBeanRelativePath() { - return "/BaseBaen/"+TestBean.class.getName()+".json"; - } - - /** - * 创建菜单时回调(加载工具栏菜单) - * 初始化 ActionBar 菜单,加载自定义菜单布局 - * @param menu 菜单对象(用于承载菜单项) - * @return true:显示菜单;false:不显示菜单 - */ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - // 加载菜单布局(R.menu.toolbar_main 为自定义菜单文件) - getMenuInflater().inflate(R.menu.toolbar_main, menu); - return super.onCreateOptionsMenu(menu); - } - - /** - * 菜单 item 点击时回调(处理菜单事件) - * 响应 Toolbar 菜单项的点击事件,执行对应业务逻辑 - * @param item 被点击的菜单项 - * @return true:消费点击事件;false:不消费(传递给父类) - */ - @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.item_home: - // 点击 "首页/官网" 菜单项,唤起浏览器打开指定网站 - openWebsiteInBrowser(this); - break; - // 可扩展其他菜单项(如设置、关于等)的处理逻辑 - } - return super.onOptionsItemSelected(item); - } - - /** - * 崩溃测试按钮点击事件(触发应用崩溃,用于调试异常捕获) - * 故意执行非法操作(循环获取不存在的字符串资源),强制应用崩溃 - * @param view 触发事件的 View(对应布局中的崩溃测试按钮) - */ - public void onCrashTest(View view) { - // 循环从 Integer.MIN_VALUE 到 Integer.MAX_VALUE,获取不存在的字符串资源 ID,触发崩溃 - for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { - getString(i); // i 超出资源 ID 范围,抛出 Resources.NotFoundException 导致崩溃 - } - } - - public void onLogTestNewTask(View view) { - LogActivity.startLogActivity(this, true); - } - - /** - * 日志测试按钮点击事件(打开日志查看界面) - * 启动 LogActivity,用于查看应用运行日志 - * @param view 触发事件的 View(对应布局中的日志测试按钮) - */ - public void onLogTest(View view) { - LogActivity.startLogActivity(this, false); - } - - /** - * Toast 工具测试按钮点击事件(测试全局 Toast 功能) - * 测试主线程、子线程中 Toast 的显示效果,验证 ToastUtils 的可用性 - * @param view 触发事件的 View(对应布局中的 Toast 测试按钮) - */ - public void onToastUtilsTest(View view) { - LogUtils.d(TAG, "onToastUtilsTest"); // 打印调试日志,标识进入 Toast 测试 - ToastUtils.show("Hello, WinBoLL!"); // 主线程显示 Toast - - // 开启子线程,延迟 2 秒后显示 Toast(测试子线程 Toast 兼容性) - new Thread(new Runnable() { - @Override - public void run() { - try { - Thread.sleep(2000); // 线程休眠 2 秒 - // 若 ToastUtils 已处理主线程切换,此处可直接调用;否则需通过 Handler 切换到主线程 - ToastUtils.show("Thread.sleep(2000);ToastUtils.show..."); - } catch (InterruptedException e) { - // 捕获线程中断异常(如线程被销毁时),不做处理(测试场景) - e.printStackTrace(); - } - } - }).start(); - } - - /** - * 唤起系统默认浏览器打开指定网站(跳转至应用官网) - * 通过 Intent.ACTION_VIEW 隐式意图,触发浏览器打开目标 URL - * @param context 上下文对象(如 Activity、Application,此处为 MainActivity) - */ - public void openWebsiteInBrowser(Context context) { - String url = "https://www.winboll.cc"; // 目标网站 URL(应用官网) - // 构建隐式意图:ACTION_VIEW 表示查看指定数据(Uri 为网站地址) - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); - // 设置标志:在新的任务栈中启动 Activity(避免与当前应用任务栈混淆) - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - // 启动意图(唤起浏览器) - context.startActivity(intent); - } - - public void onAboutActivity(View view) { - LogUtils.d(TAG, "onAboutActivity() 调用"); - Intent aboutIntent = new Intent(getApplicationContext(), AboutActivity.class); - startActivity(aboutIntent); - } - - - - public void onMultiInstance(View view) { - LogUtils.d(TAG, "onMultiInstance() 多开窗口按钮已点击"); - ToastUtils.show("多开窗口:已启动新窗口"); - android.content.Intent intent = new android.content.Intent(this, Main2Activity.class); - intent.setFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK); - LogUtils.d(TAG, "onMultiInstance() 准备启动Main2Activity"); - startActivity(intent); - LogUtils.d(TAG, "onMultiInstance() Main2Activity已启动"); - } -} - diff --git a/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java b/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java deleted file mode 100644 index ee3e70a..0000000 --- a/appbase/src/main/java/cc/winboll/studio/appbase/model/TestBean.java +++ /dev/null @@ -1,154 +0,0 @@ -package cc.winboll.studio.appbase.model; - -import android.util.JsonReader; -import android.util.JsonWriter; -import cc.winboll.studio.libappbase.BaseBean; -import cc.winboll.studio.libappbase.LogUtils; -import java.io.IOException; - -/** - * 测试实体类 - * 继承BaseBean实现JSON序列化/反序列化能力,提供基础int类型属性的封装与数据持久化支持 - * 适配Java7语法,遵循BaseBean统一的反射识别、JSON读写规范 - * @Author 豆包&ZhanGSKen - * @Date 2026/01/31 19:16:00 - * @LastEditTime 2026/02/01 10:46:00 - */ -public class TestBean extends BaseBean { - - // ====================================== 常量定义 ====================================== - /** 当前类的日志 TAG(用于调试输出) */ - public static final String TAG = "TestBean"; - - // ====================================== 成员属性 ====================================== - /** - * 测试数字属性(默认值:123) - * 基础int类型属性,用于测试BaseBean的JSON序列化/反序列化能力 - */ - private int testNum1; - - // ====================================== 构造方法 ====================================== - /** - * 无参构造器(默认初始化) - * 给testNum1赋值默认值123,满足反射实例化、JSON解析的无参构造要求 - */ - public TestBean() { - this.testNum1 = 123; - LogUtils.d(TAG, "TestBean无参构造器调用,testNum1默认初始化值:" + this.testNum1); - } - - /** - * 有参构造器(自定义初始化) - * @param testNum1 测试数字初始值 - */ - public TestBean(int testNum1) { - this.testNum1 = testNum1; - LogUtils.d(TAG, "TestBean有参构造器调用,传入testNum1:" + testNum1); - } - - // ====================================== Get/Set 方法 ====================================== - /** - * 设置测试数字属性值 - * @param testNum1 待设置的int类型值 - */ - public void setTestNum1(int testNum1) { - LogUtils.d(TAG, "setTestNum1调用,传入参数:" + testNum1); - this.testNum1 = testNum1; - } - - /** - * 获取测试数字属性值 - * @return 当前testNum1的int类型值 - */ - public int getTestNum1() { - LogUtils.d(TAG, "getTestNum1调用,返回值:" + this.testNum1); - return testNum1; - } - - // ====================================== 重写父类BaseBean方法 ====================================== - /** - * 重写父类方法:获取当前类的全限定名 - * 用于BaseBean反射识别、类名匹配等统一逻辑 - * @return 类全限定名(cc.winboll.studio.appbase.model.TestBean) - */ - @Override - public String getName() { - LogUtils.d(TAG, "getName方法调用,返回类全限定名:" + TestBean.class.getName()); - return TestBean.class.getName(); - } - - /** - * 重写父类方法:将当前对象序列化为JSON(持久化存储专用) - * 遵循BaseBean规范,先执行父类序列化逻辑,再处理子类专属字段 - * @param jsonWriter JSON写入器(外部传入的JSON流操作实例) - * @throws IOException JSON写入异常(流关闭、格式错误等) - */ - @Override - public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { - LogUtils.d(TAG, "writeThisToJsonWriter调用,传入参数JsonWriter:" + jsonWriter); - // 执行父类公共字段的序列化逻辑 - super.writeThisToJsonWriter(jsonWriter); - // 序列化子类专属字段testNum1 - jsonWriter.name("testNum1").value(this.getTestNum1()); - LogUtils.d(TAG, "writeThisToJsonWriter执行完成,已序列化testNum1:" + this.getTestNum1()); - } - - /** - * 重写父类方法:从JSON字段初始化当前对象属性(解析JSON专用) - * 先让父类处理公共字段,再匹配子类专属字段,不匹配则返回false跳过 - * @param jsonReader JSON读取器(外部传入的JSON流操作实例) - * @param name 当前解析的JSON字段名 - * @return true-字段解析成功;false-字段不匹配,需跳过/父类处理 - * @throws IOException JSON读取异常(字段类型不匹配、流中断等) - */ - @Override - public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { - LogUtils.d(TAG, "initObjectsFromJsonReader调用,传入参数:name=" + name + ",JsonReader=" + jsonReader); - // 父类优先处理公共字段,处理成功则直接返回 - if (super.initObjectsFromJsonReader(jsonReader, name)) { - LogUtils.d(TAG, "initObjectsFromJsonReader:字段" + name + "由父类BaseBean处理成功"); - return true; - } - // 解析子类专属字段 - if ("testNum1".equals(name)) { - this.setTestNum1(jsonReader.nextInt()); - LogUtils.d(TAG, "initObjectsFromJsonReader:解析testNum1成功,值为:" + this.getTestNum1()); - } else { - LogUtils.w(TAG, "initObjectsFromJsonReader:字段" + name + "不匹配,返回false跳过解析"); - // 字段不匹配,返回false表示跳过 - return false; - } - return true; - } - - /** - * 重写父类方法:从JSON读取器完整解析并初始化当前对象(JSON解析入口) - * 负责JSON对象的开始/结束标识处理,遍历所有字段并调用字段解析方法 - * 严格遵循writeThisToJsonWriter的序列化结构,保证解析一致性 - * @param jsonReader JSON读取器(外部传入的JSON流操作实例) - * @return 解析后的当前TestBean实例(支持链式调用) - * @throws IOException JSON解析异常(格式错误、字段缺失、流异常等) - */ - @Override - public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException { - LogUtils.d(TAG, "readBeanFromJsonReader调用,传入参数JsonReader:" + jsonReader); - // 开始解析JSON对象,与序列化结构保持一致 - jsonReader.beginObject(); - // 遍历所有JSON字段 - while (jsonReader.hasNext()) { - String fieldName = jsonReader.nextName(); - LogUtils.d(TAG, "readBeanFromJsonReader:开始解析字段,fieldName=" + fieldName); - // 解析字段,不匹配则跳过该值 - if (!this.initObjectsFromJsonReader(jsonReader, fieldName)) { - jsonReader.skipValue(); - LogUtils.w(TAG, "readBeanFromJsonReader:字段" + fieldName + "解析失败,已跳过该值"); - } - } - // 结束JSON对象解析,必须调用避免流异常 - jsonReader.endObject(); - LogUtils.d(TAG, "readBeanFromJsonReader执行完成,JSON解析结束,当前TestBean实例testNum1:" + this.getTestNum1()); - // 返回当前实例,支持链式调用 - return this; - } -} - diff --git a/appbase/src/main/res/drawable/bg_container_border.xml b/appbase/src/main/res/drawable/bg_container_border.xml deleted file mode 100644 index 09c5bdf..0000000 --- a/appbase/src/main/res/drawable/bg_container_border.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/appbase/src/main/res/drawable/btn_light_blue.xml b/appbase/src/main/res/drawable/btn_light_blue.xml deleted file mode 100644 index 58415fd..0000000 --- a/appbase/src/main/res/drawable/btn_light_blue.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - diff --git a/appbase/src/main/res/layout-night/activity_about.xml b/appbase/src/main/res/layout-night/activity_about.xml deleted file mode 100644 index f8af6b0..0000000 --- a/appbase/src/main/res/layout-night/activity_about.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/appbase/src/main/res/layout-night/activity_main.xml b/appbase/src/main/res/layout-night/activity_main.xml deleted file mode 100644 index 383caad..0000000 --- a/appbase/src/main/res/layout-night/activity_main.xml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - -