Compare commits
15 Commits
powerbell-
...
powerbell-
| Author | SHA1 | Date | |
|---|---|---|---|
| 6ed9bc0d8e | |||
| bcb5db0a17 | |||
| 6b69e04706 | |||
| a2a61bbf0b | |||
| 9f4211c83e | |||
| 447a786632 | |||
| ff0f239ffc | |||
| 7c59a982fc | |||
| 895cc4630d | |||
| 851a539364 | |||
| d79f2937ba | |||
| c524a21429 | |||
| a148de2ab8 | |||
| de34e823b6 | |||
| fd0833476e |
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Wed Dec 10 18:12:34 HKT 2025
|
#Thu Dec 11 03:22:10 HKT 2025
|
||||||
stageCount=8
|
stageCount=15
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.12
|
baseVersion=15.12
|
||||||
publishVersion=15.12.7
|
publishVersion=15.12.14
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.12.8
|
baseBetaVersion=15.12.15
|
||||||
|
|||||||
@@ -2,28 +2,36 @@ package cc.winboll.studio.powerbell;
|
|||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Environment;
|
import android.os.Environment;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
|
import cc.winboll.studio.powerbell.model.BackgroundBean;
|
||||||
import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver;
|
import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver;
|
||||||
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
|
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
|
||||||
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
|
||||||
|
import cc.winboll.studio.powerbell.utils.BackgroundSourceUtils;
|
||||||
|
import cc.winboll.studio.powerbell.utils.BitmapCacheUtils;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
public class App extends GlobalApplication {
|
public class App extends GlobalApplication {
|
||||||
|
|
||||||
public static final String TAG = "App";
|
public static final String TAG = "App";
|
||||||
|
|
||||||
public static final String COMPONENT_EN1 = "cc.winboll.studio.powerbell.MainActivityEN1";
|
public static final String COMPONENT_EN1 = "cc.winboll.studio.powerbell.MainActivityEN1";
|
||||||
public static final String COMPONENT_CN1 = "cc.winboll.studio.powerbell.MainActivityCN1";
|
public static final String COMPONENT_CN1 = "cc.winboll.studio.powerbell.MainActivityCN1";
|
||||||
public static final String COMPONENT_CN2 = "cc.winboll.studio.powerbell.MainActivityCN2";
|
public static final String COMPONENT_CN2 = "cc.winboll.studio.powerbell.MainActivityCN2";
|
||||||
public static final String ACTION_SWITCHTO_EN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_EN1";
|
public static final String ACTION_SWITCHTO_EN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_EN1";
|
||||||
public static final String ACTION_SWITCHTO_CN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN1";
|
public static final String ACTION_SWITCHTO_CN1 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN1";
|
||||||
public static final String ACTION_SWITCHTO_CN2 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN2";
|
public static final String ACTION_SWITCHTO_CN2 = "cc.winboll.studio.powerbell.App.ACTION_SWITCHTO_CN2";
|
||||||
|
|
||||||
// 数据配置存储工具
|
// 数据配置存储工具
|
||||||
static AppConfigUtils _mAppConfigUtils;
|
static AppConfigUtils _mAppConfigUtils;
|
||||||
static AppCacheUtils _mAppCacheUtils;
|
static AppCacheUtils _mAppCacheUtils;
|
||||||
|
// 新增:全局 Bitmap 缓存工具(常驻内存)
|
||||||
|
public static BitmapCacheUtils _mBitmapCacheUtils;
|
||||||
|
|
||||||
GlobalApplicationReceiver mReceiver;
|
GlobalApplicationReceiver mReceiver;
|
||||||
static String szTempDir = "";
|
static String szTempDir = "";
|
||||||
|
|
||||||
@@ -34,25 +42,16 @@ public class App extends GlobalApplication {
|
|||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
setIsDebugging(BuildConfig.DEBUG);
|
setIsDebugging(BuildConfig.DEBUG);
|
||||||
//setIsDebugging(false);
|
|
||||||
|
|
||||||
// 初始化活动窗口管理
|
// 初始化活动窗口管理
|
||||||
WinBoLLActivityManager.init(this);
|
WinBoLLActivityManager.init(this);
|
||||||
// 初始化 Toast 框架
|
// 初始化 Toast 框架
|
||||||
ToastUtils.init(this);
|
ToastUtils.init(this);
|
||||||
|
|
||||||
// 临时文件夹方案1
|
// 临时文件夹初始化(保持原有逻辑)
|
||||||
// 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式)
|
|
||||||
File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
File picturesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES);
|
||||||
// 定义目标文件路径(在Pictures目录下创建"PowerBell"子文件夹及文件)
|
|
||||||
File powerBellDir = new File(picturesDir, "PowerBell");
|
File powerBellDir = new File(picturesDir, "PowerBell");
|
||||||
|
|
||||||
// 临时文件夹方案2 <图片保存失败>
|
|
||||||
// 获取Pictures文件夹路径(Android 10及以上推荐使用MediaStore,此处为传统方式)
|
|
||||||
//File powerBellDir = getExternalFilesDir("TempDir");
|
|
||||||
|
|
||||||
// 先创建文件夹(如果不存在)
|
|
||||||
if (!powerBellDir.exists()) {
|
if (!powerBellDir.exists()) {
|
||||||
powerBellDir.mkdirs();
|
powerBellDir.mkdirs();
|
||||||
}
|
}
|
||||||
@@ -61,11 +60,54 @@ public class App extends GlobalApplication {
|
|||||||
// 设置数据配置存储工具
|
// 设置数据配置存储工具
|
||||||
_mAppConfigUtils = getAppConfigUtils(this);
|
_mAppConfigUtils = getAppConfigUtils(this);
|
||||||
_mAppCacheUtils = getAppCacheUtils(this);
|
_mAppCacheUtils = getAppCacheUtils(this);
|
||||||
|
// 初始化全局 Bitmap 缓存工具(关键:App 启动时初始化,常驻内存)
|
||||||
|
_mBitmapCacheUtils = BitmapCacheUtils.getInstance();
|
||||||
|
|
||||||
mReceiver = new GlobalApplicationReceiver(this);
|
mReceiver = new GlobalApplicationReceiver(this);
|
||||||
mReceiver.registerAction();
|
mReceiver.registerAction();
|
||||||
|
|
||||||
|
// ======================== 新增:异步预加载背景图 ========================
|
||||||
|
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
// 1. 获取背景源工具类实例
|
||||||
|
BackgroundSourceUtils bgSourceUtils = BackgroundSourceUtils.getInstance(App.this);
|
||||||
|
if (bgSourceUtils == null) {
|
||||||
|
LogUtils.e(TAG, "preloadBitmap: BackgroundSourceUtils 实例为空");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 2. 获取当前背景Bean
|
||||||
|
BackgroundBean bgBean = bgSourceUtils.getCurrentBackgroundBean();
|
||||||
|
if (bgBean == null || !bgBean.isUseBackgroundFile()) {
|
||||||
|
LogUtils.d(TAG, "preloadBitmap: 无有效背景文件,跳过预加载");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 3. 获取背景图路径(优先取压缩图路径)
|
||||||
|
String bgPath = bgBean.isUseBackgroundScaledCompressFile()
|
||||||
|
? bgBean.getBackgroundScaledCompressFilePath()
|
||||||
|
: bgBean.getBackgroundFilePath();
|
||||||
|
// 4. 预加载到全局缓存
|
||||||
|
if (_mBitmapCacheUtils != null) {
|
||||||
|
_mBitmapCacheUtils.cacheBitmap(bgPath);
|
||||||
|
LogUtils.d(TAG, "preloadBitmap: 应用启动时预加载成功 - " + bgPath);
|
||||||
|
} else {
|
||||||
|
LogUtils.e(TAG, "preloadBitmap: 全局 BitmapCacheUtils 未初始化");
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
LogUtils.e(TAG, "preloadBitmap: 预加载失败 - " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
}, 1000); // 延迟1秒执行,避免阻塞应用初始化
|
||||||
|
// ======================== 预加载逻辑结束 ========================
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 保持原有方法不变
|
||||||
public static AppConfigUtils getAppConfigUtils(Context context) {
|
public static AppConfigUtils getAppConfigUtils(Context context) {
|
||||||
if (_mAppConfigUtils == null) {
|
if (_mAppConfigUtils == null) {
|
||||||
_mAppConfigUtils = AppConfigUtils.getInstance(context);
|
_mAppConfigUtils = AppConfigUtils.getInstance(context);
|
||||||
@@ -84,12 +126,14 @@ public class App extends GlobalApplication {
|
|||||||
_mAppCacheUtils.clearBatteryHistory();
|
_mAppCacheUtils.clearBatteryHistory();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onTerminate() {
|
public void onTerminate() {
|
||||||
super.onTerminate();
|
super.onTerminate();
|
||||||
ToastUtils.release();
|
ToastUtils.release();
|
||||||
}
|
// 可选:App 终止时清空 Bitmap 缓存,释放内存
|
||||||
|
if (_mBitmapCacheUtils != null) {
|
||||||
|
_mBitmapCacheUtils.clearAllCache();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import android.view.KeyEvent;
|
|||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.view.ViewStub;
|
||||||
import android.widget.CheckBox;
|
import android.widget.CheckBox;
|
||||||
import android.widget.CompoundButton;
|
import android.widget.CompoundButton;
|
||||||
import android.widget.ImageView;
|
import android.widget.ImageView;
|
||||||
@@ -24,6 +25,7 @@ import android.widget.SeekBar;
|
|||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
|
||||||
import cc.winboll.studio.libaes.activitys.AboutActivity;
|
import cc.winboll.studio.libaes.activitys.AboutActivity;
|
||||||
import cc.winboll.studio.libaes.models.APPInfo;
|
import cc.winboll.studio.libaes.models.APPInfo;
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
@@ -49,71 +51,56 @@ import cc.winboll.studio.powerbell.views.BatteryDrawable;
|
|||||||
import cc.winboll.studio.powerbell.views.VerticalSeekBar;
|
import cc.winboll.studio.powerbell.views.VerticalSeekBar;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主活动类(修复小米广告SDK空Context崩溃问题)
|
* 主活动类(Java 7 兼容 | 移除窗体缓存)
|
||||||
* 核心修改点:
|
* 核心优化点:
|
||||||
* 1. 添加全局Context安全校验
|
* 1. ViewHolder 缓存控件 + ViewStub 延迟加载
|
||||||
* 2. 优化广告请求的生命周期判断
|
* 2. 资源异步加载 + 非关键任务异步化
|
||||||
* 3. 确保广告操作在主线程执行
|
|
||||||
* 4. 完善广告资源释放逻辑
|
|
||||||
*/
|
*/
|
||||||
public class MainActivity extends WinBoLLActivity {
|
public class MainActivity extends WinBoLLActivity {
|
||||||
|
|
||||||
// ======================== 静态常量(首屏排列,统一管理)========================
|
// ======================== 静态常量(移除缓存相关键)========================
|
||||||
public static final String TAG = "MainActivity";
|
public static final String TAG = "MainActivity";
|
||||||
private static final int REQUEST_WRITE_STORAGE_PERMISSION = 1001;
|
private static final int REQUEST_WRITE_STORAGE_PERMISSION = 1001;
|
||||||
|
public static final int MSG_RELOAD_APPCONFIG = 0;
|
||||||
// ======================== 成员属性(按「静态→非静态」「核心→辅助」排序)========================
|
|
||||||
public static MainActivity _mMainActivity; // 静态Activity实例(全局调用)
|
|
||||||
private App mApplication; // 应用Application实例
|
|
||||||
private Menu mMenu; // 顶部菜单实例
|
|
||||||
private Fragment mCurrentShowFragment; // 当前显示的Fragment
|
|
||||||
private MainViewFragment mMainViewFragment; // 主Fragment(核心视图)
|
|
||||||
private Toolbar mToolbar; // 顶部工具栏
|
|
||||||
private ADsBannerView mADsBannerView; // 广告Banner视图
|
|
||||||
|
|
||||||
public static final int MSG_RELOAD_APPCONFIG = 0;
|
|
||||||
public static final int MSG_CURRENTVALUEBATTERY = 1;
|
public static final int MSG_CURRENTVALUEBATTERY = 1;
|
||||||
|
public static final int MSG_LOAD_BACKGROUND = 2;
|
||||||
|
private static final int DELAY_LOAD_NON_CRITICAL = 500;
|
||||||
|
|
||||||
|
// ======================== 成员属性(移除缓存标识)========================
|
||||||
|
public static MainActivity _mMainActivity;
|
||||||
static MainViewFragment _mMainViewFragment;
|
static MainViewFragment _mMainViewFragment;
|
||||||
AppConfigUtils mAppConfigUtils;
|
static Handler _mHandler;
|
||||||
Drawable mDrawableFrame;
|
|
||||||
LinearLayout mllLeftSeekBar;
|
|
||||||
LinearLayout mllRightSeekBar;
|
|
||||||
CheckBox mcbIsEnableChargeReminder;
|
|
||||||
CheckBox mcbIsEnableUsegeReminder;
|
|
||||||
Switch mswIsEnableService;
|
|
||||||
TextView mtvTips;
|
|
||||||
|
|
||||||
private BackgroundSourceUtils mBgSourceUtils;
|
private App mApplication;
|
||||||
|
private AppConfigUtils mAppConfigUtils;
|
||||||
|
private BackgroundSourceUtils mBgSourceUtils;
|
||||||
|
|
||||||
// 背景布局
|
private Toolbar mToolbar;
|
||||||
//LinearLayout mLinearLayoutloadBackground;
|
private ViewStub mAdsViewStub;
|
||||||
|
private ADsBannerView mADsBannerView;
|
||||||
|
|
||||||
// 现在电量图示
|
private ViewHolder mViewHolder;
|
||||||
BatteryDrawable mCurrentValueBatteryDrawable;
|
private Menu mMenu;
|
||||||
// 现在充电提醒电量图示
|
private Fragment mCurrentShowFragment;
|
||||||
BatteryDrawable mChargeReminderValueBatteryDrawable;
|
private MainViewFragment mMainViewFragment;
|
||||||
// 现在耗电提醒电量图示
|
private Drawable mDrawableFrame;
|
||||||
BatteryDrawable mUsegeReminderValueBatteryDrawable;
|
private BatteryDrawable mCurrentValueBatteryDrawable;
|
||||||
|
private BatteryDrawable mChargeReminderValueBatteryDrawable;
|
||||||
|
private BatteryDrawable mUsegeReminderValueBatteryDrawable;
|
||||||
|
|
||||||
ImageView mCurrentValueBatteryImageView;
|
// ======================== 视图缓存容器(ViewHolder 不变)========================
|
||||||
ImageView mChargeReminderValueBatteryImageView;
|
private static class ViewHolder {
|
||||||
ImageView mUsegeReminderValueBatteryImageView;
|
BackgroundView backgroundView;
|
||||||
|
RelativeLayout mainLayout;
|
||||||
|
LinearLayout llLeftSeekBar, llRightSeekBar;
|
||||||
|
CheckBox cbIsEnableChargeReminder, cbIsEnableUsegeReminder;
|
||||||
|
Switch swIsEnableService;
|
||||||
|
TextView tvTips, tvChargeReminderValue, tvUsegeReminderValue, tvCurrentValue;
|
||||||
|
VerticalSeekBar chargeReminderSeekBar, usegeReminderSeekBar;
|
||||||
|
ImageView ivCurrentBattery, ivChargeReminderBattery, ivUsegeReminderBattery;
|
||||||
|
}
|
||||||
|
|
||||||
VerticalSeekBar mChargeReminderSeekBar;
|
// ======================== 重写生命周期(移除缓存恢复/保存逻辑)========================
|
||||||
ChargeReminderSeekBarChangeListener mChargeReminderSeekBarChangeListener;
|
|
||||||
TextView mtvChargeReminderValue;
|
|
||||||
|
|
||||||
|
|
||||||
VerticalSeekBar mUsegeReminderSeekBar;
|
|
||||||
UsegeReminderSeekBarChangeListener mUsegeReminderSeekBarChangeListener;
|
|
||||||
TextView mtvUsegeReminderValue;
|
|
||||||
CheckBox mcbUsegeReminderValue;
|
|
||||||
TextView mtvCurrentValue;
|
|
||||||
BackgroundView mBackgroundView;
|
|
||||||
|
|
||||||
|
|
||||||
// ======================== 重写父类抽象方法(优先排列,明确实现)========================
|
|
||||||
@Override
|
@Override
|
||||||
public Activity getActivity() {
|
public Activity getActivity() {
|
||||||
return this;
|
return this;
|
||||||
@@ -126,57 +113,57 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
LogUtils.d(TAG, "onCreate(...)");
|
LogUtils.d(TAG, "onCreate(...) - 移除窗体缓存");
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
setContentView(R.layout.activity_main);
|
initGlobalHandler();
|
||||||
|
|
||||||
// 初始化视图与实例
|
// 恢复原始初始化流程:直接加载布局+初始化
|
||||||
initView();
|
setContentView(R.layout.activity_main);
|
||||||
initInstance();
|
initCoreUtilsAsync();
|
||||||
// initFragment();
|
initViewHolder();
|
||||||
|
initCriticalView();
|
||||||
|
loadNonCriticalViewDelayed();
|
||||||
|
|
||||||
// 权限申请
|
// 权限申请
|
||||||
PermissionUtils.getInstance().checkAndRequestStoragePermission(this);
|
PermissionUtils.getInstance().checkAndRequestStoragePermission(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 移除 onSaveInstanceState 方法
|
||||||
|
// 移除 onRestoreInstanceState 方法
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
// 释放广告资源
|
|
||||||
if (mADsBannerView != null) {
|
if (mADsBannerView != null) {
|
||||||
mADsBannerView.releaseAdResources();
|
mADsBannerView.releaseAdResources();
|
||||||
}
|
}
|
||||||
// 置空静态引用,避免内存泄漏
|
|
||||||
_mMainActivity = null;
|
_mMainActivity = null;
|
||||||
}
|
_mMainViewFragment = null;
|
||||||
|
if (_mHandler != null) {
|
||||||
@Override
|
_mHandler.removeCallbacksAndMessages(null);
|
||||||
protected void onPostCreate(Bundle savedInstanceState) {
|
}
|
||||||
super.onPostCreate(savedInstanceState);
|
|
||||||
reloadBackground();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
reloadBackground();
|
// 移除缓存恢复后的刷新逻辑,直接发送加载背景消息
|
||||||
setBackgroundColor();
|
if (_mHandler != null) {
|
||||||
// 恢复广告
|
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
|
||||||
|
}
|
||||||
if (mADsBannerView != null) {
|
if (mADsBannerView != null) {
|
||||||
mADsBannerView.resumeADs(MainActivity.this);
|
mADsBannerView.resumeADs(MainActivity.this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 其他生命周期方法(onCreateOptionsMenu、onOptionsItemSelected等保持原有不变)
|
||||||
@Override
|
@Override
|
||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
mMenu = menu;
|
mMenu = menu;
|
||||||
// 主题菜单
|
|
||||||
AESThemeUtil.inflateMenu(this, menu);
|
AESThemeUtil.inflateMenu(this, menu);
|
||||||
// 调试工具菜单(仅Debug模式显示)
|
|
||||||
if (App.isDebugging()) {
|
if (App.isDebugging()) {
|
||||||
DevelopUtils.inflateMenu(this, menu);
|
DevelopUtils.inflateMenu(this, menu);
|
||||||
}
|
}
|
||||||
// 应用核心菜单
|
|
||||||
getMenuInflater().inflate(R.menu.toolbar_main, mMenu);
|
getMenuInflater().inflate(R.menu.toolbar_main, mMenu);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -184,17 +171,14 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onOptionsItemSelected(MenuItem item) {
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
int menuItemId = item.getItemId();
|
int menuItemId = item.getItemId();
|
||||||
// 主题切换菜单
|
|
||||||
if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
|
if (AESThemeUtil.onAppThemeItemSelected(this, item)) {
|
||||||
recreate();
|
recreate();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// 调试工具菜单
|
|
||||||
if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
if (DevelopUtils.onDevelopItemSelected(this, item)) {
|
||||||
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
LogUtils.d(TAG, String.format("onOptionsItemSelected item.getItemId() %d ", item.getItemId()));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
// 应用核心菜单
|
|
||||||
switch (menuItemId) {
|
switch (menuItemId) {
|
||||||
case R.id.action_settings:
|
case R.id.action_settings:
|
||||||
startActivity(new Intent(this, SettingsActivity.class));
|
startActivity(new Intent(this, SettingsActivity.class));
|
||||||
@@ -226,15 +210,16 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
@Override
|
@Override
|
||||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
|
if (resultCode == Activity.RESULT_OK) {
|
||||||
|
if (_mHandler != null) {
|
||||||
|
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBackPressed() {
|
public void onBackPressed() {
|
||||||
if (mCurrentShowFragment != mMainViewFragment) {
|
moveTaskToBack(true);
|
||||||
showFragment(mMainViewFragment);
|
|
||||||
} else {
|
|
||||||
moveTaskToBack(true);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -250,50 +235,374 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ======================== 移除缓存相关核心方法(restoreFromCache/refreshViewFromCache)========================
|
||||||
|
|
||||||
// ======================== 核心业务逻辑方法(按功能优先级排序)========================
|
|
||||||
/**
|
/**
|
||||||
* 显示指定Fragment(隐藏其他Fragment)
|
* 初始化电量图标(复用逻辑)
|
||||||
*/
|
*/
|
||||||
void showFragment(Fragment fragment) {
|
private void initBatteryDrawables() {
|
||||||
FragmentTransaction tx = getFragmentManager().beginTransaction();
|
if (mCurrentValueBatteryDrawable == null) {
|
||||||
for (Fragment item : getFragmentManager().getFragments()) {
|
mCurrentValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCurrent));
|
||||||
tx.hide(item);
|
}
|
||||||
|
if (mChargeReminderValueBatteryDrawable == null) {
|
||||||
|
mChargeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCharge));
|
||||||
|
}
|
||||||
|
if (mUsegeReminderValueBatteryDrawable == null) {
|
||||||
|
mUsegeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorUsege));
|
||||||
}
|
}
|
||||||
tx.show(fragment);
|
|
||||||
tx.commit();
|
|
||||||
mCurrentShowFragment = fragment;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ======================== 原有核心方法(移除缓存判断逻辑)========================
|
||||||
/**
|
/**
|
||||||
* 刷新背景(全局静态调用,带生命周期校验)
|
* 刷新背景(移除缓存判断)
|
||||||
*/
|
*/
|
||||||
// public static void reloadBackground() {
|
public void reloadBackground() {
|
||||||
// if (_mMainActivity != null && !_mMainActivity.isFinishing() && !_mMainActivity.isDestroyed()) {
|
if (mViewHolder == null || mBgSourceUtils == null || mViewHolder.backgroundView == null) {
|
||||||
// _mMainActivity.mMainViewFragment.reloadBackground();
|
LogUtils.e(TAG, "reloadBackground: 背景加载失败(控件/工具类未初始化)");
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 设置主页面背景颜色(从BackgroundBean获取颜色值)
|
|
||||||
*/
|
|
||||||
void setBackgroundColor() {
|
|
||||||
// 生命周期校验,避免Activity销毁后操作UI
|
|
||||||
if (isFinishing() || isDestroyed()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
BackgroundSourceUtils utils = BackgroundSourceUtils.getInstance(this);
|
BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean();
|
||||||
BackgroundBean bean = utils.getCurrentBackgroundBean();
|
if (bean != null) {
|
||||||
int nPixelColor = bean.getPixelColor();
|
mViewHolder.backgroundView.loadBackgroundBean(bean);
|
||||||
RelativeLayout mainLayout = findViewById(R.id.activitymainRelativeLayout1);
|
} else {
|
||||||
if (mainLayout != null) {
|
LogUtils.e(TAG, "reloadBackground: 背景Bean为空(图片路径异常)");
|
||||||
mainLayout.setBackgroundColor(nPixelColor);
|
mViewHolder.backgroundView.setBackgroundResource(R.drawable.default_background);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 通过Uri获取文件本地真实路径(兼容图片选择等场景)
|
* 设置主页面背景颜色(移除缓存判断)
|
||||||
*/
|
*/
|
||||||
|
void setBackgroundColor() {
|
||||||
|
if (isFinishing() || isDestroyed() || mViewHolder == null || mBgSourceUtils == null || mViewHolder.mainLayout == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean();
|
||||||
|
if (bean != null) {
|
||||||
|
int nPixelColor = bean.getPixelColor();
|
||||||
|
mViewHolder.mainLayout.setBackgroundColor(nPixelColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置视图数据(移除缓存判断)
|
||||||
|
*/
|
||||||
|
void setViewData() {
|
||||||
|
if (mViewHolder == null || mAppConfigUtils == null) return;
|
||||||
|
|
||||||
|
int nChargeReminderValue = mAppConfigUtils.getChargeReminderValue();
|
||||||
|
int nUsegeReminderValue = mAppConfigUtils.getUsegeReminderValue();
|
||||||
|
int nCurrentValue = mAppConfigUtils.getCurrentValue();
|
||||||
|
|
||||||
|
if (mViewHolder.llLeftSeekBar != null && mViewHolder.llRightSeekBar != null && mDrawableFrame != null) {
|
||||||
|
mViewHolder.llLeftSeekBar.setBackground(mDrawableFrame);
|
||||||
|
mViewHolder.llRightSeekBar.setBackground(mDrawableFrame);
|
||||||
|
}
|
||||||
|
|
||||||
|
initBatteryDrawables();
|
||||||
|
if (mViewHolder.ivCurrentBattery != null) {
|
||||||
|
mCurrentValueBatteryDrawable.setValue(nCurrentValue);
|
||||||
|
mViewHolder.ivCurrentBattery.setImageDrawable(mCurrentValueBatteryDrawable);
|
||||||
|
}
|
||||||
|
if (mViewHolder.ivChargeReminderBattery != null) {
|
||||||
|
mChargeReminderValueBatteryDrawable.setValue(nChargeReminderValue);
|
||||||
|
mViewHolder.ivChargeReminderBattery.setImageDrawable(mChargeReminderValueBatteryDrawable);
|
||||||
|
}
|
||||||
|
if (mViewHolder.ivUsegeReminderBattery != null) {
|
||||||
|
mUsegeReminderValueBatteryDrawable.setValue(nUsegeReminderValue);
|
||||||
|
mViewHolder.ivUsegeReminderBattery.setImageDrawable(mUsegeReminderValueBatteryDrawable);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.tvChargeReminderValue != null) {
|
||||||
|
mViewHolder.tvChargeReminderValue.setTextColor(getActivity().getColor(R.color.colorCharge));
|
||||||
|
mViewHolder.tvChargeReminderValue.setText(String.valueOf(nChargeReminderValue) + "%");
|
||||||
|
}
|
||||||
|
if (mViewHolder.chargeReminderSeekBar != null) {
|
||||||
|
mViewHolder.chargeReminderSeekBar.setProgress(nChargeReminderValue);
|
||||||
|
}
|
||||||
|
if (mViewHolder.cbIsEnableChargeReminder != null) {
|
||||||
|
mViewHolder.cbIsEnableChargeReminder.setChecked(mAppConfigUtils.getIsEnableChargeReminder());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.tvUsegeReminderValue != null) {
|
||||||
|
mViewHolder.tvUsegeReminderValue.setTextColor(getActivity().getColor(R.color.colorUsege));
|
||||||
|
mViewHolder.tvUsegeReminderValue.setText(String.valueOf(nUsegeReminderValue) + "%");
|
||||||
|
}
|
||||||
|
if (mViewHolder.usegeReminderSeekBar != null) {
|
||||||
|
mViewHolder.usegeReminderSeekBar.setProgress(nUsegeReminderValue);
|
||||||
|
}
|
||||||
|
if (mViewHolder.cbIsEnableUsegeReminder != null) {
|
||||||
|
mViewHolder.cbIsEnableUsegeReminder.setChecked(mAppConfigUtils.getIsEnableUsegeReminder());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.tvCurrentValue != null) {
|
||||||
|
mViewHolder.tvCurrentValue.setTextColor(getActivity().getColor(R.color.colorCurrent));
|
||||||
|
mViewHolder.tvCurrentValue.setText(String.valueOf(nCurrentValue) + "%");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.swIsEnableService != null) {
|
||||||
|
mViewHolder.swIsEnableService.setChecked(mAppConfigUtils.getIsEnableService());
|
||||||
|
mViewHolder.swIsEnableService.setText(getString(R.string.txt_aboveswitch));
|
||||||
|
}
|
||||||
|
if (mViewHolder.tvTips != null) {
|
||||||
|
mViewHolder.tvTips.setText(getString(R.string.txt_aboveswitchtips));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置视图监听(保持原有)
|
||||||
|
*/
|
||||||
|
void setViewListener() {
|
||||||
|
if (mViewHolder == null || mAppConfigUtils == null) return;
|
||||||
|
|
||||||
|
if (mViewHolder.chargeReminderSeekBar != null) {
|
||||||
|
mViewHolder.chargeReminderSeekBar.setOnSeekBarChangeListener(new ChargeReminderSeekBarChangeListener());
|
||||||
|
}
|
||||||
|
if (mViewHolder.cbIsEnableChargeReminder != null) {
|
||||||
|
mViewHolder.cbIsEnableChargeReminder.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mAppConfigUtils.setIsEnableChargeReminder(mViewHolder.cbIsEnableChargeReminder.isChecked());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.usegeReminderSeekBar != null) {
|
||||||
|
mViewHolder.usegeReminderSeekBar.setOnSeekBarChangeListener(new UsegeReminderSeekBarChangeListener());
|
||||||
|
}
|
||||||
|
if (mViewHolder.cbIsEnableUsegeReminder != null) {
|
||||||
|
mViewHolder.cbIsEnableUsegeReminder.setOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
mAppConfigUtils.setIsEnableUsegeReminder(mViewHolder.cbIsEnableUsegeReminder.isChecked());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mViewHolder.swIsEnableService != null) {
|
||||||
|
mViewHolder.swIsEnableService.setOnClickListener(new CompoundButton.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View view) {
|
||||||
|
mAppConfigUtils.setIsEnableService(getActivity(), mViewHolder.swIsEnableService.isChecked());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新当前电量显示(保持原有)
|
||||||
|
*/
|
||||||
|
void setCurrentValueBattery(int value) {
|
||||||
|
if (mViewHolder == null || mCurrentValueBatteryDrawable == null || mViewHolder.tvCurrentValue == null) return;
|
||||||
|
mViewHolder.tvCurrentValue.setText(String.valueOf(value) + "%");
|
||||||
|
mCurrentValueBatteryDrawable.setValue(value);
|
||||||
|
mCurrentValueBatteryDrawable.invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化ViewHolder(保持原有)
|
||||||
|
*/
|
||||||
|
private void initViewHolder() {
|
||||||
|
mViewHolder = new ViewHolder();
|
||||||
|
mViewHolder.mainLayout = (RelativeLayout) findViewById(R.id.activitymainRelativeLayout1);
|
||||||
|
if (mViewHolder.mainLayout == null) LogUtils.e(TAG, "initViewHolder: mainLayout绑定失败(ID不匹配)");
|
||||||
|
|
||||||
|
mViewHolder.backgroundView = (BackgroundView) findViewById(R.id.fragmentmainviewBackgroundView1);
|
||||||
|
if (mViewHolder.backgroundView == null) LogUtils.e(TAG, "initViewHolder: backgroundView绑定失败(ID不匹配)");
|
||||||
|
|
||||||
|
mViewHolder.llLeftSeekBar = (LinearLayout) findViewById(R.id.fragmentmainviewLinearLayout1);
|
||||||
|
mViewHolder.llRightSeekBar = (LinearLayout) findViewById(R.id.fragmentmainviewLinearLayout2);
|
||||||
|
mViewHolder.cbIsEnableChargeReminder = (CheckBox) findViewById(R.id.fragmentmainviewCheckBox1);
|
||||||
|
mViewHolder.cbIsEnableUsegeReminder = (CheckBox) findViewById(R.id.fragmentmainviewCheckBox2);
|
||||||
|
mViewHolder.swIsEnableService = (Switch) findViewById(R.id.fragmentandroidviewSwitch1);
|
||||||
|
mViewHolder.tvTips = (TextView) findViewById(R.id.fragmentandroidviewTextView1);
|
||||||
|
mViewHolder.tvChargeReminderValue = (TextView) findViewById(R.id.fragmentandroidviewTextView2);
|
||||||
|
mViewHolder.tvUsegeReminderValue = (TextView) findViewById(R.id.fragmentandroidviewTextView3);
|
||||||
|
mViewHolder.tvCurrentValue = (TextView) findViewById(R.id.fragmentandroidviewTextView4);
|
||||||
|
mViewHolder.chargeReminderSeekBar = (VerticalSeekBar) findViewById(R.id.fragmentandroidviewVerticalSeekBar1);
|
||||||
|
mViewHolder.usegeReminderSeekBar = (VerticalSeekBar) findViewById(R.id.fragmentandroidviewVerticalSeekBar2);
|
||||||
|
mViewHolder.ivCurrentBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView1);
|
||||||
|
mViewHolder.ivChargeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView3);
|
||||||
|
mViewHolder.ivUsegeReminderBattery = (ImageView) findViewById(R.id.fragmentandroidviewImageView2);
|
||||||
|
mAdsViewStub = (ViewStub) findViewById(R.id.stub_ads_banner);
|
||||||
|
mToolbar = (Toolbar) findViewById(R.id.toolbar);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化核心工具类(保持原有)
|
||||||
|
*/
|
||||||
|
private void initCoreUtilsAsync() {
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
mApplication = (App) getApplication();
|
||||||
|
mAppConfigUtils = App.getAppConfigUtils(getActivity());
|
||||||
|
mBgSourceUtils = BackgroundSourceUtils.getInstance(getActivity());
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (getActivity() != null) {
|
||||||
|
mDrawableFrame = getActivity().getDrawable(R.drawable.bg_frame);
|
||||||
|
}
|
||||||
|
setViewData();
|
||||||
|
setViewListener();
|
||||||
|
checkServiceAsync();
|
||||||
|
if (_mHandler != null) {
|
||||||
|
_mHandler.sendEmptyMessage(MSG_LOAD_BACKGROUND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化首屏核心视图(保持原有)
|
||||||
|
*/
|
||||||
|
private void initCriticalView() {
|
||||||
|
_mMainActivity = this;
|
||||||
|
setSupportActionBar(mToolbar);
|
||||||
|
if (mToolbar != null) {
|
||||||
|
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 延迟加载非首屏核心视图(保持原有)
|
||||||
|
*/
|
||||||
|
private void loadNonCriticalViewDelayed() {
|
||||||
|
new Handler().postDelayed(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (isFinishing() || isDestroyed()) return;
|
||||||
|
loadAdsView();
|
||||||
|
}
|
||||||
|
}, DELAY_LOAD_NON_CRITICAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 加载广告视图(保持原有)
|
||||||
|
*/
|
||||||
|
private void loadAdsView() {
|
||||||
|
if (mAdsViewStub == null) return;
|
||||||
|
if (mADsBannerView == null) {
|
||||||
|
View adsView = mAdsViewStub.inflate();
|
||||||
|
mADsBannerView = (ADsBannerView) adsView.findViewById(R.id.adsbanner);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查服务状态(保持原有)
|
||||||
|
*/
|
||||||
|
private void checkServiceAsync() {
|
||||||
|
new Thread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
if (mAppConfigUtils == null || isFinishing() || isDestroyed()) return;
|
||||||
|
if (mAppConfigUtils.getIsEnableService()
|
||||||
|
&& !ServiceUtils.isServiceAlive(getActivity(), ControlCenterService.class.getName())) {
|
||||||
|
runOnUiThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Intent intent = new Intent(getActivity(), ControlCenterService.class);
|
||||||
|
getActivity().startForegroundService(intent);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 初始化全局Handler(保持原有)
|
||||||
|
*/
|
||||||
|
private void initGlobalHandler() {
|
||||||
|
if (_mHandler == null) {
|
||||||
|
_mHandler = new Handler() {
|
||||||
|
@Override
|
||||||
|
public void handleMessage(Message msg) {
|
||||||
|
switch (msg.what) {
|
||||||
|
case MSG_RELOAD_APPCONFIG:
|
||||||
|
if (_mMainActivity != null && _mMainActivity.mViewHolder != null) {
|
||||||
|
_mMainActivity.setViewData();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MSG_CURRENTVALUEBATTERY:
|
||||||
|
if (_mMainActivity != null && _mMainActivity.mViewHolder != null) {
|
||||||
|
_mMainActivity.setCurrentValueBattery(msg.arg1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case MSG_LOAD_BACKGROUND:
|
||||||
|
if (_mMainActivity != null) {
|
||||||
|
_mMainActivity.reloadBackground();
|
||||||
|
_mMainActivity.setBackgroundColor();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
super.handleMessage(msg);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 内部监听类(保持原有)
|
||||||
|
class ChargeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
|
||||||
|
@Override
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||||
|
if (mViewHolder == null || mChargeReminderValueBatteryDrawable == null || mViewHolder.tvChargeReminderValue == null) return;
|
||||||
|
mViewHolder.tvChargeReminderValue.setText(String.valueOf(progress) + "%");
|
||||||
|
mChargeReminderValueBatteryDrawable.setValue(progress);
|
||||||
|
mChargeReminderValueBatteryDrawable.invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
if (mAppConfigUtils == null || mViewHolder == null || mViewHolder.tvChargeReminderValue == null) return;
|
||||||
|
int nChargeReminderValue = ((VerticalSeekBar) seekBar)._mnProgress;
|
||||||
|
mAppConfigUtils.setChargeReminderValue(nChargeReminderValue);
|
||||||
|
mViewHolder.tvChargeReminderValue.setText(String.valueOf(nChargeReminderValue) + "%");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class UsegeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
|
||||||
|
@Override
|
||||||
|
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
||||||
|
if (mViewHolder == null || mUsegeReminderValueBatteryDrawable == null || mViewHolder.tvUsegeReminderValue == null) return;
|
||||||
|
mViewHolder.tvUsegeReminderValue.setText(String.valueOf(progress) + "%");
|
||||||
|
mUsegeReminderValueBatteryDrawable.setValue(progress);
|
||||||
|
mUsegeReminderValueBatteryDrawable.invalidateSelf();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStartTrackingTouch(SeekBar seekBar) {}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onStopTrackingTouch(SeekBar seekBar) {
|
||||||
|
if (mAppConfigUtils == null || mViewHolder == null || mViewHolder.tvUsegeReminderValue == null) return;
|
||||||
|
int nUsegeReminderValue = ((VerticalSeekBar) seekBar)._mnProgress;
|
||||||
|
mAppConfigUtils.setUsegeReminderValue(nUsegeReminderValue);
|
||||||
|
mViewHolder.tvUsegeReminderValue.setText(String.valueOf(nUsegeReminderValue) + "%");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 静态工具方法(保持原有)
|
||||||
|
public static void relaodAppConfigs() {
|
||||||
|
if (_mHandler != null) {
|
||||||
|
_mHandler.sendMessage(_mHandler.obtainMessage(MSG_RELOAD_APPCONFIG));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void sendMsgCurrentValueBattery(int value) {
|
||||||
|
if (_mHandler != null) {
|
||||||
|
Message msg = _mHandler.obtainMessage(MSG_CURRENTVALUEBATTERY);
|
||||||
|
msg.arg1 = value;
|
||||||
|
_mHandler.sendMessage(msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private String getRealPathFromURI(Uri contentUri) {
|
private String getRealPathFromURI(Uri contentUri) {
|
||||||
String[] proj = {MediaStore.MediaColumns.DATA};
|
String[] proj = {MediaStore.MediaColumns.DATA};
|
||||||
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
|
Cursor cursor = getContentResolver().query(contentUri, proj, null, null, null);
|
||||||
@@ -303,17 +612,12 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
String path = cursor.getString(nColumnIndex);
|
String path = cursor.getString(nColumnIndex);
|
||||||
cursor.close();
|
cursor.close();
|
||||||
return path;
|
return path;
|
||||||
} else {
|
|
||||||
LogUtils.d(TAG, "getRealPathFromURI nColumnIndex is -1.");
|
|
||||||
}
|
}
|
||||||
cursor.close();
|
cursor.close();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 生成默认APP信息(用于关于页面)
|
|
||||||
*/
|
|
||||||
APPInfo genDefaultAPPInfo() {
|
APPInfo genDefaultAPPInfo() {
|
||||||
String szBranchName = "powerbell";
|
String szBranchName = "powerbell";
|
||||||
APPInfo appInfo = new APPInfo();
|
APPInfo appInfo = new APPInfo();
|
||||||
@@ -329,314 +633,5 @@ public class MainActivity extends WinBoLLActivity {
|
|||||||
appInfo.setAppAPKFolderName("PowerBell");
|
appInfo.setAppAPKFolderName("PowerBell");
|
||||||
return appInfo;
|
return appInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ======================== 内部初始化辅助方法(私有,统一放在最后)========================
|
|
||||||
/**
|
|
||||||
* 初始化视图控件(findViewById)
|
|
||||||
*/
|
|
||||||
private void initView() {
|
|
||||||
mAppConfigUtils = App.getAppConfigUtils(getActivity());
|
|
||||||
mBgSourceUtils = BackgroundSourceUtils.getInstance(getActivity());
|
|
||||||
|
|
||||||
mADsBannerView = findViewById(R.id.adsbanner);
|
|
||||||
mToolbar = findViewById(R.id.toolbar);
|
|
||||||
|
|
||||||
// 获取指定ID的View实例
|
|
||||||
mBackgroundView = findViewById(R.id.fragmentmainviewBackgroundView1);
|
|
||||||
|
|
||||||
loadBackground();
|
|
||||||
/*final View mainImageView = mView.findViewById(R.id.fragmentmainviewImageView1);
|
|
||||||
|
|
||||||
// 注册OnGlobalLayoutListener
|
|
||||||
mainImageView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
|
|
||||||
@Override
|
|
||||||
public void onGlobalLayout() {
|
|
||||||
// 获取宽度和高度
|
|
||||||
int width = mainImageView.getMeasuredWidth();
|
|
||||||
int height = mainImageView.getMeasuredHeight();
|
|
||||||
|
|
||||||
BackgroundPictureUtils utils = BackgroundPictureUtils.getInstance(getActivity());
|
|
||||||
BackgroundPictureBean bean = utils.loadBackgroundPictureBean();
|
|
||||||
bean.setBackgroundWidth(width);
|
|
||||||
bean.setBackgroundHeight(height);
|
|
||||||
utils.saveData();
|
|
||||||
// 移除监听器以避免内存泄漏
|
|
||||||
mainImageView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
|
|
||||||
}
|
|
||||||
});*/
|
|
||||||
|
|
||||||
mDrawableFrame = getActivity().getDrawable(R.drawable.bg_frame);
|
|
||||||
mllLeftSeekBar = (LinearLayout) findViewById(R.id.fragmentmainviewLinearLayout1);
|
|
||||||
mllRightSeekBar = (LinearLayout) findViewById(R.id.fragmentmainviewLinearLayout2);
|
|
||||||
|
|
||||||
// 初始化充电电量提醒设置控件
|
|
||||||
mtvChargeReminderValue = (TextView) findViewById(R.id.fragmentandroidviewTextView2);
|
|
||||||
mChargeReminderSeekBar = (VerticalSeekBar) findViewById(R.id.fragmentandroidviewVerticalSeekBar1);
|
|
||||||
mcbIsEnableChargeReminder = findViewById(R.id.fragmentmainviewCheckBox1);
|
|
||||||
|
|
||||||
// 初始化耗电电量提醒设置控件
|
|
||||||
mtvUsegeReminderValue = (TextView) findViewById(R.id.fragmentandroidviewTextView3);
|
|
||||||
mUsegeReminderSeekBar = (VerticalSeekBar) findViewById(R.id.fragmentandroidviewVerticalSeekBar2);
|
|
||||||
mcbIsEnableUsegeReminder = findViewById(R.id.fragmentmainviewCheckBox2);
|
|
||||||
|
|
||||||
// 初始化现在电量显示控件
|
|
||||||
mtvCurrentValue = (TextView) findViewById(R.id.fragmentandroidviewTextView4);
|
|
||||||
|
|
||||||
// 初始化服务总开关
|
|
||||||
mswIsEnableService = (Switch) findViewById(R.id.fragmentandroidviewSwitch1);
|
|
||||||
mtvTips = findViewById(R.id.fragmentandroidviewTextView1);
|
|
||||||
|
|
||||||
// 设置视图显示数据
|
|
||||||
setViewData();
|
|
||||||
// 设置视图控件响应
|
|
||||||
setViewListener();
|
|
||||||
|
|
||||||
// 注册一个广播接收
|
|
||||||
//mMainActivityReceiver = new MainActivityReceiver(this);
|
|
||||||
//mMainActivityReceiver.registerAction();
|
|
||||||
|
|
||||||
// 启动的时候检查一下服务
|
|
||||||
if (mAppConfigUtils.getIsEnableService()
|
|
||||||
&& ServiceUtils.isServiceAlive(getActivity(), ControlCenterService.class.getName()) == false) {
|
|
||||||
// 如果配置了服务启动,服务没有启动
|
|
||||||
// 就启动服务
|
|
||||||
Intent intent = new Intent(getActivity(), ControlCenterService.class);
|
|
||||||
getActivity().startForegroundService(intent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadBackground() {
|
|
||||||
BackgroundBean bean = mBgSourceUtils.getCurrentBackgroundBean();
|
|
||||||
mBackgroundView.loadBackgroundBean(bean);
|
|
||||||
}
|
|
||||||
|
|
||||||
void setViewData() {
|
|
||||||
int nChargeReminderValue = mAppConfigUtils.getChargeReminderValue();
|
|
||||||
int nUsegeReminderValue = mAppConfigUtils.getUsegeReminderValue();
|
|
||||||
int nCurrentValue = mAppConfigUtils.getCurrentValue();
|
|
||||||
|
|
||||||
mllLeftSeekBar.setBackground(mDrawableFrame);
|
|
||||||
mllRightSeekBar.setBackground(mDrawableFrame);
|
|
||||||
|
|
||||||
// 初始化电量图
|
|
||||||
mCurrentValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCurrent));
|
|
||||||
mCurrentValueBatteryDrawable.setValue(mAppConfigUtils.getCurrentValue());
|
|
||||||
mCurrentValueBatteryImageView = findViewById(R.id.fragmentandroidviewImageView1);
|
|
||||||
mCurrentValueBatteryImageView.setImageDrawable(mCurrentValueBatteryDrawable);
|
|
||||||
|
|
||||||
// 初始化充电电量提醒图
|
|
||||||
mChargeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorCharge));
|
|
||||||
mChargeReminderValueBatteryDrawable.setValue(nChargeReminderValue);
|
|
||||||
mChargeReminderValueBatteryImageView = findViewById(R.id.fragmentandroidviewImageView3);
|
|
||||||
mChargeReminderValueBatteryImageView.setImageDrawable(mChargeReminderValueBatteryDrawable);
|
|
||||||
|
|
||||||
// 初始化耗电电量提醒图
|
|
||||||
mUsegeReminderValueBatteryDrawable = new BatteryDrawable(getActivity().getColor(R.color.colorUsege));
|
|
||||||
mUsegeReminderValueBatteryDrawable.setValue(nUsegeReminderValue);
|
|
||||||
mUsegeReminderValueBatteryImageView = findViewById(R.id.fragmentandroidviewImageView2);
|
|
||||||
mUsegeReminderValueBatteryImageView.setImageDrawable(mUsegeReminderValueBatteryDrawable);
|
|
||||||
|
|
||||||
// 初始化充电电量提醒设置控件
|
|
||||||
mtvChargeReminderValue.setTextColor(getActivity().getColor(R.color.colorCharge));
|
|
||||||
//LogUtils.d(TAG, "Color.YELLOW is " + Integer.toString(mApplication.getColor(R.color.colorCharge)));
|
|
||||||
mtvChargeReminderValue.setText(Integer.toString(nChargeReminderValue) + "%");
|
|
||||||
mChargeReminderSeekBar.setProgress(nChargeReminderValue);
|
|
||||||
mcbIsEnableChargeReminder.setChecked(mAppConfigUtils.getIsEnableChargeReminder());
|
|
||||||
|
|
||||||
// 初始化耗电电量提醒设置控件
|
|
||||||
mtvUsegeReminderValue.setTextColor(getActivity().getColor(R.color.colorUsege));
|
|
||||||
mtvUsegeReminderValue.setText(Integer.toString(nUsegeReminderValue) + "%");
|
|
||||||
mUsegeReminderSeekBar.setProgress(nUsegeReminderValue);
|
|
||||||
mcbIsEnableUsegeReminder.setChecked(mAppConfigUtils.getIsEnableUsegeReminder());
|
|
||||||
|
|
||||||
// 初始化现在电量显示控件
|
|
||||||
mtvCurrentValue.setTextColor(getActivity().getColor(R.color.colorCurrent));
|
|
||||||
mtvCurrentValue.setText(Integer.toString(nCurrentValue) + "%");
|
|
||||||
|
|
||||||
// 初始化服务总开关
|
|
||||||
mswIsEnableService.setChecked(mAppConfigUtils.getIsEnableService());
|
|
||||||
if (mAppConfigUtils.getIsEnableService()) {
|
|
||||||
//LogUtils.d(TAG, "mApplication.getIsEnableService() " + Boolean.toString(mAppConfigUtils.getIsEnableService()));
|
|
||||||
ControlCenterService.startControlCenterService(getActivity());
|
|
||||||
} else {
|
|
||||||
//LogUtils.d(TAG, "mApplication.getIsEnableService() " + Boolean.toString(mAppConfigUtils.getIsEnableService()));
|
|
||||||
ControlCenterService.stopControlCenterService(getActivity());
|
|
||||||
}
|
|
||||||
mswIsEnableService.setText(getString(R.string.txt_aboveswitch));
|
|
||||||
mtvTips.setText(getString(R.string.txt_aboveswitchtips));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void setViewListener() {
|
|
||||||
// 初始化充电电量提醒设置控件
|
|
||||||
mChargeReminderSeekBarChangeListener = new ChargeReminderSeekBarChangeListener();
|
|
||||||
mChargeReminderSeekBar.setOnSeekBarChangeListener(mChargeReminderSeekBarChangeListener);
|
|
||||||
mcbIsEnableChargeReminder.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
LogUtils.d(TAG, "setIsEnableChargeReminder");
|
|
||||||
mAppConfigUtils.setIsEnableChargeReminder(mcbIsEnableChargeReminder.isChecked());
|
|
||||||
//ControlCenterService.updateIsEnableChargeReminder(mcbIsEnableChargeReminder.isChecked());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// 初始化耗电电量提醒设置控件
|
|
||||||
mUsegeReminderSeekBarChangeListener = new UsegeReminderSeekBarChangeListener();
|
|
||||||
mUsegeReminderSeekBar.setOnSeekBarChangeListener(mUsegeReminderSeekBarChangeListener);
|
|
||||||
mcbIsEnableUsegeReminder.setOnClickListener(new View.OnClickListener() {
|
|
||||||
@Override
|
|
||||||
public void onClick(View v) {
|
|
||||||
LogUtils.d(TAG, "setIsEnableUsegeReminder");
|
|
||||||
mAppConfigUtils.setIsEnableUsegeReminder(mcbIsEnableUsegeReminder.isChecked());
|
|
||||||
//ControlCenterService.updateIsEnableUsegeReminder(mcbIsEnableUsegeReminder.isChecked());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// 初始化服务总开关
|
|
||||||
mswIsEnableService.setOnClickListener(new CompoundButton.OnClickListener() {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onClick(View view) {
|
|
||||||
mAppConfigUtils.setIsEnableService(getActivity(), mswIsEnableService.isChecked());
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCurrentValueBattery(int value) {
|
|
||||||
//LogUtils.d(TAG, "setCurrentValueBattery");
|
|
||||||
mtvCurrentValue.setText(Integer.toString(value) + "%");
|
|
||||||
mCurrentValueBatteryDrawable.setValue(value);
|
|
||||||
mCurrentValueBatteryDrawable.invalidateSelf();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void reloadBackground() {
|
|
||||||
BackgroundSourceUtils utils = BackgroundSourceUtils.getInstance(getActivity());
|
|
||||||
utils.loadSettings();
|
|
||||||
BackgroundBean bean = utils.getCurrentBackgroundBean();
|
|
||||||
mBackgroundView.loadBackgroundBean(bean);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Handler _mHandler = new Handler(){
|
|
||||||
@Override
|
|
||||||
public void handleMessage(Message msg) {
|
|
||||||
switch (msg.what) {
|
|
||||||
case MSG_RELOAD_APPCONFIG : {
|
|
||||||
if (_mMainActivity != null) {
|
|
||||||
_mMainActivity.setViewData();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case MSG_CURRENTVALUEBATTERY : {
|
|
||||||
if (_mMainActivity != null) {
|
|
||||||
_mMainActivity.setCurrentValueBattery(msg.arg1);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
super.handleMessage(msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
public static void relaodAppConfigs() {
|
|
||||||
if (_mHandler != null) {
|
|
||||||
_mHandler.sendMessage(_mHandler.obtainMessage(MSG_RELOAD_APPCONFIG));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void sendMsgCurrentValueBattery(int value) {
|
|
||||||
if (_mHandler != null) {
|
|
||||||
Message msg = _mHandler.obtainMessage(MSG_CURRENTVALUEBATTERY);
|
|
||||||
msg.arg1 = value;
|
|
||||||
_mHandler.sendMessage(msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化实例(Application、工具类等)
|
|
||||||
*/
|
|
||||||
private void initInstance() {
|
|
||||||
_mMainActivity = this;
|
|
||||||
mApplication = (App) getApplication();
|
|
||||||
// 初始化工具栏
|
|
||||||
setSupportActionBar(mToolbar);
|
|
||||||
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 初始化主Fragment(添加并显示)
|
|
||||||
*/
|
|
||||||
// private void initFragment() {
|
|
||||||
// if (mMainViewFragment == null) {
|
|
||||||
// FragmentTransaction tx = getFragmentManager().beginTransaction();
|
|
||||||
// mMainViewFragment = new MainViewFragment();
|
|
||||||
// tx.add(R.id.activitymainFrameLayout1, mMainViewFragment, MainViewFragment.TAG);
|
|
||||||
// tx.commit();
|
|
||||||
// }
|
|
||||||
// showFragment(mMainViewFragment);
|
|
||||||
// }
|
|
||||||
|
|
||||||
class ChargeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
//LogUtils.d(TAG, "call onProgressChanged");
|
|
||||||
int nChargeReminderValue = progress;
|
|
||||||
mtvChargeReminderValue.setText(Integer.toString(nChargeReminderValue) + "%");
|
|
||||||
mChargeReminderValueBatteryDrawable.setValue(nChargeReminderValue);
|
|
||||||
mChargeReminderValueBatteryDrawable.invalidateSelf();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
||||||
//LogUtils.d(TAG, "call onStartTrackingTouch");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
//LogUtils.d(TAG, "call onStopTrackingTouch");
|
|
||||||
//取得当前进度条的刻度
|
|
||||||
int nChargeReminderValue = ((VerticalSeekBar)seekBar)._mnProgress;
|
|
||||||
|
|
||||||
mAppConfigUtils.setChargeReminderValue(nChargeReminderValue);
|
|
||||||
mtvChargeReminderValue.setText(Integer.toString(nChargeReminderValue) + "%");
|
|
||||||
//ControlCenterService.updateChargeReminderValue(nChargeReminderValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class UsegeReminderSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener {
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
|
|
||||||
//LogUtils.d(TAG, "call onProgressChanged");
|
|
||||||
int nUsegeReminderValue = progress;
|
|
||||||
mtvUsegeReminderValue.setText(Integer.toString(nUsegeReminderValue) + "%");
|
|
||||||
mUsegeReminderValueBatteryDrawable.setValue(nUsegeReminderValue);
|
|
||||||
mUsegeReminderValueBatteryDrawable.invalidateSelf();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStartTrackingTouch(SeekBar seekBar) {
|
|
||||||
//LogUtils.d(TAG, "call onStartTrackingTouch");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onStopTrackingTouch(SeekBar seekBar) {
|
|
||||||
//LogUtils.d(TAG, "call onStopTrackingTouch");
|
|
||||||
//取得当前进度条的刻度
|
|
||||||
int nUsegeReminderValue = ((VerticalSeekBar)seekBar)._mnProgress;
|
|
||||||
LogUtils.d(TAG, "nUsegeReminderValue is " + Integer.toString(nUsegeReminderValue));
|
|
||||||
//LogUtils.d(TAG, "mPowerReminder is " + mApplication);
|
|
||||||
mAppConfigUtils.setUsegeReminderValue(nUsegeReminderValue);
|
|
||||||
//LogUtils.d(TAG, "opopopopopopopop");
|
|
||||||
mtvUsegeReminderValue.setText(Integer.toString(nUsegeReminderValue) + "%");
|
|
||||||
//ControlCenterService.updateUsegeReminderValue(nUsegeReminderValue);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import android.content.Intent;
|
|||||||
import android.graphics.Bitmap;
|
import android.graphics.Bitmap;
|
||||||
import android.graphics.Bitmap.CompressFormat;
|
import android.graphics.Bitmap.CompressFormat;
|
||||||
import android.graphics.BitmapFactory;
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.graphics.drawable.Drawable;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.Build;
|
import android.os.Build;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
@@ -14,6 +15,7 @@ import android.os.Handler;
|
|||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.provider.MediaStore;
|
import android.provider.MediaStore;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
import android.widget.ImageView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.appcompat.app.AlertDialog;
|
import androidx.appcompat.app.AlertDialog;
|
||||||
import androidx.core.content.FileProvider;
|
import androidx.core.content.FileProvider;
|
||||||
@@ -52,7 +54,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
private BackgroundView mBackgroundView;
|
private BackgroundView mBackgroundView;
|
||||||
private File mfTakePhoto;
|
private File mfTakePhoto;
|
||||||
volatile boolean isCommitSettings = false;
|
volatile boolean isCommitSettings = false;
|
||||||
volatile boolean isPreviewBackgroundChanged = false;
|
volatile boolean isPreviewBackgroundChanged = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Activity getActivity() {
|
public Activity getActivity() {
|
||||||
@@ -71,49 +73,49 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
|
|
||||||
mBackgroundView = (BackgroundView) findViewById(R.id.background_view);
|
mBackgroundView = (BackgroundView) findViewById(R.id.background_view);
|
||||||
mBgSourceUtils = BackgroundSourceUtils.getInstance(this);
|
mBgSourceUtils = BackgroundSourceUtils.getInstance(this);
|
||||||
mBgSourceUtils.loadSettings();
|
mBgSourceUtils.loadSettings();
|
||||||
mPermissionUtils = PermissionUtils.getInstance();
|
mPermissionUtils = PermissionUtils.getInstance();
|
||||||
|
|
||||||
// File tempDir = new File(App.getTempDirPath());
|
File tempDir = new File(App.getTempDirPath());
|
||||||
// if (!tempDir.exists()) {
|
if (!tempDir.exists()) {
|
||||||
// tempDir.mkdirs();
|
tempDir.mkdirs();
|
||||||
// }
|
}
|
||||||
// mfTakePhoto = new File(tempDir, "TakePhoto.jpg");
|
mfTakePhoto = new File(tempDir, "TakePhoto.jpg");
|
||||||
//
|
|
||||||
// File selectTempDir = new File(mBgSourceUtils.getBackgroundSourceDirPath(), "SelectTemp");
|
File selectTempDir = new File(mBgSourceUtils.getBackgroundSourceDirPath(), "SelectTemp");
|
||||||
// if (!selectTempDir.exists()) {
|
if (!selectTempDir.exists()) {
|
||||||
// selectTempDir.mkdirs();
|
selectTempDir.mkdirs();
|
||||||
// LogUtils.d(TAG, "【选图初始化】选图临时目录创建完成:" + selectTempDir.getAbsolutePath());
|
LogUtils.d(TAG, "【选图初始化】选图临时目录创建完成:" + selectTempDir.getAbsolutePath());
|
||||||
// }
|
}
|
||||||
|
|
||||||
initToolbar();
|
initToolbar();
|
||||||
initClickListeners();
|
initClickListeners();
|
||||||
|
|
||||||
if (handleShareIntent()) {
|
if (handleShareIntent()) {
|
||||||
ToastUtils.show("handleShareIntent");
|
ToastUtils.show("handleShareIntent");
|
||||||
} else {
|
} else {
|
||||||
mBgSourceUtils.setCurrentSourceToPreview();
|
mBgSourceUtils.setCurrentSourceToPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
Uri uriSelectedImage = UriUtil.getUriForFile(this, new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundFilePath()));
|
Uri uriSelectedImage = UriUtil.getUriForFile(this, new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundFilePath()));
|
||||||
// 创建预览数据剪裁环境
|
// 创建预览数据剪裁环境
|
||||||
mBgSourceUtils.createAndUpdatePreviewEnvironmentForCropping(mBgSourceUtils.getPreviewBackgroundBean());
|
mBgSourceUtils.createAndUpdatePreviewEnvironmentForCropping(mBgSourceUtils.getPreviewBackgroundBean());
|
||||||
doubleRefreshPreview();
|
doubleRefreshPreview();
|
||||||
LogUtils.d(TAG, "【初始化】BackgroundSettingsActivity 初始化完成");
|
LogUtils.d(TAG, "【初始化】BackgroundSettingsActivity 初始化完成");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onPostCreate(Bundle savedInstanceState) {
|
protected void onPostCreate(Bundle savedInstanceState) {
|
||||||
super.onPostCreate(savedInstanceState);
|
super.onPostCreate(savedInstanceState);
|
||||||
doubleRefreshPreview();
|
doubleRefreshPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initToolbar() {
|
private void initToolbar() {
|
||||||
mToolbar = findViewById(R.id.toolbar);
|
mToolbar = findViewById(R.id.toolbar);
|
||||||
setSupportActionBar(mToolbar);
|
setSupportActionBar(mToolbar);
|
||||||
mToolbar.setSubtitle(getTag());
|
mToolbar.setSubtitle(getTag());
|
||||||
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
|
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
|
||||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@@ -143,10 +145,10 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
BackgroundPicturePreviewDialog dlg = new BackgroundPicturePreviewDialog(this);
|
BackgroundPicturePreviewDialog dlg = new BackgroundPicturePreviewDialog(this);
|
||||||
dlg.show();
|
dlg.show();
|
||||||
LogUtils.d(TAG, "【分享处理】收到分享图片意图");
|
LogUtils.d(TAG, "【分享处理】收到分享图片意图");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isImageType(String lowerMimeType) {
|
boolean isImageType(String lowerMimeType) {
|
||||||
@@ -255,8 +257,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
mBackgroundView.getWidth(),
|
mBackgroundView.getWidth(),
|
||||||
mBackgroundView.getHeight(),
|
mBackgroundView.getHeight(),
|
||||||
false,
|
false,
|
||||||
REQUEST_CROP_IMAGE
|
REQUEST_CROP_IMAGE);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -270,8 +271,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
true,
|
true,
|
||||||
REQUEST_CROP_IMAGE
|
REQUEST_CROP_IMAGE);
|
||||||
);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -429,8 +429,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
mBackgroundView.getWidth(),
|
mBackgroundView.getWidth(),
|
||||||
mBackgroundView.getHeight(),
|
mBackgroundView.getHeight(),
|
||||||
false,
|
false,
|
||||||
REQUEST_CROP_IMAGE
|
REQUEST_CROP_IMAGE);
|
||||||
);
|
|
||||||
LogUtils.d(TAG, "【拍照完成】已启动裁剪");
|
LogUtils.d(TAG, "【拍照完成】已启动裁剪");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -470,50 +469,52 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void handleSelectPictureResult(int resultCode, Intent data) {
|
private void handleSelectPictureResult(int resultCode, Intent data) {
|
||||||
if (resultCode != RESULT_OK || data == null) {
|
if (resultCode != RESULT_OK || data == null) {
|
||||||
handleOperationCancelOrFail();
|
handleOperationCancelOrFail();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Uri selectedImage = data.getData();
|
Uri selectedImage = data.getData();
|
||||||
if (selectedImage == null) {
|
if (selectedImage == null) {
|
||||||
ToastUtils.show("图片Uri为空");
|
ToastUtils.show("图片Uri为空");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
LogUtils.d(TAG, "【选图回调】Uri : " + selectedImage.toString());
|
LogUtils.d(TAG, "【选图回调】Uri : " + selectedImage.toString());
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
getContentResolver().takePersistableUriPermission(
|
getContentResolver().takePersistableUriPermission(
|
||||||
selectedImage,
|
selectedImage,
|
||||||
Intent.FLAG_GRANT_READ_URI_PERMISSION
|
Intent.FLAG_GRANT_READ_URI_PERMISSION
|
||||||
);
|
);
|
||||||
LogUtils.d(TAG, "【选图权限】已添加持久化权限");
|
LogUtils.d(TAG, "【选图权限】已添加持久化权限");
|
||||||
}
|
}
|
||||||
|
|
||||||
LogUtils.d(TAG, "【选图同步】路径绑定完成");
|
LogUtils.d(TAG, "【选图同步】路径绑定完成");
|
||||||
// 选图后启动固定比例裁剪(调用工具类)
|
// 选图后启动固定比例裁剪(调用工具类)
|
||||||
putUriFileToPreviewSource(selectedImage);
|
putUriFileToPreviewSource(selectedImage);
|
||||||
ImageCropUtils.startImageCrop(BackgroundSettingsActivity.this,
|
ImageCropUtils.startImageCrop(BackgroundSettingsActivity.this,
|
||||||
mBgSourceUtils.getPreviewBackgroundBean(),
|
mBgSourceUtils.getPreviewBackgroundBean(),
|
||||||
mBackgroundView.getWidth(),
|
mBackgroundView.getWidth(),
|
||||||
mBackgroundView.getHeight(),
|
mBackgroundView.getHeight(),
|
||||||
false,
|
false,
|
||||||
REQUEST_CROP_IMAGE
|
REQUEST_CROP_IMAGE);
|
||||||
);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
boolean putUriFileToPreviewSource(Uri srcUriFile) {
|
boolean putUriFileToPreviewSource(Uri srcUriFile) {
|
||||||
File srcFile = new File(UriUtil.getFilePathFromUri(this, srcUriFile));
|
File srcFile = new File(UriUtil.getFilePathFromUri(this, srcUriFile));
|
||||||
return putUriFileToPreviewSource(srcFile);
|
return putUriFileToPreviewSource(srcFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean putUriFileToPreviewSource(File srcFile) {
|
boolean putUriFileToPreviewSource(File srcFile) {
|
||||||
mBgSourceUtils.loadSettings();
|
mBgSourceUtils.loadSettings();
|
||||||
File dstFile = new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundFilePath());
|
File dstFile = new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundFilePath());
|
||||||
return FileUtils.copyFile(srcFile, dstFile);
|
return FileUtils.copyFile(srcFile, dstFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 核心修改:裁剪成功后调用双重刷新,确保最新图片加载
|
||||||
|
*/
|
||||||
private void handleCropImageResult(int requestCode, int resultCode, Intent data) {
|
private void handleCropImageResult(int requestCode, int resultCode, Intent data) {
|
||||||
LogUtils.d(TAG, "handleCropImageResult: 处理裁剪结果");
|
LogUtils.d(TAG, "handleCropImageResult: 处理裁剪结果");
|
||||||
File cropTempFile = new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundScaledCompressFilePath());
|
File cropTempFile = new File(mBgSourceUtils.getPreviewBackgroundBean().getBackgroundScaledCompressFilePath());
|
||||||
@@ -523,9 +524,9 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
boolean isCropSuccess = (resultCode == RESULT_OK) && isFileExist && isFileReadable && fileSize > 100;
|
boolean isCropSuccess = (resultCode == RESULT_OK) && isFileExist && isFileReadable && fileSize > 100;
|
||||||
|
|
||||||
if (isCropSuccess) {
|
if (isCropSuccess) {
|
||||||
isPreviewBackgroundChanged = true;
|
isPreviewBackgroundChanged = true;
|
||||||
LogUtils.d(TAG, "handleCropImageResult: 裁剪成功");
|
LogUtils.d(TAG, "handleCropImageResult: 裁剪成功");
|
||||||
BackgroundBean previewBean = mBgSourceUtils.getPreviewBackgroundBean();
|
final BackgroundBean previewBean = mBgSourceUtils.getPreviewBackgroundBean();
|
||||||
previewBean.setIsUseBackgroundFile(true);
|
previewBean.setIsUseBackgroundFile(true);
|
||||||
previewBean.setIsUseBackgroundScaledCompressFile(true);
|
previewBean.setIsUseBackgroundScaledCompressFile(true);
|
||||||
mBgSourceUtils.saveSettings();
|
mBgSourceUtils.saveSettings();
|
||||||
@@ -546,15 +547,16 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 关键修改:延迟300ms调用双重刷新,确保文件写入完成
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (mBackgroundView != null && !isFinishing()) {
|
if (!isFinishing()) {
|
||||||
mBackgroundView.loadBackgroundBean(mBgSourceUtils.getPreviewBackgroundBean());
|
doubleRefreshPreview();
|
||||||
LogUtils.d(TAG, "handleCropImageResult: 裁剪图片加载完成");
|
LogUtils.d(TAG, "handleCropImageResult: 触发双重刷新");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 50);
|
}, 300);
|
||||||
} else {
|
} else {
|
||||||
handleOperationCancelOrFail();
|
handleOperationCancelOrFail();
|
||||||
}
|
}
|
||||||
@@ -697,10 +699,42 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
return cropBitmap;
|
return cropBitmap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 核心修改:添加缓存清理 + 控件 Bitmap 清空逻辑
|
||||||
|
*/
|
||||||
private void doubleRefreshPreview() {
|
private void doubleRefreshPreview() {
|
||||||
LogUtils.d(TAG, "【双重刷新】开始");
|
LogUtils.d(TAG, "【双重刷新】开始");
|
||||||
|
// 1. 清空缓存工具类的旧数据
|
||||||
|
if (mBgSourceUtils != null) {
|
||||||
|
BackgroundBean previewBean = mBgSourceUtils.getPreviewBackgroundBean();
|
||||||
|
if (previewBean != null && previewBean.isUseBackgroundFile()) {
|
||||||
|
String bgPath = previewBean.isUseBackgroundScaledCompressFile()
|
||||||
|
? previewBean.getBackgroundScaledCompressFilePath()
|
||||||
|
: previewBean.getBackgroundFilePath();
|
||||||
|
// 强制清除缓存
|
||||||
|
App._mBitmapCacheUtils.removeCachedBitmap(bgPath);
|
||||||
|
LogUtils.d(TAG, "【双重刷新】已清空工具类缓存:" + bgPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 清空 BackgroundView 自身的 Bitmap 引用
|
||||||
|
// if (mBackgroundView != null) {
|
||||||
|
// // 清空 ImageView 持有的 Bitmap
|
||||||
|
// if (mBackgroundView instanceof BackgroundView) {
|
||||||
|
// ((BackgroundView) mBackgroundView).setImageBitmap(null);
|
||||||
|
// }
|
||||||
|
// // 清空背景 Drawable 引用
|
||||||
|
// Drawable drawable = mBackgroundView.getBackground();
|
||||||
|
// if (drawable != null) {
|
||||||
|
// drawable.setCallback(null);
|
||||||
|
// mBackgroundView.setBackground(null);
|
||||||
|
// }
|
||||||
|
// LogUtils.d(TAG, "【双重刷新】已清空控件 Bitmap 引用");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// 3. 重新加载最新数据
|
||||||
if (mBackgroundView != null && !isFinishing()) {
|
if (mBackgroundView != null && !isFinishing()) {
|
||||||
mBgSourceUtils.loadSettings();
|
mBgSourceUtils.loadSettings();
|
||||||
mBackgroundView.loadBackgroundBean(mBgSourceUtils.getPreviewBackgroundBean());
|
mBackgroundView.loadBackgroundBean(mBgSourceUtils.getPreviewBackgroundBean());
|
||||||
LogUtils.d(TAG, "【双重刷新】第一重完成");
|
LogUtils.d(TAG, "【双重刷新】第一重完成");
|
||||||
} else {
|
} else {
|
||||||
@@ -708,6 +742,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 4. 延长延迟到200ms,确保文件完全加载
|
||||||
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
@@ -717,7 +752,7 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
LogUtils.d(TAG, "【双重刷新】第二重完成");
|
LogUtils.d(TAG, "【双重刷新】第二重完成");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, 50);
|
}, 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -725,37 +760,16 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
mBgSourceUtils.setCurrentSourceToPreview();
|
mBgSourceUtils.setCurrentSourceToPreview();
|
||||||
LogUtils.d(TAG, "【操作回调】取消或失败");
|
LogUtils.d(TAG, "【操作回调】取消或失败");
|
||||||
ToastUtils.show("【操作回调】取消或失败");
|
ToastUtils.show("【操作回调】取消或失败");
|
||||||
doubleRefreshPreview();
|
doubleRefreshPreview();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 启动系统裁剪工具
|
|
||||||
* @param activity 上下文
|
|
||||||
* @param srcFile 裁剪原图
|
|
||||||
* @param aspectX 裁剪宽比例(自由裁剪传0)
|
|
||||||
* @param aspectY 裁剪高比例(自由裁剪传0)
|
|
||||||
* @param isFreeCrop 是否自由裁剪
|
|
||||||
* @param requestCode 裁剪请求码
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* 启动系统裁剪工具
|
|
||||||
* @param activity 上下文
|
|
||||||
* @param srcFile 裁剪原图
|
|
||||||
* @param aspectX 裁剪宽比例(自由裁剪传0)
|
|
||||||
* @param aspectY 裁剪高比例(自由裁剪传0)
|
|
||||||
* @param isFreeCrop 是否自由裁剪
|
|
||||||
* @param requestCode 裁剪请求码
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取FileProvider Uri(复用方法,避免重复代码)
|
* 获取FileProvider Uri(复用方法,避免重复代码)
|
||||||
*/
|
*/
|
||||||
public Uri getFileProviderUri(File file) {
|
public Uri getFileProviderUri(File file) {
|
||||||
try {
|
try {
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
|
||||||
String FILE_PROVIDER_AUTHORITY = getPackageName() + ".fileprovider";
|
String FILE_PROVIDER_AUTHORITY = getPackageName() + ".fileprovider";
|
||||||
|
|
||||||
return FileProvider.getUriForFile(this, FILE_PROVIDER_AUTHORITY, file);
|
return FileProvider.getUriForFile(this, FILE_PROVIDER_AUTHORITY, file);
|
||||||
} else {
|
} else {
|
||||||
@@ -779,9 +793,9 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
if (isCommitSettings) {
|
if (isCommitSettings) {
|
||||||
super.finish();
|
super.finish();
|
||||||
} else {
|
} else {
|
||||||
// 如果预览背景改变过就提示是否更换背景
|
// 如果预览背景改变过就提示是否更换背景
|
||||||
if (isPreviewBackgroundChanged) {
|
if (isPreviewBackgroundChanged) {
|
||||||
YesNoAlertDialog.show(this, "背景更换问题", "是否确定背景图片设置?", new YesNoAlertDialog.OnDialogResultListener(){
|
YesNoAlertDialog.show(this, "背景更换问题", "是否确定背景图片设置?", new YesNoAlertDialog.OnDialogResultListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onYes() {
|
public void onYes() {
|
||||||
mBgSourceUtils.commitPreviewSourceToCurrent();
|
mBgSourceUtils.commitPreviewSourceToCurrent();
|
||||||
@@ -795,11 +809,11 @@ public class BackgroundSettingsActivity extends WinBoLLActivity implements Backg
|
|||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 如果预览背景未改变就直接退出
|
// 如果预览背景未改变就直接退出
|
||||||
isCommitSettings = true;
|
isCommitSettings = true;
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,13 +4,14 @@ import android.util.JsonReader;
|
|||||||
import android.util.JsonWriter;
|
import android.util.JsonWriter;
|
||||||
import cc.winboll.studio.libappbase.BaseBean;
|
import cc.winboll.studio.libappbase.BaseBean;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.Serializable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Author ZhanGSKen<zhangsken@qq.com>
|
* @Author ZhanGSKen<zhangsken@qq.com>
|
||||||
* @Date 2024/07/18 11:52:28
|
* @Date 2024/07/18 11:52:28
|
||||||
* @Describe 应用背景图片数据类(存储正式/预览背景配置,支持JSON序列化/反序列化)
|
* @Describe 应用背景图片数据类(存储正式/预览背景配置,支持JSON序列化/反序列化)
|
||||||
*/
|
*/
|
||||||
public class BackgroundBean extends BaseBean {
|
public class BackgroundBean extends BaseBean implements Serializable {
|
||||||
|
|
||||||
public static final String TAG = "BackgroundPictureBean";
|
public static final String TAG = "BackgroundPictureBean";
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,165 @@
|
|||||||
|
package cc.winboll.studio.powerbell.utils;
|
||||||
|
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
||||||
|
* @Date 2025/12/11 01:57
|
||||||
|
* @Describe 单例 Bitmap 缓存工具类(Java 7 兼容)
|
||||||
|
* 功能:内存缓存 Bitmap,支持路径关联缓存、全局获取、缓存清空
|
||||||
|
* 特点:1. 单例模式 2. 压缩加载避免OOM 3. 路径- Bitmap 映射 4. 线程安全
|
||||||
|
*/
|
||||||
|
public class BitmapCacheUtils {
|
||||||
|
private static final String TAG = "BitmapCacheUtils";
|
||||||
|
// 最大图片尺寸(适配1080P屏幕,可根据需求调整)
|
||||||
|
private static final int MAX_WIDTH = 1080;
|
||||||
|
private static final int MAX_HEIGHT = 1920;
|
||||||
|
|
||||||
|
// 单例实例(volatile 保证多线程可见性)
|
||||||
|
private static volatile BitmapCacheUtils sInstance;
|
||||||
|
// 路径-Bitmap 缓存容器(内存缓存)
|
||||||
|
private final Map<String, Bitmap> mBitmapCacheMap;
|
||||||
|
|
||||||
|
// 私有构造器(单例模式)
|
||||||
|
private BitmapCacheUtils() {
|
||||||
|
mBitmapCacheMap = new HashMap<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取单例实例(双重校验锁,线程安全)
|
||||||
|
*/
|
||||||
|
public static BitmapCacheUtils getInstance() {
|
||||||
|
if (sInstance == null) {
|
||||||
|
synchronized (BitmapCacheUtils.class) {
|
||||||
|
if (sInstance == null) {
|
||||||
|
sInstance = new BitmapCacheUtils();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 核心接口:根据图片路径缓存 Bitmap 到内存
|
||||||
|
* @param imagePath 图片绝对路径
|
||||||
|
* @return 缓存成功的 Bitmap / null(路径无效/文件不存在)
|
||||||
|
*/
|
||||||
|
public Bitmap cacheBitmap(String imagePath) {
|
||||||
|
if (TextUtils.isEmpty(imagePath)) {
|
||||||
|
LogUtils.e(TAG, "cacheBitmap: 图片路径为空");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
File imageFile = new File(imagePath);
|
||||||
|
if (!imageFile.exists() || !imageFile.isFile()) {
|
||||||
|
LogUtils.e(TAG, "cacheBitmap: 图片文件不存在 - " + imagePath);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 已缓存则直接返回,避免重复加载
|
||||||
|
if (mBitmapCacheMap.containsKey(imagePath)) {
|
||||||
|
LogUtils.d(TAG, "cacheBitmap: 图片已缓存,直接返回 - " + imagePath);
|
||||||
|
return mBitmapCacheMap.get(imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 压缩加载 Bitmap(避免OOM)
|
||||||
|
Bitmap bitmap = decodeCompressedBitmap(imagePath);
|
||||||
|
if (bitmap != null) {
|
||||||
|
// 存入缓存容器
|
||||||
|
mBitmapCacheMap.put(imagePath, bitmap);
|
||||||
|
LogUtils.d(TAG, "cacheBitmap: 图片缓存成功 - " + imagePath);
|
||||||
|
} else {
|
||||||
|
LogUtils.e(TAG, "cacheBitmap: 图片解码失败 - " + imagePath);
|
||||||
|
}
|
||||||
|
return bitmap;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 核心接口:根据路径获取缓存的 Bitmap
|
||||||
|
* @param imagePath 图片绝对路径
|
||||||
|
* @return 缓存的 Bitmap / null
|
||||||
|
*/
|
||||||
|
public Bitmap getCachedBitmap(String imagePath) {
|
||||||
|
if (TextUtils.isEmpty(imagePath)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return mBitmapCacheMap.get(imagePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 清空所有 Bitmap 缓存(释放内存)
|
||||||
|
*/
|
||||||
|
public void clearAllCache() {
|
||||||
|
for (Bitmap bitmap : mBitmapCacheMap.values()) {
|
||||||
|
if (bitmap != null && !bitmap.isRecycled()) {
|
||||||
|
bitmap.recycle(); // 主动回收 Bitmap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mBitmapCacheMap.clear();
|
||||||
|
LogUtils.d(TAG, "clearAllCache: 所有 Bitmap 缓存已清空");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 移除指定路径的 Bitmap 缓存
|
||||||
|
* @param imagePath 图片绝对路径
|
||||||
|
*/
|
||||||
|
public void removeCachedBitmap(String imagePath) {
|
||||||
|
if (TextUtils.isEmpty(imagePath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Bitmap bitmap = mBitmapCacheMap.remove(imagePath);
|
||||||
|
if (bitmap != null && !bitmap.isRecycled()) {
|
||||||
|
bitmap.recycle();
|
||||||
|
LogUtils.d(TAG, "removeCachedBitmap: 移除并回收缓存 - " + imagePath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 压缩解码 Bitmap(按最大尺寸缩放,避免OOM)
|
||||||
|
*/
|
||||||
|
private Bitmap decodeCompressedBitmap(String imagePath) {
|
||||||
|
BitmapFactory.Options options = new BitmapFactory.Options();
|
||||||
|
// 第一步:只获取图片尺寸,不加载像素
|
||||||
|
options.inJustDecodeBounds = true;
|
||||||
|
BitmapFactory.decodeFile(imagePath, options);
|
||||||
|
|
||||||
|
// 计算缩放比例
|
||||||
|
int sampleSize = calculateInSampleSize(options, MAX_WIDTH, MAX_HEIGHT);
|
||||||
|
|
||||||
|
// 第二步:加载压缩后的 Bitmap
|
||||||
|
options.inJustDecodeBounds = false;
|
||||||
|
options.inSampleSize = sampleSize;
|
||||||
|
options.inPreferredConfig = Bitmap.Config.RGB_565; // 节省内存(比ARGB_8888少一半内存)
|
||||||
|
options.inPurgeable = true;
|
||||||
|
options.inInputShareable = true;
|
||||||
|
|
||||||
|
return BitmapFactory.decodeFile(imagePath, options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算 Bitmap 缩放比例
|
||||||
|
*/
|
||||||
|
private int calculateInSampleSize(BitmapFactory.Options options, int maxWidth, int maxHeight) {
|
||||||
|
int rawWidth = options.outWidth;
|
||||||
|
int rawHeight = options.outHeight;
|
||||||
|
int inSampleSize = 1;
|
||||||
|
|
||||||
|
if (rawWidth > maxWidth || rawHeight > maxHeight) {
|
||||||
|
int halfWidth = rawWidth / 2;
|
||||||
|
int halfHeight = rawHeight / 2;
|
||||||
|
while ((halfWidth / inSampleSize) >= maxWidth && (halfHeight / inSampleSize) >= maxHeight) {
|
||||||
|
inSampleSize *= 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return inSampleSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -12,6 +12,8 @@ import android.widget.ImageView.ScaleType;
|
|||||||
import android.widget.LinearLayout;
|
import android.widget.LinearLayout;
|
||||||
import android.widget.RelativeLayout;
|
import android.widget.RelativeLayout;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
|
import cc.winboll.studio.powerbell.App;
|
||||||
import cc.winboll.studio.powerbell.model.BackgroundBean;
|
import cc.winboll.studio.powerbell.model.BackgroundBean;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
@@ -22,6 +24,8 @@ import java.io.File;
|
|||||||
public class BackgroundView extends RelativeLayout {
|
public class BackgroundView extends RelativeLayout {
|
||||||
|
|
||||||
public static final String TAG = "BackgroundView";
|
public static final String TAG = "BackgroundView";
|
||||||
|
// 新增:记录当前已缓存的图片路径
|
||||||
|
private String mCurrentCachedPath = "";
|
||||||
|
|
||||||
private Context mContext;
|
private Context mContext;
|
||||||
private LinearLayout mLlContainer; // 主容器LinearLayout
|
private LinearLayout mLlContainer; // 主容器LinearLayout
|
||||||
@@ -55,8 +59,6 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
LogUtils.d(TAG, "=== initView 启动 ===");
|
LogUtils.d(TAG, "=== initView 启动 ===");
|
||||||
// 1. 配置当前控件:全屏+透明
|
// 1. 配置当前控件:全屏+透明
|
||||||
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
||||||
//setBackgroundColor(0x00000000);
|
|
||||||
//setBackground(new ColorDrawable(0x00000000));
|
|
||||||
|
|
||||||
// 2. 初始化主容器LinearLayout
|
// 2. 初始化主容器LinearLayout
|
||||||
initLinearLayout();
|
initLinearLayout();
|
||||||
@@ -64,7 +66,7 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
// 3. 初始化ImageView
|
// 3. 初始化ImageView
|
||||||
initImageView();
|
initImageView();
|
||||||
|
|
||||||
// 初始设置透明背景
|
// 初始设置透明背景
|
||||||
setDefaultTransparentBackground();
|
setDefaultTransparentBackground();
|
||||||
|
|
||||||
LogUtils.d(TAG, "=== initView 完成 ===");
|
LogUtils.d(TAG, "=== initView 完成 ===");
|
||||||
@@ -101,22 +103,21 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
LogUtils.d(TAG, "=== initImageView 完成 ===");
|
LogUtils.d(TAG, "=== initImageView 完成 ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void loadBackgroundBean(BackgroundBean bean) {
|
public void loadBackgroundBean(BackgroundBean bean) {
|
||||||
if (!bean.isUseBackgroundFile()) {
|
if (!bean.isUseBackgroundFile()) {
|
||||||
setDefaultTransparentBackground();
|
setDefaultTransparentBackground();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bean.isUseBackgroundScaledCompressFile()) {
|
String targetPath = bean.isUseBackgroundScaledCompressFile()
|
||||||
loadImage(bean.getBackgroundScaledCompressFilePath());
|
? bean.getBackgroundScaledCompressFilePath()
|
||||||
} else {
|
: bean.getBackgroundFilePath();
|
||||||
|
// 调用带路径判断的loadImage方法
|
||||||
loadImage(bean.getBackgroundFilePath());
|
loadImage(targetPath);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// ====================================== 对外方法 ======================================
|
// ====================================== 对外方法 ======================================
|
||||||
/**
|
/**
|
||||||
* 加载图片(保持原图比例,在LinearLayout中居中平铺)
|
* 改造后:添加路径判断,路径更新时同步更新缓存
|
||||||
* @param imagePath 图片绝对路径
|
* @param imagePath 图片绝对路径
|
||||||
*/
|
*/
|
||||||
public void loadImage(String imagePath) {
|
public void loadImage(String imagePath) {
|
||||||
@@ -132,25 +133,51 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
setDefaultTransparentBackground();
|
setDefaultTransparentBackground();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mIvBackground.setVisibility(View.GONE);
|
|
||||||
|
|
||||||
// 计算原图比例
|
mIvBackground.setVisibility(View.GONE);
|
||||||
|
|
||||||
|
// ======================== 新增:路径判断逻辑 ========================
|
||||||
|
// 1. 路径未变化:直接使用缓存
|
||||||
|
if (imagePath.equals(mCurrentCachedPath)) {
|
||||||
|
//ToastUtils.show("isReload == false");
|
||||||
|
Bitmap cachedBitmap = App._mBitmapCacheUtils.getCachedBitmap(imagePath);
|
||||||
|
if (cachedBitmap != null && !cachedBitmap.isRecycled()) {
|
||||||
|
LogUtils.d(TAG, "loadImage: 路径未变,使用缓存 Bitmap");
|
||||||
|
mImageAspectRatio = (float) cachedBitmap.getWidth() / cachedBitmap.getHeight();
|
||||||
|
mIvBackground.setImageBitmap(cachedBitmap);
|
||||||
|
adjustImageViewSize();
|
||||||
|
mIvBackground.setVisibility(View.VISIBLE);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 路径已更新:移除旧缓存,加载新图片并更新缓存
|
||||||
|
if (!TextUtils.isEmpty(mCurrentCachedPath)) {
|
||||||
|
App._mBitmapCacheUtils.removeCachedBitmap(mCurrentCachedPath);
|
||||||
|
LogUtils.d(TAG, "loadImage: 路径已更新,移除旧缓存 - " + mCurrentCachedPath);
|
||||||
|
}
|
||||||
|
// ======================== 路径判断逻辑结束 ========================
|
||||||
|
|
||||||
|
// 无缓存/路径更新:走原有逻辑加载图片
|
||||||
if (!calculateImageAspectRatio(imageFile)) {
|
if (!calculateImageAspectRatio(imageFile)) {
|
||||||
setDefaultTransparentBackground();
|
setDefaultTransparentBackground();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 压缩加载Bitmap
|
|
||||||
Bitmap bitmap = decodeBitmapWithCompress(imageFile, 1080, 1920);
|
Bitmap bitmap = decodeBitmapWithCompress(imageFile, 1080, 1920);
|
||||||
if (bitmap == null) {
|
if (bitmap == null) {
|
||||||
setDefaultTransparentBackground();
|
setDefaultTransparentBackground();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置图片
|
// 缓存新图片,并更新当前缓存路径记录
|
||||||
|
App._mBitmapCacheUtils.cacheBitmap(imagePath);
|
||||||
|
mCurrentCachedPath = imagePath;
|
||||||
|
LogUtils.d(TAG, "loadImage: 加载新图片并更新缓存 - " + imagePath);
|
||||||
|
|
||||||
mIvBackground.setImageDrawable(new BitmapDrawable(mContext.getResources(), bitmap));
|
mIvBackground.setImageDrawable(new BitmapDrawable(mContext.getResources(), bitmap));
|
||||||
adjustImageViewSize(); // 调整尺寸
|
adjustImageViewSize();
|
||||||
|
mIvBackground.setVisibility(View.VISIBLE);
|
||||||
LogUtils.d(TAG, "=== loadImage 完成 ===");
|
LogUtils.d(TAG, "=== loadImage 完成 ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,56 +225,39 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 调整ImageView尺寸(保持原图比例,在LinearLayout中居中平铺)
|
|
||||||
*/
|
|
||||||
private void adjustImageViewSize() {
|
private void adjustImageViewSize() {
|
||||||
//LogUtils.d(TAG, "=== adjustImageViewSize 启动 ===");
|
|
||||||
if (mLlContainer == null || mIvBackground == null) {
|
if (mLlContainer == null || mIvBackground == null) {
|
||||||
//LogUtils.e(TAG, "控件为空");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取LinearLayout尺寸
|
|
||||||
int llWidth = mLlContainer.getWidth();
|
int llWidth = mLlContainer.getWidth();
|
||||||
int llHeight = mLlContainer.getHeight();
|
int llHeight = mLlContainer.getHeight();
|
||||||
if (llWidth == 0 || llHeight == 0) {
|
|
||||||
postDelayed(new Runnable() {
|
if (llWidth != 0 && llHeight != 0) {
|
||||||
@Override
|
int ivWidth, ivHeight;
|
||||||
public void run() {
|
if (mImageAspectRatio >= 1.0f) {
|
||||||
adjustImageViewSize();
|
ivWidth = Math.min((int) (llHeight * mImageAspectRatio), llWidth);
|
||||||
}
|
ivHeight = (int) (ivWidth / mImageAspectRatio);
|
||||||
}, 150);
|
} else {
|
||||||
return;
|
ivHeight = Math.min((int) (llWidth / mImageAspectRatio), llHeight);
|
||||||
|
ivWidth = (int) (ivHeight * mImageAspectRatio);
|
||||||
|
}
|
||||||
|
|
||||||
|
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mIvBackground.getLayoutParams();
|
||||||
|
params.width = ivWidth;
|
||||||
|
params.height = ivHeight;
|
||||||
|
mIvBackground.setLayoutParams(params);
|
||||||
|
mIvBackground.setScaleType(ScaleType.FIT_CENTER);
|
||||||
|
mIvBackground.setVisibility(View.VISIBLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算ImageView尺寸(保持比例,不超出LinearLayout)
|
|
||||||
int ivWidth, ivHeight;
|
|
||||||
if (mImageAspectRatio >= 1.0f) {
|
|
||||||
ivWidth = Math.min((int) (llHeight * mImageAspectRatio), llWidth);
|
|
||||||
ivHeight = (int) (ivWidth / mImageAspectRatio);
|
|
||||||
} else {
|
|
||||||
ivHeight = Math.min((int) (llWidth / mImageAspectRatio), llHeight);
|
|
||||||
ivWidth = (int) (ivHeight * mImageAspectRatio);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 应用尺寸
|
|
||||||
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) mIvBackground.getLayoutParams();
|
|
||||||
params.width = ivWidth;
|
|
||||||
params.height = ivHeight;
|
|
||||||
mIvBackground.setLayoutParams(params);
|
|
||||||
mIvBackground.setScaleType(ScaleType.FIT_CENTER); // 确保居中平铺
|
|
||||||
mIvBackground.setVisibility(View.VISIBLE);
|
|
||||||
|
|
||||||
|
|
||||||
//LogUtils.d(TAG, "ImageView尺寸:" + ivWidth + "x" + ivHeight);
|
|
||||||
//LogUtils.d(TAG, "=== adjustImageViewSize 完成 ===");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setDefaultTransparentBackground() {
|
private void setDefaultTransparentBackground() {
|
||||||
mIvBackground.setImageBitmap(null);
|
mIvBackground.setImageBitmap(null);
|
||||||
mIvBackground.setBackgroundColor(0x00000000);
|
mIvBackground.setBackgroundColor(0x00000000);
|
||||||
mImageAspectRatio = 1.0f;
|
mImageAspectRatio = 1.0f;
|
||||||
|
// 清空缓存路径记录
|
||||||
|
mCurrentCachedPath = "";
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================================== 重写方法 ======================================
|
// ====================================== 重写方法 ======================================
|
||||||
@@ -257,3 +267,4 @@ public class BackgroundView extends RelativeLayout {
|
|||||||
adjustImageViewSize(); // 尺寸变化时重新调整
|
adjustImageViewSize(); // 尺寸变化时重新调整
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,251 +1,259 @@
|
|||||||
<?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:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:orientation="vertical">
|
android:orientation="vertical">
|
||||||
|
|
||||||
<cc.winboll.studio.libaes.views.ASupportToolbar
|
<!-- 顶部Toolbar(首屏核心,同步加载,保留原有ASupportToolbar) -->
|
||||||
android:layout_width="match_parent"
|
<cc.winboll.studio.libaes.views.ASupportToolbar
|
||||||
android:layout_height="@dimen/toolbar_height"
|
android:layout_width="match_parent"
|
||||||
android:id="@+id/toolbar"
|
android:layout_height="@dimen/toolbar_height"
|
||||||
android:gravity="center_vertical"
|
android:id="@+id/toolbar"
|
||||||
style="@style/DefaultAToolbar"/>
|
android:gravity="center_vertical"
|
||||||
|
style="@style/DefaultAToolbar"/>
|
||||||
|
|
||||||
<RelativeLayout
|
<!-- 主内容区(优化层级,减少冗余RelativeLayout) -->
|
||||||
android:layout_width="match_parent"
|
<RelativeLayout
|
||||||
android:layout_height="0dp"
|
android:layout_width="match_parent"
|
||||||
android:layout_weight="1.0">
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1.0">
|
||||||
|
|
||||||
<RelativeLayout
|
<!-- 首屏核心容器(合并原冗余RelativeLayout,减少层级) -->
|
||||||
android:layout_width="match_parent"
|
<RelativeLayout
|
||||||
android:layout_height="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:id="@+id/activitymainRelativeLayout1"/>
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/activitymainRelativeLayout1">
|
||||||
|
|
||||||
<RelativeLayout
|
<!-- 1. 背景视图(首屏核心,同步加载,保留原有) -->
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
<cc.winboll.studio.powerbell.views.BackgroundView
|
||||||
android:orientation="vertical"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="match_parent"
|
||||||
android:layout_height="match_parent">
|
android:id="@+id/fragmentmainviewBackgroundView1"/>
|
||||||
|
|
||||||
<cc.winboll.studio.powerbell.views.BackgroundView
|
<!-- 2. 功能控件容器(首屏核心,同步加载,保留原有结构) -->
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
<LinearLayout
|
||||||
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">
|
||||||
android:id="@+id/fragmentmainviewBackgroundView1"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<!-- 服务总开关布局 -->
|
||||||
android:orientation="vertical"
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:orientation="vertical"
|
||||||
android:layout_height="match_parent">
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/fragmentmainviewLinearLayout3"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp"
|
||||||
|
android:layout_marginTop="10dp">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="horizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/fragmentmainviewLinearLayout3"
|
android:gravity="center_vertical"
|
||||||
android:layout_marginLeft="10dp"
|
android:background="@drawable/bg_frame">
|
||||||
android:layout_marginRight="10dp"
|
|
||||||
android:layout_marginTop="10dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
<Switch
|
||||||
android:orientation="horizontal"
|
android:layout_width="0dp"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:id="@+id/fragmentandroidviewSwitch1"
|
||||||
android:gravity="center_vertical"
|
android:padding="10dp"
|
||||||
android:background="@drawable/bg_frame">
|
android:layout_weight="1.0"
|
||||||
|
android:textSize="@dimen/text_title_size"/>
|
||||||
|
|
||||||
<Switch
|
</LinearLayout>
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewSwitch1"
|
|
||||||
android:padding="10dp"
|
|
||||||
android:layout_weight="1.0"
|
|
||||||
android:textSize="@dimen/text_title_size"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 电量控制核心布局(SeekBar+图标) -->
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:layout_marginLeft="10dp"
|
||||||
|
android:layout_marginRight="10dp">
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="horizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="match_parent"
|
||||||
android:layout_weight="1.0"
|
android:layout_weight="1.0">
|
||||||
android:layout_marginLeft="10dp"
|
|
||||||
android:layout_marginRight="10dp">
|
|
||||||
|
|
||||||
<LinearLayout
|
<!-- 耗电提醒布局 -->
|
||||||
android:orientation="horizontal"
|
<LinearLayout
|
||||||
android:layout_width="match_parent"
|
android:orientation="vertical"
|
||||||
android:layout_height="match_parent"
|
android:layout_width="50dp"
|
||||||
android:layout_weight="1.0">
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
android:id="@+id/fragmentmainviewLinearLayout1">
|
||||||
|
|
||||||
<LinearLayout
|
<ImageView
|
||||||
android:orientation="vertical"
|
android:layout_width="36dp"
|
||||||
android:layout_width="50dp"
|
android:layout_height="36dp"
|
||||||
android:layout_height="match_parent"
|
android:background="@drawable/usege"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_marginBottom="20dp"
|
android:layout_marginTop="10dp"/>
|
||||||
android:id="@+id/fragmentmainviewLinearLayout1">
|
|
||||||
|
|
||||||
<ImageView
|
<CheckBox
|
||||||
android:layout_width="36dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="36dp"
|
android:layout_height="wrap_content"
|
||||||
android:background="@drawable/usege"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_marginTop="10dp"
|
||||||
android:layout_marginTop="10dp"/>
|
android:id="@+id/fragmentmainviewCheckBox2"/>
|
||||||
|
|
||||||
<CheckBox
|
<cc.winboll.studio.powerbell.views.VerticalSeekBar
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:id="@+id/fragmentandroidviewVerticalSeekBar2"
|
||||||
android:layout_marginTop="10dp"
|
android:progressTint="@color/colorUsege"
|
||||||
android:id="@+id/fragmentmainviewCheckBox2"/>
|
android:progressBackgroundTint="@color/colorUsege"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:layout_margin="10dp"/>
|
||||||
|
|
||||||
<cc.winboll.studio.powerbell.views.VerticalSeekBar
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewVerticalSeekBar2"
|
|
||||||
android:progressTint="@color/colorUsege"
|
|
||||||
android:progressBackgroundTint="@color/colorUsege"
|
|
||||||
android:layout_weight="1.0"
|
|
||||||
android:layout_margin="10dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 耗电提醒数值+图标 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="80dp"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<LinearLayout
|
<TextView
|
||||||
android:orientation="vertical"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="80dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="match_parent">
|
android:text="100%"
|
||||||
|
android:textSize="@dimen/text_title_size"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:id="@+id/fragmentandroidviewTextView3"
|
||||||
|
android:gravity="center_horizontal"/>
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="100%"
|
android:id="@+id/fragmentandroidviewImageView2"
|
||||||
android:textSize="@dimen/text_title_size"
|
android:layout_weight="1.0"/>
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:id="@+id/fragmentandroidviewTextView3"
|
|
||||||
android:gravity="center_horizontal"/>
|
|
||||||
|
|
||||||
<ImageView
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewImageView2"
|
|
||||||
android:layout_weight="1.0"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 当前电量数值+图标 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_weight="1.0">
|
||||||
|
|
||||||
<LinearLayout
|
<TextView
|
||||||
android:orientation="vertical"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="match_parent"
|
android:text="100%"
|
||||||
android:layout_weight="1.0">
|
android:textSize="@dimen/text_title_size"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:gravity="center_horizontal"
|
||||||
|
android:id="@+id/fragmentandroidviewTextView4"/>
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="100%"
|
android:id="@+id/fragmentandroidviewImageView1"
|
||||||
android:textSize="@dimen/text_title_size"
|
android:layout_weight="1.0"/>
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:gravity="center_horizontal"
|
|
||||||
android:id="@+id/fragmentandroidviewTextView4"/>
|
|
||||||
|
|
||||||
<ImageView
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewImageView1"
|
|
||||||
android:layout_weight="1.0"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 充电提醒数值+图标 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="80dp"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<LinearLayout
|
<TextView
|
||||||
android:orientation="vertical"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="80dp"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="match_parent">
|
android:text="100%"
|
||||||
|
android:textSize="@dimen/text_title_size"
|
||||||
|
android:layout_gravity="center_horizontal"
|
||||||
|
android:id="@+id/fragmentandroidviewTextView2"
|
||||||
|
android:gravity="center_horizontal"/>
|
||||||
|
|
||||||
<TextView
|
<ImageView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="100%"
|
android:id="@+id/fragmentandroidviewImageView3"
|
||||||
android:textSize="@dimen/text_title_size"
|
android:layout_weight="1.0"/>
|
||||||
android:layout_gravity="center_horizontal"
|
|
||||||
android:id="@+id/fragmentandroidviewTextView2"
|
|
||||||
android:gravity="center_horizontal"/>
|
|
||||||
|
|
||||||
<ImageView
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewImageView3"
|
|
||||||
android:layout_weight="1.0"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 充电提醒布局 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="50dp"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:layout_marginBottom="20dp"
|
||||||
|
android:layout_marginTop="20dp"
|
||||||
|
android:id="@+id/fragmentmainviewLinearLayout2">
|
||||||
|
|
||||||
<LinearLayout
|
<ImageView
|
||||||
android:orientation="vertical"
|
android:layout_width="36dp"
|
||||||
android:layout_width="50dp"
|
android:layout_height="36dp"
|
||||||
android:layout_height="match_parent"
|
android:background="@drawable/charge"
|
||||||
android:layout_marginBottom="20dp"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_marginTop="20dp"
|
android:layout_marginTop="10dp"/>
|
||||||
android:id="@+id/fragmentmainviewLinearLayout2">
|
|
||||||
|
|
||||||
<ImageView
|
<CheckBox
|
||||||
android:layout_width="36dp"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="36dp"
|
android:layout_height="wrap_content"
|
||||||
android:background="@drawable/charge"
|
android:layout_gravity="center_horizontal"
|
||||||
android:layout_gravity="center_horizontal"
|
android:layout_marginTop="10dp"
|
||||||
android:layout_marginTop="10dp"/>
|
android:id="@+id/fragmentmainviewCheckBox1"/>
|
||||||
|
|
||||||
<CheckBox
|
<cc.winboll.studio.powerbell.views.VerticalSeekBar
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_gravity="center_horizontal"
|
android:id="@+id/fragmentandroidviewVerticalSeekBar1"
|
||||||
android:layout_marginTop="10dp"
|
android:progressTint="@color/colorCharge"
|
||||||
android:id="@+id/fragmentmainviewCheckBox1"/>
|
android:progressBackgroundTint="@color/colorCharge"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:layout_margin="10dp"/>
|
||||||
|
|
||||||
<cc.winboll.studio.powerbell.views.VerticalSeekBar
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/fragmentandroidviewVerticalSeekBar1"
|
|
||||||
android:progressTint="@color/colorCharge"
|
|
||||||
android:progressBackgroundTint="@color/colorCharge"
|
|
||||||
android:layout_weight="1.0"
|
|
||||||
android:layout_margin="10dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- Tips文本 -->
|
||||||
|
<LinearLayout
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="match_parent">
|
||||||
|
|
||||||
<LinearLayout
|
<TextView
|
||||||
android:layout_height="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_width="match_parent">
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Tips"
|
||||||
|
android:textSize="@dimen/text_content_size"
|
||||||
|
android:id="@+id/fragmentandroidviewTextView1"
|
||||||
|
android:background="@drawable/bg_frame"
|
||||||
|
android:padding="10dp"/>
|
||||||
|
|
||||||
<TextView
|
</LinearLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="Tips"
|
|
||||||
android:textSize="@dimen/text_content_size"
|
|
||||||
android:id="@+id/fragmentandroidviewTextView1"
|
|
||||||
android:background="@drawable/bg_frame"
|
|
||||||
android:padding="10dp"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
<!-- 3. 广告视图:关键优化→用ViewStub延迟加载(替代原直接加载的ADsBannerView) -->
|
||||||
|
<!-- 首次启动仅占位(1px),不inflate真实广告视图,减少首次耗时 -->
|
||||||
|
<ViewStub
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/stub_ads_banner"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:layout="@layout/view_ads_banner"/> <!-- 广告视图独立布局文件 -->
|
||||||
|
|
||||||
</RelativeLayout>
|
</RelativeLayout>
|
||||||
|
|
||||||
<cc.winboll.studio.libaes.views.ADsBannerView
|
</RelativeLayout>
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/adsbanner"
|
|
||||||
android:layout_alignParentBottom="true"/>
|
|
||||||
|
|
||||||
</RelativeLayout>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
7
powerbell/src/main/res/layout/view_ads_banner.xml
Normal file
7
powerbell/src/main/res/layout/view_ads_banner.xml
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- 广告视图独立布局(供ViewStub延迟加载) -->
|
||||||
|
<cc.winboll.studio.libaes.views.ADsBannerView
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/adsbanner"/>
|
||||||
Reference in New Issue
Block a user