Compare commits

..

14 Commits

Author SHA1 Message Date
ZhanGSKen
69e7e72ed8 <apputils>APK 9.2.7 release Publish. 2025-01-23 02:17:32 +08:00
ZhanGSKen
a96ba362b4 应用类重构 2025-01-23 02:16:53 +08:00
ZhanGSKen
6447bcf924 <libapputils>Library Release 9.2.6 2025-01-23 01:54:40 +08:00
ZhanGSKen
18ed325731 <apputils>APK 9.2.6 release Publish. 2025-01-23 01:54:23 +08:00
ZhanGSKen
16e3d10b63 吐司框架分离初始化步骤 2025-01-23 01:53:06 +08:00
ZhanGSKen
8b0e8b00ae <libapputils>Library Release 9.2.5 2025-01-23 01:34:24 +08:00
ZhanGSKen
7f61ff1470 <apputils>APK 9.2.5 release Publish. 2025-01-23 01:34:03 +08:00
ZhanGSKen
c4e0c23a0c 应用介绍页添加 Gitea APP 子项目文件夹直接链接方式 2025-01-23 01:33:10 +08:00
ZhanGSKen
c7d26bbc3d 清理应用提示信息 2025-01-23 01:14:06 +08:00
ZhanGSKen
4968bbaeae <apputils>APK 9.2.4 release Publish. 2025-01-22 21:22:05 +08:00
ZhanGSKen
8e6b06e366 <apputils>APK 9.2.3 release Publish. 2025-01-22 21:17:58 +08:00
ZhanGSKen
ae7fb2984a 介绍页调试中 2025-01-22 21:16:35 +08:00
ZhanGSKen
a4d009f8fb 重构 WinBoll 框架应用类 2025-01-22 19:36:11 +08:00
ZhanGSKen
5a549e9652 <libapputils>Library Release 9.2.2 2025-01-22 17:20:01 +08:00
18 changed files with 164 additions and 79 deletions

View File

@@ -50,6 +50,8 @@ android {
dependencies { dependencies {
api project(':libapputils') api project(':libapputils')
api 'cc.winboll.studio:libappbase:1.0.3'
api 'cc.winboll.studio:libappbase:1.1.0'
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Wed Jan 22 17:19:38 HKT 2025 #Thu Jan 23 02:17:32 HKT 2025
stageCount=3 stageCount=8
libraryProject=libapputils libraryProject=libapputils
baseVersion=9.2 baseVersion=9.2
publishVersion=9.2.2 publishVersion=9.2.7
buildCount=0 buildCount=0
baseBetaVersion=9.2.3 baseBetaVersion=9.2.8

View File

@@ -5,22 +5,25 @@ package cc.winboll.studio.apputils;
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.app.Application;
import android.view.Gravity; import android.view.Gravity;
import cc.winboll.studio.libapputils.app.WinBollApplication; import cc.winboll.studio.GlobalApplication;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle; import com.hjq.toast.style.WhiteToastStyle;
import cc.winboll.studio.libapputils.app.WinBollUtils;
public class App extends WinBollApplication { public class App extends GlobalApplication {
public static final String TAG = "App"; public static final String TAG = "App";
public static final String _ACTION_DEBUGVIEW = WinBollApplication.class.getName() + "_ACTION_DEBUGVIEW"; public static final String _ACTION_DEBUGVIEW = App.class.getName() + "_ACTION_DEBUGVIEW";
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
// 初始化 WinBoll 框架
WinBollUtils.init(this);
// 初始化 Toast 框架 // 初始化 Toast 框架
//
ToastUtils.init(this); ToastUtils.init(this);
// 设置 Toast 布局样式 // 设置 Toast 布局样式
//ToastUtils.setView(R.layout.view_toast); //ToastUtils.setView(R.layout.view_toast);

View File

@@ -160,18 +160,34 @@ final public class MainActivity extends WinBollActivity {
} else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) { } else if (item.getItemId() == R.id.item_testqrcodedecodeactivity) {
Intent intent = new Intent(this, QRCodeDecodeActivity.class); Intent intent = new Intent(this, QRCodeDecodeActivity.class);
startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY); startActivityForResult(intent, REQUEST_QRCODEDECODE_ACTIVITY);
} else if(item.getItemId() == R.id.item_about) {
openAboutActivity();
return true;
} }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
public void onTestAboutActivity(View view) { void openAboutActivity() {
Intent intent = new Intent(this, AboutActivity.class); Intent intent = new Intent(this, AboutActivity.class);
APPInfo appInfo = new APPInfo(); APPInfo appInfo = new APPInfo();
appInfo.setAppName("APPUtils");
appInfo.setAppIcon(cc.winboll.studio.libapputils.R.drawable.ic_winboll); appInfo.setAppIcon(cc.winboll.studio.libapputils.R.drawable.ic_winboll);
appInfo.setAppName("Test APP"); appInfo.setAppDescription("APPUtils Description");
appInfo.setAppGitName("APP");
appInfo.setAppGitAPPBranch("apputils");
appInfo.setAppGitAPPSubProjectFolder("apputils");
appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=APP");
appInfo.setAppAPKName("APPUtils");
appInfo.setAppAPKFolderName("APPUtils");
intent.putExtra(AboutActivity.EXTRA_APPINFO, appInfo); intent.putExtra(AboutActivity.EXTRA_APPINFO, appInfo);
WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AboutActivity.class); WinBollActivityManager.getInstance(this).startWinBollActivity(this, intent, AboutActivity.class);
} }
public void onTestAboutActivity(View view) {
//ToastUtils.show("onTestAboutActivity");
openAboutActivity();
}
public void onTestJavascriptHtmlActivity(View view) { public void onTestJavascriptHtmlActivity(View view) {
Intent intent = new Intent(this, AssetsHtmlActivity.class); Intent intent = new Intent(this, AssetsHtmlActivity.class);

View File

@@ -38,7 +38,7 @@ dependencies {
api 'androidx.fragment:fragment:1.0.0' api 'androidx.fragment:fragment:1.0.0'
api 'com.google.android.material:material:1.0.0' api 'com.google.android.material:material:1.0.0'
api 'cc.winboll.studio:libappbase:1.0.3' api 'cc.winboll.studio:libappbase:1.1.0'
api fileTree(dir: 'libs', include: ['*.jar']) api fileTree(dir: 'libs', include: ['*.jar'])
} }

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Wed Jan 22 17:19:38 HKT 2025 #Thu Jan 23 02:17:32 HKT 2025
stageCount=3 stageCount=8
libraryProject=libapputils libraryProject=libapputils
baseVersion=9.2 baseVersion=9.2
publishVersion=9.2.2 publishVersion=9.2.7
buildCount=0 buildCount=0
baseBetaVersion=9.2.3 baseBetaVersion=9.2.8

View File

@@ -18,6 +18,9 @@
<!-- 拍摄照片和视频 --> <!-- 拍摄照片和视频 -->
<uses-permission android:name="android.permission.CAMERA"/> <uses-permission android:name="android.permission.CAMERA"/>
<!-- 拥有完全的网络访问权限 -->
<uses-permission android:name="android.permission.INTERNET"/>
<application android:networkSecurityConfig="@xml/network_security_config"> <application android:networkSecurityConfig="@xml/network_security_config">
<activity <activity
@@ -45,4 +48,4 @@
</application> </application>
</manifest> </manifest>

View File

@@ -81,7 +81,7 @@ public class AssetsHtmlActivity extends WinBollActivity {
if (szTemp != null && !szTemp.trim().equals("")) { if (szTemp != null && !szTemp.trim().equals("")) {
mszHtmlFileName = szTemp.trim(); mszHtmlFileName = szTemp.trim();
} }
ToastUtils.show(mszHtmlFileName); //ToastUtils.show(mszHtmlFileName);
} }
// 与其他应用分享 html 帮助 // 与其他应用分享 html 帮助

View File

@@ -5,7 +5,7 @@ package cc.winboll.studio.libapputils.app;
* @Date 2024/08/12 14:45:35 * @Date 2024/08/12 14:45:35
* @Describe 应用版本工具集 * @Describe 应用版本工具集
*/ */
import com.hjq.toast.ToastUtils; import cc.winboll.studio.libapputils.log.LogUtils;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -23,6 +23,7 @@ public class AppVersionUtils {
// true 新版本 == 当前版本 // true 新版本 == 当前版本
// //
public static boolean isHasNewVersion2(String szCurrentName, String szNextName) { public static boolean isHasNewVersion2(String szCurrentName, String szNextName) {
LogUtils.d(TAG, String.format("isHasNewVersion2\nszCurrentName : %s\nszNextName : %s", szCurrentName, szNextName));
//szCurrentName = "AES_6.2.0-beta0_3234.apk"; //szCurrentName = "AES_6.2.0-beta0_3234.apk";
//szNextName = "AES_6.1.12.apk"; //szNextName = "AES_6.1.12.apk";
//szCurrentName = "AES_6.2.0-beta0_3234.apk"; //szCurrentName = "AES_6.2.0-beta0_3234.apk";
@@ -77,8 +78,9 @@ public class AppVersionUtils {
//LogUtils.d(TAG, "App version is the newest. "); //LogUtils.d(TAG, "App version is the newest. ");
return false; return false;
} }
public static boolean isHasNewStageReleaseVersion(String szCurrentName, String szNextName) { public static boolean isHasNewStageReleaseVersion(String szCurrentName, String szNextName) {
LogUtils.d(TAG, String.format("isHasNewStageReleaseVersion\nszCurrentName : %s\nszNextName : %s", szCurrentName, szNextName));
//szCurrentName = "AES_6.2.12.apk"; //szCurrentName = "AES_6.2.12.apk";
//szNextName = "AES_6.3.12.apk"; //szNextName = "AES_6.3.12.apk";
if (checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName))) { if (checkNewVersion(getCodeInPackageName(szCurrentName), getCodeInPackageName(szNextName))) {
@@ -96,6 +98,10 @@ public class AppVersionUtils {
// 返回 true 新版本 > 当前版本 // 返回 true 新版本 > 当前版本
// //
public static Boolean checkNewVersion(String szCurrentCode, String szNextCode) { public static Boolean checkNewVersion(String szCurrentCode, String szNextCode) {
if (szCurrentCode == null || szCurrentCode.equals("") || szNextCode == null || szNextCode.equals("")) {
LogUtils.d(TAG, String.format("checkNewVersion unexpected parameters:\nszCurrentCode : %s\nszNextCode : %s", szCurrentCode, szNextCode));
return false;
}
boolean isNew = false; boolean isNew = false;
String[] appVersionCurrent = szCurrentCode.split("\\."); String[] appVersionCurrent = szCurrentCode.split("\\.");
String[] appVersionNext = szNextCode.split("\\."); String[] appVersionNext = szNextCode.split("\\.");
@@ -106,7 +112,7 @@ public class AppVersionUtils {
if (Integer.parseInt(appVersionNext[i]) > Integer.parseInt(appVersionCurrent[i])) { if (Integer.parseInt(appVersionNext[i]) > Integer.parseInt(appVersionCurrent[i])) {
isNew = true; isNew = true;
return isNew; return isNew;
} else if(Integer.parseInt(appVersionNext[i]) == Integer.parseInt(appVersionCurrent[i])) { } else if (Integer.parseInt(appVersionNext[i]) == Integer.parseInt(appVersionCurrent[i])) {
continue ; continue ;
} else { } else {
isNew = false; isNew = false;
@@ -122,14 +128,17 @@ public class AppVersionUtils {
// 如 AppUtils_7.0.4.apk 版本号为 7.0.4 // 如 AppUtils_7.0.4.apk 版本号为 7.0.4
// //
public static String getCodeInPackageName(String apkName) { public static String getCodeInPackageName(String apkName) {
LogUtils.d(TAG, String.format("getCodeInPackageName apkName : %s", apkName));
//String apkName = "AppUtils_7.0.0.apk"; //String apkName = "AppUtils_7.0.0.apk";
Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+"); Pattern pattern = Pattern.compile("\\d+\\.\\d+\\.\\d+");
Matcher matcher = pattern.matcher(apkName); Matcher matcher = pattern.matcher(apkName);
if (matcher.find()) { if (matcher.find()) {
String version = matcher.group(); String version = matcher.group();
LogUtils.d(TAG, String.format("version is %s", version));
return version; return version;
//System.out.println("Version number: " + version); // 输出7.0.0 //System.out.println("Version number: " + version); // 输出7.0.0
} }
LogUtils.d(TAG, String.format("No result."));
return ""; return "";
} }
@@ -149,5 +158,4 @@ public class AppVersionUtils {
} }
return ""; return "";
} }
} }

View File

@@ -6,22 +6,23 @@ package cc.winboll.studio.libapputils.app;
*/ */
import android.app.Activity; import android.app.Activity;
import android.app.Application; import android.app.Application;
import android.content.ComponentName;
import android.content.Intent; import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import cc.winboll.studio.GlobalApplication;
import cc.winboll.studio.libapputils.log.LogUtils; import cc.winboll.studio.libapputils.log.LogUtils;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import java.util.Set; import android.content.Context;
public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
public static final String TAG = "MyActivityLifecycleCallbacks"; public static final String TAG = "MyActivityLifecycleCallbacks";
Application mApplication;
public String mInfo = ""; public String mInfo = "";
public MyActivityLifecycleCallbacks(WinBollApplication application) { public MyActivityLifecycleCallbacks(Application application) {
mApplication = application;
} }
void createActivityeInfo(Activity activity) { void createActivityeInfo(Activity activity) {

View File

@@ -64,7 +64,7 @@ abstract public class WinBollActivity extends AppCompatActivity {
// 传入的Intent action在Activity清单的intent-filter的action节点里有定义 // 传入的Intent action在Activity清单的intent-filter的action节点里有定义
if (intent.getAction() != null) { if (intent.getAction() != null) {
if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) { if (intent.getAction().equals(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW)) {
WinBollApplication.setIsDebug(true); WinBollUtils.setIsDebug(true);
//ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction()); //ToastUtils.show!("WinBollApplication.setIsDebug(true) by action : " + intent.getAction());
} }
@@ -356,7 +356,7 @@ abstract public class WinBollActivity extends AppCompatActivity {
if (isAddWinBollToolBar()) { if (isAddWinBollToolBar()) {
getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu); getMenuInflater().inflate(R.menu.toolbar_winboll_shared_main, menu);
} }
if (WinBollApplication.isDebug()) { if (WinBollUtils.isDebug()) {
getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu); getMenuInflater().inflate(R.menu.toolbar_studio_debug, menu);
} }
return super.onCreateOptionsMenu(menu); return super.onCreateOptionsMenu(menu);
@@ -378,8 +378,9 @@ abstract public class WinBollActivity extends AppCompatActivity {
//ToastUtils.show("item_exit"); //ToastUtils.show("item_exit");
WinBollActivityManager.getInstance(this).finishAll(); WinBollActivityManager.getInstance(this).finishAll();
} else if (item.getItemId() == R.id.item_info) { } else if (item.getItemId() == R.id.item_info) {
WinBollApplication application = (WinBollApplication) getApplication(); LogUtils.d(TAG, "item_info not yet.");
application.getMyActivityLifecycleCallbacks().showActivityeInfo(); //WinBollApplication application = (WinBollApplication) getApplication();
//application.getMyActivityLifecycleCallbacks().showActivityeInfo();
} else if (item.getItemId() == R.id.item_exitdebug) { } else if (item.getItemId() == R.id.item_exitdebug) {
AboutView.setApp2NormalMode(getApplicationContext()); AboutView.setApp2NormalMode(getApplicationContext());
} else if (item.getItemId() == R.id.item_about) { } else if (item.getItemId() == R.id.item_about) {

View File

@@ -171,11 +171,11 @@ public class WinBollActivityManager {
//ToastUtils.show("finishAll() activity"); //ToastUtils.show("finishAll() activity");
if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
//ToastUtils.show("activity != null ..."); //ToastUtils.show("activity != null ...");
if (WinBollApplication.getWinBollUI_TYPE() == WinBollApplication.WinBollUI_TYPE.Service) { if (WinBollUtils.getWinBollUI_TYPE() == WinBollUtils.WinBollUI_TYPE.Service) {
// 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。 // 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。
activity.finishAndRemoveTask(); activity.finishAndRemoveTask();
//ToastUtils.show("finishAll() activity.finishAndRemoveTask();"); //ToastUtils.show("finishAll() activity.finishAndRemoveTask();");
} else if (WinBollApplication.getWinBollUI_TYPE() == WinBollApplication.WinBollUI_TYPE.Aplication) { } else if (WinBollUtils.getWinBollUI_TYPE() == WinBollUtils.WinBollUI_TYPE.Aplication) {
// 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。 // 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。
activity.finish(); activity.finish();
//ToastUtils.show("finishAll() activity.finish();"); //ToastUtils.show("finishAll() activity.finish();");

View File

@@ -1,11 +1,32 @@
package cc.winboll.studio.libapputils.app; package cc.winboll.studio.libapputils.app;
import android.app.Application;
import android.content.Context;
import android.view.Gravity;
import cc.winboll.studio.libapputils.bean.DebugBean; import cc.winboll.studio.libapputils.bean.DebugBean;
import cc.winboll.studio.libapputils.log.LogUtils; import cc.winboll.studio.libapputils.log.LogUtils;
import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle;
import cc.winboll.studio.GlobalApplication;
public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalApplication { public class WinBollUtils {
public static final String TAG = "WinBollApplication"; public static final String TAG = "WinBollUtils";
//
// 单件结构模块
//
static volatile WinBollUtils _WinBollUtils;
Application mApplication;
WinBollUtils(Application application) {
mApplication = application;
}
static synchronized WinBollUtils getInstance(Application application) {
if (_WinBollUtils == null) {
_WinBollUtils = new WinBollUtils(application);
}
return _WinBollUtils;
}
public static enum WinBollUI_TYPE { public static enum WinBollUI_TYPE {
Aplication, // 退出应用后保持最近任务栏任务记录主窗口 Aplication, // 退出应用后保持最近任务栏任务记录主窗口
@@ -15,14 +36,14 @@ public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalAppli
// 应用类型标志 // 应用类型标志
volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service; volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service;
static volatile WinBollApplication _WinBollApplication = null; //static volatile WinBollApplication _WinBollApplication = null;
MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks; MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks;
// 标记当前应用是否处于调试状态 // 标记当前应用是否处于调试状态
static volatile boolean isDebug = false; static volatile boolean isDebug = false;
public static void setIsDebug(boolean isDebug) { public static void setIsDebug(boolean isDebug) {
WinBollApplication.isDebug = isDebug; WinBollUtils.isDebug = isDebug;
} }
public static boolean isDebug() { public static boolean isDebug() {
@@ -39,7 +60,7 @@ public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalAppli
// //
// 获取 WinBoll 应用 UI 类型 // 获取 WinBoll 应用 UI 类型
// //
public static WinBollUI_TYPE getWinBollUI_TYPE() { public synchronized static WinBollUI_TYPE getWinBollUI_TYPE() {
return _mWinBollUI_TYPE; return _mWinBollUI_TYPE;
} }
@@ -47,16 +68,14 @@ public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalAppli
return mMyActivityLifecycleCallbacks; return mMyActivityLifecycleCallbacks;
} }
@Override public static void init(Application application) {
public void onCreate() { WinBollUtils winBollUtils = WinBollUtils.getInstance(application);
super.onCreate();
_WinBollApplication = this;
// 应用环境初始化, 基本调试环境 // 应用环境初始化, 基本调试环境
// //
CrashHandler.init(this); // 初始化日志模块
LogUtils.init(this); LogUtils.init(application);
// 设置应用调试标志
DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class); DebugBean debugBean = DebugBean.loadBean(application, DebugBean.class);
if (debugBean == null) { if (debugBean == null) {
//ToastUtils.show("debugBean == null"); //ToastUtils.show("debugBean == null");
setIsDebug(false); setIsDebug(false);
@@ -64,11 +83,10 @@ public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalAppli
//ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")"); //ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")");
setIsDebug(debugBean.isDebuging()); setIsDebug(debugBean.isDebuging());
} }
// 应用窗口管理模块参数设置
// 应用运行状态环境设置
// //
mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks(this); winBollUtils.mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks(application);
registerActivityLifecycleCallbacks(mMyActivityLifecycleCallbacks); application.registerActivityLifecycleCallbacks(winBollUtils.mMyActivityLifecycleCallbacks);
// 设置默认 WinBoll 应用 UI 类型 // 设置默认 WinBoll 应用 UI 类型
setWinBollUI_TYPE(WinBollUI_TYPE.Service); setWinBollUI_TYPE(WinBollUI_TYPE.Service);
//ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE()); //ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE());

View File

@@ -20,6 +20,10 @@ public class APPInfo implements Serializable {
String appDescription; String appDescription;
// 应用Git仓库地址 // 应用Git仓库地址
String appGitName; String appGitName;
// 应用Git仓库分支
String appGitAPPBranch;
// 应用Git仓库子项目文件夹
String appGitAPPSubProjectFolder;
// 应用主页 // 应用主页
String appHomePage; String appHomePage;
// 应用包名称 // 应用包名称
@@ -27,27 +31,46 @@ public class APPInfo implements Serializable {
// 应用包存储文件夹名称 // 应用包存储文件夹名称
String appAPKFolderName; String appAPKFolderName;
public APPInfo(String appName, int appIcon, String appDescription, String appGitName, String appHomePage, String appAPKName, String appAPKFolderName) { public APPInfo(String appName, int appIcon, String appDescription, String appGitName, String appGitAPPBranch, String appGitAPPSubProjectFolder, String appHomePage, String appAPKName, String appAPKFolderName) {
this.appName = appName; this.appName = appName;
this.appIcon = appIcon; this.appIcon = appIcon;
this.appDescription = appDescription; this.appDescription = appDescription;
this.appGitName = appGitName; this.appGitName = appGitName;
this.appGitAPPBranch = appGitAPPBranch;
this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
this.appHomePage = appHomePage; this.appHomePage = appHomePage;
this.appAPKName = appAPKName; this.appAPKName = appAPKName;
this.appAPKFolderName = appAPKFolderName; this.appAPKFolderName = appAPKFolderName;
} }
public APPInfo() { public APPInfo() {
this.appName = "WinBoll-APP"; this.appName = "WinBoll-APP";
this.appIcon = R.drawable.ic_launcher; this.appIcon = R.drawable.ic_launcher;
this.appDescription = "WinBoll APP"; this.appDescription = "WinBoll APP";
this.appGitName = "APP"; this.appGitName = "APP";
this.appGitAPPBranch = "app";
this.appGitAPPSubProjectFolder = "app";
this.appHomePage = "https://www.winboll.cc/studio/details.php?app=APP"; this.appHomePage = "https://www.winboll.cc/studio/details.php?app=APP";
this.appAPKName = "APP"; this.appAPKName = "APP";
this.appAPKFolderName = "APP"; this.appAPKFolderName = "APP";
} }
public void setAppGitAPPBranch(String appGitAPPBranch) {
this.appGitAPPBranch = appGitAPPBranch;
}
public String getAppGitAPPBranch() {
return appGitAPPBranch;
}
public void setAppGitAPPSubProjectFolder(String appGitAPPSubProjectFolder) {
this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
}
public String getAppGitAPPSubProjectFolder() {
return appGitAPPSubProjectFolder;
}
public void setAppIcon(int appIcon) { public void setAppIcon(int appIcon) {
this.appIcon = appIcon; this.appIcon = appIcon;
} }

View File

@@ -9,7 +9,7 @@ import android.os.Bundle;
import androidx.appcompat.widget.Toolbar; import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libapputils.R; import cc.winboll.studio.libapputils.R;
import cc.winboll.studio.libapputils.app.WinBollActivity; import cc.winboll.studio.libapputils.app.WinBollActivity;
import cc.winboll.studio.libapputils.app.WinBollApplication; import cc.winboll.studio.libapputils.app.WinBollUtils;
public class LogActivity extends WinBollActivity { public class LogActivity extends WinBollActivity {
@@ -44,7 +44,7 @@ public class LogActivity extends WinBollActivity {
setContentView(R.layout.activity_log); setContentView(R.layout.activity_log);
mLogView = findViewById(R.id.logview); mLogView = findViewById(R.id.logview);
if (WinBollApplication.isDebug()) { mLogView.start(); } if (WinBollUtils.isDebug()) { mLogView.start(); }
} }
@Override @Override

View File

@@ -7,7 +7,7 @@ package cc.winboll.studio.libapputils.log;
* @Describe 应用日志类 * @Describe 应用日志类
*/ */
import android.content.Context; import android.content.Context;
import cc.winboll.studio.libapputils.app.WinBollApplication; import cc.winboll.studio.libapputils.app.WinBollUtils;
import cc.winboll.studio.libapputils.util.FileUtils; import cc.winboll.studio.libapputils.util.FileUtils;
import dalvik.system.DexFile; import dalvik.system.DexFile;
import java.io.BufferedReader; import java.io.BufferedReader;
@@ -61,7 +61,7 @@ public class LogUtils {
// 初始化函数 // 初始化函数
// //
public static void init(Context context, LOG_LEVEL logLevel) { public static void init(Context context, LOG_LEVEL logLevel) {
if (WinBollApplication.isDebug()) { if (WinBollUtils.isDebug()) {
// 初始化日志缓存文件路径 // 初始化日志缓存文件路径
_mfLogCacheDir = new File(context.getApplicationContext().getExternalCacheDir(), TAG); _mfLogCacheDir = new File(context.getApplicationContext().getExternalCacheDir(), TAG);
if (!_mfLogCacheDir.exists()) { if (!_mfLogCacheDir.exists()) {

View File

@@ -19,7 +19,7 @@ import android.widget.LinearLayout;
import cc.winboll.studio.libapputils.R; import cc.winboll.studio.libapputils.R;
import cc.winboll.studio.libapputils.app.AppVersionUtils; import cc.winboll.studio.libapputils.app.AppVersionUtils;
import cc.winboll.studio.libapputils.app.WinBollActivityManager; import cc.winboll.studio.libapputils.app.WinBollActivityManager;
import cc.winboll.studio.libapputils.app.WinBollApplication; import cc.winboll.studio.libapputils.app.WinBollUtils;
import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.bean.APPInfo;
import cc.winboll.studio.libapputils.bean.DebugBean; import cc.winboll.studio.libapputils.bean.DebugBean;
import cc.winboll.studio.libapputils.log.LogUtils; import cc.winboll.studio.libapputils.log.LogUtils;
@@ -58,18 +58,22 @@ public class AboutView extends LinearLayout {
String mszGitea = ""; String mszGitea = "";
int mnAppIcon = 0; int mnAppIcon = 0;
String mszWinBollServerHost; String mszWinBollServerHost;
String mszReleaseAPKName; //String mszReleaseAPKName;
EditText metDevUserName; EditText metDevUserName;
EditText metDevUserPassword; EditText metDevUserPassword;
public AboutView(Context context, APPInfo appInfo) { public AboutView(Context context, APPInfo appInfo) {
super(context); super(context);
mContext = context;
setAPPInfo(appInfo); setAPPInfo(appInfo);
initView(context); initView(context);
} }
public AboutView(Context context, AttributeSet attrs) { public AboutView(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
mContext = context;
initView(context, attrs); initView(context, attrs);
} }
@@ -84,6 +88,8 @@ public class AboutView extends LinearLayout {
appInfo.setAppAPKFolderName(typedArray.getString(R.styleable.AboutView_app_apkfoldername)); appInfo.setAppAPKFolderName(typedArray.getString(R.styleable.AboutView_app_apkfoldername));
appInfo.setAppAPKName(typedArray.getString(R.styleable.AboutView_app_apkname)); appInfo.setAppAPKName(typedArray.getString(R.styleable.AboutView_app_apkname));
appInfo.setAppGitName(typedArray.getString(R.styleable.AboutView_app_gitname)); appInfo.setAppGitName(typedArray.getString(R.styleable.AboutView_app_gitname));
appInfo.setAppGitAPPBranch(typedArray.getString(R.styleable.AboutView_app_gitappbranch));
appInfo.setAppGitAPPSubProjectFolder(typedArray.getString(R.styleable.AboutView_app_gitappsubprojectfolder));
appInfo.setAppDescription(typedArray.getString(R.styleable.AboutView_appdescription)); appInfo.setAppDescription(typedArray.getString(R.styleable.AboutView_appdescription));
appInfo.setAppIcon(typedArray.getResourceId(R.styleable.AboutView_appicon, R.drawable.ic_winboll)); appInfo.setAppIcon(typedArray.getResourceId(R.styleable.AboutView_appicon, R.drawable.ic_winboll));
// 返回一个绑定资源结束的信号给资源 // 返回一个绑定资源结束的信号给资源
@@ -92,8 +98,6 @@ public class AboutView extends LinearLayout {
} }
void initView(Context context) { void initView(Context context) {
mContext = context;
mszAppName = mAPPInfo.getAppName(); mszAppName = mAPPInfo.getAppName();
mszAppAPKFolderName = mAPPInfo.getAppAPKFolderName(); mszAppAPKFolderName = mAPPInfo.getAppAPKFolderName();
mszAppAPKName = mAPPInfo.getAppAPKName(); mszAppAPKName = mAPPInfo.getAppAPKName();
@@ -101,18 +105,18 @@ public class AboutView extends LinearLayout {
mszAppDescription = mAPPInfo.getAppDescription(); mszAppDescription = mAPPInfo.getAppDescription();
mnAppIcon = mAPPInfo.getAppIcon(); mnAppIcon = mAPPInfo.getAppIcon();
mszWinBollServerHost = WinBollApplication.isDebug() ? "http://10.8.0.13": "https://www.winboll.cc"; mszWinBollServerHost = WinBollUtils.isDebug() ? "https://dev.winboll.cc": "https://www.winboll.cc";
try { try {
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName; mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} }
mszCurrentAppPackageName = mszAppName + "_" + mszAppVersionName + ".apk"; mszCurrentAppPackageName = mszAppAPKName + "_" + mszAppVersionName + ".apk";
mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName; mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
mszGitea = "https://gitea.winboll.cc/Studio/" + mszAppGitName + ".git"; mszGitea = "https://gitea.winboll.cc/Studio/" + mszAppGitName + "/src/branch/" + mAPPInfo.getAppGitAPPBranch() + "/" + mAPPInfo.getAppGitAPPSubProjectFolder();
if (WinBollApplication.isDebug()) { if (WinBollUtils.isDebug()) {
LayoutInflater inflater = LayoutInflater.from(mContext); LayoutInflater inflater = LayoutInflater.from(mContext);
View addedView = inflater.inflate(R.layout.view_about_dev, this, false); View addedView = inflater.inflate(R.layout.view_about_dev, this, false);
LinearLayout llMain = addedView.findViewById(R.id.viewaboutdevLinearLayout1); LinearLayout llMain = addedView.findViewById(R.id.viewaboutdevLinearLayout1);
@@ -146,15 +150,16 @@ public class AboutView extends LinearLayout {
//llMain.addView(createAboutPage()); //llMain.addView(createAboutPage());
// 就读取正式版应用包版本号,设置 Release 应用包文件名 // 就读取正式版应用包版本号,设置 Release 应用包文件名
String szReleaseAppVersionName = ""; // String szReleaseAppVersionName = "";
try { // try {
szReleaseAppVersionName = mContext.getPackageManager().getPackageInfo(subBetaSuffix(mContext.getPackageName()), 0).versionName; // //LogUtils.d(TAG, String.format("mContext.getPackageName() %s", mContext.getPackageName()));
} catch (PackageManager.NameNotFoundException e) { // String szSubBetaSuffix = subBetaSuffix(mContext.getPackageName());
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); // //LogUtils.d(TAG, String.format("szSubBetaSuffix : %s", szSubBetaSuffix));
} // szReleaseAppVersionName = mContext.getPackageManager().getPackageInfo(szSubBetaSuffix, 0).versionName;
mszReleaseAPKName = mszAppAPKName + "_" + szReleaseAppVersionName + ".apk"; // } catch (PackageManager.NameNotFoundException e) {
// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// }
// mszReleaseAPKName = mszAppAPKName + "_" + szReleaseAppVersionName + ".apk";
} }
void initView(Context context, AttributeSet attrs) { void initView(Context context, AttributeSet attrs) {
@@ -181,10 +186,13 @@ public class AboutView extends LinearLayout {
return; return;
}*/ }*/
if (!AppVersionUtils.isHasNewStageReleaseVersion(mszReleaseAPKName, mszNewestAppPackageName)) { // if (!AppVersionUtils.isHasNewStageReleaseVersion(mszReleaseAPKName, mszNewestAppPackageName)) {
// ToastUtils.delayedShow("Current app is the newest.", 5000);
// }
if (!AppVersionUtils.isHasNewVersion2(mszCurrentAppPackageName, mszNewestAppPackageName)) {
ToastUtils.delayedShow("Current app is the newest.", 5000); ToastUtils.delayedShow("Current app is the newest.", 5000);
} else { } else {
String szMsg = "Current app is :\n[ " + mszReleaseAPKName String szMsg = "Current app is :\n[ " + mszCurrentAppPackageName
+ " ]\nThe last app is :\n[ " + mszNewestAppPackageName + " ]\nThe last app is :\n[ " + mszNewestAppPackageName
+ " ]\nIs download the last app?"; + " ]\nIs download the last app?";
YesNoAlertDialog.show(mContext, "Application Update Prompt", szMsg, mIsDownlaodUpdateListener); YesNoAlertDialog.show(mContext, "Application Update Prompt", szMsg, mIsDownlaodUpdateListener);
@@ -199,7 +207,7 @@ public class AboutView extends LinearLayout {
// 定义应用调试按钮 // 定义应用调试按钮
// //
Element elementAppMode; Element elementAppMode;
if (WinBollApplication.isDebug()) { if (WinBollUtils.isDebug()) {
elementAppMode = new Element(mContext.getString(R.string.app_normal), R.drawable.ic_winboll); elementAppMode = new Element(mContext.getString(R.string.app_normal), R.drawable.ic_winboll);
elementAppMode.setOnClickListener(mAppNormalOnClickListener); elementAppMode.setOnClickListener(mAppNormalOnClickListener);
} else { } else {
@@ -265,7 +273,7 @@ public class AboutView extends LinearLayout {
if (intent != null) { if (intent != null) {
intent.setAction(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW); intent.setAction(cc.winboll.studio.libapputils.intent.action.DEBUGVIEW);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
WinBollApplication.setIsDebug(true); WinBollUtils.setIsDebug(true);
DebugBean.saveBean(context, new DebugBean(true)); DebugBean.saveBean(context, new DebugBean(true));
WinBollActivityManager.getInstance(context).finishAll(); WinBollActivityManager.getInstance(context).finishAll();
@@ -277,7 +285,7 @@ public class AboutView extends LinearLayout {
Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName()); Intent intent = context.getPackageManager().getLaunchIntentForPackage(context.getPackageName());
if (intent != null) { if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
WinBollApplication.setIsDebug(false); WinBollUtils.setIsDebug(false);
DebugBean.saveBean(context, new DebugBean(false)); DebugBean.saveBean(context, new DebugBean(false));
WinBollActivityManager.getInstance(context).finishAll(); WinBollActivityManager.getInstance(context).finishAll();
@@ -303,7 +311,7 @@ public class AboutView extends LinearLayout {
String szUrl = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName; String szUrl = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
// 构建包含认证信息的请求 // 构建包含认证信息的请求
String credential = ""; String credential = "";
if (WinBollApplication.isDebug()) { if (WinBollUtils.isDebug()) {
credential = Credentials.basic(metDevUserName.getText().toString(), metDevUserPassword.getText().toString()); credential = Credentials.basic(metDevUserName.getText().toString(), metDevUserPassword.getText().toString());
PrefUtils.saveString(mContext, "metDevUserName", metDevUserName.getText().toString()); PrefUtils.saveString(mContext, "metDevUserName", metDevUserName.getText().toString());
PrefUtils.saveString(mContext, "metDevUserPassword", metDevUserPassword.getText().toString()); PrefUtils.saveString(mContext, "metDevUserPassword", metDevUserPassword.getText().toString());

View File

@@ -5,6 +5,8 @@
<attr name="app_apkfoldername" format="string" /> <attr name="app_apkfoldername" format="string" />
<attr name="app_apkname" format="string" /> <attr name="app_apkname" format="string" />
<attr name="app_gitname" format="string" /> <attr name="app_gitname" format="string" />
<attr name="app_gitappbranch" format="string" />
<attr name="app_gitappsubprojectfolder" format="string" />
<attr name="appdescription" format="string" /> <attr name="appdescription" format="string" />
<attr name="appicon" format="reference" /> <attr name="appicon" format="reference" />
</declare-styleable> </declare-styleable>