diff --git a/README.md b/README.md index 381277a..207e65c 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ ## WinBoll 项目组研发计划 致力于把 WinBoll-APP 应用在手机端 Android 项目开发。 -也在探索 https://gitea.winboll.cc//WinBoll-APP.git 应用于 WinBoll-APP APK 分发。 -更想进阶 https://github.com//WinBoll-APP.git 应用于 WinBoll-APP Beta APK 分发。 +也在探索 https://gitea.winboll.cc//APP.git 应用于 WinBoll-APP APK 分发。 +更想进阶 https://github.com//APP.git 应用于 WinBoll-APP Beta APK 分发。 ## WinBoll-APP 汗下... #### ☁应用何置如此呢。且观用户云云。 @@ -55,10 +55,10 @@ ☁ WinBoll 主机建立 1Panel Gitea 应用。 ☁ WinBoll 主机设置 WinBoll 应用为非登录状态。 ☁ WinBoll 主机建立 WinBoll 账户与 WinBoll 用户组。 -☁ WinBoll 账户 User ID 为: winboll。 -☁ WinBoll 用户组 Group ID 为: winboll。 +☁ WinBoll 账户 User ID 为: J。 +☁ WinBoll 用户组 Group ID 为: Studio。 ☁ WinBoll 主机 WinBoll 1Panel Gitea 建立 WinBoll 工作组。 -☁ WinBoll 主机 WinBoll 1Panel Gitea 用户项目 APK 编译输出目录为 /sdcard/<用户名>/WinBoll/app/ +☁ WinBoll 主机 WinBoll 1Panel Gitea 用户项目 APK 编译输出目录为 /sdcard/WinBollStudio/<用户名>/APKs/ ☁ WinBoll 项目配置文件示例为 "/.winboll/winboll.properties-demo"(WinBoll 项目已设置) ☁ WinBoll 项目配置文件为 "/.winboll/winboll.properties" ☁ WinBoll 项目配置文件设定为源码提交时忽略。(WinBoll 项目已设置) @@ -72,17 +72,17 @@ ☁ MySQL winbollclient 数据库中 WinBoll 客户端用户信息设定为: <用户名, 验证密码, 验证邮箱, 验证手机, 唯一存储令牌Token, 备用验证邮箱>。 -☁ WinBoll 项目源码仓库托管在 WinBoll 1Panel Gitea 目录 /opt/1panel/apps/gitea/gitea/data/git/repositories/winboll/winboll.git中。 +☁ WinBoll 项目源码仓库托管在 WinBoll 1Panel Gitea 目录 /opt/1panel/apps/gitea/gitea/data/git/repositories/studio/app.git中。 ☁ WinBoll 主机提供 WinBoll 1Panel Gitea 应用的 WinBoll 项目源码仓库存取功能。(Gitea 应用已提供) ☁ WinBoll 主机提供 WinBoll Gitea 项目仓库存档功能。(Gitea 应用已提供) ☁ 提供 WinBoll 客户端用户登录功能。(Gitea 应用已提供) ### ☁ 看远方 ☁ ### ### ☁ 心忧虑 ☁ WinBoll-APP 应用前置需求 -☁ WinBoll-APP WinBoll 项目根目录设定为手机的 /sdcard/WinBoll 目录。(需要用户手动建立文件夹) +☁ WinBoll-APP WinBoll 项目根目录设定为手机的 /sdcard/WinBollStudio/Sources 目录。(需要用户手动建立文件夹) ☁ WinBoll-APP 具有手机 /sdcard/WinBoll 目录的存储权限。(需要手机操作系统授权) -☁ WinBoll-APP WinBoll 项目仓库源码存储路径为 /sdcard/WinBoll/repositories/winboll.git(需要用户手动建立文件夹) -☁ WinBoll-APP 项目 APK 编译输出目录为 /sdcard/WinBoll/app/ +☁ WinBoll-APP WinBoll 项目仓库源码存储路径为 /sdcard/WinBollStudio/Sources/APP.git(需要用户手动建立文件夹) +☁ WinBoll-APP 项目 APK 编译输出目录为 /sdcard/WinBollStudio/APKs/ ☁ WinBoll-APP 应用签名验证可定制化。(WinBoll 项目已提供) ☁ WinBoll-APP 与系列衍生 APP 应用共享 cc.winboll.studio 命名空间资源。(WinBoll 项目已提供) ☁ WinBoll-APP 用户客户端信息存储在命名空间为 WinBoll APP MySQLLite 应用的 winbollappclient 数据库中。 @@ -92,7 +92,7 @@ ### ☁ 云游四方 ☁ ### ### ☁ 呔! ☁ WinBoll-APP 应用需求规划 -☁ WinBoll-APP 提供手机目录 /sdcard/WinBoll 的 WinBoll 项目源码管理功能。 +☁ WinBoll-APP 提供手机目录 /sdcard/WinBollStudio/Sources 的 WinBoll 项目源码管理功能。 ### ☁ 吁! ☁ WinBoll-APP 共享计划前景 ☁ WinBoll-APP 将会实现 https://winboll.cc/api 访问功能。 diff --git a/aes/build.gradle b/aes/build.gradle index c6a3a6c..13025d9 100644 --- a/aes/build.gradle +++ b/aes/build.gradle @@ -19,17 +19,17 @@ def genVersionName(def versionName){ android { compileSdkVersion 32 - buildToolsVersion "33.0.3" + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.aes" minSdkVersion 24 - targetSdkVersion 30 + targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "7.6" + versionName "15.2" if(true) { versionName = genVersionName("${versionName}") } @@ -41,29 +41,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } } dependencies { api project(':libaes') - - //api 'cc.winboll.studio:winboll-shared:1.6.5' - api 'io.github.medyo:android-about-page:2.0.0' - api 'com.github.getActivity:ToastUtils:10.5' - api 'com.jcraft:jsch:0.1.55' - api 'org.jsoup:jsoup:1.13.1' - api 'com.squareup.okhttp3:okhttp:4.4.1' - - api 'androidx.appcompat:appcompat:1.0.0' - api 'androidx.fragment:fragment:1.0.0' - api 'com.google.android.material:material:1.0.0' - - api 'cc.winboll.studio:libapputils:9.2.1' - api 'cc.winboll.studio:libappbase:1.0.3' - api fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/aes/build.properties b/aes/build.properties index 69caa9a..3498711 100644 --- a/aes/build.properties +++ b/aes/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun Jan 19 04:58:59 GMT 2025 -stageCount=3 +#Wed Apr 02 20:09:04 HKT 2025 +stageCount=6 libraryProject=libaes -baseVersion=7.6 -publishVersion=7.6.2 -buildCount=4 -baseBetaVersion=7.6.3 +baseVersion=15.2 +publishVersion=15.2.5 +buildCount=0 +baseBetaVersion=15.2.6 diff --git a/aes/src/main/AndroidManifest.xml b/aes/src/main/AndroidManifest.xml index cc00d93..d123b21 100644 --- a/aes/src/main/AndroidManifest.xml +++ b/aes/src/main/AndroidManifest.xml @@ -8,9 +8,10 @@ android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" - android:theme="@style/WinBoll.SupportThemeNoActionBar" + android:theme="@style/MyAESTheme" android:requestLegacyExternalStorage="true" - android:supportsRtl="true"> + android:supportsRtl="true" + android:networkSecurityConfig="@xml/network_security_config"> + + diff --git a/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java b/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java new file mode 100644 index 0000000..208327c --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/AboutActivity.java @@ -0,0 +1,91 @@ +package cc.winboll.studio.aes; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/24 23:52:29 + * @Describe AES应用介绍窗口 + */ +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.winboll.APPInfo; +import cc.winboll.studio.libaes.winboll.AboutView; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.winboll.IWinBollActivity; + +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); + + GlobalApplication.getWinBollActivityManager().add(this); + } + + @Override + protected void onDestroy() { + super.onDestroy(); + GlobalApplication.getWinBollActivityManager().registeRemove(this); + } + + public AboutView CreateAboutView() { + String szBranchName = "aes"; + APPInfo appInfo = new APPInfo(); + appInfo.setAppName("AES"); + appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll); + appInfo.setAppDescription("AES Description"); + appInfo.setAppGitName("APP"); + appInfo.setAppGitOwner("Studio"); + appInfo.setAppGitAPPBranch(szBranchName); + appInfo.setAppGitAPPSubProjectFolder(szBranchName); + appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=AES"); + appInfo.setAppAPKName("AES"); + appInfo.setAppAPKFolderName("AES"); + return new AboutView(mContext, 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 index 578f72d..2dc8e06 100644 --- a/aes/src/main/java/cc/winboll/studio/aes/App.java +++ b/aes/src/main/java/cc/winboll/studio/aes/App.java @@ -5,16 +5,26 @@ package cc.winboll.studio.aes; * @Date 2024/06/13 19:03:58 * @Describe AES应用类 */ +import android.view.Gravity; import cc.winboll.studio.libappbase.GlobalApplication; +import com.hjq.toast.ToastUtils; + public class App extends GlobalApplication { - + public static final String TAG = "App"; @Override public void onCreate() { super.onCreate(); - //setIsDebug(BuildConfig.DEBUG); + + // 初始化 Toast 框架 + ToastUtils.init(this); + // 设置 Toast 布局样式 + ToastUtils.setView(R.layout.view_toast); + //ToastUtils.setStyle(new WhiteToastStyle()); + ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + } - + } diff --git a/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java b/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java index cafaf1e..7d76e83 100644 --- a/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java +++ b/aes/src/main/java/cc/winboll/studio/aes/MainActivity.java @@ -5,12 +5,193 @@ package cc.winboll.studio.aes; * @Date 2024/06/13 19:05:52 * @Describe 应用主窗口 */ -import cc.winboll.studio.libaes.unittests.LibraryActivity; +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.beans.DrawerMenuBean; +import cc.winboll.studio.libaes.dialogs.LocalFileSelectDialog; +import cc.winboll.studio.libaes.dialogs.StoragePathDialog; +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.libappbase.LogUtils; +import cc.winboll.studio.libappbase.winboll.IWinBollActivity; +import com.a4455jkjh.colorpicker.ColorPickerDialog; +import com.hjq.toast.ToastUtils; +import java.util.ArrayList; + +public class MainActivity extends DrawerFragmentActivity implements IWinBollActivity { + -public class MainActivity extends LibraryActivity { - public static final String TAG = "MainActivity"; + + TestAButtonFragment mTestAButtonFragment; + TestViewPageFragment mTestViewPageFragment; + @Override + public Activity getActivity() { + return this; + } + + @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_library, menu); + if(App.isDebuging()) { + 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 (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_log) { +// WinBollActivityManager.getInstance(this).startWinBollActivity(getApplicationContext(), LogActivity.class); +// } 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_about) { + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); + return true; + } + + return super.onOptionsItemSelected(item); + } } diff --git a/aes/src/main/java/cc/winboll/studio/aes/WinBollActivity.java b/aes/src/main/java/cc/winboll/studio/aes/WinBollActivity.java new file mode 100644 index 0000000..a15318d --- /dev/null +++ b/aes/src/main/java/cc/winboll/studio/aes/WinBollActivity.java @@ -0,0 +1,60 @@ +package cc.winboll.studio.aes; + +import android.app.Activity; +import android.os.Bundle; +import androidx.appcompat.app.AppCompatActivity; +import cc.winboll.studio.libaes.beans.AESThemeBean; +import cc.winboll.studio.libaes.utils.AESThemeUtil; +import cc.winboll.studio.libappbase.winboll.IWinBollActivity; +import android.view.MenuItem; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/30 00:34:02 + * @Describe WinBoll 活动窗口通用基类 + */ +public class WinBollActivity extends AppCompatActivity implements IWinBollActivity { + + public static final String TAG = "WinBollActivity"; + + protected volatile AESThemeBean.ThemeType mThemeType; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + mThemeType = getThemeType(); + setThemeStyle(); + super.onCreate(savedInstanceState); + } + + AESThemeBean.ThemeType getThemeType() { + /*SharedPreferences sharedPreferences = getSharedPreferences( + SHAREDPREFERENCES_NAME, MODE_PRIVATE); + return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))]; + */ + return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext())); + } + + void setThemeStyle() { + //setTheme(AESThemeBean.getThemeStyle(getThemeType())); + setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext())); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if(item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/libapputils/src/main/res/layout/activity_assetshtml.xml b/aes/src/main/res/layout/activity_about.xml similarity index 71% rename from libapputils/src/main/res/layout/activity_assetshtml.xml rename to aes/src/main/res/layout/activity_about.xml index 657c8de..3de4825 100644 --- a/libapputils/src/main/res/layout/activity_assetshtml.xml +++ b/aes/src/main/res/layout/activity_about.xml @@ -6,16 +6,17 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:id="@+id/toolbar"/> - + android:id="@+id/aboutviewroot_ll"/> diff --git a/libaes/src/main/res/menu/toolbar_library.xml b/aes/src/main/res/menu/toolbar_library.xml similarity index 99% rename from libaes/src/main/res/menu/toolbar_library.xml rename to aes/src/main/res/menu/toolbar_library.xml index d01cea5..b12aef8 100644 --- a/libaes/src/main/res/menu/toolbar_library.xml +++ b/aes/src/main/res/menu/toolbar_library.xml @@ -13,7 +13,7 @@ - + diff --git a/aes/src/main/res/values/colors.xml b/aes/src/main/res/values/colors.xml new file mode 100644 index 0000000..87d3836 --- /dev/null +++ b/aes/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #FF00B322 + #FF005C12 + #FF8DFFA2 + #FFFFFB8D + diff --git a/aes/src/main/res/values/styles.xml b/aes/src/main/res/values/styles.xml index c5c6ef3..1da88ba 100644 --- a/aes/src/main/res/values/styles.xml +++ b/aes/src/main/res/values/styles.xml @@ -1,5 +1,5 @@ - diff --git a/aes/src/main/res/xml/network_security_config.xml b/aes/src/main/res/xml/network_security_config.xml new file mode 100644 index 0000000..ee39aa4 --- /dev/null +++ b/aes/src/main/res/xml/network_security_config.xml @@ -0,0 +1,6 @@ + + + + winboll.cc + + diff --git a/androiddemo/build.gradle b/androiddemo/build.gradle index 8357611..0902de4 100644 --- a/androiddemo/build.gradle +++ b/androiddemo/build.gradle @@ -18,25 +18,18 @@ def genVersionName(def versionName){ } android { - productFlavors { - beta { - } - stage { - } - } - - compileSdkVersion 30 - buildToolsVersion "30.0.3" + compileSdkVersion 32 + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.androiddemo" - minSdkVersion 26 + minSdkVersion 24 targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "1.0" + versionName "15.0" if(true) { versionName = genVersionName("${versionName}") } @@ -53,22 +46,27 @@ android { dependencies { api fileTree(dir: 'libs', include: ['*.jar']) - // 吐司类库 - implementation 'com.github.getActivity:ToastUtils:10.5' - // Android 类库 - // https://mvnrepository.com/artifact/com.android.support/support-v4 - implementation 'com.android.support:support-v4:28.0.0' + //api 'com.android.support:appcompat-v7:28.0.0' + api('com.android.support:appcompat-v7:28.0.0'){ + //exclude group: "com.android.support", module: "support-vector-drawable" + exclude group: "com.android.support:animated-vector-drawable:28.0.0" + } // https://mvnrepository.com/artifact/com.android.support/support-compat - implementation 'com.android.support:support-compat:28.0.0' + api 'com.android.support:support-compat:28.0.0' // 保留原有依赖(可选) + // https://mvnrepository.com/artifact/com.android.support/support-v4 + api 'com.android.support:support-v4:28.0.0' // https://mvnrepository.com/artifact/com.android.support/support-media-compat - implementation 'com.android.support:support-media-compat:28.0.0' + api 'com.android.support:support-media-compat:28.0.0' // https://mvnrepository.com/artifact/com.android.support/support-core-utils - implementation 'com.android.support:support-core-utils:28.0.0' + api 'com.android.support:support-core-utils:28.0.0' // https://mvnrepository.com/artifact/com.android.support/support-core-ui - implementation 'com.android.support:support-core-ui:28.0.0' + api 'com.android.support:support-core-ui:28.0.0' // https://mvnrepository.com/artifact/com.android.support/support-fragment - implementation 'com.android.support:support-fragment:28.0.0' + api 'com.android.support:support-fragment:28.0.0' // https://mvnrepository.com/artifact/com.android.support/recyclerview-v7 - implementation 'com.android.support:recyclerview-v7:28.0.0' + api 'com.android.support:recyclerview-v7:28.0.0' + + api 'cc.winboll.studio:libapputils:15.2.1' + api 'cc.winboll.studio:libappbase:15.2.2' } diff --git a/androiddemo/build.properties b/androiddemo/build.properties index 4d98e2f..2fffde9 100644 --- a/androiddemo/build.properties +++ b/androiddemo/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Mar 11 18:02:14 GMT 2025 +#Wed Apr 02 12:22:30 GMT 2025 stageCount=0 libraryProject= -baseVersion=1.0 -publishVersion=1.0.0 -buildCount=1 -baseBetaVersion=1.0.1 +baseVersion=15.0 +publishVersion=15.0.0 +buildCount=20 +baseBetaVersion=15.0.1 diff --git a/androiddemo/src/main/AndroidManifest.xml b/androiddemo/src/main/AndroidManifest.xml index 43eac9a..57a1145 100644 --- a/androiddemo/src/main/AndroidManifest.xml +++ b/androiddemo/src/main/AndroidManifest.xml @@ -11,7 +11,7 @@ android:label="@string/app_name" android:theme="@style/AppTheme" android:resizeableActivity="true" - android:name=".GlobalApplication"> + android:name=".App"> + android:orientation="vertical"> - + + + + + + + + + + + diff --git a/androidxdemo/build.gradle b/androidxdemo/build.gradle index fcf214f..004105d 100644 --- a/androidxdemo/build.gradle +++ b/androidxdemo/build.gradle @@ -18,25 +18,18 @@ def genVersionName(def versionName){ } android { - productFlavors { - beta { - } - stage { - } - } - - compileSdkVersion 30 - buildToolsVersion "30.0.3" + compileSdkVersion 32 + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.androidxdemo" - minSdkVersion 26 + minSdkVersion 24 targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "1.0" + versionName "15.0" if(true) { versionName = genVersionName("${versionName}") } @@ -54,23 +47,27 @@ dependencies { api fileTree(dir: 'libs', include: ['*.jar']) // SSH - implementation 'com.jcraft:jsch:0.1.55' + api 'com.jcraft:jsch:0.1.55' // Html 解析 - implementation 'org.jsoup:jsoup:1.13.1' + api 'org.jsoup:jsoup:1.13.1' // 二维码类库 - implementation 'com.google.zxing:core:3.4.1' - implementation 'com.journeyapps:zxing-android-embedded:3.6.0' + api 'com.google.zxing:core:3.4.1' + api 'com.journeyapps:zxing-android-embedded:3.6.0' // 应用介绍页类库 - implementation 'io.github.medyo:android-about-page:2.0.0' + api 'io.github.medyo:android-about-page:2.0.0' // 吐司类库 - implementation 'com.github.getActivity:ToastUtils:10.5' + api 'com.github.getActivity:ToastUtils:10.5' // 网络连接类库 - implementation 'com.squareup.okhttp3:okhttp:4.4.1' - // Android 类库 - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.viewpager:viewpager:1.0.0' - implementation 'androidx.vectordrawable:vectordrawable:1.1.0' - implementation 'androidx.vectordrawable:vectordrawable-animated:1.1.0' - implementation 'androidx.fragment:fragment:1.1.0' - implementation 'com.google.android.material:material:1.4.0' + api 'com.squareup.okhttp3:okhttp:4.4.1' + // AndroidX 类库 + api 'androidx.appcompat:appcompat:1.1.0' + api 'com.google.android.material:material:1.4.0' + //api 'androidx.viewpager:viewpager:1.0.0' + //api 'androidx.vectordrawable:vectordrawable:1.1.0' + //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' + //api 'androidx.fragment:fragment:1.1.0' + + api 'cc.winboll.studio:libaes:15.2.5' + api 'cc.winboll.studio:libapputils:15.2.1' + api 'cc.winboll.studio:libappbase:15.2.2' } diff --git a/androidxdemo/build.properties b/androidxdemo/build.properties index 8d115d9..ec3a471 100644 --- a/androidxdemo/build.properties +++ b/androidxdemo/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Mar 11 18:25:43 GMT 2025 +#Wed Apr 02 12:13:40 GMT 2025 stageCount=0 libraryProject= -baseVersion=1.0 -publishVersion=1.0.0 -buildCount=4 -baseBetaVersion=1.0.1 +baseVersion=15.0 +publishVersion=15.0.0 +buildCount=16 +baseBetaVersion=15.0.1 diff --git a/androidxdemo/src/main/AndroidManifest.xml b/androidxdemo/src/main/AndroidManifest.xml index 6d0c707..1b70e90 100644 --- a/androidxdemo/src/main/AndroidManifest.xml +++ b/androidxdemo/src/main/AndroidManifest.xml @@ -8,9 +8,9 @@ android:icon="@mipmap/ic_launcher" android:roundIcon="@mipmap/ic_launcher_round" android:label="@string/app_name" - android:theme="@style/AppTheme" + android:theme="@style/MyAppTheme" android:resizeableActivity="true" - android:name=".GlobalApplication"> + android:name=".App"> - \ No newline at end of file + diff --git a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/GlobalApplication.java b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java similarity index 94% rename from androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/GlobalApplication.java rename to androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java index 7abaf88..afb21c7 100644 --- a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/GlobalApplication.java +++ b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/App.java @@ -1,7 +1,6 @@ package cc.winboll.studio.androidxdemo; import android.app.Activity; -import android.app.Application; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -15,6 +14,7 @@ import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import android.util.Log; +import android.view.Gravity; import android.view.Menu; import android.view.MenuItem; import android.view.ViewGroup; @@ -22,6 +22,9 @@ import android.widget.HorizontalScrollView; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; +import cc.winboll.studio.androidxdemo.R; +import cc.winboll.studio.libappbase.GlobalApplication; +import com.hjq.toast.ToastUtils; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.Closeable; @@ -39,15 +42,23 @@ import java.util.Date; import java.util.LinkedHashMap; import java.util.concurrent.atomic.AtomicBoolean; -public class GlobalApplication extends Application { +public class App extends GlobalApplication { private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); @Override public void onCreate() { super.onCreate(); - CrashHandler.getInstance().registerGlobal(this); - CrashHandler.getInstance().registerPart(this); + + // 初始化 Toast 框架 + ToastUtils.init(this); + // 设置 Toast 布局样式 + ToastUtils.setView(R.layout.view_toast); + //ToastUtils.setStyle(new WhiteToastStyle()); + ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + + //CrashHandler.getInstance().registerGlobal(this); + //CrashHandler.getInstance().registerPart(this); } public static void write(InputStream input, OutputStream output) throws IOException { @@ -252,7 +263,7 @@ public class GlobalApplication extends Application { private static String getKernel() { try { - return GlobalApplication.toString(new FileInputStream("/proc/version")).trim(); + return App.toString(new FileInputStream("/proc/version")).trim(); } catch (Throwable e) { return e.getMessage(); } @@ -331,4 +342,4 @@ public class GlobalApplication extends Application { restart(); } } -} \ No newline at end of file +} diff --git a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java index de5c892..6755e6f 100644 --- a/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java +++ b/androidxdemo/src/main/java/cc/winboll/studio/androidxdemo/MainActivity.java @@ -3,17 +3,29 @@ package cc.winboll.studio.androidxdemo; import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libappbase.LogView; +import com.hjq.toast.ToastUtils; public class MainActivity extends AppCompatActivity { - + + LogView mLogView; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - + Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); setSupportActionBar(toolbar); + + mLogView = findViewById(R.id.logview); + ToastUtils.show("onCreate"); } - -} \ No newline at end of file + + @Override + protected void onResume() { + super.onResume(); + mLogView.start(); + } +} diff --git a/androidxdemo/src/main/res/layout/activity_main.xml b/androidxdemo/src/main/res/layout/activity_main.xml index 034ba40..12fdc32 100644 --- a/androidxdemo/src/main/res/layout/activity_main.xml +++ b/androidxdemo/src/main/res/layout/activity_main.xml @@ -34,5 +34,18 @@ + + + + + + diff --git a/androidxdemo/src/main/res/values/styles.xml b/androidxdemo/src/main/res/values/styles.xml index 0eb88fe..a70e242 100644 --- a/androidxdemo/src/main/res/values/styles.xml +++ b/androidxdemo/src/main/res/values/styles.xml @@ -1,7 +1,7 @@ - diff --git a/apputils/build.gradle b/apputils/build.gradle index 6e1573e..ce30b57 100644 --- a/apputils/build.gradle +++ b/apputils/build.gradle @@ -19,17 +19,17 @@ def genVersionName(def versionName){ android { compileSdkVersion 32 - buildToolsVersion "33.0.3" + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.apputils" - minSdkVersion 21 - targetSdkVersion 30 + minSdkVersion 26 + targetSdkVersion 29 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "9.2" + versionName "15.2" if(true) { versionName = genVersionName("${versionName}") } @@ -41,15 +41,9 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } } dependencies { api project(':libapputils') - api 'cc.winboll.studio:libappbase:1.0.3' api fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/apputils/build.properties b/apputils/build.properties index 9d55320..4fad09f 100644 --- a/apputils/build.properties +++ b/apputils/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Jan 18 13:03:10 HKT 2025 +#Sat Mar 29 12:14:55 HKT 2025 stageCount=2 libraryProject=libapputils -baseVersion=9.2 -publishVersion=9.2.1 +baseVersion=15.2 +publishVersion=15.2.1 buildCount=0 -baseBetaVersion=9.2.2 +baseBetaVersion=15.2.2 diff --git a/apputils/src/main/AndroidManifest.xml b/apputils/src/main/AndroidManifest.xml index 1a0c9c3..41176ff 100644 --- a/apputils/src/main/AndroidManifest.xml +++ b/apputils/src/main/AndroidManifest.xml @@ -8,7 +8,7 @@ android:allowBackup="true" android:icon="@drawable/ic_winboll" android:label="@string/app_name" - android:theme="@style/WinBoll.SupportThemeNoActionBar" + android:theme="@style/MyUtilsTheme" android:supportsRtl="true"> - + - + + + + + diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/App.java b/apputils/src/main/java/cc/winboll/studio/apputils/App.java index ca55cce..4c81010 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/App.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/App.java @@ -5,27 +5,16 @@ package cc.winboll.studio.apputils; * @Date 2024/12/08 15:10:51 * @Describe 全局应用类 */ -import android.view.Gravity; -import cc.winboll.studio.libapputils.app.WinBollApplication; -import com.hjq.toast.ToastUtils; -import com.hjq.toast.style.WhiteToastStyle; +import android.app.Application; +import android.content.Context; +import cc.winboll.studio.libappbase.GlobalApplication; -public class App extends WinBollApplication { +public class App extends GlobalApplication { public static final String TAG = "App"; - public static final String _ACTION_DEBUGVIEW = WinBollApplication.class.getName() + "_ACTION_DEBUGVIEW"; - @Override public void onCreate() { super.onCreate(); - // 初始化 Toast 框架 - // - ToastUtils.init(this); - // 设置 Toast 布局样式 - //ToastUtils.setView(R.layout.view_toast); - ToastUtils.setStyle(new WhiteToastStyle()); - ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); } - } diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/AssetsHtmlActivity.java similarity index 80% rename from libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java rename to apputils/src/main/java/cc/winboll/studio/apputils/AssetsHtmlActivity.java index 228ba89..432d5be 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/AssetsHtmlActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/AssetsHtmlActivity.java @@ -1,59 +1,53 @@ -package cc.winboll.studio.libapputils.activities; +package cc.winboll.studio.apputils; /** * @Author ZhanGSKen@QQ.COM * @Date 2025/01/03 11:02:49 * @Describe 一个可以浏览随 APP 附带的 Html 文档的窗口 */ +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 androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; -import cc.winboll.studio.libapputils.log.LogUtils; -import cc.winboll.studio.libapputils.view.SimpleWebView; -import com.hjq.toast.ToastUtils; +import android.widget.Toolbar; +import cc.winboll.studio.apputils.R; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.winboll.IWinBollActivity; +import cc.winboll.studio.libapputils.views.SimpleWebView; import java.io.IOException; import java.io.InputStream; -import android.os.PersistableBundle; -public class AssetsHtmlActivity extends WinBollActivity { +public class AssetsHtmlActivity extends WinBollActivityBase implements IWinBollActivity { - public static final String TAG = "AssetsHtmlActivity"; - - public static final String EXTRA_HTMLFILENAME = "EXTRA_HTMLFILENAME"; - - String mszHelpIndexFilePath = ""; - Uri mszHelpIndexFileUri; - Context mContext; - - // Assets 文件夹里的 Html 文件的名称 - String mszHtmlFileName; + @Override + public Activity getActivity() { + return super.getActivity(); + } @Override public String getTag() { return TAG; } - @Override - protected boolean isEnableDisplayHomeAsUp() { - return true; - } + public static final String TAG = "AssetsHtmlActivity"; - @Override - protected boolean isAddWinBollToolBar() { - return false; - } + public static final String EXTRA_HTMLFILENAME = "EXTRA_HTMLFILENAME"; - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activityassetshtmlToolbar1); - } + String mszHelpIndexFilePath = ""; + Uri mszHelpIndexFileUri; + Context mContext; + + // Assets 文件夹里的 Html 文件的名称 + String mszHtmlFileName; +// +// @Override +// public Activity getActivity() { +// return this; +// } @Override public boolean onCreateOptionsMenu(Menu menu) { @@ -73,6 +67,10 @@ public class AssetsHtmlActivity extends WinBollActivity { super.onCreate(savedInstanceState); setContentView(R.layout.activity_assetshtml); + // 初始化工具栏 + Toolbar mToolbar = findViewById(R.id.toolbar); + setActionBar(mToolbar); + mszHtmlFileName = "index.html"; Intent intent = getIntent(); @@ -81,7 +79,7 @@ public class AssetsHtmlActivity extends WinBollActivity { if (szTemp != null && !szTemp.trim().equals("")) { mszHtmlFileName = szTemp.trim(); } - ToastUtils.show(mszHtmlFileName); + //ToastUtils.show(mszHtmlFileName); } // 与其他应用分享 html 帮助 @@ -107,13 +105,6 @@ public class AssetsHtmlActivity extends WinBollActivity { // myWebView.loadUrl(mszHelpIndexFileUri.toString()); } - @Override - public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) { - super.onPostCreate(savedInstanceState, persistentState); - setSubTitle(mszHtmlFileName); - //setSubTitle(TAG); - } - // void initWebViewFromAssets(String szHtmlFileName) { try { diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java index 49963b5..afe1708 100644 --- a/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/MainActivity.java @@ -1,38 +1,60 @@ package cc.winboll.studio.apputils; +import android.app.Activity; +import android.content.ComponentName; import android.content.Intent; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Toast; -import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; -import cc.winboll.studio.libapputils.activities.QRCodeDecodeActivity; -import cc.winboll.studio.libapputils.app.WinBollActivity; -import cc.winboll.studio.libapputils.app.WinBollActivityManager; -import cc.winboll.studio.libapputils.log.LogActivity; -import cc.winboll.studio.libapputils.log.LogUtils; -import com.hjq.toast.ToastUtils; +import android.widget.Toolbar; +import cc.winboll.studio.apputils.R; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import java.util.List; +import java.util.Set; -final public class MainActivity extends WinBollActivity { +final public class MainActivity extends Activity { public static final String TAG = "MainActivity"; public static final int REQUEST_QRCODEDECODE_ACTIVITY = 0; - @Override - protected boolean isEnableDisplayHomeAsUp() { - return false; - } + Toolbar mToolbar; + LogView mLogView; +// +// @Override +// public Activity getActivity() { +// return this; +// } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - //Toolbar toolbar = findViewById(R.id.activitymainToolbar1); - //setActionBar(toolbar); + mLogView = findViewById(R.id.logview); + mLogView.start(); + + // 初始化工具栏 + mToolbar = findViewById(R.id.toolbar); + setActionBar(mToolbar); +// if (isEnableDisplayHomeAsUp()) { +// // 显示后退按钮 +// getActionBar().setDisplayHomeAsUpEnabled(true); +// } +// getActionBar().setSubtitle(getTag()); + + checkResolveActivity(); + archiveInstance(); + + // 接收并处理 Intent 数据,函数 Intent 处理接收就直接返回 //if (prosessIntents(getIntent())) return; @@ -44,44 +66,94 @@ final public class MainActivity extends WinBollActivity { // LogUtils.d(TAG, "BuildConfig.DEBUG : " + Boolean.toString(BuildConfig.DEBUG)); } + boolean checkResolveActivity() { + PackageManager packageManager = getPackageManager(); + //Intent intent = new Intent("your_action_here"); + Intent intent = getIntent(); + if (intent != null) { + List resolveInfoList = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); + if (resolveInfoList.size() > 0) { + // 传入的Intent action在Activity清单的intent-filter的action节点里有定义 + if (intent.getAction() != null) { +// if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { +// App.setIsDebug(true); +// //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); +// +// } + } + return true; + } else { + // 传入的Intent action在Activity清单的intent-filter的action节点里没有定义 + //ToastUtils.show("false : " + intent.getAction()); + return false; + } + + } + + // action在清单文件中没有声明 + ToastUtils.show("false"); + return false; + } + + void archiveInstance() { + Intent intent = getIntent(); + StringBuilder sb = new StringBuilder("\n### Archive Instance ###\n"); + + if (intent != null) { + ComponentName componentName = intent.getComponent(); + if (componentName != null) { + String packageName = componentName.getPackageName(); + //Log.d("AppStarter", "启动本应用的应用包名: " + packageName); + sb.append("启动本应用的应用包名: \n" + packageName); + } + + sb.append("\nImplicit Intent Tracker :\n接收到的 Intent 动作: \n" + intent.getAction()); + Set categories = intent.getCategories(); + if (categories != null) { + for (String category : categories) { + sb.append("\n接收到的 Intent 类别 :\n" + category); + } + } + Uri data = intent.getData(); + if (data != null) { + sb.append("\n接收到的 Intent 数据 :\n" + data.toString()); + } + } else { + sb.append("Intent is null."); + } + sb.append("\n\n"); + LogUtils.d(TAG, sb.toString()); + } + + + @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // 缓存当前 activity + //WinBollActivityManager.getInstance(this).add(this); + } + + @Override + public void onDestroy() { + //WinBollActivityManager.getInstance(this).registeRemove(this); + super.onDestroy(); + } + public void onTestLogClick(View view) { LogUtils.d(TAG, "onTestLogClick"); Toast.makeText(getApplication(), "onTestLogClick", Toast.LENGTH_SHORT).show(); } - public void onLogUtilsClick(View view) { - Intent intent = new Intent(this, LogActivity.class); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); - intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); - startActivity(intent); - } + public void onTestLogActivity(View view) { +// Intent intent = new Intent(this, LogActivity.class); +// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); +// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); +// startActivity(intent); - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); -// setSubTitle(""); + //WinBollActivityManager.getInstance().printAvtivityListInfo(); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); } - @Override - public void onBackPressed() { -// exit(); - } - -// void exit() { -// YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ -// -// @Override -// public void onYes() { -// WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); -// } -// -// @Override -// public void onNo() { -// } -// }; -// YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener); -// } - // // 处理传入的 Intent 数据 // @@ -125,58 +197,107 @@ final public class MainActivity extends WinBollActivity { return true; } - @Override - public String getTag() { - return TAG; - } - - @Override - protected boolean isAddWinBollToolBar() { - return true; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activitymainToolbar1); - } - @Override public boolean onCreateOptionsMenu(Menu menu) { + //ToastUtils.show("onCreateOptionsMenu"); getMenuInflater().inflate(R.menu.toolbar_main, menu); +// if (isAddWinBollToolBar()) { +// //ToastUtils.show("mIWinBoll.isAddWinBollToolBar()"); +// getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); +// } + if (App.isDebuging()) { + getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); + } + return super.onCreateOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { - if (item.getItemId() == R.id.item_testwinboll) { - WinBollActivityManager.getInstance(this).startWinBollActivity(this, TestWinBollActivity.class); + if (item.getItemId() == R.id.item_exit) { + //exit(); + return true; } else if (item.getItemId() == R.id.item_teststringtoqrcodeview) { - WinBollActivityManager.getInstance(this).startWinBollActivity(this, TestStringToQrCodeViewActivity.class); + Intent intent = new Intent(this, TestStringToQRCodeViewActivity.class); + startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, TestStringToQrCodeViewActivity.class); } else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) { Intent intent = new Intent(this, QRCodeDecodeActivity.class); startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); + } else if (item.getItemId() == R.id.item_testcrashreport) { + for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { + getString(i); + } + return true; + } else if (item.getItemId() == R.id.item_log) { + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); + return true; + } else if (item.getItemId() == R.id.item_exitdebug) { + //AboutView.setApp2NormalMode(this); + return true; + } else if (item.getItemId() == android.R.id.home) { + //WinBollActivityManager.getInstance(this).finish(this); + return true; } return super.onOptionsItemSelected(item); } - public void onTestJavascriptHtmlActivity(View view) { +// void exit() { +// YesNoAlertDialog.OnDialogResultListener listener = new YesNoAlertDialog.OnDialogResultListener(){ +// +// @Override +// public void onYes() { +// //WinBollActivityManager.getInstance(getApplicationContext()).finishAll(); +// } +// +// @Override +// public void onNo() { +// } +// }; +// YesNoAlertDialog.show(this, "[ " + getString(R.string.app_name) + " ]", "Exit(Yes/No).\nIs close all activity?", listener); +// +// } + + @Override + public void onBackPressed() { +// if (WinBollActivityManager.getInstance(getApplicationContext()).isFirstIWinBollActivity(this)) { +// exit(); +// } else { +// WinBollActivityManager.getInstance(this).finish(this); +// super.onBackPressed(); +// } + } + + + public void onTestAssetsHtmlActivity(View view) { Intent intent = new Intent(this, AssetsHtmlActivity.class); intent.putExtra(AssetsHtmlActivity.EXTRA_HTMLFILENAME, "javascript_test.html"); - WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AssetsHtmlActivity.class); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); + intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); + startActivity(intent); + //WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AssetsHtmlActivity.class); } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case REQUEST_QRCODEDECODE_ACTIVITY : { - String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT); - ToastUtils.show(text); - break; - } - default : { - ToastUtils.show(String.format("%d, %d", requestCode, resultCode)); - super.onActivityResult(requestCode, resultCode, data); - } - } + protected void onResume() { + super.onResume(); + mLogView.start(); } + + /*@Override + protected void onActivithyResult(int requestCode, int resultCode, Intent data) { + switch (requestCode) { + case REQUEST_QRCODEDECODE_ACTIVITY : { + if (data != null) { + String text = data.getStringExtra(QRCodeDecodeActivity.EXTRA_RESULT); + ToastUtils.show(text); + } + break; + } + default : { + //ToastUtils.show(String.format("%d, %d", requestCode, resultCode)); + super.prosessActivityResult(requestCode, resultCode, data); + } + } + }*/ } diff --git a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/QRCodeDecodeActivity.java similarity index 67% rename from libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java rename to apputils/src/main/java/cc/winboll/studio/apputils/QRCodeDecodeActivity.java index a0d979c..cd74712 100644 --- a/libapputils/src/main/java/cc/winboll/studio/libapputils/activities/QRCodeDecodeActivity.java +++ b/apputils/src/main/java/cc/winboll/studio/apputils/QRCodeDecodeActivity.java @@ -1,72 +1,59 @@ -package cc.winboll.studio.libapputils.activities; +package cc.winboll.studio.apputils; /** * @Author ZhanGSKen@QQ.COM * @Date 2025/01/18 10:32:21 * @Describe 二维码扫码解码窗口 */ +import android.app.Activity; import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.widget.TextView; -import androidx.appcompat.widget.Toolbar; -import androidx.core.app.ActivityCompat; -import androidx.core.content.ContextCompat; -import cc.winboll.studio.libapputils.R; -import cc.winboll.studio.libapputils.app.WinBollActivity; +import android.widget.Toolbar; +import cc.winboll.studio.apputils.R; import com.google.zxing.ResultPoint; import com.journeyapps.barcodescanner.BarcodeCallback; import com.journeyapps.barcodescanner.BarcodeResult; import com.journeyapps.barcodescanner.DecoratedBarcodeView; import java.util.List; -public class QRCodeDecodeActivity extends WinBollActivity { +public class QRCodeDecodeActivity extends Activity { public static final String TAG = "QRCodeDecodeActivity"; - public static final String EXTRA_RESULT = "EXTRA_RESULT"; + public static final String EXTRA_RESULT = "EXTRA_RESULT"; private static final int REQUEST_CAMERA_PERMISSION = 1; + TextView resultTextView; DecoratedBarcodeView barcodeView; - - @Override - public String getTag() { - return TAG; - } - @Override - protected boolean isEnableDisplayHomeAsUp() { - return true; - } - - - @Override - protected boolean isAddWinBollToolBar() { - return false; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activityqrcodedecodeToolbar1); - } +// @Override +// public Activity getActivity() { +// return this; +// } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_qrcodedecode); - resultTextView = findViewById(R.id.activityqrcodedecodeTextView1); + + // 初始化工具栏 +// Toolbar mToolbar = findViewById(R.id.toolbar); +// setActionBar(mToolbar); + + //resultTextView = findViewById(R.id.activityqrcodedecodeTextView1); barcodeView = findViewById(R.id.activityqrcodedecodeDecoratedBarcodeView1); // 请求相机权限 - if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) - != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(this, - new String[]{android.Manifest.permission.CAMERA}, - REQUEST_CAMERA_PERMISSION); - } else { - startScanning(); - } - - +// if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA) +// != PackageManager.PERMISSION_GRANTED) { +// ActivityCompat.requestPermissions(this, +// new String[]{android.Manifest.permission.CAMERA}, +// REQUEST_CAMERA_PERMISSION); +// } else { +// startScanning(); +// } + startScanning(); } private void startScanning() { diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestBBMorseCodeActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestBBMorseCodeActivity.java new file mode 100644 index 0000000..1781971 --- /dev/null +++ b/apputils/src/main/java/cc/winboll/studio/apputils/TestBBMorseCodeActivity.java @@ -0,0 +1,20 @@ +package cc.winboll.studio.apputils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/23 16:14:45 + */ +import android.app.Activity; +import android.os.Bundle; + +public class TestBBMorseCodeActivity extends Activity { + + public static final String TAG = "TestBBMorseCodeActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_testbbmorsecode); + + } +} diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQRCodeViewActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQRCodeViewActivity.java new file mode 100644 index 0000000..a77addd --- /dev/null +++ b/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQRCodeViewActivity.java @@ -0,0 +1,36 @@ +package cc.winboll.studio.apputils; + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2025/01/17 19:50:46 + */ +import android.app.Activity; +import android.os.Bundle; +import android.widget.Toolbar; +import cc.winboll.studio.apputils.R; +import cc.winboll.studio.libapputils.views.StringToQrCodeView; + +public class TestStringToQRCodeViewActivity extends Activity { + + public static final String TAG = "TestStringToQrCodeViewActivity"; + + StringToQrCodeView mStringToQrCodeView; +// +// @Override +// public Activity getActivity() { +// return this; +// } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_teststringtoqrcodeview); + + // 初始化工具栏 + Toolbar mToolbar = findViewById(R.id.toolbar); + mToolbar.setSubtitle(TAG); + setActionBar(mToolbar); + + mStringToQrCodeView = findViewById(R.id.activityteststringtoqrcodeviewStringToQrCodeView1); + } +} diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java deleted file mode 100644 index 06c80a3..0000000 --- a/apputils/src/main/java/cc/winboll/studio/apputils/TestStringToQrCodeViewActivity.java +++ /dev/null @@ -1,50 +0,0 @@ -package cc.winboll.studio.apputils; - -import android.os.Bundle; -import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.app.WinBollActivity; -import cc.winboll.studio.libapputils.view.StringToQrCodeView; - -/** - * @Author ZhanGSKen@QQ.COM - * @Date 2025/01/17 19:50:46 - */ -public class TestStringToQrCodeViewActivity extends WinBollActivity { - - public static final String TAG = "TestStringToQrCodeViewActivity"; - - StringToQrCodeView mStringToQrCodeView; - - @Override - public String getTag() { - return TAG; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activityteststringtoqrcodeviewToolbar1); - } - - @Override - protected boolean isEnableDisplayHomeAsUp() { - return true; - } - - @Override - protected boolean isAddWinBollToolBar() { - return true; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_teststringtoqrcodeview); - mStringToQrCodeView = findViewById(R.id.activityteststringtoqrcodeviewStringToQrCodeView1); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - setSubTitle(TAG); - } -} diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java b/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java deleted file mode 100644 index 91bc4b4..0000000 --- a/apputils/src/main/java/cc/winboll/studio/apputils/TestWinBollActivity.java +++ /dev/null @@ -1,52 +0,0 @@ -package cc.winboll.studio.apputils; - -import android.content.Intent; -import android.os.Bundle; -import android.view.View; -import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.libapputils.activities.AssetsHtmlActivity; -import cc.winboll.studio.libapputils.app.WinBollActivity; -import cc.winboll.studio.libapputils.app.WinBollActivityManager; - -/** - * @Author ZhanGSKen@QQ.COM - * @Date 2025/01/13 15:09:46 - */ -public class TestWinBollActivity extends WinBollActivity { - - public static final String TAG = "TestWinBollActivity"; - - @Override - public String getTag() { - return TAG; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activitytestwinbollToolbar1); - } - - @Override - protected boolean isEnableDisplayHomeAsUp() { - return true; - } - - @Override - protected boolean isAddWinBollToolBar() { - return true; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_testwinboll); - } - - @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - setSubTitle(TAG); - } - - -} diff --git a/apputils/src/main/java/cc/winboll/studio/apputils/WinBollActivityBase.java b/apputils/src/main/java/cc/winboll/studio/apputils/WinBollActivityBase.java new file mode 100644 index 0000000..1e2e8cf --- /dev/null +++ b/apputils/src/main/java/cc/winboll/studio/apputils/WinBollActivityBase.java @@ -0,0 +1,52 @@ +package cc.winboll.studio.apputils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/28 17:11:37 + * @Describe 应用活动窗口基类 + */ +import android.app.Activity; +import android.os.Bundle; +import android.os.PersistableBundle; +import android.support.v7.app.AppCompatActivity; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.winboll.IWinBollActivity; +import cc.winboll.studio.libappbase.winboll.WinBollActivityManager; + +public class WinBollActivityBase extends AppCompatActivity implements IWinBollActivity { + + public static final String TAG = "WinBollActivityBase"; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + WinBollActivityManager getWinBollActivityManager() { + return WinBollActivityManager.getInstance(GlobalApplication.getInstance()); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWinBollActivityManager().add(this); + } + + @Override + public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) { + super.onPostCreate(savedInstanceState, persistentState); + } + + + + @Override + protected void onDestroy() { + super.onDestroy(); + getWinBollActivityManager().registeRemove(this); + } +} diff --git a/apputils/src/main/res/layout/activity_assetshtml.xml b/apputils/src/main/res/layout/activity_assetshtml.xml new file mode 100644 index 0000000..84e8f72 --- /dev/null +++ b/apputils/src/main/res/layout/activity_assetshtml.xml @@ -0,0 +1,21 @@ + + + + + + + + + diff --git a/apputils/src/main/res/layout/activity_main.xml b/apputils/src/main/res/layout/activity_main.xml index ad57465..7a07e44 100644 --- a/apputils/src/main/res/layout/activity_main.xml +++ b/apputils/src/main/res/layout/activity_main.xml @@ -5,10 +5,10 @@ android:layout_width="match_parent" android:layout_height="match_parent"> - + android:id="@+id/toolbar"/>