Compare commits

..

8 Commits

Author SHA1 Message Date
ZhanGSKen
b9c9eb926d <appbase>APK 1.1.1 release Publish. 2025-01-23 14:23:50 +08:00
ZhanGSKen
35efcdddcd 添加应用上下文函数 2025-01-23 14:23:00 +08:00
ZhanGSKen
fc5ac32514 <libappbase>Library Release 1.1.0 2025-01-22 14:48:24 +08:00
ZhanGSKen
afa8a97dba <appbase>APK 1.1.0 release Publish. 2025-01-22 14:47:54 +08:00
ZhanGSKen
fe004c7b82 设置编译参数 2025-01-22 14:47:01 +08:00
ZhanGSKen
b9582cb99d <appbase>Start New Stage Version. 2025-01-22 14:16:40 +08:00
ZhanGSKen
b3a69283ab 添加文本复制提示 2025-01-22 13:27:47 +08:00
ZhanGSKen
36e10db8e3 APPBase编译调试 2025-01-19 23:37:15 +08:00
29 changed files with 349 additions and 572 deletions

View File

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

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sun Jan 05 02:30:11 GMT 2025 #Thu Jan 23 14:23:50 HKT 2025
stageCount=0 stageCount=2
libraryProject= libraryProject=libappbase
baseVersion=1.0 baseVersion=1.1
publishVersion=1.0.0 publishVersion=1.1.1
buildCount=2 buildCount=0
baseBetaVersion=1.0.1 baseBetaVersion=1.1.2

View File

@@ -29,7 +29,7 @@ android {
// versionName 更新后需要手动设置 // versionName 更新后需要手动设置
// 项目模块目录的 build.gradle 文件的 stageCount=0 // 项目模块目录的 build.gradle 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "9.3" versionName "9.2"
if(true) { if(true) {
versionName = genVersionName("${versionName}") versionName = genVersionName("${versionName}")
} }
@@ -50,6 +50,6 @@ android {
dependencies { dependencies {
api project(':libapputils') api project(':libapputils')
api 'cc.winboll.studio:libappbase:1.0.3'
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
#Tue Feb 04 08:54:03 HKT 2025 #Sat Jan 18 13:03:10 HKT 2025
stageCount=1 stageCount=2
libraryProject=libapputils libraryProject=libapputils
baseVersion=9.3 baseVersion=9.2
publishVersion=9.3.0 publishVersion=9.2.1
buildCount=0 buildCount=0
baseBetaVersion=9.3.1 baseBetaVersion=9.2.2

View File

@@ -5,19 +5,27 @@ package cc.winboll.studio.apputils;
* @Date 2024/12/08 15:10:51 * @Date 2024/12/08 15:10:51
* @Describe 全局应用类 * @Describe 全局应用类
*/ */
import android.widget.Toast; import android.view.Gravity;
import cc.winboll.studio.libapputils.app.WinBollGlobalApplication; import cc.winboll.studio.libapputils.app.WinBollApplication;
import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle;
public class App extends WinBollGlobalApplication { public class App extends WinBollApplication {
public static final String TAG = "App"; public static final String TAG = "App";
public static final String _ACTION_DEBUGVIEW = App.class.getName() + "_ACTION_DEBUGVIEW"; public static final String _ACTION_DEBUGVIEW = WinBollApplication.class.getName() + "_ACTION_DEBUGVIEW";
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();
Toast.makeText(getApplication(), "Toast Test", Toast.LENGTH_SHORT).show(); // 初始化 Toast 框架
//
ToastUtils.init(this);
// 设置 Toast 布局样式
//ToastUtils.setView(R.layout.view_toast);
ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
} }
} }

View File

@@ -14,8 +14,6 @@ import cc.winboll.studio.libapputils.app.WinBollActivityManager;
import cc.winboll.studio.libapputils.log.LogActivity; import cc.winboll.studio.libapputils.log.LogActivity;
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 cc.winboll.studio.libapputils.activities.AboutActivity;
import cc.winboll.studio.libapputils.bean.APPInfo;
final public class MainActivity extends WinBollActivity { final public class MainActivity extends WinBollActivity {
@@ -52,13 +50,10 @@ final public class MainActivity extends WinBollActivity {
} }
public void onLogUtilsClick(View view) { public void onLogUtilsClick(View view) {
// Intent intent = new Intent(this, LogActivity.class); Intent intent = new Intent(this, LogActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
// startActivity(intent); startActivity(intent);
//WinBollActivityManager.getInstance().printAvtivityListInfo();
WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class);
} }
@Override @Override
@@ -160,35 +155,9 @@ 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);
} }
void openAboutActivity() {
Intent intent = new Intent(this, AboutActivity.class);
APPInfo appInfo = new APPInfo();
appInfo.setAppName("APPUtils");
appInfo.setAppIcon(cc.winboll.studio.libapputils.R.drawable.ic_winboll);
appInfo.setAppDescription("APPUtils Description");
appInfo.setAppGitName("APP");
appInfo.setAppGitOwner("Studio");
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);
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

@@ -54,21 +54,6 @@
</LinearLayout> </LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAllCaps="false"
android:text="Test AboutActivity"
android:onClick="onTestAboutActivity"/>
</LinearLayout>
</LinearLayout> </LinearLayout>
</LinearLayout> </LinearLayout>

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle #Created by .winboll/winboll_app_build.gradle
#Sun Jan 05 07:55:11 HKT 2025 #Thu Jan 23 14:23:50 HKT 2025
stageCount=17 stageCount=2
libraryProject=winboll-shared libraryProject=libappbase
baseVersion=1.8 baseVersion=1.1
publishVersion=1.8.16 publishVersion=1.1.1
buildCount=0 buildCount=0
baseBetaVersion=1.8.17 baseBetaVersion=1.1.2

View File

@@ -25,6 +25,7 @@ import android.view.ViewGroup;
import android.widget.HorizontalScrollView; import android.widget.HorizontalScrollView;
import android.widget.ScrollView; import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import android.widget.Toast;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
@@ -194,6 +195,7 @@ public final class CrashHandler {
case MENUITEM_COPY: case MENUITEM_COPY:
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE); ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog)); cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog));
Toast.makeText(getApplication(), "The text is copied.", Toast.LENGTH_SHORT).show();
break; break;
case MENUITEM_RESTART: case MENUITEM_RESTART:
restart(); restart();

View File

@@ -43,11 +43,18 @@ import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicBoolean;
import android.content.pm.ApplicationInfo;
import android.content.res.AssetManager;
public class GlobalApplication extends Application { public class GlobalApplication extends Application {
private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper()); private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
@Override
public Context getApplicationContext() {
return super.getApplicationContext();
}
@Override @Override
public void onCreate() { public void onCreate() {
super.onCreate(); super.onCreate();

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.1.3' api 'cc.winboll.studio:libappbase:1.0.3'
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
#Tue Feb 04 08:54:03 HKT 2025 #Sat Jan 18 13:02:39 HKT 2025
stageCount=1 stageCount=2
libraryProject=libapputils libraryProject=libapputils
baseVersion=9.3 baseVersion=9.2
publishVersion=9.3.0 publishVersion=9.2.1
buildCount=0 buildCount=0
baseBetaVersion=9.3.1 baseBetaVersion=9.2.2

View File

@@ -18,9 +18,6 @@
<!-- 拍摄照片和视频 --> <!-- 拍摄照片和视频 -->
<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
@@ -48,4 +45,4 @@
</application> </application>
</manifest> </manifest>

View File

@@ -1,31 +1,25 @@
package cc.winboll.studio.libapputils.activities; package cc.winboll.studio.libapputils.activities;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/07/14 13:20:33
* @Describe 应用介绍页
*/
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.LinearLayout;
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.WinBollActivityManager; import cc.winboll.studio.libapputils.app.WinBollActivityManager;
import cc.winboll.studio.libapputils.bean.APPInfo; import cc.winboll.studio.libapputils.log.LogUtils;
import cc.winboll.studio.libapputils.view.AboutView;
import com.hjq.toast.ToastUtils;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2024/07/14 13:20:33
* @Describe AboutFragment Test
*/
final public class AboutActivity extends WinBollActivity { final public class AboutActivity extends WinBollActivity {
public static final String TAG = "AboutActivity"; public static final String TAG = "AboutActivity";
public static final String EXTRA_APPINFO = "EXTRA_APPINFO";
APPInfo mAPPInfo;
@Override @Override
public String getTag() { public String getTag() {
return TAG; return TAG;
@@ -40,19 +34,21 @@ final public class AboutActivity extends WinBollActivity {
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_about); setContentView(R.layout.activity_about);
Intent intent = getIntent();
if (intent != null) { /*AboutView aboutView = findViewById(R.id.activityaboutAboutView1);
mAPPInfo = (APPInfo)intent.getSerializableExtra(EXTRA_APPINFO); aboutView.setOnRequestDevUserInfoAutofillListener(new AboutView.OnRequestDevUserInfoAutofillListener(){
}
if (mAPPInfo == null) { @Override
mAPPInfo = new APPInfo(); public void requestAutofill(EditText etDevUserName, EditText etDevUserPassword) {
} AutofillManager autofillManager = (AutofillManager) getSystemService(AutofillManager.class);
if (autofillManager!= null) {
AboutView aboutView = new AboutView(this, mAPPInfo); //ToastUtils.show("0");
LinearLayout llMain = findViewById(R.id.activityaboutLinearLayout1); autofillManager.requestAutofill(findViewById(R.id.usernameEditText));
llMain.addView(aboutView); autofillManager.requestAutofill(findViewById(R.id.passwordEditText));
}
ToastUtils.show(TAG); }
});*/
} }
@Override @Override
@@ -83,8 +79,9 @@ final public class AboutActivity extends WinBollActivity {
if (item.getItemId() == R.id.item_help) { if (item.getItemId() == R.id.item_help) {
WinBollActivityManager.getInstance(this).startWinBollActivity(this, AssetsHtmlActivity.class); WinBollActivityManager.getInstance(this).startWinBollActivity(this, AssetsHtmlActivity.class);
} }
// else if (item.getItemId() == android.R.id.home) {
// WinBollActivityManager.getInstance(this).finish(this);
// }
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }

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 cc.winboll.studio.libapputils.log.LogUtils; import com.hjq.toast.ToastUtils;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
@@ -23,7 +23,6 @@ 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";
@@ -78,9 +77,8 @@ 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))) {
@@ -98,10 +96,6 @@ 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("\\.");
@@ -112,7 +106,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;
@@ -128,17 +122,14 @@ 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 "";
} }
@@ -158,4 +149,5 @@ public class AppVersionUtils {
} }
return ""; return "";
} }
} }

View File

@@ -6,20 +6,22 @@ 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.libapputils.log.LogUtils; import cc.winboll.studio.libapputils.log.LogUtils;
import com.hjq.toast.ToastUtils; import com.hjq.toast.ToastUtils;
import android.content.Context; import java.util.Set;
public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { public class MyActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
public static final String TAG = "MyActivityLifecycleCallbacks"; public static final String TAG = "MyActivityLifecycleCallbacks";
public String mInfo = ""; public String mInfo = "";
public MyActivityLifecycleCallbacks() { public MyActivityLifecycleCallbacks(WinBollApplication 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)) {
WinBollGlobalApplication.setIsDebug(true); WinBollApplication.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 (WinBollGlobalApplication.isDebug()) { if (WinBollApplication.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);
@@ -365,26 +365,15 @@ abstract public class WinBollActivity extends AppCompatActivity {
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
LogUtils.d(TAG, "onOptionsItemSelected"); LogUtils.d(TAG, "onOptionsItemSelected");
if (item.getItemId() == R.id.item_testcrashreport) { if (item.getItemId() == R.id.item_log) {
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { LogUtils.d(TAG, "item_log not yet.");
getString(i);
}
} else if (item.getItemId() == R.id.item_log) {
// LogUtils.d(TAG, "item_log not yet.");
// Intent intent = new Intent(this, LogActivity.class);
// intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
// intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
// startActivity(intent);
//WinBollActivityManager.getInstance().printAvtivityListInfo(); //WinBollActivityManager.getInstance().printAvtivityListInfo();
WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class); //WinBollActivityManager.getInstance(this).startWinBollActivity(this, LogActivity.class);
} else if (item.getItemId() == R.id.item_exit) { } else if (item.getItemId() == R.id.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) {
LogUtils.d(TAG, "item_info not yet."); WinBollApplication application = (WinBollApplication) getApplication();
//WinBollApplication application = (WinBollApplication) getApplication(); application.getMyActivityLifecycleCallbacks().showActivityeInfo();
//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

@@ -20,16 +20,17 @@ import java.util.Map;
public class WinBollActivityManager { public class WinBollActivityManager {
public static final String TAG = "WinBollActivityManager"; public static final String TAG = "WinBollActivityManager";
public static final String EXTRA_TAG = "EXTRA_TAG";
Context mContext; Context mContext;
static WinBollActivityManager _mWinBollActivityManager; static WinBollActivityManager _mWinBollActivityManager;
static Map<String, WinBollActivity> _mapActivityList; static Map<String, WinBollActivity> _mapActivityList;
//static ArrayList<WinBollActivity> _mWinBollActivityList;
public WinBollActivityManager(Context context) { public WinBollActivityManager(Context context) {
mContext = context; mContext = context;
LogUtils.d(TAG, "WinBollActivityManager()"); LogUtils.d(TAG, "WinBollActivityManager()");
_mapActivityList = new HashMap<String, WinBollActivity>(); _mapActivityList = new HashMap<String, WinBollActivity>();
//_mWinBollActivityList = new ArrayList<WinBollActivity>();
} }
public static synchronized WinBollActivityManager getInstance(Context context) { public static synchronized WinBollActivityManager getInstance(Context context) {
@@ -41,10 +42,19 @@ public class WinBollActivityManager {
return _mWinBollActivityManager; return _mWinBollActivityManager;
} }
// /**
// 把Activity添加到管理中 * 把Activity添加到管理中
// */
public <T extends WinBollActivity> void add(T activity) { public <T extends WinBollActivity> void add(T activity) {
/*for (int i = 0; i < _mWinBollActivityList.size(); i++) {
LogUtils.d(TAG, String.format("add for i %d\nget(i).getTag() %s", i, _mWinBollActivityList.get(i).getTag()));
if (_mWinBollActivityList.get(i).getTag().equals(activity.getTag())) {
_mWinBollActivityList.add(i, activity);
_mWinBollActivityList.remove(i);
LogUtils.d(TAG, String.format("Replace activity : %s\nSize %d", activity.getTag(), _mWinBollActivityList.size()));
return;
}
}*/
if (isActive(activity.getTag())) { if (isActive(activity.getTag())) {
LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag())); LogUtils.d(TAG, String.format("add(...) %s is active.", activity.getTag()));
} else { } else {
@@ -56,7 +66,7 @@ public class WinBollActivityManager {
// //
// activity: 为 null 时, // activity: 为 null 时,
// intent.putExtra 函数 EXTRA_TAG 参数为 tag // intent.putExtra 函数 "tag" 参数为 tag
// activity: 不为 null 时, // activity: 不为 null 时,
// intent.putExtra 函数 "tag" 参数为 activity.getTag() // intent.putExtra 函数 "tag" 参数为 activity.getTag()
// //
@@ -74,7 +84,7 @@ public class WinBollActivityManager {
//打开多任务窗口 flags //打开多任务窗口 flags
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.putExtra(EXTRA_TAG, tag); intent.putExtra("tag", tag);
mContext.startActivity(intent); mContext.startActivity(intent);
} catch (InstantiationException | IllegalAccessException e) { } catch (InstantiationException | IllegalAccessException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
@@ -95,18 +105,18 @@ public class WinBollActivityManager {
//打开多任务窗口 flags //打开多任务窗口 flags
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); intent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
intent.putExtra(EXTRA_TAG, tag); intent.putExtra("tag", tag);
mContext.startActivity(intent); mContext.startActivity(intent);
} catch (InstantiationException | IllegalAccessException e) { } catch (InstantiationException | IllegalAccessException e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} }
} }
// /**
// 判断 tag绑定的 MyActivity是否存在 * 判断 tag绑定的 MyActivity是否存在
// */
public boolean isActive(String tag) { public boolean isActive(String tag) {
//printAvtivityListInfo(); printAvtivityListInfo();
WinBollActivity activity = getWinBollActivity(tag); WinBollActivity activity = getWinBollActivity(tag);
if (activity != null) { if (activity != null) {
LogUtils.d(TAG, "isActive(...) activity != null tag " + tag); LogUtils.d(TAG, "isActive(...) activity != null tag " + tag);
@@ -131,21 +141,21 @@ public class WinBollActivityManager {
return _mapActivityList.get(tag); return _mapActivityList.get(tag);
} }
// /**
// 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
// */
public <T extends WinBollActivity> void resumeActivity(Context context, String tag) { public <T extends WinBollActivity> void resumeActivity(Context context, String tag) {
LogUtils.d(TAG, "resumeActivty"); LogUtils.d(TAG, "resumeActivty");
T activity = (T)getWinBollActivity(tag); T activity = (T)getWinBollActivity(tag);
//LogUtils.d(TAG, "activity " + activity.getTag()); LogUtils.d(TAG, "activity " + activity.getTag());
if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
resumeActivity(context, activity); resumeActivity(context, activity);
} }
} }
// /**
// 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台 * 找到tag 绑定的 BaseActivity ,通过 getTaskId() 移动到前台
// */
public <T extends WinBollActivity> void resumeActivity(Context context, T activity) { public <T extends WinBollActivity> void resumeActivity(Context context, T activity) {
ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE); ActivityManager am = (ActivityManager) activity.getSystemService(Context.ACTIVITY_SERVICE);
//返回启动它的根任务home 或者 MainActivity //返回启动它的根任务home 或者 MainActivity
@@ -160,39 +170,39 @@ public class WinBollActivityManager {
} }
// /**
// 结束所有 Activity * 结束所有 Activity
// */
public void finishAll() { public void finishAll() {
try { try {
for (String key : _mapActivityList.keySet()) { LogUtils.d(TAG, "finishAll no yet.");
//System.out.println("Key: " + key + ", Value: " + _mapActivityList.get(key)); //ToastUtils.show(String.format("finishAll() size : %d", _mWinBollActivityList.size()));
WinBollActivity activity = _mapActivityList.get(key); // for (int i = _mWinBollActivityList.size() - 1; i > -1; i--) {
//ToastUtils.show("finishAll() activity"); // WinBollActivity activity = _mWinBollActivityList.get(i);
if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { // ToastUtils.show("finishAll() activity");
//ToastUtils.show("activity != null ..."); // if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Service) { // //ToastUtils.show("activity != null ...");
// 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。 // if (WinBollApplication.getWinBollUI_TYPE() == WinBollApplication.WinBollUI_TYPE.Service) {
activity.finishAndRemoveTask(); // // 结束窗口和最近任务栏, 建议前台服务类应用使用,可以方便用户再次调用 UI 操作。
//ToastUtils.show("finishAll() activity.finishAndRemoveTask();"); // activity.finishAndRemoveTask();
} else if (WinBollGlobalApplication.getWinBollUI_TYPE() == WinBollGlobalApplication.WinBollUI_TYPE.Aplication) { // //ToastUtils.show("finishAll() activity.finishAndRemoveTask();");
// 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。 // } else if (WinBollApplication.getWinBollUI_TYPE() == WinBollApplication.WinBollUI_TYPE.Aplication) {
activity.finish(); // // 结束窗口保留最近任务栏,建议前台服务类应用使用,可以保持应用的系统自觉性。
//ToastUtils.show("finishAll() activity.finish();"); // activity.finish();
} else { // //ToastUtils.show("finishAll() activity.finish();");
LogUtils.d(TAG, "WinBollApplication.WinBollUI_TYPE error."); // } else {
//ToastUtils.show("WinBollApplication.WinBollUI_TYPE error."); // ToastUtils.show("WinBollApplication.WinBollUI_TYPE error.");
} // }
} // }
} // }
} catch (Exception e) { } catch (Exception e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
} }
} }
// /**
// 结束指定Activity * 结束指定Activity
// */
public <T extends WinBollActivity> void finish(T activity) { public <T extends WinBollActivity> void finish(T activity) {
try { try {
if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) { if (activity != null && !activity.isFinishing() && !activity.isDestroyed()) {
@@ -215,6 +225,22 @@ public class WinBollActivityManager {
if (preActivity != null) { if (preActivity != null) {
resumeActivity(mContext, preActivity); resumeActivity(mContext, preActivity);
} }
// for (int i = 0; i < _mWinBollActivityList.size(); i++) {
// if (_mWinBollActivityList.get(i).getTag().equals(activity.getTag())) {
// //ToastUtils.show(String.format("equals i : %d\nTag : %s\nSize : %d", i, activity.getTag(), _mWinBollActivityList.size()));
// if (i == 0) {
// finishAll();
// //ToastUtils.show("finish finishAll");
// return;
// }
// if (i > 0) {
// activity.finish();
// resumeActivity(mContext, _mWinBollActivityList.get(i - 1));
// return;
// }
// }
// }
} }
} catch (Exception e) { } catch (Exception e) {
@@ -222,9 +248,6 @@ public class WinBollActivityManager {
} }
} }
//
// 获取窗口队列中的前一个窗口
//
WinBollActivity getPreActivity(WinBollActivity activity) { WinBollActivity getPreActivity(WinBollActivity activity) {
try { try {
boolean bingo = false; boolean bingo = false;
@@ -248,10 +271,12 @@ public class WinBollActivityManager {
return null; return null;
} }
//
// 从管理列表中移除管理项
//
public <T extends WinBollActivity> boolean registeRemove(T activity) { public <T extends WinBollActivity> boolean registeRemove(T activity) {
// for (int i = 0; i < _mWinBollActivityList.size(); i++) {
// if (registeRemove(activity, i)) {
// return true;
// }
// }
WinBollActivity activityTest = _mapActivityList.get(activity.getTag()); WinBollActivity activityTest = _mapActivityList.get(activity.getTag());
if (activityTest != null) { if (activityTest != null) {
_mapActivityList.remove(activity.getTag()); _mapActivityList.remove(activity.getTag());
@@ -260,9 +285,15 @@ public class WinBollActivityManager {
return false; return false;
} }
// // public <T extends WinBollActivity> boolean registeRemove(T activity, int position) {
// 打印管理列表项列表里的信息 // if (_mWinBollActivityList.get(position) == activity) {
// // _mWinBollActivityList.remove(position);
// //ToastUtils.show(String.format("registeRemove remove.\nTag %s\nposition %d", activity.getTag(), position));
// return true;
// }
// return false;
// }
public static void printAvtivityListInfo() { public static void printAvtivityListInfo() {
//LogUtils.d(TAG, "printAvtivityListInfo"); //LogUtils.d(TAG, "printAvtivityListInfo");
if (!_mapActivityList.isEmpty()) { if (!_mapActivityList.isEmpty()) {
@@ -279,4 +310,6 @@ public class WinBollActivityManager {
LogUtils.d(TAG, "The map is empty."); LogUtils.d(TAG, "The map is empty.");
} }
} }
} }

View File

@@ -0,0 +1,76 @@
package cc.winboll.studio.libapputils.app;
import cc.winboll.studio.libapputils.bean.DebugBean;
import cc.winboll.studio.libapputils.log.LogUtils;
public class WinBollApplication extends cc.winboll.studio.libappbase.GlobalApplication {
public static final String TAG = "WinBollApplication";
public static enum WinBollUI_TYPE {
Aplication, // 退出应用后,保持最近任务栏任务记录主窗口
Service // 退出应用后,清理所有最近任务栏任务记录窗口
};
// 应用类型标志
volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service;
static volatile WinBollApplication _WinBollApplication = null;
MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks;
// 标记当前应用是否处于调试状态
static volatile boolean isDebug = false;
public static void setIsDebug(boolean isDebug) {
WinBollApplication.isDebug = isDebug;
}
public static boolean isDebug() {
return isDebug;
}
//
// 设置 WinBoll 应用 UI 类型
//
public static void setWinBollUI_TYPE(WinBollUI_TYPE mWinBollUI_TYPE) {
_mWinBollUI_TYPE = mWinBollUI_TYPE;
}
//
// 获取 WinBoll 应用 UI 类型
//
public static WinBollUI_TYPE getWinBollUI_TYPE() {
return _mWinBollUI_TYPE;
}
MyActivityLifecycleCallbacks getMyActivityLifecycleCallbacks() {
return mMyActivityLifecycleCallbacks;
}
@Override
public void onCreate() {
super.onCreate();
_WinBollApplication = this;
// 应用环境初始化, 基本调试环境
//
CrashHandler.init(this);
LogUtils.init(this);
DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class);
if (debugBean == null) {
//ToastUtils.show("debugBean == null");
setIsDebug(false);
} else {
//ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")");
setIsDebug(debugBean.isDebuging());
}
// 应用运行状态环境设置
//
mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks(this);
registerActivityLifecycleCallbacks(mMyActivityLifecycleCallbacks);
// 设置默认 WinBoll 应用 UI 类型
setWinBollUI_TYPE(WinBollUI_TYPE.Service);
//ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE());
}
}

View File

@@ -1,103 +0,0 @@
package cc.winboll.studio.libapputils.app;
import android.app.Application;
import android.content.Context;
import android.view.Gravity;
import android.widget.Toast;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libapputils.bean.DebugBean;
import cc.winboll.studio.libapputils.log.LogUtils;
import com.hjq.toast.ToastUtils;
import com.hjq.toast.style.WhiteToastStyle;
public class WinBollGlobalApplication extends GlobalApplication {
public static final String TAG = "WinBollGlobalApplication";
public static enum WinBollUI_TYPE {
Aplication, // 退出应用后,保持最近任务栏任务记录主窗口
Service // 退出应用后,清理所有最近任务栏任务记录窗口
};
// 应用类型标志
volatile static WinBollUI_TYPE _mWinBollUI_TYPE = WinBollUI_TYPE.Service;
//static volatile WinBollApplication _WinBollApplication = null;
MyActivityLifecycleCallbacks mMyActivityLifecycleCallbacks;
// 标记当前应用是否处于调试状态
static volatile boolean isDebug = false;
public synchronized static void setIsDebug(boolean isDebug) {
WinBollGlobalApplication.isDebug = isDebug;
}
public static boolean isDebug() {
return isDebug;
}
//
// 设置 WinBoll 应用 UI 类型
//
public synchronized static void setWinBollUI_TYPE(WinBollUI_TYPE mWinBollUI_TYPE) {
_mWinBollUI_TYPE = mWinBollUI_TYPE;
}
//
// 获取 WinBoll 应用 UI 类型
//
public synchronized static WinBollUI_TYPE getWinBollUI_TYPE() {
return _mWinBollUI_TYPE;
}
MyActivityLifecycleCallbacks getMyActivityLifecycleCallbacks() {
return mMyActivityLifecycleCallbacks;
}
@Override
public Context getApplicationContext() {
return super.getApplicationContext();
}
@Override
public Application getApplication() {
return this;
}
@Override
public void onCreate() {
super.onCreate();
// 应用环境初始化, 基本调试环境
//
// 初始化日志模块
LogUtils.init(this);
try {
// 初始化 Toast 框架
ToastUtils.init(this);
// 设置 Toast 布局样式
//ToastUtils.setView(R.layout.view_toast);
ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
// 设置应用调试标志
DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class);
if (debugBean == null) {
//ToastUtils.show("debugBean == null");
setIsDebug(false);
} else {
//ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")");
setIsDebug(debugBean.isDebuging());
}
// 应用窗口管理模块参数设置
//
mMyActivityLifecycleCallbacks = new MyActivityLifecycleCallbacks();
registerActivityLifecycleCallbacks(mMyActivityLifecycleCallbacks);
// 设置默认 WinBoll 应用 UI 类型
setWinBollUI_TYPE(WinBollUI_TYPE.Service);
//ToastUtils.show("WinBollUI_TYPE " + getWinBollUI_TYPE());
} catch (Exception e) {
LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}

View File

@@ -1,142 +0,0 @@
package cc.winboll.studio.libapputils.bean;
/**
* @Author ZhanGSKen@QQ.COM
* @Date 2025/01/20 14:19:02
* @Describe 应用信息类
*/
import cc.winboll.studio.libapputils.R;
import java.io.Serializable;
public class APPInfo implements Serializable {
public static final String TAG = "APPInfo";
// 应用名称
String appName;
// 应用图标
int appIcon;
// 应用描述
String appDescription;
// 应用Git仓库地址
String appGitName;
// 应用Git仓库拥有者
String appGitOwner;
// 应用Git仓库分支
String appGitAPPBranch;
// 应用Git仓库子项目文件夹
String appGitAPPSubProjectFolder;
// 应用主页
String appHomePage;
// 应用包名称
String appAPKName;
// 应用包存储文件夹名称
String appAPKFolderName;
public APPInfo(String appName, int appIcon, String appDescription, String appGitName, String appGitOwner, String appGitAPPBranch, String appGitAPPSubProjectFolder, String appHomePage, String appAPKName, String appAPKFolderName) {
this.appName = appName;
this.appIcon = appIcon;
this.appDescription = appDescription;
this.appGitName = appGitName;
this.appGitOwner = appGitOwner;
this.appGitAPPBranch = appGitAPPBranch;
this.appGitAPPSubProjectFolder = appGitAPPSubProjectFolder;
this.appHomePage = appHomePage;
this.appAPKName = appAPKName;
this.appAPKFolderName = appAPKFolderName;
}
public APPInfo() {
this.appName = "WinBoll-APP";
this.appIcon = R.drawable.ic_launcher;
this.appDescription = "WinBoll APP";
this.appGitName = "APP";
this.appGitOwner = "Studio";
this.appGitAPPBranch = "app";
this.appGitAPPSubProjectFolder = "app";
this.appHomePage = "https://www.winboll.cc/studio/details.php?app=APP";
this.appAPKName = "APP";
this.appAPKFolderName = "APP";
}
public void setAppGitOwner(String appGitOwner) {
this.appGitOwner = appGitOwner;
}
public String getAppGitOwner() {
return appGitOwner;
}
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) {
this.appIcon = appIcon;
}
public int getAppIcon() {
return appIcon;
}
public void setAppDescription(String appDescription) {
this.appDescription = appDescription;
}
public String getAppDescription() {
return appDescription;
}
public void setAppAPKFolderName(String appAPKFolderName) {
this.appAPKFolderName = appAPKFolderName;
}
public String getAppAPKFolderName() {
return appAPKFolderName;
}
public void setAppName(String appName) {
this.appName = appName;
}
public String getAppName() {
return appName;
}
public void setAppGitName(String appGitName) {
this.appGitName = appGitName;
}
public String getAppGitName() {
return appGitName;
}
public void setAppHomePage(String appHomePage) {
this.appHomePage = appHomePage;
}
public String getAppHomePage() {
return appHomePage;
}
public void setAppAPKName(String appAPKName) {
this.appAPKName = appAPKName;
}
public String getAppAPKName() {
return appAPKName;
}
}

View File

@@ -1,41 +1,30 @@
package cc.winboll.studio.libapputils.log; package cc.winboll.studio.libapputils.log;
import android.os.Bundle;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libapputils.R;
import cc.winboll.studio.libapputils.app.WinBollActivity;
import cc.winboll.studio.libapputils.ads.ADsView;
import cc.winboll.studio.libapputils.app.WinBollApplication;
import android.view.View;
import android.app.Activity;
/** /**
* @Author ZhanGSKen@QQ.COM * @Author ZhanGSKen@QQ.COM
* @Date 2024/08/12 15:07:58 * @Date 2024/08/12 15:07:58
* @Describe WinBoll 应用日志窗口 * @Describe WinBoll 应用日志窗口
*/ */
import android.os.Bundle; public class LogActivity extends Activity {
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libapputils.R;
import cc.winboll.studio.libapputils.app.WinBollActivity;
import cc.winboll.studio.libapputils.app.WinBollGlobalApplication;
public class LogActivity extends WinBollActivity {
public static final String TAG = "LogActivity"; public static final String TAG = "LogActivity";
LogView mLogView; LogView mLogView;
//ADsView mADsView;
@Override // @Override
public String getTag() { // protected boolean isEnableDisplayHomeAsUp() {
return TAG; // return false;
} // }
@Override
protected Toolbar initToolBar() {
return null;
}
@Override
protected boolean isEnableDisplayHomeAsUp() {
return false;
}
@Override
protected boolean isAddWinBollToolBar() {
return false;
}
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -43,8 +32,12 @@ public class LogActivity extends WinBollActivity {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
setContentView(R.layout.activity_log); setContentView(R.layout.activity_log);
mLogView = findViewById(R.id.logview); mLogView = findViewById(R.id.logview);
//mADsView = findViewById(R.id.adsview);
if (WinBollGlobalApplication.isDebug()) { mLogView.start(); } //mADsView.loadUrl("https://www.winboll.cc");
//mLogView.setVisibility(WinBollApplication.isDebug()?View.GONE:View.VISIBLE);
//mADsView.setVisibility(WinBollApplication.isDebug()?View.GONE:View.VISIBLE);
if(WinBollApplication.isDebug()) { mLogView.start(); }
} }
@Override @Override
@@ -53,4 +46,21 @@ public class LogActivity extends WinBollActivity {
super.onResume(); super.onResume();
mLogView.start(); mLogView.start();
} }
// @Override
// protected boolean isAddWinBollToolBar() {
// return false;
// }
//
// @Override
// protected Toolbar initToolBar() {
// LogUtils.d(TAG, "initToolBar");
// return null;
// }
//
// @Override
// public String getTag() {
// LogUtils.d(TAG, "getTag");
// return TAG;
// }
} }

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.WinBollGlobalApplication; import cc.winboll.studio.libapputils.app.WinBollApplication;
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 (WinBollGlobalApplication.isDebug()) { if (WinBollApplication.isDebug()) {
// 初始化日志缓存文件路径 // 初始化日志缓存文件路径
_mfLogCacheDir = new File(context.getApplicationContext().getExternalCacheDir(), TAG); _mfLogCacheDir = new File(context.getApplicationContext().getExternalCacheDir(), TAG);
if (!_mfLogCacheDir.exists()) { if (!_mfLogCacheDir.exists()) {
@@ -174,9 +174,8 @@ public class LogUtils {
mapTAGList.put(tagValue, false); mapTAGList.put(tagValue, false);
} }
} }
} catch (NoClassDefFoundError | ClassNotFoundException | IllegalAccessException e) { } catch (ClassNotFoundException | IllegalAccessException e) {
LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
//LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
//Toast.makeText(context, TAG + " : " + e.getMessage(), Toast.LENGTH_SHORT).show(); //Toast.makeText(context, TAG + " : " + e.getMessage(), Toast.LENGTH_SHORT).show();
} }
} }

View File

@@ -19,8 +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.WinBollGlobalApplication; import cc.winboll.studio.libapputils.app.WinBollApplication;
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;
import cc.winboll.studio.libapputils.util.PrefUtils; import cc.winboll.studio.libapputils.util.PrefUtils;
@@ -42,8 +41,6 @@ public class AboutView extends LinearLayout {
public static final int MSG_APPUPDATE_CHECKED = 0; public static final int MSG_APPUPDATE_CHECKED = 0;
Context mContext; Context mContext;
APPInfo mAPPInfo;
WinBollServiceStatusView mWinBollServiceStatusView; WinBollServiceStatusView mWinBollServiceStatusView;
OnRequestDevUserInfoAutofillListener mOnRequestDevUserInfoAutofillListener; OnRequestDevUserInfoAutofillListener mOnRequestDevUserInfoAutofillListener;
String mszAppName = ""; String mszAppName = "";
@@ -58,66 +55,38 @@ 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) {
super(context);
mContext = context;
setAPPInfo(appInfo);
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);
} }
public void setAPPInfo(APPInfo appInfo) { void initView(Context context, AttributeSet attrs) {
mAPPInfo = appInfo; mContext = context;
} mszWinBollServerHost = WinBollApplication.isDebug() ? "http://10.8.0.13": "https://www.winboll.cc";
APPInfo createAppInfo(Context context, AttributeSet attrs) {
APPInfo appInfo = new APPInfo();
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AboutView); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AboutView);
appInfo.setAppName(typedArray.getString(R.styleable.AboutView_app_name)); mszAppName = typedArray.getString(R.styleable.AboutView_app_name);
appInfo.setAppAPKFolderName(typedArray.getString(R.styleable.AboutView_app_apkfoldername)); mszAppAPKFolderName = typedArray.getString(R.styleable.AboutView_app_apkfoldername);
appInfo.setAppAPKName(typedArray.getString(R.styleable.AboutView_app_apkname)); mszAppAPKName = typedArray.getString(R.styleable.AboutView_app_apkname);
appInfo.setAppGitName(typedArray.getString(R.styleable.AboutView_app_gitname)); mszAppGitName = typedArray.getString(R.styleable.AboutView_app_gitname);
appInfo.setAppGitOwner(typedArray.getString(R.styleable.AboutView_app_gitowner)); mszAppDescription = typedArray.getString(R.styleable.AboutView_appdescription);
appInfo.setAppGitAPPBranch(typedArray.getString(R.styleable.AboutView_app_gitappbranch)); mnAppIcon = typedArray.getResourceId(R.styleable.AboutView_appicon, R.drawable.ic_winboll);
appInfo.setAppGitAPPSubProjectFolder(typedArray.getString(R.styleable.AboutView_app_gitappsubprojectfolder));
appInfo.setAppDescription(typedArray.getString(R.styleable.AboutView_appdescription));
appInfo.setAppIcon(typedArray.getResourceId(R.styleable.AboutView_appicon, R.drawable.ic_winboll));
// 返回一个绑定资源结束的信号给资源 // 返回一个绑定资源结束的信号给资源
typedArray.recycle(); typedArray.recycle();
return appInfo;
}
void initView(Context context) {
mszAppName = mAPPInfo.getAppName();
mszAppAPKFolderName = mAPPInfo.getAppAPKFolderName();
mszAppAPKName = mAPPInfo.getAppAPKName();
mszAppGitName = mAPPInfo.getAppGitName();
mszAppDescription = mAPPInfo.getAppDescription();
mnAppIcon = mAPPInfo.getAppIcon();
mszWinBollServerHost = WinBollGlobalApplication.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 = mszAppAPKName + "_" + mszAppVersionName + ".apk"; mszCurrentAppPackageName = mszAppName + "_" + mszAppVersionName + ".apk";
mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName; mszHomePage = mszWinBollServerHost + "/studio/details.php?app=" + mszAppAPKFolderName;
mszGitea = "https://gitea.winboll.cc/" + mAPPInfo.getAppGitOwner() + "/" + mszAppGitName + "/src/branch/" + mAPPInfo.getAppGitAPPBranch() + "/" + mAPPInfo.getAppGitAPPSubProjectFolder(); mszGitea = "https://gitea.winboll.cc/Studio/" + mszAppGitName + ".git";
if (WinBollGlobalApplication.isDebug()) { if (WinBollApplication.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);
@@ -151,21 +120,15 @@ public class AboutView extends LinearLayout {
//llMain.addView(createAboutPage()); //llMain.addView(createAboutPage());
// 就读取正式版应用包版本号,设置 Release 应用包文件名 // 就读取正式版应用包版本号,设置 Release 应用包文件名
// String szReleaseAppVersionName = ""; String szReleaseAppVersionName = "";
// try { try {
// //LogUtils.d(TAG, String.format("mContext.getPackageName() %s", mContext.getPackageName())); szReleaseAppVersionName = mContext.getPackageManager().getPackageInfo(subBetaSuffix(mContext.getPackageName()), 0).versionName;
// String szSubBetaSuffix = subBetaSuffix(mContext.getPackageName()); } catch (PackageManager.NameNotFoundException e) {
// //LogUtils.d(TAG, String.format("szSubBetaSuffix : %s", szSubBetaSuffix)); LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// szReleaseAppVersionName = mContext.getPackageManager().getPackageInfo(szSubBetaSuffix, 0).versionName; }
// } catch (PackageManager.NameNotFoundException e) { mszReleaseAPKName = mszAppAPKName + "_" + szReleaseAppVersionName + ".apk";
// LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
// }
// mszReleaseAPKName = mszAppAPKName + "_" + szReleaseAppVersionName + ".apk";
}
void initView(Context context, AttributeSet attrs) {
mAPPInfo = createAppInfo(context, attrs);
initView(context);
} }
public static String subBetaSuffix(String input) { public static String subBetaSuffix(String input) {
@@ -187,13 +150,10 @@ 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[ " + mszCurrentAppPackageName String szMsg = "Current app is :\n[ " + mszReleaseAPKName
+ " ]\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);
@@ -208,7 +168,7 @@ public class AboutView extends LinearLayout {
// 定义应用调试按钮 // 定义应用调试按钮
// //
Element elementAppMode; Element elementAppMode;
if (WinBollGlobalApplication.isDebug()) { if (WinBollApplication.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 {
@@ -240,7 +200,7 @@ public class AboutView extends LinearLayout {
//.addItem(versionElement) //.addItem(versionElement)
//.addItem(adsElement) //.addItem(adsElement)
//.addGroup("Connect with us") //.addGroup("Connect with us")
.addEmail("ZhanGSKen@AliYun.Com") .addEmail("ZhanGSKen@QQ.COM")
.addWebsite(mszHomePage) .addWebsite(mszHomePage)
.addItem(elementAppMode) .addItem(elementAppMode)
.addItem(elementGitWeb) .addItem(elementGitWeb)
@@ -274,7 +234,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);
WinBollGlobalApplication.setIsDebug(true); WinBollApplication.setIsDebug(true);
DebugBean.saveBean(context, new DebugBean(true)); DebugBean.saveBean(context, new DebugBean(true));
WinBollActivityManager.getInstance(context).finishAll(); WinBollActivityManager.getInstance(context).finishAll();
@@ -286,7 +246,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);
WinBollGlobalApplication.setIsDebug(false); WinBollApplication.setIsDebug(false);
DebugBean.saveBean(context, new DebugBean(false)); DebugBean.saveBean(context, new DebugBean(false));
WinBollActivityManager.getInstance(context).finishAll(); WinBollActivityManager.getInstance(context).finishAll();
@@ -312,7 +272,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 (WinBollGlobalApplication.isDebug()) { if (WinBollApplication.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

@@ -1,22 +1,25 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="vertical" android:orientation="vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.appcompat.widget.Toolbar <androidx.appcompat.widget.Toolbar
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:id="@+id/activityaboutToolbar1"/> android:id="@+id/activityaboutToolbar1"/>
<LinearLayout <cc.winboll.studio.libapputils.view.AboutView
android:orientation="vertical" app:app_name= "APP"
android:layout_width="match_parent" app:app_apkfoldername="APP"
android:layout_height="0dp" app:app_apkname="APP"
android:layout_weight="1.0" app:app_gitname="APP"
android:id="@+id/activityaboutLinearLayout1"/> app:appdescription="WinBoll.CC 网站客户端。"
app:appicon="@drawable/ic_winboll"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activityaboutAboutView1"/>
</LinearLayout> </LinearLayout>

View File

@@ -8,8 +8,8 @@
app:cardElevation="4dp" app:cardElevation="4dp"
app:cardCornerRadius="4dp" app:cardCornerRadius="4dp"
android:id="@+id/listviewauthinfoCardView1" android:id="@+id/listviewauthinfoCardView1"
android:layout_marginLeft="0dp" android:layout_marginLeft="10dp"
android:layout_marginRight="5dp"> android:layout_marginRight="10dp">
<LinearLayout <LinearLayout
android:orientation="horizontal" android:orientation="horizontal"
@@ -19,7 +19,6 @@
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="24dp" android:layout_height="24dp"
android:layout_marginLeft="5dp"
android:id="@+id/viewlogtagTextView1"/> android:id="@+id/viewlogtagTextView1"/>
<CheckBox <CheckBox

View File

@@ -15,9 +15,6 @@
<item android:title="DebugTools"> <item android:title="DebugTools">
<menu> <menu>
<item
android:id="@+id/item_testcrashreport"
android:title="Test Application Crash Report"/>
<item <item
android:id="@+id/item_unittest" android:id="@+id/item_unittest"
android:title="UnitTest"/> android:title="UnitTest"/>

View File

@@ -5,9 +5,6 @@
<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_gitowner" 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>