From 6ccbaf8c328178d3a3a5ee38e4a94c3002f0d133 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 15 Mar 2025 15:21:41 +0800 Subject: [PATCH 001/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=B1=BB=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autoinstaller/build.gradle | 34 ++++--------------- autoinstaller/build.properties | 12 +++---- autoinstaller/src/main/AndroidManifest.xml | 2 +- .../cc/winboll/studio/autoinstaller/App.java | 15 ++++---- .../studio/autoinstaller/FileListener.java | 2 +- .../studio/autoinstaller/MainActivity.java | 10 +++--- .../autoinstaller/beans/AppConfigs.java | 2 +- .../autoinstaller/receivers/MainReceiver.java | 2 +- .../autoinstaller/services/MainService.java | 5 +-- .../autoinstaller/utils/PackageUtil.java | 2 +- .../src/main/res/layout/activity_main.xml | 2 +- autoinstaller/src/main/res/values/styles.xml | 13 +++++++ autoinstaller/src/main/res/values/themes.xml | 14 -------- 13 files changed, 49 insertions(+), 66 deletions(-) create mode 100644 autoinstaller/src/main/res/values/styles.xml delete mode 100644 autoinstaller/src/main/res/values/themes.xml diff --git a/autoinstaller/build.gradle b/autoinstaller/build.gradle index ba56e67..e8f0df5 100644 --- a/autoinstaller/build.gradle +++ b/autoinstaller/build.gradle @@ -18,18 +18,18 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 32 - buildToolsVersion "33.0.3" + compileSdkVersion 30 + buildToolsVersion "30.0.3" defaultConfig { applicationId "cc.winboll.studio.autoinstaller" - minSdkVersion 24 - targetSdkVersion 30 + minSdkVersion 26 + targetSdkVersion 29 versionCode 2 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "5.0" + versionName "15.0" if(true) { versionName = genVersionName("${versionName}") } @@ -41,30 +41,10 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } } dependencies { - api 'cc.winboll.studio:winboll-shared:1.1.0' - api 'io.github.medyo:android-about-page:2.0.0' - api 'com.github.getActivity:ToastUtils:10.5' - api 'com.jcraft:jsch:0.1.55' - api 'org.jsoup:jsoup:1.13.1' - api 'com.squareup.okhttp3:okhttp:4.4.1' - - api 'androidx.appcompat:appcompat:1.0.0' - api 'androidx.fragment:fragment:1.0.0' - api 'com.google.android.material:material:1.0.0' - - api 'androidx.vectordrawable:vectordrawable-animated:1.0.0' - api 'androidx.lifecycle:lifecycle-livedata:1.0.0' - - //api 'cc.winboll.studio:libaes:6.3.2' - //api 'cc.winboll.studio:libapputils:8.3.8' - api fileTree(dir: 'libs', include: ['*.jar']) + implementation 'cc.winboll.studio:libappbase:15.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0' } diff --git a/autoinstaller/build.properties b/autoinstaller/build.properties index 1db8525..1cf870a 100644 --- a/autoinstaller/build.properties +++ b/autoinstaller/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Jan 02 02:39:56 HKT 2025 -stageCount=4 +#Sat Mar 15 07:19:52 GMT 2025 +stageCount=0 libraryProject= -baseVersion=5.0 -publishVersion=5.0.3 -buildCount=0 -baseBetaVersion=5.0.4 +baseVersion=15.0 +publishVersion=15.0.0 +buildCount=9 +baseBetaVersion=15.0.1 diff --git a/autoinstaller/src/main/AndroidManifest.xml b/autoinstaller/src/main/AndroidManifest.xml index 0da8a10..506ea85 100644 --- a/autoinstaller/src/main/AndroidManifest.xml +++ b/autoinstaller/src/main/AndroidManifest.xml @@ -33,7 +33,7 @@ android:persistent="true" android:supportsRtl="true" android:requestLegacyExternalStorage="true" - android:theme="@style/Theme.Application"> + android:theme="@style/MyAppTheme"> - + + + + diff --git a/autoinstaller/src/main/res/values/themes.xml b/autoinstaller/src/main/res/values/themes.xml deleted file mode 100644 index 89d5280..0000000 --- a/autoinstaller/src/main/res/values/themes.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - \ No newline at end of file From f04f5cf77c02e262f8a74e08f1bc2e1b03d21989 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 15 Mar 2025 15:33:36 +0800 Subject: [PATCH 002/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=AE=89=E5=8D=93?= =?UTF-8?q?=E9=80=82=E9=85=8D=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- autoinstaller/build.gradle | 2 +- autoinstaller/build.properties | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/autoinstaller/build.gradle b/autoinstaller/build.gradle index e8f0df5..77ae304 100644 --- a/autoinstaller/build.gradle +++ b/autoinstaller/build.gradle @@ -45,6 +45,6 @@ android { dependencies { api fileTree(dir: 'libs', include: ['*.jar']) - implementation 'cc.winboll.studio:libappbase:15.0.0' + implementation 'cc.winboll.studio:libappbase:15.0.2' implementation 'androidx.appcompat:appcompat:1.1.0' } diff --git a/autoinstaller/build.properties b/autoinstaller/build.properties index 1cf870a..5973145 100644 --- a/autoinstaller/build.properties +++ b/autoinstaller/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 15 07:19:52 GMT 2025 +#Sat Mar 15 07:32:25 GMT 2025 stageCount=0 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=9 +buildCount=12 baseBetaVersion=15.0.1 From 5714aed7610a75701612ed29f38520fce8525000 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 15 Mar 2025 15:38:45 +0800 Subject: [PATCH 003/132] APK 15.0.0 release Publish. --- autoinstaller/build.properties | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/autoinstaller/build.properties b/autoinstaller/build.properties index 5973145..26e242a 100644 --- a/autoinstaller/build.properties +++ b/autoinstaller/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 15 07:32:25 GMT 2025 -stageCount=0 +#Sat Mar 15 15:38:45 HKT 2025 +stageCount=1 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=12 +buildCount=0 baseBetaVersion=15.0.1 From 0d21994291dd7123b43b73882a57e80b0eb2b94c Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 22 Mar 2025 03:06:40 +0800 Subject: [PATCH 004/132] =?UTF-8?q?=E7=BC=96=E8=AF=91=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=B2=BE=E7=AE=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.gradle | 5 ----- 1 file changed, 5 deletions(-) diff --git a/powerbell/build.gradle b/powerbell/build.gradle index 80fddb2..c1481e4 100644 --- a/powerbell/build.gradle +++ b/powerbell/build.gradle @@ -41,11 +41,6 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_11 - targetCompatibility JavaVersion.VERSION_11 - } } dependencies { From 508c8b0b976cfa67ba1e9ea40c798e9dc8ff0943 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 22 Mar 2025 05:53:58 +0800 Subject: [PATCH 005/132] =?UTF-8?q?=E9=80=82=E9=85=8D=E5=B0=8F=E7=B1=B315?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=94=B9=E9=80=9A=E7=9F=A5=E6=A8=A1=E5=9D=97?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.properties | 4 +- powerbell/src/main/AndroidManifest.xml | 27 +++- .../studio/powerbell/MainActivity.java | 10 +- .../receivers/GlobalApplicationReceiver.java | 4 +- .../services/ControlCenterService.java | 65 ++++++-- .../powerbell/utils/AppConfigUtils.java | 2 +- .../powerbell/utils/NotificationHelper.java | 150 ++++++++++++++++++ ...tionUtils.java => NotificationUtils2.java} | 59 +++++-- .../main/res/layout/custom_notification.xml | 11 ++ .../layout/custom_notification_expanded.xml | 17 ++ 10 files changed, 308 insertions(+), 41 deletions(-) create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationHelper.java rename powerbell/src/main/java/cc/winboll/studio/powerbell/utils/{NotificationUtils.java => NotificationUtils2.java} (83%) create mode 100644 powerbell/src/main/res/layout/custom_notification.xml create mode 100644 powerbell/src/main/res/layout/custom_notification_expanded.xml diff --git a/powerbell/build.properties b/powerbell/build.properties index 005367c..cb30cf7 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Jan 02 11:13:45 HKT 2025 +#Fri Mar 21 21:51:15 GMT 2025 stageCount=6 libraryProject= baseVersion=4.0 publishVersion=4.0.5 -buildCount=0 +buildCount=13 baseBetaVersion=4.0.6 diff --git a/powerbell/src/main/AndroidManifest.xml b/powerbell/src/main/AndroidManifest.xml index b7d17be..6c9175e 100644 --- a/powerbell/src/main/AndroidManifest.xml +++ b/powerbell/src/main/AndroidManifest.xml @@ -2,10 +2,9 @@ - - - - + + + @@ -22,6 +21,23 @@ + + + + + + + + + + + + + + + + + + android:launchMode="singleTask" + android:exported="true"> diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java index c2a5eb6..e8c75fd 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java @@ -17,7 +17,7 @@ import cc.winboll.studio.powerbell.activities.AboutActivity; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.activities.ClearRecordActivity; import cc.winboll.studio.powerbell.fragments.MainViewFragment; -import cc.winboll.studio.powerbell.utils.NotificationUtils; +import cc.winboll.studio.powerbell.utils.NotificationHelper; import cc.winboll.studio.shared.log.LogUtils; import cc.winboll.studio.shared.log.LogView; @@ -64,8 +64,10 @@ public class MainActivity extends Activity { } showFragment(mMainViewFragment); - NotificationUtils notificationUtils = new NotificationUtils(this); - notificationUtils.createNotificationChannel(); +// NotificationHelper notificationUtils = new NotificationHelper(this); +// notificationUtils.createNotificationChannels(); + + } void showFragment(Fragment fragment) { @@ -113,7 +115,7 @@ public class MainActivity extends Activity { protected void onResume() { super.onResume(); // 回到窗口自动取消提醒消息 - NotificationUtils.cancelRemindNotification(this); + //NotificationHelper.cancelRemindNotification(this); reloadBackground(); } diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java index 3d7dde3..4eb3ffe 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java @@ -8,7 +8,7 @@ import cc.winboll.studio.powerbell.GlobalApplication; import cc.winboll.studio.powerbell.fragments.MainViewFragment; import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.BatteryUtils; -import cc.winboll.studio.powerbell.utils.NotificationUtils; +import cc.winboll.studio.powerbell.utils.NotificationHelper; public class GlobalApplicationReceiver extends BroadcastReceiver { @@ -45,7 +45,7 @@ public class GlobalApplicationReceiver extends BroadcastReceiver { // 新电池状态标志某一个有变化就更新显示信息 if (_mIsCharging != isCharging || _mnTheQuantityOfElectricityOld != nTheQuantityOfElectricity) { // 电池状态改变先取消旧的提醒消息 - NotificationUtils.cancelRemindNotification(context); + //NotificationHelper.cancelRemindNotification(context); GlobalApplication.getAppCacheUtils(context).addChangingTime(nTheQuantityOfElectricity); MainViewFragment.sendMsgCurrentValueBattery(nTheQuantityOfElectricity); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java index 20cc497..2d1b7aa 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java @@ -8,14 +8,17 @@ package cc.winboll.studio.powerbell.services; * Android Service之onStartCommand方法研究 * https://blog.csdn.net/cyp331203/article/details/38920491 */ -import cc.winboll.studio.powerbell.R; +import android.app.Notification; import android.app.Service; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; +import android.widget.RemoteViews; import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.powerbell.MainActivity; +import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.beans.AppConfigBean; import cc.winboll.studio.powerbell.beans.NotificationMessage; import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler; @@ -24,11 +27,12 @@ import cc.winboll.studio.powerbell.services.AssistantService; import cc.winboll.studio.powerbell.threads.RemindThread; import cc.winboll.studio.powerbell.utils.AppCacheUtils; import cc.winboll.studio.powerbell.utils.AppConfigUtils; -import cc.winboll.studio.powerbell.utils.NotificationUtils; +import cc.winboll.studio.powerbell.utils.NotificationHelper; import cc.winboll.studio.powerbell.utils.ServiceUtils; import cc.winboll.studio.powerbell.utils.StringUtils; import cc.winboll.studio.shared.log.LogUtils; import com.hjq.toast.ToastUtils; +import android.graphics.Color; public class ControlCenterService extends Service { @@ -43,7 +47,8 @@ public class ControlCenterService extends Service { AppConfigUtils mAppConfigUtils; AppCacheUtils mAppCacheUtils; // 前台服务通知工具 - NotificationUtils mNotificationUtils; + NotificationHelper mNotificationHelper; + Notification notification; RemindThread mRemindThread; ControlCenterServiceHandler mControlCenterServiceHandler; MyServiceConnection mMyServiceConnection; @@ -66,7 +71,9 @@ public class ControlCenterService extends Service { isServiceRunning = false; mAppConfigUtils = GlobalApplication.getAppConfigUtils(this); mAppCacheUtils = GlobalApplication.getAppCacheUtils(this); - mNotificationUtils = new NotificationUtils(ControlCenterService.this); + mNotificationHelper = new NotificationHelper(ControlCenterService.this); + + if (mMyServiceConnection == null) { mMyServiceConnection = new MyServiceConnection(); } @@ -92,10 +99,16 @@ public class ControlCenterService extends Service { // 唤醒守护进程 wakeupAndBindAssistant(); // 显示前台通知栏 - NotificationMessage notificationMessage=createNotificationMessage(); - //Toast.makeText(getApplication(), "", Toast.LENGTH_SHORT).show(); - mNotificationUtils.createForegroundNotification(this, notificationMessage); - mNotificationUtils.createRemindNotification(this, notificationMessage); + // 在Service中 + NotificationHelper helper = new NotificationHelper(this); + Intent intent = new Intent(this, MainActivity.class); + notification = helper.showForegroundNotification(intent, getString(R.string.app_name), "Service Running, Click to open app"); + startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); + +// NotificationMessage notificationMessage=createNotificationMessage(); +// //Toast.makeText(getApplication(), "", Toast.LENGTH_SHORT).show(); +// mNotificationUtils.createForegroundNotification(this, notificationMessage); +// mNotificationUtils.createRemindNotification(this, notificationMessage); if (mControlCenterServiceReceiver == null) { // 注册广播接收器 @@ -126,19 +139,19 @@ public class ControlCenterService extends Service { // 更新前台通知 // public void updateServiceNotification() { - mNotificationUtils.updateForegroundNotification(ControlCenterService.this, createNotificationMessage()); + //mNotificationUtils.updateForegroundNotification(ControlCenterService.this, createNotificationMessage()); } // 更新前台通知 // public void updateServiceNotification(NotificationMessage notificationMessage) { - mNotificationUtils.updateForegroundNotification(ControlCenterService.this, notificationMessage); + //mNotificationUtils.updateForegroundNotification(ControlCenterService.this, notificationMessage); } // 更新前台通知 // public void updateRemindNotification(NotificationMessage notificationMessage) { - mNotificationUtils.updateRemindNotification(ControlCenterService.this, notificationMessage); + //mNotificationUtils.updateRemindNotification(ControlCenterService.this, notificationMessage); } // 唤醒和绑定守护进程 @@ -234,10 +247,32 @@ public class ControlCenterService extends Service { } public void appenRemindMSG(String szRemindMSG) { - NotificationMessage notificationMessage = createNotificationMessage(); - notificationMessage.setRemindMSG(szRemindMSG); - //LogUtils.d(TAG, "notificationMessage : " + notificationMessage.getRemindMSG()); - updateRemindNotification(notificationMessage); + String msg = ""; + for (int i = 0; i < 20; i++) { + msg += szRemindMSG; + } + NotificationHelper helper = new NotificationHelper(ControlCenterService.this); + Intent intent = new Intent(ControlCenterService.this, MainActivity.class); + helper.showTemporaryNotification(intent, getString(R.string.app_name), msg); + + + +// NotificationMessage notificationMessage = createNotificationMessage(); +// notificationMessage.setRemindMSG(szRemindMSG); +// //LogUtils.d(TAG, "notificationMessage : " + notificationMessage.getRemindMSG()); +// updateRemindNotification(notificationMessage); + } + + // 设置颜色背景 + public static RemoteViews setLinearLayoutColor(RemoteViews remoteViews, int viewId, int color) { + remoteViews.setInt(viewId, "setBackgroundColor", color); + return remoteViews; + } + + // 设置Drawable背景 + public static RemoteViews setLinearLayoutDrawable(RemoteViews remoteViews, int viewId, int drawableRes) { + remoteViews.setInt(viewId, "setBackgroundResource", drawableRes); + return remoteViews; } // diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java index e1c2be0..4a21202 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java @@ -193,7 +193,7 @@ public class AppConfigUtils { // void saveConfigData() { // 更新配置先取消一下旧的的提醒消息 - NotificationUtils.cancelRemindNotification(mContext); + //NotificationHelper.cancelRemindNotification(mContext); AppConfigBean.saveBean(mContext, mAppConfigBean); // 通知活动窗口和服务配置已更新 diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationHelper.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationHelper.java new file mode 100644 index 0000000..cc62c37 --- /dev/null +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationHelper.java @@ -0,0 +1,150 @@ +package cc.winboll.studio.powerbell.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/22 04:39:40 + * @Describe 通知工具类 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.widget.RemoteViews; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import cc.winboll.studio.powerbell.R; + +public class NotificationHelper { + public static final String TAG = "NotificationHelper"; + + // 渠道ID和名称 + private static final String CHANNEL_ID_FOREGROUND = "foreground_channel"; + private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service"; + private static final String CHANNEL_ID_TEMPORARY = "temporary_channel"; + private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications"; + + // 通知ID + public static final int FOREGROUND_NOTIFICATION_ID = 1001; + public static final int TEMPORARY_NOTIFICATION_ID = 2001; + + private final Context mContext; + private final NotificationManager mNotificationManager; + + public NotificationHelper(Context context) { + mContext = context; + mNotificationManager = context.getSystemService(NotificationManager.class); + createNotificationChannels(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createForegroundChannel(); + createTemporaryChannel(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createForegroundChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_FOREGROUND, + CHANNEL_NAME_FOREGROUND, + NotificationManager.IMPORTANCE_LOW + ); + channel.setDescription("Persistent service notifications"); + channel.setSound(null, null); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createTemporaryChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_TEMPORARY, + CHANNEL_NAME_TEMPORARY, + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Temporary alert notifications"); + channel.setSound(null, null); + channel.enableVibration(true); + channel.setVibrationPattern(new long[]{100, 200, 300, 400}); + channel.setBypassDnd(true); + mNotificationManager.createNotificationChannel(channel); + } + + // 显示常驻通知(通常用于前台服务) + public Notification showForegroundNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); + return notification; + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setVibrate(new long[]{100, 200, 300, 400}) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID, notification); + } + + // 创建自定义布局通知(可扩展) + public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setContentIntent(pendingIntent) + .setContent(contentView) + .setCustomBigContentView(bigContentView) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification); + } + + // 取消所有通知 + public void cancelAllNotifications() { + mNotificationManager.cancelAll(); + } + + // 创建PendingIntent(兼容不同API版本) + private PendingIntent createPendingIntent(Intent intent) { + int flags = PendingIntent.FLAG_UPDATE_CURRENT; +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { +// flags |= PendingIntent.FLAG_IMMUTABLE; +// } + return PendingIntent.getActivity( + mContext, + 0, + intent, + flags + ); + } +} + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils2.java similarity index 83% rename from powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils.java rename to powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils2.java index 5bcb692..a2fe111 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/NotificationUtils2.java @@ -18,14 +18,15 @@ import android.media.RingtoneManager; import android.os.Build; import android.view.View; import android.widget.RemoteViews; +import androidx.annotation.RequiresApi; import cc.winboll.studio.powerbell.MainActivity; import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.beans.NotificationMessage; import cc.winboll.studio.powerbell.services.ControlCenterService; -public class NotificationUtils { +public class NotificationUtils2 { - public static final String TAG = NotificationUtils.class.getSimpleName(); + public static final String TAG = NotificationHelper.class.getSimpleName(); Context mContext; NotificationManager mNotificationManager; @@ -45,19 +46,53 @@ public class NotificationUtils { private static String _mszChannelIDRemind = "2"; private static String _mszChannelNameRemind = "Remind"; - public NotificationUtils(Context context) { +// public NotificationUtils(Context context) { +// mContext = context; +// mNotificationManager = (NotificationManager) context.getSystemService( +// Context.NOTIFICATION_SERVICE); +// } + + public NotificationUtils2(Context context) { mContext = context; - mNotificationManager = (NotificationManager) context.getSystemService( - Context.NOTIFICATION_SERVICE); + mNotificationManager = context.getSystemService(NotificationManager.class); + //createNotificationChannels(); } - public void createNotificationChannel() { - NotificationChannel channel1 = new NotificationChannel(_mszChannelIDService, _mszChannelNameService, NotificationManager.IMPORTANCE_DEFAULT); - channel1.setSound(null, null); - mNotificationManager.createNotificationChannel(channel1); - NotificationChannel channel2 = new NotificationChannel(_mszChannelIDRemind, _mszChannelNameRemind, NotificationManager.IMPORTANCE_HIGH); - channel2.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT); - mNotificationManager.createNotificationChannel(channel2); + @RequiresApi(api = Build.VERSION_CODES.O) + public void createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createServiceChannel(); + createRemindChannel(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createServiceChannel() { + NotificationChannel channel = new NotificationChannel( + _mszChannelIDService, + _mszChannelNameService, + NotificationManager.IMPORTANCE_LOW + ); + channel.setDescription("Background service updates"); + channel.setSound(null, null); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createRemindChannel() { + NotificationChannel channel = new NotificationChannel( + _mszChannelIDRemind, + _mszChannelNameRemind, + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Critical reminders"); + channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM), null); + channel.enableVibration(true); + channel.setVibrationPattern(new long[]{100, 200, 300, 400}); + channel.setBypassDnd(true); + channel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC); + mNotificationManager.createNotificationChannel(channel); } // 创建并发送服务通知 diff --git a/powerbell/src/main/res/layout/custom_notification.xml b/powerbell/src/main/res/layout/custom_notification.xml new file mode 100644 index 0000000..53ddf4b --- /dev/null +++ b/powerbell/src/main/res/layout/custom_notification.xml @@ -0,0 +1,11 @@ + + + + + diff --git a/powerbell/src/main/res/layout/custom_notification_expanded.xml b/powerbell/src/main/res/layout/custom_notification_expanded.xml new file mode 100644 index 0000000..b93059b --- /dev/null +++ b/powerbell/src/main/res/layout/custom_notification_expanded.xml @@ -0,0 +1,17 @@ + + + + + + + From 4ccf6824a662de7ece3475e41d77645b404cff51 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 22 Mar 2025 06:01:46 +0800 Subject: [PATCH 006/132] APK 4.0.6 release Publish. --- powerbell/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/powerbell/build.properties b/powerbell/build.properties index cb30cf7..580e4af 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Mar 21 21:51:15 GMT 2025 -stageCount=6 +#Sat Mar 22 06:01:46 HKT 2025 +stageCount=7 libraryProject= baseVersion=4.0 -publishVersion=4.0.5 -buildCount=13 -baseBetaVersion=4.0.6 +publishVersion=4.0.6 +buildCount=0 +baseBetaVersion=4.0.7 From 5a052e4b222f2da86be38b1b820e9249d3ce64ab Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 22 Mar 2025 15:54:18 +0800 Subject: [PATCH 007/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E7=94=B5=E6=B1=A0?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E7=AA=97=E5=8F=A3=E9=9B=8F=E5=BD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.properties | 4 +- powerbell/src/main/AndroidManifest.xml | 4 +- .../studio/powerbell/MainActivity.java | 10 ++- .../activities/BatteryReporterActivity.java | 51 ++++++++++++++++ .../powerbell/adapters/BatteryAdapter.java | 61 +++++++++++++++++++ .../studio/powerbell/beans/BatteryData.java | 26 ++++++++ .../ControlCenterServiceReceiver.java | 10 +++ .../src/main/res/drawable/divider_line.xml | 7 +++ .../res/layout/activity_battery_reporter.xml | 24 ++++++++ .../main/res/layout/item_battery_report.xml | 34 +++++++++++ powerbell/src/main/res/menu/toolbar_main.xml | 3 + powerbell/src/main/res/values/strings.xml | 1 + 12 files changed, 229 insertions(+), 6 deletions(-) create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReporterActivity.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/adapters/BatteryAdapter.java create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryData.java create mode 100644 powerbell/src/main/res/drawable/divider_line.xml create mode 100644 powerbell/src/main/res/layout/activity_battery_reporter.xml create mode 100644 powerbell/src/main/res/layout/item_battery_report.xml diff --git a/powerbell/build.properties b/powerbell/build.properties index cb30cf7..40f11e7 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Mar 21 21:51:15 GMT 2025 +#Sat Mar 22 07:52:04 GMT 2025 stageCount=6 libraryProject= baseVersion=4.0 publishVersion=4.0.5 -buildCount=13 +buildCount=14 baseBetaVersion=4.0.6 diff --git a/powerbell/src/main/AndroidManifest.xml b/powerbell/src/main/AndroidManifest.xml index 6c9175e..4391ee7 100644 --- a/powerbell/src/main/AndroidManifest.xml +++ b/powerbell/src/main/AndroidManifest.xml @@ -129,6 +129,8 @@ + + - + \ No newline at end of file diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java index e8c75fd..874e4fc 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java @@ -15,9 +15,9 @@ import cc.winboll.studio.libaes.views.AToolbar; import cc.winboll.studio.powerbell.MainActivity; import cc.winboll.studio.powerbell.activities.AboutActivity; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; +import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; import cc.winboll.studio.powerbell.activities.ClearRecordActivity; import cc.winboll.studio.powerbell.fragments.MainViewFragment; -import cc.winboll.studio.powerbell.utils.NotificationHelper; import cc.winboll.studio.shared.log.LogUtils; import cc.winboll.studio.shared.log.LogView; @@ -66,8 +66,8 @@ public class MainActivity extends Activity { // NotificationHelper notificationUtils = new NotificationHelper(this); // notificationUtils.createNotificationChannels(); - - + + } void showFragment(Fragment fragment) { @@ -145,6 +145,10 @@ public class MainActivity extends Activity { Intent intent = new Intent(); intent.setClass(this, AboutActivity.class); startActivity(intent); + } else if (menuItemId == R.id.action_battery_reporter) { + Intent intent = new Intent(); + intent.setClass(this, BatteryReporterActivity.class); + startActivity(intent); } else if (menuItemId == R.id.action_clearrecord) { Intent intent = new Intent(); intent.setClass(this, ClearRecordActivity.class); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReporterActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReporterActivity.java new file mode 100644 index 0000000..288a296 --- /dev/null +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BatteryReporterActivity.java @@ -0,0 +1,51 @@ +package cc.winboll.studio.powerbell.activities; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/22 14:20:15 + */ +import android.app.Activity; +import android.os.Bundle; +import androidx.recyclerview.widget.DividerItemDecoration; +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.powerbell.R; +import cc.winboll.studio.powerbell.adapters.BatteryAdapter; +import cc.winboll.studio.powerbell.beans.BatteryData; +import java.util.Arrays; +import java.util.List; + +public class BatteryReporterActivity extends Activity { + public static final String TAG = "BatteryReporterActivity"; + + private RecyclerView rvBatteryReport; + private BatteryAdapter adapter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_battery_reporter); + + rvBatteryReport = findViewById(R.id.rvBatteryReport); + setupRecyclerView(); + loadSampleData(); + } + + private void setupRecyclerView() { + adapter = new BatteryAdapter(); + rvBatteryReport.setLayoutManager(new LinearLayoutManager(this)); + rvBatteryReport.setAdapter(adapter); + rvBatteryReport.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL)); + } + + private void loadSampleData() { + List dataList = Arrays.asList( + new BatteryData(95, "01:23:45", "00:05:12"), + new BatteryData(80, "02:15:30", "00:10:00"), + new BatteryData(65, "03:45:15", "00:15:30"), + new BatteryData(50, "05:00:00", "00:20:45") + ); + adapter.updateData(dataList); + } +} + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/adapters/BatteryAdapter.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/adapters/BatteryAdapter.java new file mode 100644 index 0000000..93e69bb --- /dev/null +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/adapters/BatteryAdapter.java @@ -0,0 +1,61 @@ +package cc.winboll.studio.powerbell.adapters; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/22 14:38:55 + * @Describe 电池报告数据适配器 + */ +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; +import androidx.recyclerview.widget.RecyclerView; +import cc.winboll.studio.powerbell.R; +import cc.winboll.studio.powerbell.adapters.BatteryAdapter; +import cc.winboll.studio.powerbell.beans.BatteryData; +import java.util.ArrayList; +import java.util.List; + +public class BatteryAdapter extends RecyclerView.Adapter { + public static final String TAG = "BatteryAdapter"; + private List dataList = new ArrayList<>(); + + public void updateData(List newData) { + dataList = newData; + notifyDataSetChanged(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = LayoutInflater.from(parent.getContext()) + .inflate(R.layout.item_battery_report, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + BatteryData item = dataList.get(position); + holder.tvLevel.setText(String.format("%d%%", item.getCurrentLevel())); + holder.tvDischargeTime.setText("使用时间: " + item.getDischargeTime()); + holder.tvChargeTime.setText("充电时间: " + item.getChargeTime()); + } + + @Override + public int getItemCount() { + return dataList.size(); + } + + static class ViewHolder extends RecyclerView.ViewHolder { + TextView tvLevel; + TextView tvDischargeTime; + TextView tvChargeTime; + + ViewHolder(View itemView) { + super(itemView); + tvLevel = itemView.findViewById(R.id.tvLevel); + tvDischargeTime = itemView.findViewById(R.id.tvDischargeTime); + tvChargeTime = itemView.findViewById(R.id.tvChargeTime); + } + } +} + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryData.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryData.java new file mode 100644 index 0000000..3d89470 --- /dev/null +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryData.java @@ -0,0 +1,26 @@ +package cc.winboll.studio.powerbell.beans; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/22 14:30:51 + * @Describe 电池报告数据模型 + */ +public class BatteryData { + + public static final String TAG = "BatteryData"; + + private int currentLevel; + private String dischargeTime; + private String chargeTime; + + public BatteryData(int currentLevel, String dischargeTime, String chargeTime) { + this.currentLevel = currentLevel; + this.dischargeTime = dischargeTime; + this.chargeTime = chargeTime; + } + + public int getCurrentLevel() { return currentLevel; } + public String getDischargeTime() { return dischargeTime; } + public String getChargeTime() { return chargeTime; } +} + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java index 007fd9e..e18f5e4 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java @@ -5,11 +5,14 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import cc.winboll.studio.powerbell.beans.AppConfigBean; +import cc.winboll.studio.powerbell.beans.BatteryData; import cc.winboll.studio.powerbell.services.ControlCenterService; import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.BatteryUtils; import cc.winboll.studio.shared.log.LogUtils; import java.lang.ref.WeakReference; +import java.util.ArrayList; +import java.util.List; public class ControlCenterServiceReceiver extends BroadcastReceiver { public static final String TAG = ControlCenterServiceReceiver.class.getSimpleName(); @@ -52,6 +55,13 @@ public class ControlCenterServiceReceiver extends BroadcastReceiver { appConfigBean.setCurrentValue(nTheQuantityOfElectricity); appConfigBean.setIsCharging(isCharging); mwrService.get().startRemindThread(appConfigBean); + + // 保存电池报告 + // 示例数据更新逻辑 +// List newData = new ArrayList<>(adapter.getDataList()); +// newData.add(0, new BatteryData(percentage, "00:00:00", "00:00:00")); +// adapter.updateData(newData); + // 保存好新的电池状态标志 _mIsCharging = isCharging; _mnTheQuantityOfElectricityOld = nTheQuantityOfElectricity; diff --git a/powerbell/src/main/res/drawable/divider_line.xml b/powerbell/src/main/res/drawable/divider_line.xml new file mode 100644 index 0000000..f9365df --- /dev/null +++ b/powerbell/src/main/res/drawable/divider_line.xml @@ -0,0 +1,7 @@ + + + + diff --git a/powerbell/src/main/res/layout/activity_battery_reporter.xml b/powerbell/src/main/res/layout/activity_battery_reporter.xml new file mode 100644 index 0000000..0ad37ee --- /dev/null +++ b/powerbell/src/main/res/layout/activity_battery_reporter.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/powerbell/src/main/res/layout/item_battery_report.xml b/powerbell/src/main/res/layout/item_battery_report.xml new file mode 100644 index 0000000..048d3a8 --- /dev/null +++ b/powerbell/src/main/res/layout/item_battery_report.xml @@ -0,0 +1,34 @@ + + + + + + + + + + diff --git a/powerbell/src/main/res/menu/toolbar_main.xml b/powerbell/src/main/res/menu/toolbar_main.xml index 3518127..dce9de9 100644 --- a/powerbell/src/main/res/menu/toolbar_main.xml +++ b/powerbell/src/main/res/menu/toolbar_main.xml @@ -1,5 +1,8 @@ + diff --git a/powerbell/src/main/res/values/strings.xml b/powerbell/src/main/res/values/strings.xml index b3be1aa..c0505a8 100644 --- a/powerbell/src/main/res/values/strings.xml +++ b/powerbell/src/main/res/values/strings.xml @@ -6,6 +6,7 @@ This application has crashed, the author level is limited, please understand! Main View About + Battery Reporter Clear Record Change Picture Developer View From 3c2b720e201bf51e44b48defabe107dbef48a633 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 22 Mar 2025 16:03:08 +0800 Subject: [PATCH 008/132] =?UTF-8?q?=E8=B0=83=E6=95=B4=E8=83=8C=E6=99=AF?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E8=AE=BE=E7=BD=AE=E7=AA=97=E5=8F=A3=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.properties | 4 +-- .../res/layout/activity_backgroundpicture.xml | 26 +++++++++---------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/powerbell/build.properties b/powerbell/build.properties index 40f11e7..e75ba77 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 22 07:52:04 GMT 2025 +#Sat Mar 22 07:59:55 GMT 2025 stageCount=6 libraryProject= baseVersion=4.0 publishVersion=4.0.5 -buildCount=14 +buildCount=15 baseBetaVersion=4.0.6 diff --git a/powerbell/src/main/res/layout/activity_backgroundpicture.xml b/powerbell/src/main/res/layout/activity_backgroundpicture.xml index 348b505..32197b4 100644 --- a/powerbell/src/main/res/layout/activity_backgroundpicture.xml +++ b/powerbell/src/main/res/layout/activity_backgroundpicture.xml @@ -26,29 +26,27 @@ android:layout_height="wrap_content" android:layout_below="@id/toolbar"> - + + android:id="@+id/activitybackgroundpictureAButton5" + android:layout_alignParentLeft="true" + android:layout_margin="5dp"/> + android:id="@+id/activitybackgroundpictureAButton4" + android:layout_alignParentRight="true" + android:layout_margin="5dp"/> - + Date: Sat, 22 Mar 2025 16:06:33 +0800 Subject: [PATCH 009/132] APK 4.0.7 release Publish. --- powerbell/build.properties | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/powerbell/build.properties b/powerbell/build.properties index 3116a2a..b7f2176 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 22 06:01:46 HKT 2025 -stageCount=7 +#Sat Mar 22 16:06:33 HKT 2025 +stageCount=8 libraryProject= baseVersion=4.0 -publishVersion=4.0.6 +publishVersion=4.0.7 buildCount=0 -baseBetaVersion=4.0.7 \ No newline at end of file +baseBetaVersion=4.0.8 From 51775620dbd790b468c0cdd8f93298cb0550ccbf Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 24 Mar 2025 20:24:31 +0800 Subject: [PATCH 010/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=B1=BB=E5=BA=93?= =?UTF-8?q?=EF=BC=8C=E8=B0=83=E8=AF=95=E5=BA=94=E7=94=A8=E4=BB=8B=E7=BB=8D?= =?UTF-8?q?...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.gradle | 38 +++++++++++++---- powerbell/build.properties | 12 +++--- powerbell/src/main/AndroidManifest.xml | 6 +-- .../{GlobalApplication.java => App.java} | 14 +++---- .../studio/powerbell/MainActivity.java | 36 ++++++++++++---- .../powerbell/activities/AboutActivity.java | 42 ------------------- .../activities/BackgroundPictureActivity.java | 4 +- .../activities/ClearRecordActivity.java | 10 ++--- .../studio/powerbell/beans/AppConfigBean.java | 2 +- .../beans/BackgroundPictureBean.java | 2 +- .../powerbell/beans/BatteryInfoBean.java | 2 +- .../beans/ControlCenterServiceBean.java | 2 +- .../BackgroundPicturePreviewDialog.java | 4 +- .../powerbell/fragments/MainViewFragment.java | 6 +-- .../ControlCenterServiceReceiver.java | 5 +-- .../receivers/GlobalApplicationReceiver.java | 10 ++--- .../powerbell/receivers/MainReceiver.java | 6 +-- .../powerbell/services/AssistantService.java | 4 +- .../services/ControlCenterService.java | 13 +++--- .../powerbell/threads/RemindThread.java | 2 +- .../studio/powerbell/utils/AppCacheUtils.java | 2 +- .../powerbell/utils/AppConfigUtils.java | 6 +-- .../studio/powerbell/utils/FileUtils.java | 2 +- .../studio/powerbell/utils/ImageUtils.java | 2 +- .../src/main/res/layout/activity_about.xml | 25 ----------- .../src/main/res/layout/activity_main.xml | 4 +- 26 files changed, 115 insertions(+), 146 deletions(-) rename powerbell/src/main/java/cc/winboll/studio/powerbell/{GlobalApplication.java => App.java} (80%) delete mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java delete mode 100644 powerbell/src/main/res/layout/activity_about.xml diff --git a/powerbell/build.gradle b/powerbell/build.gradle index c1481e4..421c3f6 100644 --- a/powerbell/build.gradle +++ b/powerbell/build.gradle @@ -19,17 +19,17 @@ def genVersionName(def versionName){ android { compileSdkVersion 32 - buildToolsVersion "33.0.3" + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.powerbell" - minSdkVersion 24 - targetSdkVersion 30 + minSdkVersion 26 + targetSdkVersion 29 versionCode 6 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "4.0" + versionName "15.0" if(true) { versionName = genVersionName("${versionName}") } @@ -44,7 +44,32 @@ android { } dependencies { - api 'cc.winboll.studio:winboll-shared:1.8.0' + api fileTree(dir: 'libs', include: ['*.jar']) + + // SSH + api 'com.jcraft:jsch:0.1.55' + // Html 解析 + api 'org.jsoup:jsoup:1.13.1' + // 二维码类库 + api 'com.google.zxing:core:3.4.1' + api 'com.journeyapps:zxing-android-embedded:3.6.0' + // 应用介绍页类库 + api 'io.github.medyo:android-about-page:2.0.0' + // 网络连接类库 + api 'com.squareup.okhttp3:okhttp:4.4.1' + // AndroidX 类库 + api 'androidx.appcompat:appcompat:1.1.0' + api 'com.google.android.material:material:1.4.0' + //api 'androidx.viewpager:viewpager:1.0.0' + //api 'androidx.vectordrawable:vectordrawable:1.1.0' + //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' + //api 'androidx.fragment:fragment:1.1.0' + + api 'cc.winboll.studio:libappbase:15.0.9' + api 'cc.winboll.studio:libapputils:15.0.15' + api 'cc.winboll.studio:libaes:15.0.5' + + /*api 'cc.winboll.studio:winboll-shared:1.8.0' api 'io.github.medyo:android-about-page:2.0.0' api 'com.github.getActivity:ToastUtils:10.5' api 'com.jcraft:jsch:0.1.55' @@ -62,6 +87,5 @@ dependencies { api 'com.squareup.okhttp3:okhttp:4.4.1' api 'cc.winboll.studio:libaes:7.6.0' - - api fileTree(dir: 'libs', include: ['*.jar']) + */ } diff --git a/powerbell/build.properties b/powerbell/build.properties index b7f2176..b4ec05a 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Mar 22 16:06:33 HKT 2025 -stageCount=8 +#Mon Mar 24 12:22:12 GMT 2025 +stageCount=0 libraryProject= -baseVersion=4.0 -publishVersion=4.0.7 -buildCount=0 -baseBetaVersion=4.0.8 +baseVersion=15.0 +publishVersion=15.0.0 +buildCount=9 +baseBetaVersion=15.0.1 diff --git a/powerbell/src/main/AndroidManifest.xml b/powerbell/src/main/AndroidManifest.xml index 4391ee7..1fc6b61 100644 --- a/powerbell/src/main/AndroidManifest.xml +++ b/powerbell/src/main/AndroidManifest.xml @@ -39,7 +39,7 @@ - - - \ No newline at end of file + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/GlobalApplication.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java similarity index 80% rename from powerbell/src/main/java/cc/winboll/studio/powerbell/GlobalApplication.java rename to powerbell/src/main/java/cc/winboll/studio/powerbell/App.java index 3dba865..45c7677 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/GlobalApplication.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java @@ -1,15 +1,13 @@ package cc.winboll.studio.powerbell; import android.content.Context; -import android.view.Gravity; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver; import cc.winboll.studio.powerbell.utils.AppCacheUtils; import cc.winboll.studio.powerbell.utils.AppConfigUtils; -import cc.winboll.studio.shared.app.WinBollApplication; -import com.hjq.toast.ToastUtils; -import com.hjq.toast.style.WhiteToastStyle; -public class GlobalApplication extends WinBollApplication { +public class App extends GlobalApplication { public static final String TAG = "GlobalApplication"; @@ -23,11 +21,11 @@ public class GlobalApplication extends WinBollApplication { super.onCreate(); // 初始化 Toast 框架 - ToastUtils.init(this); + //ToastUtils.init(this); // 设置 Toast 布局样式 //ToastUtils.setView(R.layout.toast_custom_view); - ToastUtils.setStyle(new WhiteToastStyle()); - ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + //ToastUtils.setStyle(new WhiteToastStyle()); + //ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); // 设置数据配置存储工具 _mAppConfigUtils = getAppConfigUtils(this); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java index 874e4fc..4713f1e 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java @@ -12,14 +12,15 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import cc.winboll.studio.libaes.views.AToolbar; +import cc.winboll.studio.libaes.winboll.APPInfo; +import cc.winboll.studio.libaes.winboll.AboutActivityFactory; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.powerbell.MainActivity; -import cc.winboll.studio.powerbell.activities.AboutActivity; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; import cc.winboll.studio.powerbell.activities.ClearRecordActivity; import cc.winboll.studio.powerbell.fragments.MainViewFragment; -import cc.winboll.studio.shared.log.LogUtils; -import cc.winboll.studio.shared.log.LogView; public class MainActivity extends Activity { public static final String TAG = "MainActivity"; @@ -28,7 +29,7 @@ public class MainActivity extends Activity { public static MainActivity _mMainActivity; LogView mLogView; //ArrayList mlistFragment; - GlobalApplication mApplication; + App mApplication; //AppConfigUtils mAppConfigUtils; Menu mMenu; Fragment mCurrentShowFragment; @@ -48,7 +49,7 @@ public class MainActivity extends Activity { mLogView.updateLogView(); _mMainActivity = MainActivity.this; - mApplication = (GlobalApplication) getApplication(); + mApplication = (App) getApplication(); //mAppConfigUtils = AppConfigUtils.getInstance(mApplication); // 初始化工具栏 @@ -142,9 +143,10 @@ public class MainActivity extends Activity { super.onOptionsItemSelected(item); int menuItemId = item.getItemId(); if (menuItemId == R.id.action_about) { - Intent intent = new Intent(); - intent.setClass(this, AboutActivity.class); - startActivity(intent); + onAbout(); +// Intent intent = new Intent(); +// intent.setClass(this, AboutActivity.class); +// startActivity(intent); } else if (menuItemId == R.id.action_battery_reporter) { Intent intent = new Intent(); intent.setClass(this, BatteryReporterActivity.class); @@ -193,4 +195,22 @@ public class MainActivity extends Activity { moveTaskToBack(true); } } + + public void onAbout() { + String szBranchName = "powerbell"; + + APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); + appInfo.setAppName("PowerBell"); + appInfo.setAppIcon(R.drawable.ic_launcher); + appInfo.setAppDescription("PowerBell Description"); + appInfo.setAppGitName("APP"); + appInfo.setAppGitOwner("Studio"); + appInfo.setAppGitAPPBranch(szBranchName); + appInfo.setAppGitAPPSubProjectFolder(szBranchName); + appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=PowerBell"); + appInfo.setAppAPKName("PowerBell"); + appInfo.setAppAPKFolderName("PowerBell"); + AboutActivityFactory.showAboutActivity(this, appInfo); + //ToastUtils.show("onAbout"); + } } diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java deleted file mode 100644 index fa5e526..0000000 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java +++ /dev/null @@ -1,42 +0,0 @@ -package cc.winboll.studio.powerbell.activities; - -/** - * @Author ZhanGSKen@QQ.COM - * @Date 2024/07/12 13:33:59 - * @Describe AboutActivity - */ -import android.app.Activity; -import android.os.Bundle; -import android.view.View; -import cc.winboll.studio.libaes.views.AToolbar; -import cc.winboll.studio.powerbell.R; - -public class AboutActivity extends Activity { - - public static final String TAG = "AboutActivity"; - - AToolbar mAToolbar; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_about); - - // 初始化工具栏 - mAToolbar = (AToolbar) findViewById(R.id.toolbar); - setActionBar(mAToolbar); - //mAToolbar.setTitle(getTitle() + "-" + getString(R.string.subtitle_activity_backgroundpicture)); - mAToolbar.setSubtitle(R.string.subtitle_activity_about); - mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); - mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); - //mAToolbar.setBackgroundColor(getColor(R.color.colorPrimary)); - setActionBar(mAToolbar); - getActionBar().setDisplayHomeAsUpEnabled(true); - mAToolbar.setNavigationOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - finish(); - } - }); - } -} diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java index d004aa3..5a5fe70 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java @@ -13,6 +13,8 @@ import android.view.View; import android.widget.ImageView; import android.widget.Toast; import cc.winboll.studio.libaes.views.AToolbar; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; @@ -20,8 +22,6 @@ import cc.winboll.studio.powerbell.dialogs.BackgroundPicturePreviewDialog; import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; import cc.winboll.studio.powerbell.utils.FileUtils; import cc.winboll.studio.powerbell.utils.UriUtil; -import cc.winboll.studio.shared.log.LogUtils; -import com.hjq.toast.ToastUtils; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java index 19bbd28..489254c 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java @@ -7,14 +7,14 @@ import android.view.View; import android.widget.TextView; import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; import cc.winboll.studio.libaes.views.AToolbar; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.beans.BatteryInfoBean; import cc.winboll.studio.powerbell.receivers.ControlCenterServiceReceiver; import cc.winboll.studio.powerbell.utils.AppCacheUtils; import cc.winboll.studio.powerbell.utils.StringUtils; -import cc.winboll.studio.shared.log.LogUtils; -import com.hjq.toast.ToastUtils; import java.util.ArrayList; public class ClearRecordActivity extends Activity { @@ -23,13 +23,13 @@ public class ClearRecordActivity extends Activity { AToolbar mAToolbar; TextView mtvRecordText; - GlobalApplication mApplication; + App mApplication; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_clearrecord); - mApplication = (GlobalApplication) getApplication(); + mApplication = (App) getApplication(); // 初始化工具栏 mAToolbar = (AToolbar) findViewById(R.id.toolbar); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/AppConfigBean.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/AppConfigBean.java index 597c133..85d7a3c 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/AppConfigBean.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/AppConfigBean.java @@ -7,7 +7,7 @@ package cc.winboll.studio.powerbell.beans; */ import android.util.JsonReader; import android.util.JsonWriter; -import cc.winboll.studio.shared.app.BaseBean; +import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; import java.io.Serializable; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BackgroundPictureBean.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BackgroundPictureBean.java index 2e8f4fa..785607f 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BackgroundPictureBean.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BackgroundPictureBean.java @@ -7,7 +7,7 @@ package cc.winboll.studio.powerbell.beans; */ import android.util.JsonReader; import android.util.JsonWriter; -import cc.winboll.studio.shared.app.BaseBean; +import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; public class BackgroundPictureBean extends BaseBean { diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryInfoBean.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryInfoBean.java index b108ac4..3063c88 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryInfoBean.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/BatteryInfoBean.java @@ -2,7 +2,7 @@ package cc.winboll.studio.powerbell.beans; import android.util.JsonReader; import android.util.JsonWriter; -import cc.winboll.studio.shared.app.BaseBean; +import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; import java.io.Serializable; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/ControlCenterServiceBean.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/ControlCenterServiceBean.java index c7d1369..bd60336 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/ControlCenterServiceBean.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/beans/ControlCenterServiceBean.java @@ -7,7 +7,7 @@ package cc.winboll.studio.powerbell.beans; */ import android.util.JsonReader; import android.util.JsonWriter; -import cc.winboll.studio.shared.app.BaseBean; +import cc.winboll.studio.libappbase.BaseBean; import java.io.IOException; public class ControlCenterServiceBean extends BaseBean { diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/BackgroundPicturePreviewDialog.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/BackgroundPicturePreviewDialog.java index bf11607..e746271 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/BackgroundPicturePreviewDialog.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/dialogs/BackgroundPicturePreviewDialog.java @@ -1,5 +1,4 @@ package cc.winboll.studio.powerbell.dialogs; -import cc.winboll.studio.powerbell.R; import android.app.Dialog; import android.content.Context; import android.content.Intent; @@ -10,12 +9,13 @@ import android.view.View; import android.widget.Button; import android.widget.ImageView; import android.widget.Toast; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.powerbell.MainActivity; +import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; import cc.winboll.studio.powerbell.utils.FileUtils; import cc.winboll.studio.powerbell.utils.UriUtil; -import cc.winboll.studio.shared.log.LogUtils; import java.io.File; import java.io.IOException; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/fragments/MainViewFragment.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/fragments/MainViewFragment.java index 0c22da2..ea49fce 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/fragments/MainViewFragment.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/fragments/MainViewFragment.java @@ -17,7 +17,8 @@ import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.Switch; import android.widget.TextView; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.beans.BackgroundPictureBean; @@ -27,7 +28,6 @@ import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils; import cc.winboll.studio.powerbell.utils.ServiceUtils; import cc.winboll.studio.powerbell.views.BatteryDrawable; import cc.winboll.studio.powerbell.views.VerticalSeekBar; -import cc.winboll.studio.shared.log.LogUtils; import java.io.File; public class MainViewFragment extends Fragment { @@ -78,7 +78,7 @@ public class MainViewFragment extends Fragment { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mView = inflater.inflate(R.layout.fragment_mainview, container, false); _mMainViewFragment = MainViewFragment.this; - mAppConfigUtils = GlobalApplication.getAppConfigUtils(getActivity()); + mAppConfigUtils = App.getAppConfigUtils(getActivity()); // 获取指定ID的View实例 final View mainImageView = mView.findViewById(R.id.fragmentmainviewImageView1); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java index e18f5e4..53ae052 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/ControlCenterServiceReceiver.java @@ -4,15 +4,12 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.powerbell.beans.AppConfigBean; -import cc.winboll.studio.powerbell.beans.BatteryData; import cc.winboll.studio.powerbell.services.ControlCenterService; import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.BatteryUtils; -import cc.winboll.studio.shared.log.LogUtils; import java.lang.ref.WeakReference; -import java.util.ArrayList; -import java.util.List; public class ControlCenterServiceReceiver extends BroadcastReceiver { public static final String TAG = ControlCenterServiceReceiver.class.getSimpleName(); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java index 4eb3ffe..1f533a5 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/GlobalApplicationReceiver.java @@ -4,7 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.fragments.MainViewFragment; import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.BatteryUtils; @@ -15,7 +15,7 @@ public class GlobalApplicationReceiver extends BroadcastReceiver { public static final String TAG = "GlobalApplicationReceiver"; AppConfigUtils mAppConfigUtils; - GlobalApplication mGlobalApplication; + App mGlobalApplication; // 存储电量指示值, // 用于校验电量消息时的电量变化 static volatile int _mnTheQuantityOfElectricityOld = -1; @@ -24,10 +24,10 @@ public class GlobalApplicationReceiver extends BroadcastReceiver { // 便利封装 registerAction() 函数 GlobalApplicationReceiver mReceiver; - public GlobalApplicationReceiver(GlobalApplication globalApplication) { + public GlobalApplicationReceiver(App globalApplication) { mReceiver = this; mGlobalApplication = globalApplication; - mAppConfigUtils = GlobalApplication.getAppConfigUtils(mGlobalApplication); + mAppConfigUtils = App.getAppConfigUtils(mGlobalApplication); } @Override @@ -47,7 +47,7 @@ public class GlobalApplicationReceiver extends BroadcastReceiver { // 电池状态改变先取消旧的提醒消息 //NotificationHelper.cancelRemindNotification(context); - GlobalApplication.getAppCacheUtils(context).addChangingTime(nTheQuantityOfElectricity); + App.getAppCacheUtils(context).addChangingTime(nTheQuantityOfElectricity); MainViewFragment.sendMsgCurrentValueBattery(nTheQuantityOfElectricity); // 保存好新的电池状态标志 _mIsCharging = isCharging; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/MainReceiver.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/MainReceiver.java index 4e30152..9a4aab6 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/MainReceiver.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/receivers/MainReceiver.java @@ -9,10 +9,10 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.services.ControlCenterService; import cc.winboll.studio.powerbell.utils.ServiceUtils; -import cc.winboll.studio.shared.log.LogUtils; public class MainReceiver extends BroadcastReceiver { @@ -27,7 +27,7 @@ public class MainReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { String szAction = intent.getAction(); if (szAction.equals(ACTION_BOOT_COMPLETED)) { - boolean isEnableService = GlobalApplication.getAppConfigUtils(context).getIsEnableService(); + boolean isEnableService = App.getAppConfigUtils(context).getIsEnableService(); if (isEnableService) { if (ServiceUtils.isServiceAlive(context.getApplicationContext(), ControlCenterService.class.getName()) == false) { LogUtils.d(TAG, "wakeupAndBindMain() Wakeup... ControlCenterService"); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/AssistantService.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/AssistantService.java index 893bfb4..48a6a7c 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/AssistantService.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/AssistantService.java @@ -6,7 +6,7 @@ import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.services.ControlCenterService; import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.ServiceUtils; @@ -29,7 +29,7 @@ public class AssistantService extends Service { public void onCreate() { //LogUtils.d(TAG, "onCreate"); super.onCreate(); - mAppConfigUtils = GlobalApplication.getAppConfigUtils(this); + mAppConfigUtils = App.getAppConfigUtils(this); //mMyBinder = new MyBinder(); if (mMyServiceConnection == null) { diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java index 2d1b7aa..926fb71 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/services/ControlCenterService.java @@ -16,7 +16,9 @@ import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.widget.RemoteViews; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.utils.ToastUtils; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.MainActivity; import cc.winboll.studio.powerbell.R; import cc.winboll.studio.powerbell.beans.AppConfigBean; @@ -30,9 +32,6 @@ import cc.winboll.studio.powerbell.utils.AppConfigUtils; import cc.winboll.studio.powerbell.utils.NotificationHelper; import cc.winboll.studio.powerbell.utils.ServiceUtils; import cc.winboll.studio.powerbell.utils.StringUtils; -import cc.winboll.studio.shared.log.LogUtils; -import com.hjq.toast.ToastUtils; -import android.graphics.Color; public class ControlCenterService extends Service { @@ -69,8 +68,8 @@ public class ControlCenterService extends Service { super.onCreate(); _mControlCenterService = ControlCenterService.this; isServiceRunning = false; - mAppConfigUtils = GlobalApplication.getAppConfigUtils(this); - mAppCacheUtils = GlobalApplication.getAppCacheUtils(this); + mAppConfigUtils = App.getAppConfigUtils(this); + mAppCacheUtils = App.getAppCacheUtils(this); mNotificationHelper = new NotificationHelper(ControlCenterService.this); @@ -131,7 +130,7 @@ public class ControlCenterService extends Service { } NotificationMessage createNotificationMessage() { - String szTitle = ((GlobalApplication)getApplication()).getString(R.string.app_name); + String szTitle = ((App)getApplication()).getString(R.string.app_name); String szContent = getValuesString() + " {?} " + StringUtils.formatPCMListString(mAppCacheUtils.getArrayListBatteryInfo()); return new NotificationMessage(szTitle, szContent); } diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/threads/RemindThread.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/threads/RemindThread.java index 69ed6bf..59d74e6 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/threads/RemindThread.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/threads/RemindThread.java @@ -2,8 +2,8 @@ package cc.winboll.studio.powerbell.threads; import android.content.Context; import android.os.Message; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.powerbell.handlers.ControlCenterServiceHandler; -import cc.winboll.studio.shared.log.LogUtils; import java.lang.ref.WeakReference; public class RemindThread extends Thread { diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppCacheUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppCacheUtils.java index 8233777..6d21004 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppCacheUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppCacheUtils.java @@ -1,8 +1,8 @@ package cc.winboll.studio.powerbell.utils; import android.content.Context; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.powerbell.beans.BatteryInfoBean; -import cc.winboll.studio.shared.log.LogUtils; import java.util.ArrayList; public class AppCacheUtils { diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java index 4a21202..a9e93d5 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/AppConfigUtils.java @@ -2,14 +2,14 @@ package cc.winboll.studio.powerbell.utils; import android.app.Activity; import android.content.Context; -import cc.winboll.studio.powerbell.GlobalApplication; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.powerbell.App; import cc.winboll.studio.powerbell.MainActivity; import cc.winboll.studio.powerbell.beans.AppConfigBean; import cc.winboll.studio.powerbell.beans.ControlCenterServiceBean; import cc.winboll.studio.powerbell.dialogs.YesNoAlertDialog; import cc.winboll.studio.powerbell.fragments.MainViewFragment; import cc.winboll.studio.powerbell.services.ControlCenterService; -import cc.winboll.studio.shared.log.LogUtils; import java.io.File; // 应用配置工具类 @@ -42,7 +42,7 @@ public class AppConfigUtils { volatile String mszBackgroundFileName = ""; // 保存应用实例 - GlobalApplication mApplication; + App mApplication; AppConfigUtils(Context context) { mContext = context; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/FileUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/FileUtils.java index 2ca8e15..59caa2c 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/FileUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/FileUtils.java @@ -2,7 +2,7 @@ package cc.winboll.studio.powerbell.utils; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; -import cc.winboll.studio.shared.log.LogUtils; +import cc.winboll.studio.libappbase.LogUtils; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io.File; diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageUtils.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageUtils.java index 77cfa81..0528b07 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageUtils.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/utils/ImageUtils.java @@ -3,7 +3,7 @@ package cc.winboll.studio.powerbell.utils; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; -import cc.winboll.studio.shared.log.LogUtils; +import cc.winboll.studio.libappbase.LogUtils; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; diff --git a/powerbell/src/main/res/layout/activity_about.xml b/powerbell/src/main/res/layout/activity_about.xml deleted file mode 100644 index db74ef6..0000000 --- a/powerbell/src/main/res/layout/activity_about.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - diff --git a/powerbell/src/main/res/layout/activity_main.xml b/powerbell/src/main/res/layout/activity_main.xml index 031be4a..874c31a 100644 --- a/powerbell/src/main/res/layout/activity_main.xml +++ b/powerbell/src/main/res/layout/activity_main.xml @@ -33,10 +33,10 @@ - From 66eb8e06ea59a20ec4aaab2bcce11741a9022679 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Tue, 25 Mar 2025 02:30:45 +0800 Subject: [PATCH 011/132] =?UTF-8?q?=E5=BA=94=E7=94=A8=E4=BB=8B=E7=BB=8D?= =?UTF-8?q?=E9=A1=B5=E5=9F=BA=E6=9C=AC=E8=B0=83=E8=AF=95=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- powerbell/build.gradle | 6 +- powerbell/build.properties | 4 +- powerbell/src/beta/AndroidManifest.xml | 4 +- powerbell/src/main/AndroidManifest.xml | 12 +--- .../java/cc/winboll/studio/powerbell/App.java | 10 +++ .../studio/powerbell/MainActivity.java | 28 ++------ .../powerbell/activities/AboutActivity.java | 65 +++++++++++++++++++ .../activities/BackgroundPictureActivity.java | 4 +- .../activities/ClearRecordActivity.java | 4 +- .../src/main/res/layout/activity_about.xml | 31 +++++++++ powerbell/src/main/res/values/attrs.xml | 6 -- powerbell/src/main/res/values/styles.xml | 1 + powerbell/src/stage/AndroidManifest.xml | 6 +- 13 files changed, 125 insertions(+), 56 deletions(-) create mode 100644 powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java create mode 100644 powerbell/src/main/res/layout/activity_about.xml diff --git a/powerbell/build.gradle b/powerbell/build.gradle index 421c3f6..7897886 100644 --- a/powerbell/build.gradle +++ b/powerbell/build.gradle @@ -46,6 +46,8 @@ android { dependencies { api fileTree(dir: 'libs', include: ['*.jar']) + // 应用介绍页类库 + api 'io.github.medyo:android-about-page:2.0.0' // SSH api 'com.jcraft:jsch:0.1.55' // Html 解析 @@ -53,8 +55,6 @@ dependencies { // 二维码类库 api 'com.google.zxing:core:3.4.1' api 'com.journeyapps:zxing-android-embedded:3.6.0' - // 应用介绍页类库 - api 'io.github.medyo:android-about-page:2.0.0' // 网络连接类库 api 'com.squareup.okhttp3:okhttp:4.4.1' // AndroidX 类库 @@ -67,7 +67,7 @@ dependencies { api 'cc.winboll.studio:libappbase:15.0.9' api 'cc.winboll.studio:libapputils:15.0.15' - api 'cc.winboll.studio:libaes:15.0.5' + api 'cc.winboll.studio:libaes:15.0.7' /*api 'cc.winboll.studio:winboll-shared:1.8.0' api 'io.github.medyo:android-about-page:2.0.0' diff --git a/powerbell/build.properties b/powerbell/build.properties index b4ec05a..cb84fb0 100644 --- a/powerbell/build.properties +++ b/powerbell/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon Mar 24 12:22:12 GMT 2025 +#Mon Mar 24 18:29:48 GMT 2025 stageCount=0 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=9 +buildCount=39 baseBetaVersion=15.0.1 diff --git a/powerbell/src/beta/AndroidManifest.xml b/powerbell/src/beta/AndroidManifest.xml index a2a877c..7ca0b75 100644 --- a/powerbell/src/beta/AndroidManifest.xml +++ b/powerbell/src/beta/AndroidManifest.xml @@ -6,20 +6,18 @@ tools:replace="android:icon" android:icon="@drawable/ic_launcher_beta"> - + diff --git a/powerbell/src/main/AndroidManifest.xml b/powerbell/src/main/AndroidManifest.xml index 1fc6b61..93ad2bc 100644 --- a/powerbell/src/main/AndroidManifest.xml +++ b/powerbell/src/main/AndroidManifest.xml @@ -28,16 +28,6 @@ - - - - - - - - - - + + diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java index 45c7677..a41290c 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/App.java @@ -6,6 +6,7 @@ import cc.winboll.studio.libappbase.utils.ToastUtils; import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver; import cc.winboll.studio.powerbell.utils.AppCacheUtils; import cc.winboll.studio.powerbell.utils.AppConfigUtils; +import cc.winboll.studio.libapputils.bean.DebugBean; public class App extends GlobalApplication { @@ -19,6 +20,15 @@ public class App extends GlobalApplication { @Override public void onCreate() { super.onCreate(); + // 设置应用调试标志 + DebugBean debugBean = DebugBean.loadBean(this, DebugBean.class); + if (debugBean == null) { + //ToastUtils.show("debugBean == null"); + setIsDebuging(this, false); + } else { + //ToastUtils.show("saveDebugStatus(" + String.valueOf(debugBean.isDebuging()) + ")"); + setIsDebuging(this, debugBean.isDebuging()); + } // 初始化 Toast 框架 //ToastUtils.init(this); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java index 4713f1e..3e7527b 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/MainActivity.java @@ -12,11 +12,10 @@ import android.view.Menu; import android.view.MenuItem; import android.widget.Toast; import cc.winboll.studio.libaes.views.AToolbar; -import cc.winboll.studio.libaes.winboll.APPInfo; -import cc.winboll.studio.libaes.winboll.AboutActivityFactory; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.LogView; import cc.winboll.studio.powerbell.MainActivity; +import cc.winboll.studio.powerbell.activities.AboutActivity; import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity; import cc.winboll.studio.powerbell.activities.BatteryReporterActivity; import cc.winboll.studio.powerbell.activities.ClearRecordActivity; @@ -55,6 +54,7 @@ public class MainActivity extends Activity { // 初始化工具栏 mAToolbar = (AToolbar) findViewById(R.id.toolbar); setActionBar(mAToolbar); + //mAToolbar.setSubtitle("Main"); mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); if (mMainViewFragment == null) { @@ -143,10 +143,8 @@ public class MainActivity extends Activity { super.onOptionsItemSelected(item); int menuItemId = item.getItemId(); if (menuItemId == R.id.action_about) { - onAbout(); -// Intent intent = new Intent(); -// intent.setClass(this, AboutActivity.class); -// startActivity(intent); + Intent intent = new Intent(this, AboutActivity.class); + startActivity(intent); } else if (menuItemId == R.id.action_battery_reporter) { Intent intent = new Intent(); intent.setClass(this, BatteryReporterActivity.class); @@ -195,22 +193,4 @@ public class MainActivity extends Activity { moveTaskToBack(true); } } - - public void onAbout() { - String szBranchName = "powerbell"; - - APPInfo appInfo = AboutActivityFactory.buildDefaultAPPInfo(); - appInfo.setAppName("PowerBell"); - appInfo.setAppIcon(R.drawable.ic_launcher); - appInfo.setAppDescription("PowerBell Description"); - appInfo.setAppGitName("APP"); - appInfo.setAppGitOwner("Studio"); - appInfo.setAppGitAPPBranch(szBranchName); - appInfo.setAppGitAPPSubProjectFolder(szBranchName); - appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=PowerBell"); - appInfo.setAppAPKName("PowerBell"); - appInfo.setAppAPKFolderName("PowerBell"); - AboutActivityFactory.showAboutActivity(this, appInfo); - //ToastUtils.show("onAbout"); - } } diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java new file mode 100644 index 0000000..26edb7c --- /dev/null +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/AboutActivity.java @@ -0,0 +1,65 @@ +package cc.winboll.studio.powerbell.activities; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/25 01:16:32 + * @Describe 应用介绍窗口 + */ +import android.app.Activity; +import android.content.Context; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import cc.winboll.studio.libaes.views.AToolbar; +import cc.winboll.studio.libaes.winboll.APPInfo; +import cc.winboll.studio.libaes.winboll.AboutView; +import cc.winboll.studio.powerbell.R; + +public class AboutActivity extends Activity { + + Context mContext; + + public static final String TAG = "AboutActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_about); + mContext = this; + + // 初始化工具栏 + AToolbar mAToolbar = (AToolbar) findViewById(R.id.toolbar); + setActionBar(mAToolbar); + mAToolbar.setSubtitle(getString(R.string.text_about)); + //mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); + getActionBar().setDisplayHomeAsUpEnabled(true); + + AboutView aboutView = CreateAboutView(); + // 在 Activity 的 onCreate 或其他生命周期方法中调用 + LinearLayout llRoot = findViewById(R.id.root_ll); + //layout.setOrientation(LinearLayout.VERTICAL); + // 创建布局参数(宽度和高度) + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ); + llRoot.addView(aboutView, params); + + } + + public AboutView CreateAboutView() { + String szBranchName = "powerbell"; + APPInfo appInfo = new APPInfo(); + appInfo.setAppName(getString(R.string.app_name)); + appInfo.setAppIcon(R.drawable.ic_launcher); + appInfo.setAppDescription(getString(R.string.app_description)); + appInfo.setAppGitName("APP"); + appInfo.setAppGitOwner("Studio"); + appInfo.setAppGitAPPBranch(szBranchName); + appInfo.setAppGitAPPSubProjectFolder(szBranchName); + appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=PowerBell"); + appInfo.setAppAPKName("PowerBell"); + appInfo.setAppAPKFolderName("PowerBell"); + return new AboutView(mContext, appInfo); + } +} diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java index 5a5fe70..aceea9f 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/BackgroundPictureActivity.java @@ -84,8 +84,8 @@ implements BackgroundPicturePreviewDialog.IOnRecivedPictureListener { setActionBar(mAToolbar); //mAToolbar.setTitle(getTitle() + "-" + getString(R.string.subtitle_activity_backgroundpicture)); mAToolbar.setSubtitle(R.string.subtitle_activity_backgroundpicture); - mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); - mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); + //mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); + //mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); //mAToolbar.setBackgroundColor(getColor(R.color.colorPrimary)); setActionBar(mAToolbar); getActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java index 489254c..0ce0f16 100644 --- a/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java +++ b/powerbell/src/main/java/cc/winboll/studio/powerbell/activities/ClearRecordActivity.java @@ -36,8 +36,8 @@ public class ClearRecordActivity extends Activity { setActionBar(mAToolbar); //mAToolbar.setTitle(getTitle() + " - " + getString(R.string.subtitle_activity_clearrecord)); mAToolbar.setSubtitle(R.string.subtitle_activity_clearrecord); - mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); - mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); + //mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText); + //mAToolbar.setSubtitleTextAppearance(this, R.style.Toolbar_SubTitleText); //mAToolbar.setBackgroundColor(getColor(R.color.colorPrimary)); setActionBar(mAToolbar); getActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/powerbell/src/main/res/layout/activity_about.xml b/powerbell/src/main/res/layout/activity_about.xml new file mode 100644 index 0000000..2a679e4 --- /dev/null +++ b/powerbell/src/main/res/layout/activity_about.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/powerbell/src/main/res/values/attrs.xml b/powerbell/src/main/res/values/attrs.xml index f0b8edb..045e125 100644 --- a/powerbell/src/main/res/values/attrs.xml +++ b/powerbell/src/main/res/values/attrs.xml @@ -1,9 +1,3 @@ - - - - - - diff --git a/powerbell/src/main/res/values/styles.xml b/powerbell/src/main/res/values/styles.xml index e3ee98a..9683860 100644 --- a/powerbell/src/main/res/values/styles.xml +++ b/powerbell/src/main/res/values/styles.xml @@ -12,6 +12,7 @@ - + + diff --git a/timestamp/src/stage/AndroidManifest.xml b/timestamp/src/stage/AndroidManifest.xml new file mode 100644 index 0000000..ee78d9f --- /dev/null +++ b/timestamp/src/stage/AndroidManifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/timestamp/src/stage/res/values/strings.xml b/timestamp/src/stage/res/values/strings.xml new file mode 100644 index 0000000..ace0c41 --- /dev/null +++ b/timestamp/src/stage/res/values/strings.xml @@ -0,0 +1,6 @@ + + + + + + From f0a29dc7a9ad4c71391db80fa5b5405848dd61f1 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 5 May 2025 10:45:25 +0800 Subject: [PATCH 058/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B8=B8=E9=A9=BB?= =?UTF-8?q?=E9=80=9A=E7=9F=A5=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- timestamp/build.properties | 4 +- timestamp/src/main/AndroidManifest.xml | 7 + .../studio/timestamp/AssistantService.java | 112 ++++++++++ .../studio/timestamp/MainActivity.java | 11 +- .../winboll/studio/timestamp/MainService.java | 157 ++++++++++++++ .../studio/timestamp/models/AppConfigs.java | 128 +++++++++++ .../studio/timestamp/utils/FileUtil.java | 47 ++++ .../timestamp/utils/NotificationHelper.java | 201 ++++++++++++++++++ .../timestamp/utils/NotificationUtil.java | 90 ++++++++ .../studio/timestamp/utils/ServiceUtil.java | 35 +++ .../src/main/res/layout/activity_main.xml | 20 +- timestamp/src/main/res/values/strings.xml | 1 + 12 files changed, 804 insertions(+), 9 deletions(-) create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/AssistantService.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/models/AppConfigs.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/FileUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ServiceUtil.java diff --git a/timestamp/build.properties b/timestamp/build.properties index 640d410..1c9d593 100644 --- a/timestamp/build.properties +++ b/timestamp/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun May 04 14:02:22 GMT 2025 +#Mon May 05 02:43:50 GMT 2025 stageCount=0 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=2 +buildCount=8 baseBetaVersion=15.0.1 diff --git a/timestamp/src/main/AndroidManifest.xml b/timestamp/src/main/AndroidManifest.xml index 29c023d..bff1a04 100644 --- a/timestamp/src/main/AndroidManifest.xml +++ b/timestamp/src/main/AndroidManifest.xml @@ -3,6 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" package="cc.winboll.studio.timestamp"> + + + + + + + diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/AssistantService.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/AssistantService.java new file mode 100644 index 0000000..26f5b7c --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/AssistantService.java @@ -0,0 +1,112 @@ +package cc.winboll.studio.timestamp; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:49 + * @Describe MainService 守护进程服务 + */ +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import cc.winboll.studio.timestamp.AssistantService; +import cc.winboll.studio.timestamp.MainService; +import cc.winboll.studio.timestamp.models.AppConfigs; +import cc.winboll.studio.timestamp.utils.ServiceUtil; + +public class AssistantService extends Service { + + public static final String TAG = "AssistantService"; + + //MyBinder mMyBinder; + MyServiceConnection mMyServiceConnection; + volatile boolean mIsThreadAlive; + + @Override + public IBinder onBind(Intent intent) { + //return mMyBinder; + return null; + } + + @Override + public void onCreate() { + //LogUtils.d(TAG, "call onCreate()"); + super.onCreate(); + + //mMyBinder = new MyBinder(); + if (mMyServiceConnection == null) { + mMyServiceConnection = new MyServiceConnection(); + } + // 设置运行参数 + mIsThreadAlive = false; + run(); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + //LogUtils.d(TAG, "call onStartCommand(...)"); + run(); + AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(); + return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); + } + + /*class MyBinder extends IMyAidlInterface.Stub { + @Override + public String getServiceName() { + return AssistantService.class.getSimpleName(); + } + }*/ + + @Override + public void onDestroy() { + //LogUtils.d(TAG, "call onDestroy()"); + mIsThreadAlive = false; + super.onDestroy(); + } + + // 运行服务内容 + // + void run() { + //LogUtils.d(TAG, "call run()"); + AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(); + if (appConfigs.isEnableService()) { + if (mIsThreadAlive == false) { + // 设置运行状态 + mIsThreadAlive = true; + // 唤醒和绑定主进程 + wakeupAndBindMain(); + } + } + } + + // 唤醒和绑定主进程 + // + void wakeupAndBindMain() { + if (ServiceUtil.isServiceAlive(getApplicationContext(), MainService.class.getName()) == false) { + //LogUtils.d(TAG, "wakeupAndBindMain() Wakeup... ControlCenterService"); + startForegroundService(new Intent(AssistantService.this, MainService.class)); + } + //LogUtils.d(TAG, "wakeupAndBindMain() Bind... ControlCenterService"); + bindService(new Intent(AssistantService.this, MainService.class), mMyServiceConnection, Context.BIND_IMPORTANT); + } + + // 主进程与守护进程连接时需要用到此类 + // + class MyServiceConnection implements ServiceConnection { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + //LogUtils.d(TAG, "call onServiceConnected(...)"); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + //LogUtils.d(TAG, "call onServiceDisconnected(...)"); + AppConfigs appConfigs = AppConfigs.getInstance(AssistantService.this).loadAppConfigs(); + if (appConfigs.isEnableService()) { + wakeupAndBindMain(); + } + } + } +} diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java index 0184c2f..b557a09 100644 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java @@ -1,14 +1,17 @@ package cc.winboll.studio.timestamp; import android.os.Bundle; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import cc.winboll.studio.libappbase.LogView; import com.hjq.toast.ToastUtils; +import android.widget.Switch; public class MainActivity extends AppCompatActivity { LogView mLogView; + Switch mswEnableMainService; @Override protected void onCreate(Bundle savedInstanceState) { @@ -18,8 +21,10 @@ public class MainActivity extends AppCompatActivity { Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar); setSupportActionBar(toolbar); + mswEnableMainService = findViewById(R.id.activitymainSwitch1); + mLogView = findViewById(R.id.logview); - + ToastUtils.show("onCreate"); } @@ -28,4 +33,8 @@ public class MainActivity extends AppCompatActivity { super.onResume(); mLogView.start(); } + + public void onSetMainServiceStatus(View view) { + MainService.setMainServiceStatus(this, mswEnableMainService.isChecked()); + } } diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java new file mode 100644 index 0000000..4fd05e6 --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java @@ -0,0 +1,157 @@ +package cc.winboll.studio.timestamp; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:47 + * @Describe 主要服务 + */ +import android.app.Notification; +import android.app.Service; +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.content.ServiceConnection; +import android.os.IBinder; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.timestamp.AssistantService; +import cc.winboll.studio.timestamp.MainService; +import cc.winboll.studio.timestamp.models.AppConfigs; +import cc.winboll.studio.timestamp.utils.NotificationHelper; +import cc.winboll.studio.timestamp.utils.ServiceUtil; + +public class MainService extends Service { + + public static String TAG = "MainService"; + + Notification notification; + private static boolean _mIsServiceAlive; + public static final String EXTRA_APKFILEPATH = "EXTRA_APKFILEPATH"; + final static int MSG_INSTALL_APK = 0; + //Handler mHandler; + MyServiceConnection mMyServiceConnection; + MainActivity mInstallCompletedFollowUpActivity; + + @Override + public IBinder onBind(Intent intent) { + return null; + } + + @Override + public void onCreate() { + super.onCreate(); + LogUtils.d(TAG, "onCreate()"); + _mIsServiceAlive = false; + //mHandler = new MyHandler(MainService.this); + if (mMyServiceConnection == null) { + mMyServiceConnection = new MyServiceConnection(); + } + + run(); + } + + private void run() { + AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(); + if (appConfigs.isEnableService()) { + if (_mIsServiceAlive == false) { + // 设置运行状态 + _mIsServiceAlive = true; + + + // 显示前台通知栏 + NotificationHelper helper = new NotificationHelper(this); + Intent intent = new Intent(this, MainActivity.class); + notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); + startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); + + // 唤醒守护进程 + wakeupAndBindAssistant(); + + LogUtils.d(TAG, "running..."); + + } else { + LogUtils.d(TAG, "_mIsServiceAlive is " + Boolean.toString(_mIsServiceAlive)); + + } + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + + _mIsServiceAlive = false; + LogUtils.d(TAG, "onDestroy()"); + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + LogUtils.d(TAG, "onStartCommand"); + + run(); + AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(); + + return appConfigs.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); + } + + public static void setMainServiceStatus(Context context, boolean isEnable) { + AppConfigs appConfigs = AppConfigs.getInstance(context).loadAppConfigs(); + appConfigs.setIsEnableService(isEnable); + Intent intent = new Intent(context, MainService.class); + if (isEnable) { + context.startService(intent); + } else { + context.stopService(intent); + } + } + + // 主进程与守护进程连接时需要用到此类 + // + private class MyServiceConnection implements ServiceConnection { + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + //LogUtils.d(TAG, "call onServiceConnected(...)"); + } + + @Override + public void onServiceDisconnected(ComponentName name) { + //LogUtils.d(TAG, "call onServiceConnected(...)"); + AppConfigs appConfigs = AppConfigs.getInstance(MainService.this).loadAppConfigs(); + if (appConfigs.isEnableService()) { + // 唤醒守护进程 + wakeupAndBindAssistant(); + } + } + } + + // 唤醒和绑定守护进程 + // + void wakeupAndBindAssistant() { + if (ServiceUtil.isServiceAlive(getApplicationContext(), AssistantService.class.getName()) == false) { + startService(new Intent(MainService.this, AssistantService.class)); + //LogUtils.d(TAG, "call wakeupAndBindAssistant() : Binding... AssistantService"); + bindService(new Intent(MainService.this, AssistantService.class), mMyServiceConnection, Context.BIND_IMPORTANT); + } + } + + // + // 服务事务处理类 + // +// static class MyHandler extends Handler { +// WeakReference weakReference; +// MyHandler(MainService service) { +// weakReference = new WeakReference(service); +// } +// public void handleMessage(Message message) { +// MainService theActivity = weakReference.get(); +// switch (message.what) { +// case MSG_INSTALL_APK: +// { +// break; +// } +// default: +// break; +// } +// super.handleMessage(message); +// } +// } +} diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/models/AppConfigs.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/models/AppConfigs.java new file mode 100644 index 0000000..7457766 --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/models/AppConfigs.java @@ -0,0 +1,128 @@ +package cc.winboll.studio.timestamp.models; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:51 + * @Describe 应用配置数据模型 + */ +import android.content.Context; +import android.util.JsonReader; +import android.util.JsonWriter; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.timestamp.models.AppConfigs; +import cc.winboll.studio.timestamp.utils.FileUtil; +import java.io.IOException; +import java.io.Serializable; +import java.io.StringReader; +import java.io.StringWriter; + +public class AppConfigs implements Serializable { + + public static final String TAG = "AppConfigs"; + + volatile static AppConfigs _AppConfigs; + Context mContext; + + // 是否启动服务 + boolean isEnableService; + + AppConfigs(Context context) { + this.mContext = context; + this.isEnableService = false; + } + + public synchronized static AppConfigs getInstance(Context context) { + if (_AppConfigs == null) { + _AppConfigs = new AppConfigs(context); + _AppConfigs.loadAppConfigs(); + } + return _AppConfigs; + } + + public void setIsEnableService(boolean isEnableService) { + this.isEnableService = isEnableService; + } + + public boolean isEnableService() { + return isEnableService; + } + + @Override + public String toString() { + // 创建 JsonWriter 对象 + StringWriter stringWriter = new StringWriter(); + JsonWriter writer = new + JsonWriter(stringWriter); + try { + // 开始 JSON 对象 + writer.beginObject(); + + // 写入键值对 + writer.name("isEnableService").value(this.isEnableService); + + // 结束 JSON 对象 + writer.endObject(); + return stringWriter.toString(); + } catch (IOException e) { + LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); + } + // 获取 JSON 字符串 + return ""; + } + + public AppConfigs parseAppConfigs(String szAppConfigs) { + // 创建 JsonWriter 对象 + StringReader stringReader = new StringReader(szAppConfigs); + JsonReader jsonReader = new + JsonReader(stringReader); + try { + // 开始 JSON 对象 + jsonReader.beginObject(); + + // 写入键值对 + while (jsonReader.hasNext()) { + String name = jsonReader.nextName(); + if (name.equals("isEnableService")) { + setIsEnableService(jsonReader.nextBoolean()); + } else { + jsonReader.skipValue(); + } + } + // 结束 JSON 对象 + jsonReader.endObject(); + return this; + } catch (IOException e) { + LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); + } + // 获取 JSON 字符串 + return null; + } + + static String getDataPath(Context context) { + return context.getExternalFilesDir(TAG) + "/" + TAG + ".json"; + } + + public AppConfigs loadAppConfigs() { + AppConfigs appConfigs = null; + try { + String szJson = FileUtil.readFile(getDataPath(mContext)); + appConfigs = parseAppConfigs(szJson); + + if (appConfigs != null) { + _AppConfigs = appConfigs; + } + } catch (IOException e) { + LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); + } + return _AppConfigs; + } + + public void saveAppConfigs(AppConfigs appConfigs) { + try { + String szJson = appConfigs.toString(); + FileUtil.writeFile(getDataPath(mContext), szJson); + } catch (IOException e) { + LogUtils.d(TAG, e.getMessage(), Thread.currentThread().getStackTrace()); + } + } +} diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/FileUtil.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/FileUtil.java new file mode 100644 index 0000000..883e443 --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/FileUtil.java @@ -0,0 +1,47 @@ +package cc.winboll.studio.timestamp.utils; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:52 + * @Describe 文件管理工具类 + */ +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.nio.charset.StandardCharsets; + +public class FileUtil { + + public static final String TAG = "FileUtil"; + + // + // 把字符串写入文件,指定 UTF-8 编码 + // + public static void writeFile(String filePath, String content) throws IOException { + File file = new File(filePath); + FileOutputStream outputStream = new FileOutputStream(file); + OutputStreamWriter writer = new OutputStreamWriter(outputStream, StandardCharsets.UTF_8); + writer.write(content); + writer.close(); + } + + // + // 读取文件到字符串,指定 UTF-8 编码 + // + public static String readFile(String filePath) throws IOException { + File file = new File(filePath); + FileInputStream inputStream = new FileInputStream(file); + InputStreamReader reader = new InputStreamReader(inputStream, StandardCharsets.UTF_8); + StringBuilder content = new StringBuilder(); + int character; + while ((character = reader.read()) != -1) { + content.append((char) character); + } + reader.close(); + return content.toString(); + } + +} diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java new file mode 100644 index 0000000..0e9ef9a --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java @@ -0,0 +1,201 @@ +package cc.winboll.studio.timestamp.utils; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 10:36 + * @Describe 应用通知工具类 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.widget.RemoteViews; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.timestamp.R; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NotificationHelper { + public static final String TAG = "NotificationHelper"; + + // 渠道ID和名称 + private static final String CHANNEL_ID_FOREGROUND = "foreground_channel"; + private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service"; + private static final String CHANNEL_ID_TEMPORARY = "temporary_channel"; + private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications"; + + // 通知ID + public static final int FOREGROUND_NOTIFICATION_ID = 1001; + public static final int TEMPORARY_NOTIFICATION_ID = 2001; + + private final Context mContext; + private final NotificationManager mNotificationManager; + + // 示例:维护当前使用的渠道ID列表 + // 键:渠道ID,值:渠道重要性级别 + Map activeChannelConfigs = new HashMap<>(); + + public NotificationHelper(Context context) { + mContext = context; + mNotificationManager = context.getSystemService(NotificationManager.class); + + // 初始化配置 + activeChannelConfigs.put( + CHANNEL_ID_FOREGROUND, + NotificationManager.IMPORTANCE_HIGH + ); + activeChannelConfigs.put( + CHANNEL_ID_TEMPORARY, + NotificationManager.IMPORTANCE_DEFAULT + ); + + createNotificationChannels(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createForegroundChannel(); + createTemporaryChannel(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createForegroundChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_FOREGROUND, + CHANNEL_NAME_FOREGROUND, + NotificationManager.IMPORTANCE_LOW + ); + channel.setDescription("Persistent service notifications"); + channel.setSound(null, null); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createTemporaryChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_TEMPORARY, + CHANNEL_NAME_TEMPORARY, + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Temporary alert notifications"); + channel.setSound(null, null); + channel.enableVibration(true); + channel.setVibrationPattern(new long[]{100, 200, 300, 400}); + channel.setBypassDnd(true); + mNotificationManager.createNotificationChannel(channel); + } + + // 显示常驻通知(通常用于前台服务) + public Notification showForegroundNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + //.setContentTitle(title) + .setContentTitle(content) + //.setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); + return notification; + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, String title, String content) { + showTemporaryNotification(intent, TEMPORARY_NOTIFICATION_ID, title, content); + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, int notificationID, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setVibrate(new long[]{100, 200, 300, 400}) + .build(); + + mNotificationManager.notify(notificationID, notification); + } + + // 创建自定义布局通知(可扩展) + public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setContentIntent(pendingIntent) + .setContent(contentView) + .setCustomBigContentView(bigContentView) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification); + } + + // 取消所有通知 + public void cancelAllNotifications() { + mNotificationManager.cancelAll(); + } + + // 取消指定通知 + public void cancelNotification(int notificationID) { + mNotificationManager.cancel(notificationID); + } + + // 创建PendingIntent(兼容不同API版本) + private PendingIntent createPendingIntent(Intent intent) { + int flags = PendingIntent.FLAG_UPDATE_CURRENT; +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { +// flags |= PendingIntent.FLAG_IMMUTABLE; +// } + return PendingIntent.getActivity( + mContext, + 0, + intent, + flags + ); + } + +// public void sendSMSReceivedMessage(int notificationID, String szPhone, String szBody) { +// Intent intent = new Intent(mContext, SMSActivity.class); +// intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone); +// String szTitle = mContext.getString(R.string.text_smsfrom) + "<" + szPhone + ">"; +// String szContent = "[ " + szBody + " ]"; +// showTemporaryNotification(intent, notificationID, szTitle, szContent); +// } + + public void cleanOldChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + List allChannels = mNotificationManager.getNotificationChannels(); + for (NotificationChannel channel : allChannels) { + LogUtils.d(TAG, "Clean channel : " + channel.getId()); + if (!activeChannelConfigs.containsKey(channel.getId())) { + // 安全删除渠道 + mNotificationManager.deleteNotificationChannel(channel.getId()); + LogUtils.d(TAG, String.format("Deleted Channel %s", channel.getId())); + } + } + } + } +} diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java new file mode 100644 index 0000000..ca71fbf --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java @@ -0,0 +1,90 @@ +package cc.winboll.studio.timestamp.utils; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:45 + * @Describe 通知栏工具 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.media.RingtoneManager; +import android.os.Build; +import android.util.Log; +import android.widget.RemoteViews; +import cc.winboll.studio.timestamp.MainService; +import cc.winboll.studio.timestamp.MainActivity; +import cc.winboll.studio.timestamp.R; + +public class NotificationUtil { + + public static final String TAG = "NotificationUtil"; + + + + static final String szServiceChannelID = "0"; + static int mNumSendForegroundNotification = 10000; + + public NotificationManager createServiceNotificationChannel(Context context) { + //创建通知渠道ID + String channelId = szServiceChannelID; + //创建通知渠道名称 + String channelName = "Service Message"; + //创建通知渠道重要性 + int importance = NotificationManager.IMPORTANCE_MIN; + NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); + channel.setSound(null, null); + NotificationManager notificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + notificationManager.createNotificationChannel(channel); + return notificationManager; + } + + // 创建通知 + // + public void sendForegroundNotification(MainService service) { + //创建Notification,传入Context和channelId + Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取 + intent.setClass(service, MainActivity.class); + + //这里放一个count用来区分每一个通知 + //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去 + + //参数1:context 上下文对象 + //参数2:发送者私有的请求码(Private request code for the sender) + //参数3:intent 意图对象 + //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个 + PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, mNumSendForegroundNotification, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT); + + Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID) + .setAutoCancel(true) + .setContentTitle(service.getString(R.string.app_name)) + .setContentText(service.TAG + " is started.") + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.drawable.ic_launcher) + //设置红色 + .setColor(Color.parseColor("#F00606")) + .setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher)) + .setContentIntent(mForegroundPendingIntent) + .build(); + + + /*RemoteViews mrvForegroundNotificationView = new RemoteViews(service.getPackageName(), R.layout.remoteview); + mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView1, notificationMessage.getTitle()); + mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView2, notificationMessage.getContent()); + mrvForegroundNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher); + mForegroundNotification.contentView = mrvForegroundNotificationView; + mForegroundNotification.bigContentView = mrvForegroundNotificationView; + */ + + service.startForeground(mNumSendForegroundNotification, mForegroundNotification); + + } +} + + diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ServiceUtil.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ServiceUtil.java new file mode 100644 index 0000000..113c239 --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/ServiceUtil.java @@ -0,0 +1,35 @@ +package cc.winboll.studio.timestamp.utils; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 09:58 + * @Describe 应用服务管理类 + */ +import android.app.ActivityManager; +import android.content.Context; +import java.util.List; + +public class ServiceUtil { + + public final static String TAG = "ServiceUtil"; + + public static boolean isServiceAlive(Context context, String szServiceName) { + // 获取Activity管理者对象 + ActivityManager manager = (ActivityManager) context + .getSystemService(Context.ACTIVITY_SERVICE); + // 获取正在运行的服务(此处设置最多取1000个) + List runningServices = manager + .getRunningServices(1000); + if (runningServices.size() <= 0) { + return false; + } + // 遍历,若存在名字和传入的serviceName的一致则说明存在 + for (ActivityManager.RunningServiceInfo runningServiceInfo : runningServices) { + if (runningServiceInfo.service.getClassName().equals(szServiceName)) { + return true; + } + } + + return false; + } +} diff --git a/timestamp/src/main/res/layout/activity_main.xml b/timestamp/src/main/res/layout/activity_main.xml index 12fdc32..d60c8cb 100644 --- a/timestamp/src/main/res/layout/activity_main.xml +++ b/timestamp/src/main/res/layout/activity_main.xml @@ -19,6 +19,20 @@ + + + + + + - - TimeStamp + This is the prompt window when the SMS service runs, which you can set to hide this class notification in the notification message settings. From 2e9b6ae2633cb73847c53460727c0a8a50ef0c97 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 5 May 2025 11:30:41 +0800 Subject: [PATCH 059/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=E6=A0=8F=E6=97=B6=E9=97=B4=E6=88=B3=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- timestamp/build.properties | 4 +- .../studio/timestamp/MainActivity.java | 2 + .../winboll/studio/timestamp/MainService.java | 108 +++++++++++++----- .../timestamp/utils/NotificationHelper.java | 22 ++++ .../timestamp/utils/NotificationUtil.java | 90 --------------- .../main/res/layout/remoteviews_timestamp.xml | 16 +++ 6 files changed, 124 insertions(+), 118 deletions(-) delete mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java create mode 100644 timestamp/src/main/res/layout/remoteviews_timestamp.xml diff --git a/timestamp/build.properties b/timestamp/build.properties index 1c9d593..16318df 100644 --- a/timestamp/build.properties +++ b/timestamp/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon May 05 02:43:50 GMT 2025 +#Mon May 05 03:29:39 GMT 2025 stageCount=0 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=8 +buildCount=15 baseBetaVersion=15.0.1 diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java index b557a09..d6fb53f 100644 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java @@ -7,6 +7,7 @@ import androidx.appcompat.widget.Toolbar; import cc.winboll.studio.libappbase.LogView; import com.hjq.toast.ToastUtils; import android.widget.Switch; +import cc.winboll.studio.timestamp.models.AppConfigs; public class MainActivity extends AppCompatActivity { @@ -22,6 +23,7 @@ public class MainActivity extends AppCompatActivity { setSupportActionBar(toolbar); mswEnableMainService = findViewById(R.id.activitymainSwitch1); + mswEnableMainService.setChecked(AppConfigs.getInstance(this).loadAppConfigs().isEnableService()); mLogView = findViewById(R.id.logview); diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java index 4fd05e6..06cc4bf 100644 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java @@ -11,23 +11,41 @@ import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; +import android.os.Handler; import android.os.IBinder; +import android.os.Message; +import android.widget.RemoteViews; +import android.widget.TextView; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.timestamp.AssistantService; import cc.winboll.studio.timestamp.MainService; import cc.winboll.studio.timestamp.models.AppConfigs; import cc.winboll.studio.timestamp.utils.NotificationHelper; import cc.winboll.studio.timestamp.utils.ServiceUtil; +import java.lang.ref.WeakReference; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.Timer; +import java.util.TimerTask; public class MainService extends Service { public static String TAG = "MainService"; + public static final int MSG_UPDATE_TIMESTAMP = 0; + + Intent intentMainService; + NotificationHelper mNotificationHelper; Notification notification; + RemoteViews mRemoteViews; + TextView mtvTimeStamp; + Timer mTimer; private static boolean _mIsServiceAlive; public static final String EXTRA_APKFILEPATH = "EXTRA_APKFILEPATH"; final static int MSG_INSTALL_APK = 0; - //Handler mHandler; + MyHandler mMyHandler; MyServiceConnection mMyServiceConnection; MainActivity mInstallCompletedFollowUpActivity; @@ -39,9 +57,13 @@ public class MainService extends Service { @Override public void onCreate() { super.onCreate(); + + mRemoteViews = new RemoteViews(getPackageName(), R.layout.remoteviews_timestamp); + intentMainService = new Intent(this, MainActivity.class); + LogUtils.d(TAG, "onCreate()"); _mIsServiceAlive = false; - //mHandler = new MyHandler(MainService.this); + mMyHandler = new MyHandler(MainService.this); if (mMyServiceConnection == null) { mMyServiceConnection = new MyServiceConnection(); } @@ -56,17 +78,27 @@ public class MainService extends Service { // 设置运行状态 _mIsServiceAlive = true; - // 显示前台通知栏 - NotificationHelper helper = new NotificationHelper(this); - Intent intent = new Intent(this, MainActivity.class); - notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); + mNotificationHelper = new NotificationHelper(this); + //notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); + notification = mNotificationHelper.showCustomForegroundNotification(intentMainService, mRemoteViews, mRemoteViews); startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); // 唤醒守护进程 wakeupAndBindAssistant(); LogUtils.d(TAG, "running..."); + mTimer = new Timer(); + TimerTask task = new TimerTask() { + @Override + public void run() { + //System.out.println("定时任务执行了"); + mMyHandler.sendEmptyMessage(MSG_UPDATE_TIMESTAMP); + } + }; + // 延迟1秒后开始执行,之后每隔2秒执行一次 + mTimer.schedule(task, 1000, 2000); + } else { LogUtils.d(TAG, "_mIsServiceAlive is " + Boolean.toString(_mIsServiceAlive)); @@ -78,6 +110,9 @@ public class MainService extends Service { @Override public void onDestroy() { super.onDestroy(); + if (mTimer != null) { + mTimer.cancel(); + } _mIsServiceAlive = false; LogUtils.d(TAG, "onDestroy()"); @@ -104,8 +139,8 @@ public class MainService extends Service { } } - // 主进程与守护进程连接时需要用到此类 - // +// 主进程与守护进程连接时需要用到此类 +// private class MyServiceConnection implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { @@ -133,25 +168,46 @@ public class MainService extends Service { } } + void updateTimeStamp() { + long currentMillis = System.currentTimeMillis(); + Instant instant = Instant.ofEpochMilli(currentMillis); + LocalDateTime ldt = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + String formattedDateTime = ldt.format(formatter); + //System.out.println(formattedDateTime); + mRemoteViews.setTextViewText(R.id.tv_timestamp, formattedDateTime); + notification = mNotificationHelper.showCustomForegroundNotification(intentMainService, mRemoteViews, mRemoteViews); + //startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); + } + // // 服务事务处理类 // -// static class MyHandler extends Handler { -// WeakReference weakReference; -// MyHandler(MainService service) { -// weakReference = new WeakReference(service); -// } -// public void handleMessage(Message message) { -// MainService theActivity = weakReference.get(); -// switch (message.what) { -// case MSG_INSTALL_APK: -// { -// break; -// } -// default: -// break; -// } -// super.handleMessage(message); -// } -// } + class MyHandler extends Handler { + WeakReference weakReference; + MyHandler(MainService service) { + weakReference = new WeakReference(service); + } + public void handleMessage(Message message) { + MainService theService = weakReference.get(); + switch (message.what) { + case MSG_UPDATE_TIMESTAMP: + { + if (theService != null) { + theService.updateTimeStamp(); + } + break; + } + default: + break; + } + super.handleMessage(message); + } + + + } + + public void sendUpdateTimeStampMessage() { + + } } diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java index 0e9ef9a..39c826c 100644 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationHelper.java @@ -113,6 +113,28 @@ public class NotificationHelper { mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); return notification; } + + + // 显示常驻通知(通常用于前台服务) + public Notification showCustomForegroundNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) { + PendingIntent pendingIntent = createPendingIntent(intent); + + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + //.setContentTitle(title) + .setContentIntent(pendingIntent) + .setContent(contentView) + .setCustomBigContentView(bigContentView) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setOngoing(true) + .build(); + + mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); + return notification; + } // 显示临时通知(自动消失) public void showTemporaryNotification(Intent intent, String title, String content) { diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java deleted file mode 100644 index ca71fbf..0000000 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/utils/NotificationUtil.java +++ /dev/null @@ -1,90 +0,0 @@ -package cc.winboll.studio.timestamp.utils; - -/** - * @Author ZhanGSKen - * @Date 2025/05/05 09:45 - * @Describe 通知栏工具 - */ -import android.app.Notification; -import android.app.NotificationChannel; -import android.app.NotificationManager; -import android.app.PendingIntent; -import android.content.Context; -import android.content.Intent; -import android.graphics.BitmapFactory; -import android.graphics.Color; -import android.media.RingtoneManager; -import android.os.Build; -import android.util.Log; -import android.widget.RemoteViews; -import cc.winboll.studio.timestamp.MainService; -import cc.winboll.studio.timestamp.MainActivity; -import cc.winboll.studio.timestamp.R; - -public class NotificationUtil { - - public static final String TAG = "NotificationUtil"; - - - - static final String szServiceChannelID = "0"; - static int mNumSendForegroundNotification = 10000; - - public NotificationManager createServiceNotificationChannel(Context context) { - //创建通知渠道ID - String channelId = szServiceChannelID; - //创建通知渠道名称 - String channelName = "Service Message"; - //创建通知渠道重要性 - int importance = NotificationManager.IMPORTANCE_MIN; - NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); - channel.setSound(null, null); - NotificationManager notificationManager = (NotificationManager) context.getSystemService( - Context.NOTIFICATION_SERVICE); - notificationManager.createNotificationChannel(channel); - return notificationManager; - } - - // 创建通知 - // - public void sendForegroundNotification(MainService service) { - //创建Notification,传入Context和channelId - Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取 - intent.setClass(service, MainActivity.class); - - //这里放一个count用来区分每一个通知 - //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去 - - //参数1:context 上下文对象 - //参数2:发送者私有的请求码(Private request code for the sender) - //参数3:intent 意图对象 - //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个 - PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, mNumSendForegroundNotification, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT); - - Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID) - .setAutoCancel(true) - .setContentTitle(service.getString(R.string.app_name)) - .setContentText(service.TAG + " is started.") - .setWhen(System.currentTimeMillis()) - .setSmallIcon(R.drawable.ic_launcher) - //设置红色 - .setColor(Color.parseColor("#F00606")) - .setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher)) - .setContentIntent(mForegroundPendingIntent) - .build(); - - - /*RemoteViews mrvForegroundNotificationView = new RemoteViews(service.getPackageName(), R.layout.remoteview); - mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView1, notificationMessage.getTitle()); - mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView2, notificationMessage.getContent()); - mrvForegroundNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher); - mForegroundNotification.contentView = mrvForegroundNotificationView; - mForegroundNotification.bigContentView = mrvForegroundNotificationView; - */ - - service.startForeground(mNumSendForegroundNotification, mForegroundNotification); - - } -} - - diff --git a/timestamp/src/main/res/layout/remoteviews_timestamp.xml b/timestamp/src/main/res/layout/remoteviews_timestamp.xml new file mode 100644 index 0000000..a8bb1a9 --- /dev/null +++ b/timestamp/src/main/res/layout/remoteviews_timestamp.xml @@ -0,0 +1,16 @@ + + + + + + + From d26de8f2f70c9f64d65f87ff577ce94984be499f Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Mon, 5 May 2025 11:53:48 +0800 Subject: [PATCH 060/132] 1153 --- timestamp/build.properties | 4 +-- timestamp/src/main/AndroidManifest.xml | 6 ++++ .../winboll/studio/timestamp/MainService.java | 17 ++++++++++- .../receivers/ButtonClickReceiver.java | 30 +++++++++++++++++++ .../main/res/layout/remoteviews_timestamp.xml | 16 +++++++--- 5 files changed, 66 insertions(+), 7 deletions(-) create mode 100644 timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/ButtonClickReceiver.java diff --git a/timestamp/build.properties b/timestamp/build.properties index 16318df..62e827f 100644 --- a/timestamp/build.properties +++ b/timestamp/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Mon May 05 03:29:39 GMT 2025 +#Mon May 05 03:50:53 GMT 2025 stageCount=0 libraryProject= baseVersion=15.0 publishVersion=15.0.0 -buildCount=15 +buildCount=24 baseBetaVersion=15.0.1 diff --git a/timestamp/src/main/AndroidManifest.xml b/timestamp/src/main/AndroidManifest.xml index bff1a04..86517cb 100644 --- a/timestamp/src/main/AndroidManifest.xml +++ b/timestamp/src/main/AndroidManifest.xml @@ -39,6 +39,12 @@ + + + + + + diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java index 06cc4bf..4a00e01 100644 --- a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainService.java @@ -6,6 +6,7 @@ package cc.winboll.studio.timestamp; * @Describe 主要服务 */ import android.app.Notification; +import android.app.PendingIntent; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -20,6 +21,7 @@ import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.timestamp.AssistantService; import cc.winboll.studio.timestamp.MainService; import cc.winboll.studio.timestamp.models.AppConfigs; +import cc.winboll.studio.timestamp.receivers.ButtonClickReceiver; import cc.winboll.studio.timestamp.utils.NotificationHelper; import cc.winboll.studio.timestamp.utils.ServiceUtil; import java.lang.ref.WeakReference; @@ -37,6 +39,8 @@ public class MainService extends Service { public static final int MSG_UPDATE_TIMESTAMP = 0; Intent intentMainService; + Intent mButtonBroadcastIntent; + PendingIntent mButtonPendingIntent; NotificationHelper mNotificationHelper; Notification notification; RemoteViews mRemoteViews; @@ -60,6 +64,15 @@ public class MainService extends Service { mRemoteViews = new RemoteViews(getPackageName(), R.layout.remoteviews_timestamp); intentMainService = new Intent(this, MainActivity.class); + + // 创建点击按钮后要发送的广播 Intent + mButtonBroadcastIntent = new Intent(ButtonClickReceiver.BUTTON_COPYTIMESTAMP_ACTION); + mButtonPendingIntent = PendingIntent.getBroadcast( + this, // 上下文 + 0, // 请求码,用于区分不同的 PendingIntent + mButtonBroadcastIntent, // Intent + PendingIntent.FLAG_UPDATE_CURRENT // 标志位,用于更新已存在的 PendingIntent + ); LogUtils.d(TAG, "onCreate()"); _mIsServiceAlive = false; @@ -83,7 +96,7 @@ public class MainService extends Service { //notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); notification = mNotificationHelper.showCustomForegroundNotification(intentMainService, mRemoteViews, mRemoteViews); startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); - + // 唤醒守护进程 wakeupAndBindAssistant(); @@ -176,6 +189,8 @@ public class MainService extends Service { String formattedDateTime = ldt.format(formatter); //System.out.println(formattedDateTime); mRemoteViews.setTextViewText(R.id.tv_timestamp, formattedDateTime); + // 为按钮设置点击事件 + mRemoteViews.setOnClickPendingIntent(R.id.btn_copytimestamp, mButtonPendingIntent); notification = mNotificationHelper.showCustomForegroundNotification(intentMainService, mRemoteViews, mRemoteViews); //startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); } diff --git a/timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/ButtonClickReceiver.java b/timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/ButtonClickReceiver.java new file mode 100644 index 0000000..3a673db --- /dev/null +++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/receivers/ButtonClickReceiver.java @@ -0,0 +1,30 @@ +package cc.winboll.studio.timestamp.receivers; + +/** + * @Author ZhanGSKen + * @Date 2025/05/05 11:35 + * @Describe ButtonClickReceiver + */ +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.widget.Toast; +import cc.winboll.studio.libappbase.LogUtils; + +public class ButtonClickReceiver extends BroadcastReceiver { + + public static final String TAG = "ButtonClickReceiver"; + + public static final String BUTTON_COPYTIMESTAMP_ACTION = "com.example.BUTTON_CLICK_ACTION"; + + @Override + public void onReceive(Context context, Intent intent) { + LogUtils.d(TAG, "onReceive"); + //if (intent.getAction().equals(BUTTON_COPYTIMESTAMP_ACTION)) { + // 在这里编写按钮点击后要执行的代码 + // 比如显示一个Toast + Toast.makeText(context, "按钮被点击了", Toast.LENGTH_SHORT).show(); + //} + } + +} diff --git a/timestamp/src/main/res/layout/remoteviews_timestamp.xml b/timestamp/src/main/res/layout/remoteviews_timestamp.xml index a8bb1a9..6979cb9 100644 --- a/timestamp/src/main/res/layout/remoteviews_timestamp.xml +++ b/timestamp/src/main/res/layout/remoteviews_timestamp.xml @@ -2,15 +2,23 @@ + android:layout_height="match_parent" + android:gravity="center_vertical"> + android:id="@+id/tv_timestamp" + android:layout_weight="1.0"/> + +