mirror of
http://gitea.winboll.cc/Studio/WinBoLL.git
synced 2026-06-29 20:12:23 +08:00
Compare commits
36 Commits
aes-v15.20
...
aes-v15.20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
795593b3bf | ||
|
|
cda173fa9e | ||
|
|
fe57aee469 | ||
| 3fc0883e0e | |||
| b162eb1a4e | |||
|
|
fdd8b64718 | ||
|
|
8d4fd95ff2 | ||
| 3b31a6a155 | |||
|
|
9eb873332c | ||
|
|
1b07a72236 | ||
| 8328e44b86 | |||
| 981a8dd8cd | |||
| 6bc3cbe446 | |||
| 79e42e72af | |||
| b59076d470 | |||
|
|
9e9486b488 | ||
|
|
4b8967b253 | ||
| 30fbf4f97e | |||
|
|
b1059c3f46 | ||
| bc882c5f80 | |||
| 8ae36effdd | |||
| 0cc9b0871e | |||
| d13c44c666 | |||
| f786d06682 | |||
| 168d2e2d60 | |||
| f303a77e28 | |||
|
|
f3d723fbee | ||
| 04b5d062aa | |||
| fce2bf2fb1 | |||
|
|
e3c30ea9a3 | ||
| 48a592cbd2 | |||
| 5fcf0de951 | |||
| f027158d07 | |||
|
|
ab4cef21f0 | ||
| 2754a2ad7c | |||
| 852f3d6cd8 |
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Wed May 20 20:04:49 HKT 2026
|
||||
stageCount=9
|
||||
#Wed Jun 03 07:07:27 HKT 2026
|
||||
stageCount=15
|
||||
libraryProject=libaes
|
||||
baseVersion=15.20
|
||||
publishVersion=15.20.8
|
||||
publishVersion=15.20.14
|
||||
buildCount=0
|
||||
baseBetaVersion=15.20.9
|
||||
baseBetaVersion=15.20.15
|
||||
|
||||
@@ -5,10 +5,14 @@ package cc.winboll.studio.aes;
|
||||
* @Date 2024/06/13 19:03:58
|
||||
* @Describe AES应用类
|
||||
*/
|
||||
import android.view.Gravity;
|
||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||
import cc.winboll.studio.libappbase.CrashHandler;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.ToastUtils;
|
||||
import cc.winboll.studio.libappbase.utils.CrashHandleNotifyUtils;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
|
||||
|
||||
public class App extends GlobalApplication {
|
||||
@@ -17,11 +21,25 @@ public class App extends GlobalApplication {
|
||||
|
||||
@Override
|
||||
public void onCreate() {
|
||||
super.onCreate();
|
||||
WinBoLLActivityManager.init(this);
|
||||
try {
|
||||
super.onCreate();
|
||||
ToastUtils.init(this);
|
||||
WinBoLLActivityManager.init(this);
|
||||
AESThemeUtil.init(null);
|
||||
} catch (Throwable e) {
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
e.printStackTrace(pw);
|
||||
pw.close();
|
||||
String stackTraceStr = sw.toString();
|
||||
CrashHandleNotifyUtils.handleUncaughtException(
|
||||
this,
|
||||
getPackageName(),
|
||||
stackTraceStr,
|
||||
CrashHandler.CrashActivity.class
|
||||
);
|
||||
}
|
||||
|
||||
// 初始化 Toast 框架
|
||||
ToastUtils.init(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -84,11 +84,12 @@ public class MainActivity extends DrawerFragmentActivity {
|
||||
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
super.onCreateOptionsMenu(menu);
|
||||
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
||||
// if(App.isDebugging()) {
|
||||
// getMenuInflater().inflate(cc.winboll.studio.libaes.R.menu.toolbar_studio_debug, menu);
|
||||
// }
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Wed May 20 16:12:13 HKT 2026
|
||||
stageCount=21
|
||||
#Wed May 27 14:51:29 HKT 2026
|
||||
stageCount=23
|
||||
libraryProject=libappbase
|
||||
baseVersion=15.20
|
||||
publishVersion=15.20.20
|
||||
publishVersion=15.20.22
|
||||
buildCount=0
|
||||
baseBetaVersion=15.20.21
|
||||
baseBetaVersion=15.20.23
|
||||
|
||||
@@ -66,9 +66,9 @@ dependencies {
|
||||
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
|
||||
|
||||
// WinBoLL库 nexus.winboll.cc 地址
|
||||
api 'cc.winboll.studio:libappbase:15.20.18'
|
||||
api 'cc.winboll.studio:libappbase:15.20.25'
|
||||
// 备用库 jitpack.io 地址
|
||||
//api 'com.github.ZhanGSKen:APPBase:appbase-v15.15.3'
|
||||
//api 'com.github.ZhanGSKen:libappbase:appbase-v15.20.25'
|
||||
|
||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Wed May 20 20:04:49 HKT 2026
|
||||
stageCount=9
|
||||
#Wed Jun 03 07:07:27 HKT 2026
|
||||
stageCount=15
|
||||
libraryProject=libaes
|
||||
baseVersion=15.20
|
||||
publishVersion=15.20.8
|
||||
publishVersion=15.20.14
|
||||
buildCount=0
|
||||
baseBetaVersion=15.20.9
|
||||
baseBetaVersion=15.20.15
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.widget.AdapterView;
|
||||
|
||||
import androidx.appcompat.app.ActionBarDrawerToggle;
|
||||
import androidx.appcompat.app.AppCompatActivity;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
@@ -22,8 +23,10 @@ import androidx.drawerlayout.widget.DrawerLayout;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentManager;
|
||||
import androidx.fragment.app.FragmentTransaction;
|
||||
|
||||
import cc.winboll.studio.libaes.DrawerMenuDataAdapter;
|
||||
import cc.winboll.studio.libaes.R;
|
||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||
import cc.winboll.studio.libaes.models.DrawerMenuBean;
|
||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||
@@ -34,8 +37,8 @@ import cc.winboll.studio.libaes.views.ADsBannerView;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import com.baoyz.widget.PullRefreshLayout;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||
|
||||
public abstract class DrawerFragmentActivity extends AppCompatActivity implements IWinBoLLActivity, AdapterView.OnItemClickListener {
|
||||
|
||||
@@ -44,7 +47,6 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
static final String SHAREDPREFERENCES_NAME = "SHAREDPREFERENCES_NAME";
|
||||
static final String DRAWER_THEME_TYPE = "DRAWER_THEME_TYPE";
|
||||
|
||||
//protected Context mContext;
|
||||
ActivityType mActivityType;
|
||||
ActionBarDrawerToggle mActionBarDrawerToggle;
|
||||
DrawerLayout mDrawerLayout;
|
||||
@@ -59,13 +61,14 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
public enum ActivityType { Main, Secondary }
|
||||
protected volatile AESThemeBean.ThemeType mThemeType;
|
||||
protected ArrayList<DrawerMenuBean> malDrawerMenuItem;
|
||||
|
||||
abstract protected ActivityType initActivityType();
|
||||
//abstract protected View initContentView(LayoutInflater inflater, ViewGroup rootView);
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
// 替换:使用工具类统一应用主题
|
||||
AESThemeUtil.applyAppCompatTheme(this);
|
||||
mThemeType = AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||
setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext()));
|
||||
super.onCreate(savedInstanceState);
|
||||
WinBoLLActivityManager.getInstance().add(this);
|
||||
mActivityType = initActivityType();
|
||||
@@ -78,53 +81,32 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
return this;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
@Override
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
WinBoLLActivityManager.getInstance().registeRemove(this);
|
||||
WinBoLLActivityManager.getInstance().registeRemove(this);
|
||||
super.onDestroy();
|
||||
// 修复:释放广告资源,避免内存泄漏
|
||||
ADsBannerView adsBannerView = findViewById(R.id.adsbanner);
|
||||
if (adsBannerView != null) {
|
||||
adsBannerView.releaseAdResources();
|
||||
}
|
||||
// 修复:释放广告资源,避免内存泄漏
|
||||
ADsBannerView adsBannerView = findViewById(R.id.adsbanner);
|
||||
if (adsBannerView != null) {
|
||||
adsBannerView.releaseAdResources();
|
||||
}
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public Intent getIntent() {
|
||||
// TODO: Implement this method
|
||||
return super.getIntent();
|
||||
}
|
||||
|
||||
public Context getContext() {
|
||||
return this.mContext;
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public MenuInflater getMenuInflater() {
|
||||
// TODO: Implement this method
|
||||
return super.getMenuInflater();
|
||||
}
|
||||
|
||||
/*public void setSubtitle(CharSequence context) {
|
||||
// TODO: Implement this method
|
||||
getSupportActionBar().setSubtitle(context);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public void recreate() {
|
||||
super.recreate();
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public boolean moveTaskToBack(boolean nonRoot) {
|
||||
return super.moveTaskToBack(nonRoot);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public void startActivity(Intent intent) {
|
||||
super.startActivity(intent);
|
||||
@@ -135,26 +117,6 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
super.startActivityForResult(intent, requestCode, options);
|
||||
}
|
||||
|
||||
/*@Override
|
||||
public FragmentManager getSupportFragmentManager() {
|
||||
return super.getSupportFragmentManager();
|
||||
}
|
||||
|
||||
public void setSubtitle(int resId) {
|
||||
// TODO: Implement this method
|
||||
getSupportActionBar().setSubtitle(resId);
|
||||
}
|
||||
|
||||
public void setTitle(CharSequence context) {
|
||||
// TODO: Implement this method
|
||||
getSupportActionBar().setTitle(context);
|
||||
}
|
||||
|
||||
public void setTitle(int resId) {
|
||||
// TODO: Implement this method
|
||||
getSupportActionBar().setTitle(resId);
|
||||
}*/
|
||||
|
||||
@Override
|
||||
public SharedPreferences getSharedPreferences(String name, int mode) {
|
||||
return super.getSharedPreferences(name, mode);
|
||||
@@ -162,7 +124,6 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
|
||||
@Override
|
||||
public Context getApplicationContext() {
|
||||
// TODO: Implement this method
|
||||
return super.getApplicationContext();
|
||||
}
|
||||
|
||||
@@ -173,25 +134,27 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
|
||||
// 替换为 DrawerFragmentActivity 专属点击处理方法
|
||||
if (AESThemeUtil.onWinBoLLThemeItemSelected(this, item)) {
|
||||
recreate();
|
||||
} if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
||||
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
||||
} else {
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
}
|
||||
if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
||||
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
||||
} else {
|
||||
return super.onOptionsItemSelected(item);
|
||||
}
|
||||
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onResume() {
|
||||
super.onResume();
|
||||
|
||||
ADsBannerView adsBannerView = findViewById(R.id.adsbanner);
|
||||
if (adsBannerView != null) {
|
||||
adsBannerView.resumeADs(DrawerFragmentActivity.this);
|
||||
}
|
||||
ADsBannerView adsBannerView = findViewById(R.id.adsbanner);
|
||||
if (adsBannerView != null) {
|
||||
adsBannerView.resumeADs(DrawerFragmentActivity.this);
|
||||
}
|
||||
}
|
||||
|
||||
void initRootView() {
|
||||
@@ -213,14 +176,13 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
mPullRefreshLayout = findViewById(R.id.activitydrawerfragmentPullRefreshLayout1);
|
||||
|
||||
mPullRefreshLayout.setOnRefreshListener(new PullRefreshLayout.OnRefreshListener() {
|
||||
@Override
|
||||
public void onRefresh() {
|
||||
//LogUtils.d(TAG, "onRefresh");
|
||||
reinitDrawerMenuItemList(malDrawerMenuItem);
|
||||
mDrawerMenuDataAdapter.notifyDataSetChanged();
|
||||
mPullRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public void onRefresh() {
|
||||
reinitDrawerMenuItemList(malDrawerMenuItem);
|
||||
mDrawerMenuDataAdapter.notifyDataSetChanged();
|
||||
mPullRefreshLayout.setRefreshing(false);
|
||||
}
|
||||
});
|
||||
|
||||
malDrawerMenuItem = new ArrayList<DrawerMenuBean>();
|
||||
|
||||
@@ -236,68 +198,51 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
|
||||
mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, mToolbar, R.string.lib_name, R.string.lib_name) {
|
||||
@Override
|
||||
public void onDrawerOpened(View drawerView) {//完全打开时触发
|
||||
public void onDrawerOpened(View drawerView) {
|
||||
super.onDrawerOpened(drawerView);
|
||||
mIsDrawerOpened = true;
|
||||
mIsDrawerOpening = false;
|
||||
//Toast.makeText(MainActivity.this,"onDrawerOpened",Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onDrawerClosed(View drawerView) {//完全关闭时触发
|
||||
public void onDrawerClosed(View drawerView) {
|
||||
super.onDrawerClosed(drawerView);
|
||||
mIsDrawerOpened = false;
|
||||
mIsDrawerClosing = false;
|
||||
//Toast.makeText(MainActivity.this,"onDrawerClosed",Toast.LENGTH_SHORT).show();
|
||||
}
|
||||
|
||||
/**
|
||||
* 当抽屉被滑动的时候调用此方法
|
||||
* slideOffset表示 滑动的幅度(0-1)
|
||||
*/
|
||||
@Override
|
||||
public void onDrawerSlide(View drawerView, float slideOffset) {
|
||||
super.onDrawerSlide(drawerView, slideOffset);
|
||||
}
|
||||
|
||||
/**
|
||||
* 当抽屉滑动状态改变的时候被调用
|
||||
* 状态值是STATE_IDLE(闲置--0), STATE_DRAGGING(拖拽的--1), STATE_SETTLING(固定--2)中之一。
|
||||
*具体状态可以慢慢调试
|
||||
*/
|
||||
@Override
|
||||
public void onDrawerStateChanged(int newState) {
|
||||
super.onDrawerStateChanged(newState);
|
||||
}
|
||||
};
|
||||
|
||||
//设置显示旋转菜单
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
//通过下面这句实现toolbar和Drawer的联动:如果没有这行代码,箭头是不会随着侧滑菜单的开关而变换的(或者没有箭头),
|
||||
// 可以尝试一下,不影响正常侧滑
|
||||
mActionBarDrawerToggle.syncState();
|
||||
mDrawerLayout.setDrawerListener(mActionBarDrawerToggle);
|
||||
|
||||
//去掉侧滑的默认图标(动画箭头图标),也可以选择不去,
|
||||
//不去的话把这一行注释掉或者改成true,然后把toolbar.setNavigationIcon注释掉就行了
|
||||
//mActionBarDrawerToggle.setDrawerIndicatorEnabled(false);
|
||||
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mIsDrawerOpened || mIsDrawerOpening) {
|
||||
mIsDrawerClosing = true;
|
||||
mIsDrawerOpening = false;
|
||||
mDrawerLayout.closeDrawer(mPullRefreshLayout);
|
||||
return;
|
||||
}
|
||||
if (!mIsDrawerOpened || mIsDrawerClosing) {
|
||||
mIsDrawerOpening = true;
|
||||
mIsDrawerClosing = false;
|
||||
mDrawerLayout.openDrawer(mPullRefreshLayout);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (mIsDrawerOpened || mIsDrawerOpening) {
|
||||
mIsDrawerClosing = true;
|
||||
mIsDrawerOpening = false;
|
||||
mDrawerLayout.closeDrawer(mPullRefreshLayout);
|
||||
return;
|
||||
}
|
||||
if (!mIsDrawerOpened || mIsDrawerClosing) {
|
||||
mIsDrawerOpening = true;
|
||||
mIsDrawerClosing = false;
|
||||
mDrawerLayout.openDrawer(mPullRefreshLayout);
|
||||
return;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
initDrawerMenuItemList(malDrawerMenuItem);
|
||||
}
|
||||
@@ -305,12 +250,11 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
void initSecondaryRootView() {
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
//LogUtils.d(TAG, "onClick " + Integer.toString(v.getId()));
|
||||
finish();
|
||||
}
|
||||
});
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
finish();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public <T extends Fragment> int removeFragment(T fragment) {
|
||||
@@ -375,13 +319,13 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
@Override
|
||||
public boolean onCreateOptionsMenu(Menu menu) {
|
||||
if (mActivityType == ActivityType.Main) {
|
||||
// 主题菜单
|
||||
AESThemeUtil.inflateMenu(this, menu);
|
||||
// 调试工具菜单
|
||||
if (GlobalApplication.isDebugging()) {
|
||||
DevelopUtils.inflateMenu(this, menu);
|
||||
}
|
||||
// 应用信息菜单
|
||||
// 替换为兼容版菜单加载方法
|
||||
AESThemeUtil.inflateCompatThemeMenu(this, menu);
|
||||
// 调试工具菜单
|
||||
if (GlobalApplication.isDebugging()) {
|
||||
DevelopUtils.inflateMenu(this, menu);
|
||||
}
|
||||
// 应用信息菜单
|
||||
getMenuInflater().inflate(R.menu.toolbar_drawerbase, menu);
|
||||
}
|
||||
return super.onCreateOptionsMenu(menu);
|
||||
@@ -392,3 +336,4 @@ public abstract class DrawerFragmentActivity extends AppCompatActivity implement
|
||||
super.onActivityResult(who, targetFragment, requestCode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ import android.util.JsonWriter;
|
||||
import cc.winboll.studio.libaes.R;
|
||||
import cc.winboll.studio.libappbase.models.libs1520000.BaseBean;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AESThemeBean extends BaseBean {
|
||||
|
||||
@@ -41,13 +42,28 @@ public class AESThemeBean extends BaseBean {
|
||||
return name;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void fillThemeStyleIDList(ArrayList<Integer> themeStyleIDList) {
|
||||
if (themeStyleIDList == null) {
|
||||
themeStyleIDList = new ArrayList<Integer>();
|
||||
|
||||
}
|
||||
themeStyleIDList.clear();
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.AESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.DepthAESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.SkyAESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.GoldenAESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.BearingAESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.MemorAESTheme);
|
||||
themeStyleIDList.add(cc.winboll.studio.libaes.R.style.TaoAESTheme);
|
||||
}
|
||||
|
||||
// 保存当前主题
|
||||
int currentThemeStyleID = getThemeStyleID(ThemeType.AES);
|
||||
|
||||
|
||||
public AESThemeBean() {
|
||||
}
|
||||
|
||||
|
||||
public AESThemeBean(int currentThemeStyleID) {
|
||||
this.currentThemeStyleID = currentThemeStyleID;
|
||||
}
|
||||
@@ -59,7 +75,7 @@ public class AESThemeBean extends BaseBean {
|
||||
public int getCurrentThemeTypeID() {
|
||||
return this.currentThemeStyleID;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return AESThemeBean.class.getName();
|
||||
@@ -74,8 +90,7 @@ public class AESThemeBean extends BaseBean {
|
||||
|
||||
@Override
|
||||
public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException {
|
||||
if(super.initObjectsFromJsonReader(jsonReader, name)) { return true; }
|
||||
else{
|
||||
if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else {
|
||||
if (name.equals("currentThemeTypeID")) {
|
||||
setCurrentThemeTypeID(jsonReader.nextInt());
|
||||
} else {
|
||||
@@ -90,7 +105,7 @@ public class AESThemeBean extends BaseBean {
|
||||
jsonReader.beginObject();
|
||||
while (jsonReader.hasNext()) {
|
||||
String name = jsonReader.nextName();
|
||||
if(!initObjectsFromJsonReader(jsonReader, name)) {
|
||||
if (!initObjectsFromJsonReader(jsonReader, name)) {
|
||||
jsonReader.skipValue();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,6 @@ import androidx.appcompat.widget.Toolbar;
|
||||
import cc.winboll.studio.libaes.R;
|
||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||
import cc.winboll.studio.libaes.views.ASupportToolbar;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
|
||||
public class TestASupportToolbarActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||
@@ -28,11 +27,12 @@ public class TestASupportToolbarActivity extends AppCompatActivity implements IW
|
||||
public String getTag() {
|
||||
return TAG;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
LogUtils.d(TAG, "onCreate() start");
|
||||
AESThemeUtil.applyAppTheme(this);
|
||||
// 替换此处:原 applyAppTheme -> 新方法 applyAppCompatTheme
|
||||
AESThemeUtil.applyAppCompatTheme(this);
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_testasupporttoolbar);
|
||||
LogUtils.d(TAG, "setContentView() done");
|
||||
@@ -45,3 +45,4 @@ public class TestASupportToolbarActivity extends AppCompatActivity implements IW
|
||||
LogUtils.d(TAG, "onCreate() end");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,10 +14,11 @@ import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||
public class TestAToolbarActivity extends Activity {
|
||||
|
||||
public static final String TAG = "TestAToolbarActivity";
|
||||
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
AESThemeUtil.applyAppTheme(this);
|
||||
// 原生Activity 使用 applyTheme
|
||||
AESThemeUtil.applyTheme(this);
|
||||
super.onCreate(savedInstanceState);
|
||||
setContentView(R.layout.activity_testatoolbar);
|
||||
Toolbar toolbar = findViewById(R.id.activitytestatoolbarAToolbar1);
|
||||
@@ -26,3 +27,4 @@ public class TestAToolbarActivity extends Activity {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -13,199 +13,159 @@ import androidx.appcompat.app.AppCompatActivity;
|
||||
import cc.winboll.studio.libaes.R;
|
||||
import cc.winboll.studio.libaes.activitys.DrawerFragmentActivity;
|
||||
import cc.winboll.studio.libaes.models.AESThemeBean;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class AESThemeUtil {
|
||||
|
||||
public static final String TAG = "AESThemeUtil";
|
||||
private static final String SHAREDPREFERENCES_NAME = "SHAREDPREFERENCES_NAME";
|
||||
private static final String DRAWER_THEME_TYPE = "DRAWER_THEME_TYPE";
|
||||
|
||||
static final String SHAREDPREFERENCES_NAME = "SHAREDPREFERENCES_NAME";
|
||||
static final String DRAWER_THEME_TYPE = "DRAWER_THEME_TYPE";
|
||||
// 私有静态集合,外部不可直接修改
|
||||
private static ArrayList<Integer> themeStyleIDList = new ArrayList<>();
|
||||
|
||||
protected volatile AESThemeBean.ThemeType mThemeType;
|
||||
// 移除无用实例成员 mThemeType,工具类不保留实例字段
|
||||
|
||||
public static <T extends Context> int getThemeTypeID(T context) {
|
||||
AESThemeBean bean = AESThemeBean.loadBean(context, AESThemeBean.class);
|
||||
return bean == null ? AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES): bean.getCurrentThemeTypeID();
|
||||
/**
|
||||
* 初始化主题样式ID集合
|
||||
*/
|
||||
public static void init(ArrayList<Integer> themeStyleIDList) {
|
||||
|
||||
if (themeStyleIDList == null) {
|
||||
themeStyleIDList = new ArrayList<Integer>();
|
||||
AESThemeBean.fillThemeStyleIDList(themeStyleIDList);
|
||||
}
|
||||
AESThemeUtil.themeStyleIDList.clear();
|
||||
AESThemeUtil.themeStyleIDList.addAll(themeStyleIDList);
|
||||
}
|
||||
|
||||
public static <T extends Context> void saveThemeStyleID(T context, int nThemeTypeID) {
|
||||
AESThemeBean bean = new AESThemeBean(nThemeTypeID);
|
||||
/**
|
||||
* 获取当前主题样式ID
|
||||
*/
|
||||
public static int getThemeTypeID(Context context) {
|
||||
AESThemeBean bean = AESThemeBean.loadBean(context, AESThemeBean.class);
|
||||
return bean == null ? getThemeStyleID(AESThemeBean.ThemeType.AES) : bean.getCurrentThemeTypeID();
|
||||
}
|
||||
|
||||
/**
|
||||
* 保存主题样式ID
|
||||
*/
|
||||
public static void saveThemeStyleID(Context context, int themeTypeID) {
|
||||
AESThemeBean bean = new AESThemeBean(themeTypeID);
|
||||
AESThemeBean.saveBean(context, bean);
|
||||
}
|
||||
|
||||
public static <T extends Activity> void applyAppTheme(T activity) {
|
||||
// ====================== 应用主题 - 规范重载 ======================
|
||||
/**
|
||||
* 应用当前持久化主题(通用 Activity)
|
||||
*/
|
||||
public static void applyTheme(Activity activity) {
|
||||
activity.setTheme(getThemeTypeID(activity));
|
||||
}
|
||||
|
||||
public static <T extends AppCompatActivity> void applyAppCompatTheme(T activity) {
|
||||
/**
|
||||
* 应用指定主题(通用 Activity)
|
||||
*/
|
||||
public static void applyTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||
activity.setTheme(getThemeStyleID(themeType));
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用当前持久化主题(AppCompat 兼容 Activity)
|
||||
*/
|
||||
public static void applyAppCompatTheme(AppCompatActivity activity) {
|
||||
activity.setTheme(getThemeTypeID(activity));
|
||||
}
|
||||
|
||||
/*public static <T extends WinBoLLActivity> void applyWinBoLLTheme(T activity) {
|
||||
activity.setTheme(getThemeTypeID(activity.getApplicationContext()));
|
||||
}*/
|
||||
|
||||
public static <T extends Activity> void applyAppTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||
/**
|
||||
* 应用指定主题(AppCompat 兼容 Activity)
|
||||
*/
|
||||
public static void applyAppCompatTheme(AppCompatActivity activity, AESThemeBean.ThemeType themeType) {
|
||||
activity.setTheme(getThemeStyleID(themeType));
|
||||
}
|
||||
|
||||
public static <T extends AppCompatActivity> void applyAppCompatTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||
}
|
||||
|
||||
/*public static <T extends WinBoLLActivity> void applyWinBoLLTheme(Activity activity, AESThemeBean.ThemeType themeType) {
|
||||
activity.setTheme(AESThemeBean.getThemeStyleID(themeType));
|
||||
}*/
|
||||
|
||||
public static <T extends Activity> void inflateMenu(T activity, Menu menu) {
|
||||
// ====================== 加载菜单 ======================
|
||||
/**
|
||||
* 加载主题菜单(通用 Activity)
|
||||
*/
|
||||
public static void inflateThemeMenu(Activity activity, Menu menu) {
|
||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||
}
|
||||
|
||||
public static <T extends AppCompatActivity> void inflateCompatMenu(T activity, Menu menu) {
|
||||
/**
|
||||
* 加载主题菜单(AppCompat Activity)
|
||||
*/
|
||||
public static void inflateCompatThemeMenu(AppCompatActivity activity, Menu menu) {
|
||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||
}
|
||||
|
||||
/*public static <T extends WinBoLLActivity> void inflateWinBoLLMenu(T activity, Menu menu) {
|
||||
activity.getMenuInflater().inflate(R.menu.toolbar_apptheme, menu);
|
||||
}*/
|
||||
|
||||
public static <T extends Activity> boolean onAppThemeItemSelected(T activity, MenuItem item) {
|
||||
int nThemeStyleID;
|
||||
if (R.id.item_depththeme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_skytheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_goldentheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_bearingtheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.BEARING);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_memortheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_taotheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
// ====================== 菜单点击统一核心逻辑(消除重复代码) ======================
|
||||
/**
|
||||
* 主题菜单项点击统一处理
|
||||
* @param context 上下文(用于持久化)
|
||||
* @param item 点击的菜单项
|
||||
* @return 是否消费点击事件
|
||||
*/
|
||||
public static boolean handleThemeMenuClick(Context context, MenuItem item) {
|
||||
int themeStyleId;
|
||||
int itemId = item.getItemId();
|
||||
if (R.id.item_depththeme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||
} else if (R.id.item_skytheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||
} else if (R.id.item_goldentheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||
} else if (R.id.item_bearingtheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.BEARING);
|
||||
} else if (R.id.item_memortheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||
} else if (R.id.item_taotheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||
} else if (R.id.item_defaulttheme == itemId) {
|
||||
themeStyleId = getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
saveThemeStyleID(context, themeStyleId);
|
||||
return true;
|
||||
}
|
||||
|
||||
public static <T extends AppCompatActivity> boolean onAppCompatThemeItemSelected(T activity, MenuItem item) {
|
||||
int nThemeStyleID;
|
||||
if (R.id.item_depththeme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_skytheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_goldentheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_bearingtheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.BEARING);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_memortheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_taotheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||
saveThemeStyleID(activity, nThemeStyleID);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
// 对外暴露不同 Activity 类型的入口,内部调用统一核心方法
|
||||
public static boolean onThemeItemSelected(Activity activity, MenuItem item) {
|
||||
return handleThemeMenuClick(activity, item);
|
||||
}
|
||||
|
||||
public static <T extends AppCompatActivity> boolean onWinBoLLThemeItemSelected(T activity, MenuItem item) {
|
||||
int nThemeStyleID;
|
||||
if (R.id.item_depththeme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_skytheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_goldentheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_bearingtheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.BEARING);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_memortheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_taotheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
public static boolean onAppCompatThemeItemSelected(AppCompatActivity activity, MenuItem item) {
|
||||
return handleThemeMenuClick(activity, item);
|
||||
}
|
||||
|
||||
public static <T extends DrawerFragmentActivity> boolean onWinBoLLThemeItemSelected(T activity, MenuItem item) {
|
||||
int nThemeStyleID;
|
||||
if (R.id.item_depththeme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.DEPTH);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_skytheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.SKY);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_goldentheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.GOLDEN);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_bearingtheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.BEARING);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_memortheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.MEMOR);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_taotheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.TAO);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||
nThemeStyleID = AESThemeBean.getThemeStyleID(AESThemeBean.ThemeType.AES);
|
||||
saveThemeStyleID(activity.getApplicationContext(), nThemeStyleID);
|
||||
return true;
|
||||
}
|
||||
public static boolean onWinBoLLThemeItemSelected(AppCompatActivity activity, MenuItem item) {
|
||||
// 使用 Application 上下文保存,避免 Activity 泄漏
|
||||
return handleThemeMenuClick(activity.getApplicationContext(), item);
|
||||
}
|
||||
|
||||
return false;
|
||||
public static boolean onWinBoLLThemeItemSelected(DrawerFragmentActivity activity, MenuItem item) {
|
||||
return handleThemeMenuClick(activity.getApplicationContext(), item);
|
||||
}
|
||||
|
||||
// ====================== 主题类型转换工具 ======================
|
||||
/**
|
||||
* 根据枚举获取对应样式ID
|
||||
*/
|
||||
public static int getThemeStyleID(AESThemeBean.ThemeType themeType) {
|
||||
return themeStyleIDList.get(themeType.ordinal());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据样式ID反向获取主题枚举
|
||||
*/
|
||||
public static AESThemeBean.ThemeType getThemeStyleType(int themeStyleID) {
|
||||
for (int i = 0; i < themeStyleIDList.size(); i++) {
|
||||
if (themeStyleIDList.get(i) == themeStyleID) {
|
||||
return AESThemeBean.ThemeType.values()[i];
|
||||
}
|
||||
}
|
||||
return AESThemeBean.ThemeType.values()[0];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
|
||||
<color name="colorTextColor">#FFFFFFFF</color>
|
||||
<color name="colorPrimary">#FF03AB4E</color>
|
||||
<color name="colorPrimaryDark">#FF027C39</color>
|
||||
<color name="colorAccent">#FF3DDC84</color>
|
||||
<color name="colorPrimaryDark">#FF3DDC84</color>
|
||||
<color name="colorAccent">#FF027C39</color>
|
||||
<color name="colorText">#FFFFFB8D</color>
|
||||
<color name="colorToastFrame">#FFA9A9A9</color>
|
||||
<color name="colorToastFrame">#FF555555</color>
|
||||
<color name="colorToastShadow">#FF000000</color>
|
||||
<color name="colorToastBackgroung">#FFFFFFFF</color>
|
||||
<color name="colorAToolbarStartColor">#FF7D3F12</color>
|
||||
<color name="colorAToolbarCenterColor">#FFCC6E2B</color>
|
||||
<color name="colorAToolbarEndColor">#FFF4B98F</color>
|
||||
<color name="colorToastBackgroung">#FF3A3A3A</color>
|
||||
<color name="colorAToolbarStartColor">#FF5A3A1A</color>
|
||||
<color name="colorAToolbarCenterColor">#FFA05A2A</color>
|
||||
<color name="colorAToolbarEndColor">#FFD4A07A</color>
|
||||
|
||||
<color name="colorACardShadow">@color/colorPrimaryDark</color>
|
||||
<color name="colorACardFrame">@color/colorPrimary</color>
|
||||
@@ -24,7 +24,7 @@
|
||||
<color name="colorOHPCTSSecondaryProgress">@color/colorPrimary</color>
|
||||
<color name="colorOHPCTSProgress">@color/colorPrimaryDark</color>
|
||||
|
||||
<color name="toolbarBackgroundColor">#FF03AB4E</color>
|
||||
<color name="toolbarBackgroundColor">#FF3DDC84</color>
|
||||
<color name="toolbarTextColor">#FFFFFFFF</color>
|
||||
<color name="mainWindowBackgroundColor">#FF2C2C2C</color>
|
||||
<color name="mainWindowTextColor">#FFFFFFFF</color>
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
<resources>
|
||||
|
||||
<style name="AESTheme" parent="Theme.AppCompat.NoActionBar">
|
||||
<item name="colorPrimary">#FF03AB4E</item>
|
||||
<item name="colorPrimaryDark">#FF3DDC84</item>
|
||||
<item name="colorAccent">#FF027C39</item>
|
||||
<item name="themeDebug">@style/DebugActivityTheme</item>
|
||||
<item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
|
||||
<item name="aboutViewTextColor">@color/mainWindowTextColor</item>
|
||||
@@ -40,52 +43,52 @@
|
||||
|
||||
<style name="AESAToolbar">
|
||||
<item name="attrAToolbarTitleTextColor">@color/colorTextColor</item>
|
||||
<item name="attrAToolbarStartColor">@color/colorPrimaryDark</item>
|
||||
<item name="attrAToolbarCenterColor">@color/colorPrimary</item>
|
||||
<item name="attrAToolbarEndColor">@color/colorAccent</item>
|
||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AESASupportToolbar">
|
||||
<item name="attrASupportToolbarTitleTextColor">@color/colorTextColor</item>
|
||||
<item name="attrASupportToolbarStartColor">@color/colorPrimaryDark</item>
|
||||
<item name="attrASupportToolbarCenterColor">@color/colorPrimary</item>
|
||||
<item name="attrASupportToolbarEndColor">@color/colorAccent</item>
|
||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="DepthAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FF0065EC</item>
|
||||
<item name="colorPrimaryDark">#FF004DB4</item>
|
||||
<item name="colorAccent">#FF4A97FF</item>
|
||||
<item name="colorPrimaryDark">#FF4A97FF</item>
|
||||
<item name="colorAccent">#FF004DB4</item>
|
||||
</style>
|
||||
|
||||
<style name="SkyAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FF00A6FF</item>
|
||||
<item name="colorPrimaryDark">#FF007ABB</item>
|
||||
<item name="colorAccent">#FF84D4FF</item>
|
||||
<item name="colorPrimaryDark">#FF84D4FF</item>
|
||||
<item name="colorAccent">#FF007ABB</item>
|
||||
</style>
|
||||
|
||||
<style name="GoldenAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FFF0CA11</item>
|
||||
<item name="colorPrimaryDark">#FFD3AF00</item>
|
||||
<item name="colorAccent">#FFFFE35C</item>
|
||||
<item name="colorPrimaryDark">#FFFFE35C</item>
|
||||
<item name="colorAccent">#FFD3AF00</item>
|
||||
</style>
|
||||
|
||||
<style name="BearingAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FF840FFF</item>
|
||||
<item name="colorPrimaryDark">#FF6900D7</item>
|
||||
<item name="colorAccent">#FFBA78FF</item>
|
||||
<item name="colorPrimaryDark">#FFBA78FF</item>
|
||||
<item name="colorAccent">#FF6900D7</item>
|
||||
</style>
|
||||
|
||||
<style name="MemorAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FFFF00F5</item>
|
||||
<item name="colorPrimaryDark">#FFE500DC</item>
|
||||
<item name="colorAccent">#FFFF76FA</item>
|
||||
<item name="colorPrimaryDark">#FFFF76FA</item>
|
||||
<item name="colorAccent">#FFE500DC</item>
|
||||
</style>
|
||||
|
||||
<style name="TaoAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FFACACAC</item>
|
||||
<item name="colorPrimaryDark">#FF898989</item>
|
||||
<item name="colorAccent">#FFD8D8D8</item>
|
||||
<item name="colorPrimary">#FF7E7E7E</item>
|
||||
<item name="colorPrimaryDark">#FFE2E2E2</item>
|
||||
<item name="colorAccent">#FF000000</item>
|
||||
</style>
|
||||
|
||||
<style name="NormalDialogStyle" parent="Theme.AppCompat.Dialog">
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
<resources>
|
||||
|
||||
<style name="AESTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||
<item name="colorPrimary">#FF03AB4E</item>
|
||||
<item name="colorPrimaryDark">#FF027C39</item>
|
||||
<item name="colorAccent">#FF3DDC84</item>
|
||||
<item name="themeDebug">@style/DebugActivityTheme</item>
|
||||
<item name="aboutViewBackgroundColor">@color/mainWindowBackgroundColor</item>
|
||||
<item name="aboutViewTextColor">@color/mainWindowTextColor</item>
|
||||
@@ -40,16 +43,16 @@
|
||||
|
||||
<style name="AESAToolbar">
|
||||
<item name="attrAToolbarTitleTextColor">@color/colorTextColor</item>
|
||||
<item name="attrAToolbarStartColor">@color/colorPrimaryDark</item>
|
||||
<item name="attrAToolbarCenterColor">@color/colorPrimary</item>
|
||||
<item name="attrAToolbarEndColor">@color/colorAccent</item>
|
||||
<item name="attrAToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||
<item name="attrAToolbarCenterColor">?attr/colorPrimary</item>
|
||||
<item name="attrAToolbarEndColor">?attr/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="AESASupportToolbar">
|
||||
<item name="attrASupportToolbarTitleTextColor">@color/colorTextColor</item>
|
||||
<item name="attrASupportToolbarStartColor">@color/colorPrimaryDark</item>
|
||||
<item name="attrASupportToolbarCenterColor">@color/colorPrimary</item>
|
||||
<item name="attrASupportToolbarEndColor">@color/colorAccent</item>
|
||||
<item name="attrASupportToolbarStartColor">?attr/colorPrimaryDark</item>
|
||||
<item name="attrASupportToolbarCenterColor">?attr/colorPrimary</item>
|
||||
<item name="attrASupportToolbarEndColor">?attr/colorAccent</item>
|
||||
</style>
|
||||
|
||||
<style name="DepthAESTheme" parent="AESTheme">
|
||||
@@ -83,9 +86,9 @@
|
||||
</style>
|
||||
|
||||
<style name="TaoAESTheme" parent="AESTheme">
|
||||
<item name="colorPrimary">#FFACACAC</item>
|
||||
<item name="colorPrimaryDark">#FF898989</item>
|
||||
<item name="colorAccent">#FFD8D8D8</item>
|
||||
<item name="colorPrimary">#FF7E7E7E</item>
|
||||
<item name="colorPrimaryDark">#FF000000</item>
|
||||
<item name="colorAccent">#FFE2E2E2</item>
|
||||
</style>
|
||||
|
||||
<style name="NormalDialogStyle" parent="Theme.AppCompat.Light.Dialog">
|
||||
@@ -109,4 +112,4 @@
|
||||
<item name="@android:windowExitAnimation">@anim/normal_dialog_exit_corner</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
</resources>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Wed May 20 16:12:13 HKT 2026
|
||||
stageCount=21
|
||||
#Wed May 27 14:51:29 HKT 2026
|
||||
stageCount=23
|
||||
libraryProject=libappbase
|
||||
baseVersion=15.20
|
||||
publishVersion=15.20.20
|
||||
publishVersion=15.20.22
|
||||
buildCount=0
|
||||
baseBetaVersion=15.20.21
|
||||
baseBetaVersion=15.20.23
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package cc.winboll.studio.libappbase.views;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.net.Uri;
|
||||
@@ -12,6 +14,7 @@ import android.widget.ImageButton;
|
||||
import android.widget.ImageView;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import cc.winboll.studio.libappbase.R;
|
||||
@@ -74,12 +77,12 @@ public class AboutView extends LinearLayout {
|
||||
private EditText metDevUserPassword;
|
||||
|
||||
// ===================================== 页面视图控件 =====================================
|
||||
private DebugSwitchImageView ivAppIcon;
|
||||
private DebugSwitchInfoImageView ivAppIcon;
|
||||
private TextView tvAppNameVersion;
|
||||
private TextView tvAppDesc;
|
||||
private LinearLayout llFunctionContainer;
|
||||
private ImageButton ibSebugStepOver;
|
||||
private ImageButton ibSigngetDialog;
|
||||
private ImageButton ibDebugUnlock;
|
||||
private ImageButton ibWinBoLLHostDialog;
|
||||
|
||||
// ===================================== 构造方法(按参数从少到多排序) =====================================
|
||||
@@ -193,12 +196,12 @@ public class AboutView extends LinearLayout {
|
||||
llFunctionContainer = findViewById(R.id.ll_function_container);
|
||||
// 功能按钮绑定
|
||||
ibSebugStepOver = findViewById(R.id.ib_debug_step_over);
|
||||
ibSigngetDialog = findViewById(R.id.ib_signgetdialog);
|
||||
ibDebugUnlock = findViewById(R.id.ib_debug_unlock);
|
||||
ibWinBoLLHostDialog = findViewById(R.id.ib_winbollhostdialog);
|
||||
|
||||
// 调试按钮统一只在调试模式显示
|
||||
ibWinBoLLHostDialog.setVisibility(GlobalApplication.isDebugging() ? View.VISIBLE : View.GONE);
|
||||
//ibSigngetDialog.setVisibility(GlobalApplication.isDebugging() ? View.VISIBLE : View.GONE);
|
||||
//ibDebugUnlock.setVisibility(GlobalApplication.isDebugging() ? View.VISIBLE : View.GONE);
|
||||
ibSebugStepOver.setVisibility(GlobalApplication.isDebugging() ? View.VISIBLE : View.GONE);
|
||||
|
||||
// 绑定按钮点击事件
|
||||
@@ -310,6 +313,47 @@ public class AboutView extends LinearLayout {
|
||||
LogUtils.d(TAG, "initAboutPageView():视图组装完成,功能项加载完毕");
|
||||
}
|
||||
|
||||
// ===================================== 调试解锁弹窗 =====================================
|
||||
private void showDebugUnlockDialog() {
|
||||
final AlertDialog dialog = new AlertDialog.Builder(mContext).create();
|
||||
dialog.setTitle("应用调试解锁");
|
||||
dialog.setCanceledOnTouchOutside(true);
|
||||
|
||||
final EditText etToken = new EditText(mContext);
|
||||
etToken.setHint("请输入调试Token");
|
||||
dialog.setView(etToken);
|
||||
|
||||
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "调试解锁", (DialogInterface.OnClickListener) null);
|
||||
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "关闭", (DialogInterface.OnClickListener) null);
|
||||
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
||||
@Override
|
||||
public void onShow(DialogInterface d) {
|
||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
String inputToken = etToken.getText().toString().trim();
|
||||
String savedToken = DebugSwitchInfoImageView.getDebugToken();
|
||||
if (savedToken != null && savedToken.equals(inputToken)) {
|
||||
GlobalApplication.setIsDebugging(true);
|
||||
GlobalApplication.saveDebugStatus(GlobalApplication.getInstance());
|
||||
Toast.makeText(mContext, "调试解锁成功,重启应用后生效", Toast.LENGTH_SHORT).show();
|
||||
} else {
|
||||
Toast.makeText(mContext, "调试Token不匹配", Toast.LENGTH_SHORT).show();
|
||||
dialog.dismiss();
|
||||
}
|
||||
}
|
||||
});
|
||||
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
// ===================================== 内部工具/事件方法 =====================================
|
||||
/**
|
||||
* 绑定功能按钮点击事件,处理正版校验、调试地址配置弹窗唤起
|
||||
@@ -335,6 +379,15 @@ public class AboutView extends LinearLayout {
|
||||
new DebugHostDialog(mContext).show();
|
||||
}
|
||||
});
|
||||
|
||||
// 应用调试解锁按钮
|
||||
ibDebugUnlock.setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
LogUtils.d(TAG, "ibDebugUnlock onClick:弹出调试解锁对话框");
|
||||
showDebugUnlockDialog();
|
||||
}
|
||||
});
|
||||
LogUtils.d(TAG, "setBtnClickListener():功能按钮点击事件绑定完成");
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,127 @@
|
||||
package cc.winboll.studio.libappbase.views;
|
||||
|
||||
import android.app.AlertDialog;
|
||||
import android.content.ClipData;
|
||||
import android.content.ClipboardManager;
|
||||
import android.content.Context;
|
||||
import android.content.DialogInterface;
|
||||
import android.content.SharedPreferences;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
import android.widget.ImageView;
|
||||
import java.util.UUID;
|
||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||
|
||||
/**
|
||||
* @Author 豆包&ZhanGSKen<zhangsken@qq.com>
|
||||
* @Date 2026/04/06 19:32
|
||||
* @Describe 应用Logo控件,连续点击6次弹出调试Token对话框,支持复制与重置
|
||||
*/
|
||||
public class DebugSwitchInfoImageView extends ImageView {
|
||||
|
||||
public static final String TAG = "DebugSwitchInfoImageView";
|
||||
|
||||
// 连续点击计数
|
||||
private int mClickCount = 0;
|
||||
// 目标点击次数
|
||||
private static final int TARGET_CLICK_COUNT = 7;
|
||||
|
||||
private static String mDebugToken = null;
|
||||
private static final String SP_DEBUG_TOKEN = "debug_token_prefs";
|
||||
private static final String KEY_DEBUG_TOKEN = "debug_token";
|
||||
|
||||
public static String getDebugToken() {
|
||||
if (mDebugToken != null) {
|
||||
return mDebugToken;
|
||||
}
|
||||
Context context = GlobalApplication.getInstance();
|
||||
if (context != null) {
|
||||
SharedPreferences sp = context.getSharedPreferences(SP_DEBUG_TOKEN, Context.MODE_PRIVATE);
|
||||
mDebugToken = sp.getString(KEY_DEBUG_TOKEN, null);
|
||||
if (mDebugToken == null) {
|
||||
mDebugToken = UUID.randomUUID().toString();
|
||||
sp.edit().putString(KEY_DEBUG_TOKEN, mDebugToken).apply();
|
||||
}
|
||||
}
|
||||
return mDebugToken;
|
||||
}
|
||||
|
||||
public static void resetDebugToken() {
|
||||
Context context = GlobalApplication.getInstance();
|
||||
if (context != null) {
|
||||
mDebugToken = UUID.randomUUID().toString();
|
||||
SharedPreferences sp = context.getSharedPreferences(SP_DEBUG_TOKEN, Context.MODE_PRIVATE);
|
||||
sp.edit().putString(KEY_DEBUG_TOKEN, mDebugToken).apply();
|
||||
}
|
||||
}
|
||||
|
||||
private void showDebugTokenDialog() {
|
||||
final AlertDialog dialog = new AlertDialog.Builder(getContext()).create();
|
||||
dialog.setTitle("调试Token");
|
||||
dialog.setMessage(getDebugToken());
|
||||
dialog.setCanceledOnTouchOutside(false);
|
||||
dialog.setButton(DialogInterface.BUTTON_POSITIVE, "复制到剪贴板", (DialogInterface.OnClickListener) null);
|
||||
dialog.setButton(DialogInterface.BUTTON_NEUTRAL, "重置", (DialogInterface.OnClickListener) null);
|
||||
dialog.setButton(DialogInterface.BUTTON_NEGATIVE, "关闭", (DialogInterface.OnClickListener) null);
|
||||
dialog.setOnShowListener(new DialogInterface.OnShowListener() {
|
||||
@Override
|
||||
public void onShow(DialogInterface d) {
|
||||
dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
ClipboardManager cm = (ClipboardManager) getContext().getSystemService(Context.CLIPBOARD_SERVICE);
|
||||
cm.setPrimaryClip(ClipData.newPlainText("DebugToken", getDebugToken()));
|
||||
}
|
||||
});
|
||||
dialog.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
resetDebugToken();
|
||||
dialog.setMessage(getDebugToken());
|
||||
}
|
||||
});
|
||||
dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener(new View.OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
dialog.dismiss();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
dialog.show();
|
||||
}
|
||||
|
||||
public DebugSwitchInfoImageView(Context context) {
|
||||
super(context);
|
||||
init();
|
||||
}
|
||||
|
||||
public DebugSwitchInfoImageView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init();
|
||||
}
|
||||
|
||||
public DebugSwitchInfoImageView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init();
|
||||
}
|
||||
|
||||
public DebugSwitchInfoImageView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
|
||||
super(context, attrs, defStyleAttr, defStyleRes);
|
||||
init();
|
||||
}
|
||||
|
||||
private void init() {
|
||||
setOnClickListener(new OnClickListener() {
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
mClickCount++;
|
||||
if (mClickCount >= TARGET_CLICK_COUNT) {
|
||||
mClickCount = 0;
|
||||
showDebugTokenDialog();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
android:paddingRight="16dp"
|
||||
android:paddingBottom="16dp">
|
||||
|
||||
<cc.winboll.studio.libappbase.views.DebugSwitchImageView
|
||||
<cc.winboll.studio.libappbase.views.DebugSwitchInfoImageView
|
||||
android:id="@+id/iv_app_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
@@ -81,7 +81,8 @@
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:src="@drawable/ic_key"
|
||||
android:id="@+id/ib_signgetdialog"
|
||||
android:id="@+id/ib_debug_unlock"
|
||||
android:contentDescription="应用调试解锁"
|
||||
android:scaleType="fitCenter"
|
||||
android:adjustViewBounds="true"
|
||||
android:background="@null"/>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
android:paddingRight="16dp"
|
||||
android:paddingBottom="16dp">
|
||||
|
||||
<cc.winboll.studio.libappbase.views.DebugSwitchImageView
|
||||
<cc.winboll.studio.libappbase.views.DebugSwitchInfoImageView
|
||||
android:id="@+id/iv_app_icon"
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
@@ -81,7 +81,8 @@
|
||||
android:layout_width="48dp"
|
||||
android:layout_height="48dp"
|
||||
android:src="@drawable/ic_key"
|
||||
android:id="@+id/ib_signgetdialog"
|
||||
android:id="@+id/ib_debug_unlock"
|
||||
android:contentDescription="应用调试解锁"
|
||||
android:scaleType="fitCenter"
|
||||
android:adjustViewBounds="true"
|
||||
android:background="@null"/>
|
||||
|
||||
Reference in New Issue
Block a user