Compare commits

..

5 Commits

Author SHA1 Message Date
4af10c74e9 <powerbell>APK 15.11.0 release Publish. 2025-11-16 13:12:25 +08:00
ZhanGSKen
7883ef93be 应用窗口恢复时,检查当前时间戳的奇偶性,来决定是否播放Demo自带广告还是播放WiBoLL广告。 2025-11-16 13:07:26 +08:00
ZhanGSKen
398cb33a58 示例广告加载完成 2025-11-16 09:53:58 +08:00
ZhanGSKen
ac1858fba7 米盟广告接入类库设置完成 2025-11-16 08:40:02 +08:00
ZhanGSKen
5a77a5e9e0 添加横幅广告 2025-11-14 11:45:35 +08:00
20 changed files with 776 additions and 105 deletions

View File

@@ -5,6 +5,16 @@ buildscript {
// 设置本地Maven仓库路径
url 'file:///sdcard/.m2/repository/'
}
//米盟通过maven接入时要做如下配置
maven {
url "https://repos.xiaomi.com/maven"
credentials {
username 'mimo-developer'
password 'AKCp8ih1PFG9tV8qaLyws67dLGZi8udFM39SfsHgihN15cgsiRvHuxj8JzFmuZjaViVeNawaA'
}
}
// Nexus Maven 库地址
// "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" }
@@ -40,7 +50,16 @@ allprojects {
// 设置本地Maven仓库路径
url 'file:///sdcard/.m2/repository/'
}
//米盟通过maven接入时要做如下配置
maven {
url "https://repos.xiaomi.com/maven"
credentials {
username 'mimo-developer'
password 'AKCp8ih1PFG9tV8qaLyws67dLGZi8udFM39SfsHgihN15cgsiRvHuxj8JzFmuZjaViVeNawaA'
}
}
// Nexus Maven 库地址
// "WinBoLL Release"
maven { url "https://nexus.winboll.cc/repository/maven-public/" }

View File

@@ -18,18 +18,22 @@ def genVersionName(def versionName){
}
android {
compileSdkVersion 32
buildToolsVersion "32.0.0"
// 1. compileSdkVersion必须 ≥ targetSdkVersion建议直接等于 targetSdkVersion30
compileSdkVersion 30
// 2. buildToolsVersion需匹配 compileSdkVersion建议使用 30.x.x 最新稳定版(无需高于 compileSdkVersion
buildToolsVersion "30.0.3" // 这是 30 对应的最新稳定版,避免使用 beta 版
defaultConfig {
applicationId "cc.winboll.studio.powerbell"
minSdkVersion 24
minSdkVersion 23
targetSdkVersion 30
versionCode 6
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
versionName "15.4"
versionName "15.11"
if(true) {
versionName = genVersionName("${versionName}")
}
@@ -42,27 +46,40 @@ android {
}
}
// 允许使用系统隐藏API
lintOptions {
checkReleaseBuilds false
abortOnError false
}
// 针对PowerProfile的依赖配置
dependenciesInfo {
includeInApk = false
includeInBundle = false
// 米盟
packagingOptions {
doNotStrip "*/*/libmimo_1011.so"
}
}
dependencies {
api fileTree(dir: 'libs', include: ['*.jar'])
api 'cc.winboll.studio:libaes:15.9.3'
api 'cc.winboll.studio:libapputils:15.8.5'
api 'cc.winboll.studio:libappbase:15.9.5'
// 吐司提示库
api 'com.github.getActivity:ToastUtils:10.5'
// 应用介绍页类库
// 米盟
implementation 'com.miui.zeus:mimo-ad-sdk:5.3.+'//请使用最新版sdk
//注意以下5个库必须要引入
//implementation 'androidx.appcompat:appcompat:1.4.1'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.github.bumptech.glide:glide:4.9.0'
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
//--------------aar依赖-----------
/*implementation(name: 'mimo-ad-sdk', ext: 'aar')
//--------------Maven依赖-----------
//implementation 'com.miui.zeus:mimo-ad-sdk:5.3.2'
//注意以下5个库必须要引入
implementation "androidx.appcompat:appcompat:1.2.0"
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'androidx.recyclerview:recyclerview:1.0.0'
implementation 'com.github.bumptech.glide:glide:4.9.0'
//annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
implementation "androidx.navigation:navigation-ui:2.3.5"
implementation 'androidx.multidex:multidex:2.0.1'
//debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.9.1'
*/
// 应用介绍页类库
api 'io.github.medyo:android-about-page:2.0.0'
// SSH
api 'com.jcraft:jsch:0.1.55'
@@ -82,23 +99,9 @@ dependencies {
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
//api 'androidx.fragment:fragment:1.1.0'
/*api 'cc.winboll.studio:winboll-shared:1.8.0'
api 'io.github.medyo:android-about-page:2.0.0'
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 'com.baoyz.pullrefreshlayout:library:1.2.0'
api 'com.github.getActivity:ToastUtils:10.5'
api 'io.github.medyo:android-about-page:2.0.0'
api 'org.jsoup:jsoup:1.13.1'
api 'com.squareup.okhttp3:okhttp:4.4.1'
api 'cc.winboll.studio:libaes:7.6.0'
*/
implementation 'cc.winboll.studio:libaes:15.11.0'
implementation 'cc.winboll.studio:libappbase:15.11.0'
//api fileTree(dir: 'libs', include: ['*.aar'])
api fileTree(dir: 'libs', include: ['*.jar'])
}

View File

@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
#Wed Oct 22 20:17:00 HKT 2025
stageCount=18
#Sun Nov 16 13:12:25 HKT 2025
stageCount=1
libraryProject=
baseVersion=15.4
publishVersion=15.4.17
baseVersion=15.11
publishVersion=15.11.0
buildCount=0
baseBetaVersion=15.4.18
baseBetaVersion=15.11.1

View File

@@ -15,3 +15,6 @@
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
## 米盟
-keep class com.miui.zeus.** { *; }

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">能源钟</string>
<string name="app_name">PowerBell</string>
</resources>

View File

@@ -3,6 +3,25 @@
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="cc.winboll.studio.powerbell">
//米盟必要权限配置
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 权限会用在部分下载类广告安装应用时使用 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
//以下为非必要权限配置可以不申请当您使用的米盟SDK版本大于等于5.3.1时可以选择性添加如下权限
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<!-- 米盟提供“获取地理位置权限”和“不给予地理位置权限,开发者传入地理位置参数”两种方式上报用户位置,两种方式均可不选,无论通过何种方式提供给米盟用户地理位置,均需向用户声明地理位置权限将应用于米盟广告投放,米盟不强制获取地理位置信息-->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 米盟将通过此权限在Android 11系统上判定广告对应的应用是否在用户的app上安装避免投放错误的广告以此提高用户的广告体验。若添加此权限需要在您的用户隐私文档中声明 -->
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"/>
<!-- 通过GPS得到精确位置 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- 通过网络得到粗略位置 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- 拍摄照片和视频 -->
<uses-permission android:name="android.permission.CAMERA"/>
@@ -36,7 +55,7 @@
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>
<!-- 1. 基础应用信息读取权限Android 11 及以下) -->
<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
@@ -47,7 +66,7 @@
<!-- 3. 可选:若需读取系统应用,添加此权限(部分机型需要) -->
<uses-permission android:name="android.permission.ACCESS_PACKAGE_USAGE_STATS"
tools:ignore="ProtectedPermissions" />
<application
android:name=".App"
android:allowBackup="true"
@@ -56,7 +75,10 @@
android:theme="@style/AppTheme_Default"
android:persistent="true"
android:resizeableActivity="true"
android:requestLegacyExternalStorage="true">
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
tools:ignore="GoogleAppIndexingWarning"
android:networkSecurityConfig="@xml/network_security_config">
<activity
android:name=".MainActivity"

View File

@@ -4,10 +4,10 @@ import android.content.Context;
import android.os.Environment;
import android.view.Gravity;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.receivers.GlobalApplicationReceiver;
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
import cc.winboll.studio.powerbell.utils.AppConfigUtils;
import com.hjq.toast.ToastUtils;
import java.io.File;
public class App extends GlobalApplication {
@@ -50,7 +50,7 @@ public class App extends GlobalApplication {
// 设置 Toast 布局样式
//ToastUtils.setView(R.layout.toast_custom_view);
//ToastUtils.setStyle(new WhiteToastStyle());
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
//ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
// 设置数据配置存储工具
_mAppConfigUtils = getAppConfigUtils(this);
@@ -77,5 +77,13 @@ public class App extends GlobalApplication {
public void clearBatteryHistory() {
_mAppCacheUtils.clearBatteryHistory();
}
@Override
public void onTerminate() {
super.onTerminate();
ToastUtils.release();
}
}

View File

@@ -3,16 +3,30 @@ package cc.winboll.studio.powerbell;
import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.text.TextUtils;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.RelativeLayout;
import android.widget.Toast;
import cc.winboll.studio.libaes.views.AToolbar;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.LogActivity;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.powerbell.MainActivity;
import cc.winboll.studio.powerbell.activities.AboutActivity;
@@ -23,10 +37,35 @@ import cc.winboll.studio.powerbell.activities.WinBoLLActivity;
import cc.winboll.studio.powerbell.beans.BackgroundPictureBean;
import cc.winboll.studio.powerbell.fragments.MainViewFragment;
import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils;
import cc.winboll.studio.powerbell.utils.MimoUtils;
import com.miui.zeus.mimo.sdk.ADParams;
import com.miui.zeus.mimo.sdk.BannerAd;
import com.miui.zeus.mimo.sdk.MimoCustomController;
import com.miui.zeus.mimo.sdk.MimoLocation;
import com.miui.zeus.mimo.sdk.MimoSdk;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class MainActivity extends WinBoLLActivity {
public static final String TAG = "MainActivity";
private static final String PRIVACY_FILE = "privacy_pfs";
private static final String PRIVACY_VALUE = "privacy_value";//0: 拒绝1赞同
private SharedPreferences mSharedPreferences;
private String BANNER_POS_ID = "802e356f1726f9ff39c69308bfd6f06a";
private String BANNER_POS_ID_WINBOLL = "d129ee5a263911f981a6dc7a9802e3e7";
private BannerAd mBannerAd;
private List<BannerAd> mAllBanners = new ArrayList<>();
private ViewGroup mContainer;
private boolean mIsBiddingWin = true;
public static final int BACKGROUND_PICTURE_REQUEST_CODE = 0;
public static MainActivity _mMainActivity;
@@ -37,7 +76,7 @@ public class MainActivity extends WinBoLLActivity {
Menu mMenu;
Fragment mCurrentShowFragment;
MainViewFragment mMainViewFragment;
AToolbar mAToolbar;
Toolbar mToolbar;
@Override
public Activity getActivity() {
@@ -51,9 +90,14 @@ public class MainActivity extends WinBoLLActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
//LogUtils.d(TAG, "onCreate(...)");
LogUtils.d(TAG, "onCreate(...)");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContainer = findViewById(R.id.ads_container);
// 米盟模块
showPrivacy();
// 设置调试日志
// mLogView = findViewById(R.id.logview);
@@ -66,10 +110,10 @@ public class MainActivity extends WinBoLLActivity {
//mAppConfigUtils = AppConfigUtils.getInstance(mApplication);
// 初始化工具栏
mAToolbar = (AToolbar) findViewById(R.id.toolbar);
setActionBar(mAToolbar);
mToolbar = findViewById(R.id.toolbar);
setSupportActionBar(mToolbar);
//mAToolbar.setSubtitle("Main");
mAToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
mToolbar.setTitleTextAppearance(this, R.style.Toolbar_TitleText);
if (mMainViewFragment == null) {
FragmentTransaction tx = getFragmentManager().beginTransaction();
@@ -82,9 +126,143 @@ public class MainActivity extends WinBoLLActivity {
// NotificationHelper notificationUtils = new NotificationHelper(this);
// notificationUtils.createNotificationChannels();
}
// public void onADs(View view) {
// LogUtils.d(TAG, "onPostCreate");
// fetchAd();
//
// }
/*public void showADs() {
//(5.3.4新增接口) 请使用最新接口集成
ADParams params = new ADParams.Builder().setUpId(BANNER_POS_ID).build();
bannerAd.loadAd(params, new BannerAd.BannerLoadListener() {
//请求成功回调
@Override
public void onBannerAdLoadSuccess() {
}
//请求失败回调
@Override
public void onAdLoadFailed (int errorCode, String errorMsg) {
}
});
////废弃 将会在后面版本删除
// @Deprecated
// bannerAd.loadAd(upId, new BannerAd.BannerLoadListener() {
// //请求成功回调
// @Override
// public void onBannerAdLoadSuccess() {
// }
// //请求失败回调
// @Override
// public void onAdLoadFailed (int errorCode, String errorMsg) {
// }
// });
bannerAd.setDownLoadListener(new BannerAd.BannerDownloadListener() {
@Override
public void onDownloadStarted() {
//开始下载
LogUtils.d(TAG, "ads 开始下载");
}
@Override
public void onDownloadProgressUpdated(int progress) {
//下载进度,例如:${progress}%
LogUtils.d(TAG, String.format("ads 下载进度 %d", progress));
}
@Override
public void onDownloadPaused() {
//下载暂停
LogUtils.d(TAG, "ads 下载暂停");
}
@Override
public void onDownloadCancel() {
//取消下载
LogUtils.d(TAG, "ads 取消下载");
}
@Override
public void onDownloadFailed(int errorCode) {
//下载失败, 若需要了解errorCode具体含义请咨询米盟
LogUtils.d(TAG, String.format("ads 下载失败。errorCode %d", errorCode));
}
@Override
public void onDownloadFinished() {
//下载结束
LogUtils.d(TAG, "ads 下载结束");
}
@Override
public void onInstallStart() {
//开始安装
LogUtils.d(TAG, "ads 开始安装");
}
@Override
public void onInstallFailed(int errorCode) {
//安装失败
LogUtils.d(TAG, "ads 安装失败");
}
@Override
public void onInstallSuccess() {
//安装成功
LogUtils.d(TAG, "ads 安装成功");
}
});
LinearLayout ads_container = findViewById(R.id.ads_container);
bannerAd.showAd(this, ads_container, new BannerAd.BannerInteractionListener() {
@Override
public void onAdClick() {
// 广告被点击
}
@Override
public void onAdShow() {
// 广告被展示
}
@Override
public void onAdDismiss() {
// 点击关闭按钮广告消失回调
}
@Override
public void onRenderSuccess() {
// 广告渲染成功
}
@Override
public void onRenderFail(int code, String msg) {
// 广告渲染失败
}
});
}*/
@Override
protected void onDestroy() {
super.onDestroy();
//bannerAd.destroy();
}
void showFragment(Fragment fragment) {
FragmentTransaction tx = getFragmentManager().beginTransaction();
for (Fragment item : getFragmentManager().getFragments()) {
@@ -133,6 +311,24 @@ public class MainActivity extends WinBoLLActivity {
//NotificationHelper.cancelRemindNotification(this);
reloadBackground();
setBackgroundColor();
//LogUtils.d(TAG, "ads start");
new Thread(new Runnable(){
@Override
public void run() {
//LogUtils.d(TAG, "run() 1");
runOnUiThread(new Runnable(){
@Override
public void run() {
//LogUtils.d(TAG, "run() 2");
//try {
//Thread.sleep(1000);
fetchAd();
//} catch (InterruptedException e) {}
}
});
}
}).start();
}
// Menu icons are inflated just as they were with actionbar
@@ -172,7 +368,7 @@ public class MainActivity extends WinBoLLActivity {
intent.setClass(this, BackgroundPictureActivity.class);
startActivity(intent);
} else if (menuItemId == R.id.action_log) {
App.getWinBoLLActivityManager().startLogActivity(this);
LogActivity.startLogActivity(this);
}
return true;
@@ -217,4 +413,275 @@ public class MainActivity extends WinBoLLActivity {
RelativeLayout mainLayout = findViewById(R.id.activitymainRelativeLayout1);
mainLayout.setBackgroundColor(nPixelColor);
}
private void showAd() {
LogUtils.d(TAG, "showAd()");
final FrameLayout container = new FrameLayout(this);
container.setPadding(0, 0, 0, MimoUtils.dpToPx(this, 10));
mContainer.addView(container, new FrameLayout.LayoutParams(FrameLayout.LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT));
if (mIsBiddingWin) {
//如果竞价成功,传⼊本次实际结算价
mBannerAd.setPrice(getPrice());
}
mBannerAd.showAd(this, container, new BannerAd.BannerInteractionListener() {
@Override
public void onAdClick() {
LogUtils.d(TAG, "onAdClick");
}
@Override
public void onAdShow() {
//mShowBtn.setEnabled(false);
LogUtils.d(TAG, "onAdShow");
}
@Override
public void onAdDismiss() {
LogUtils.d(TAG, "onAdDismiss");
mContainer.removeView(container);
}
@Override
public void onRenderSuccess() {
LogUtils.d(TAG, "onRenderSuccess");
}
@Override
public void onRenderFail(int code, String msg) {
LogUtils.e(TAG, "onRenderFail errorCode " + code + " errorMsg " + msg);
}
});
}
private void fetchAd() {
LogUtils.d(TAG, "fetchAd()");
mBannerAd = new BannerAd();
mAllBanners.add(mBannerAd);
mBannerAd.setDownLoadListener(new BannerAd.BannerDownloadListener() {
@Override
public void onDownloadStarted() {
LogUtils.d(TAG, "onDownloadStarted");
}
@Override
public void onDownloadPaused() {
LogUtils.d(TAG, "onDownloadPaused");
}
@Override
public void onDownloadFailed(int errorCode) {
LogUtils.d(TAG, "onDownloadFailed, errorCode = " + errorCode);
}
@Override
public void onDownloadFinished() {
LogUtils.d(TAG, "onDownloadFinished");
}
@Override
public void onDownloadProgressUpdated(int progress) {
LogUtils.d(TAG, "onDownloadProgressUpdated " + progress + "%");
}
@Override
public void onInstallFailed(int errorCode) {
LogUtils.d(TAG, "onInstallFailed, errorCode = " + errorCode);
}
@Override
public void onInstallStart() {
LogUtils.d(TAG, "onInstallStart");
}
@Override
public void onInstallSuccess() {
LogUtils.d(TAG, "onInstallSuccess");
}
@Override
public void onDownloadCancel() {
LogUtils.d(TAG, "onDownloadCancel");
}
});
String currentAD_ID = isEvenSecond()?BANNER_POS_ID_WINBOLL: BANNER_POS_ID;
LogUtils.d(TAG, String.format("currentAD_ID = %s", currentAD_ID));
ADParams params = new ADParams.Builder().setUpId(currentAD_ID).build();
mBannerAd.loadAd(params, new BannerAd.BannerLoadListener() {
@Override
public void onBannerAdLoadSuccess() {
LogUtils.d(TAG, "onBannerAdLoadSuccess()");
showAd();
//mShowBtn.setEnabled(true);
/*long bannerPrice = getPrice();
if (mIsBiddingWin) {
//竞价成功时候上报win
Map<String, Long> auctionBidInfo = new HashMap<>();
auctionBidInfo.put(BaseAd.IBidding.EXPECT_COST_PRICE, bannerPrice);
auctionBidInfo.put(BaseAd.IBidding.HIGHEST_LOSS_PRICE, BID_WIN_HIGHEST_LOSS_PRICE);
mBannerAd.win(auctionBidInfo);
} else {
//竞价失败的时候上报loss
Map<String, Object> lossReasonInfo = new HashMap<>();
lossReasonInfo.put(BaseAd.IBidding.WIN_PRICE, BID_LOSS_WIN_PRICE);
lossReasonInfo.put(BaseAd.IBidding.LOSS_REASON, BaseAd.LossReason.TYPE_LOWER_OTHER_BIDDER_PRICE);
lossReasonInfo.put(BaseAd.IBidding.ADN_ID, 1);
mBannerAd.loss(lossReasonInfo);
}*/
}
@Override
public void onAdLoadFailed(int errorCode, String errorMsg) {
LogUtils.d(TAG, "errorCode = " + errorCode + ", errorMsg = " + errorMsg);
}
});
}
/**
* 判断当前时间是单数秒还是双数秒
* @return true双数秒0、2、4...false单数秒1、3、5...
*/
private boolean isEvenSecond() {
// 1. 获取当前毫秒级时间戳
long currentTimeMillis = System.currentTimeMillis();
// 2. 转换为秒数(毫秒 ÷ 1000向下取整
long currentSecond = currentTimeMillis / 1000;
// 3. 对 2 取余:余数为 0 是双数秒,余数为 1 是单数秒
return currentSecond % 2 == 0;
}
/**
* 扩展:获取当前秒数的奇偶描述(直接返回文字说明)
* @return 字符串:"单数秒" 或 "双数秒"
*/
// private String getSecondParityDesc() {
// long currentSecond = System.currentTimeMillis() / 1000;
// return (currentSecond % 2 == 0) ? "双数秒" : "单数秒";
// }
private long getPrice() {
if (mBannerAd == null) {
return 0;
}
Map<String, Object> map = mBannerAd.getMediaExtraInfo();
if (map == null || map.isEmpty()) {
return 0;
}
return (long) map.get("price");
}
private void showPrivacy() {
String privacyAgreeValue = getSharedPreferences().getString(PRIVACY_VALUE, null);
if (TextUtils.equals(privacyAgreeValue, String.valueOf(0))) {
Log.i(TAG, "已拒绝隐私协议,广告已处于不可以状态...");
Toast.makeText(this, "已拒绝隐私协议,广告已处于不可以状态", Toast.LENGTH_SHORT).show();
return;
}
if (TextUtils.equals(privacyAgreeValue, String.valueOf(1))) {
Log.i(TAG, "已同意隐私协议,开始初始化...");
initMimoSdk();
return;
}
Log.i(TAG, "开始弹出隐私协议...");
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("用户须知");
builder.setMessage("小米广告SDK隐私政策: https://dev.mi.com/distribute/doc/details?pId=1688, 请复制到浏览器查看");
builder.setIcon(R.drawable.ic_launcher);
builder.setCancelable(false); //点击对话框以外的区域是否让对话框消失
builder.setPositiveButton("同意", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences.Editor editor = getSharedPreferences().edit();
editor.putString(PRIVACY_VALUE, String.valueOf(1));
editor.apply();
initMimoSdk();
dialog.dismiss();
}
});
builder.setNegativeButton("拒绝", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences.Editor editor = getSharedPreferences().edit();
editor.putString(PRIVACY_VALUE, String.valueOf(0));
editor.apply();
dialog.dismiss();
}
});
AlertDialog dialog = builder.create();
Window window = dialog.getWindow();
window.setGravity(Gravity.BOTTOM);
WindowManager m = getWindowManager();
Display d = m.getDefaultDisplay();
WindowManager.LayoutParams p = dialog.getWindow().getAttributes();
p.width = d.getWidth();
dialog.getWindow().setAttributes(p);
dialog.show();
}
private void initMimoSdk() {
MimoSdk.init(this, new MimoCustomController() {
@Override
public boolean isCanUseLocation() {
return true;
}
@Override
public MimoLocation getMimoLocation() {
return null;
}
@Override
public boolean isCanUseWifiState() {
return true;
}
@Override
public boolean alist() {
return true;
}
} , new MimoSdk.InitCallback() {
@Override
public void success() {
Log.d(TAG, "MimoSdk init success");
}
@Override
public void fail(int code, String msg) {
Log.e(TAG, "MimoSdk init fail, code=" + code + ",msg=" + msg);
}
});
MimoSdk.setDebugOn(true);
}
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
return super.dispatchKeyEvent(event);
}
// @Override
// public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
// return false;
// }
@Override
public void setupToolbar() {
super.setupToolbar();
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(false);
}
}
public SharedPreferences getSharedPreferences() {
if (mSharedPreferences == null) {
mSharedPreferences = getSharedPreferences(PRIVACY_FILE, Context.MODE_PRIVATE);
}
return mSharedPreferences;
}
}

View File

@@ -10,9 +10,9 @@ import android.content.Context;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import cc.winboll.studio.libaes.models.APPInfo;
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.libaes.views.AboutView;
import cc.winboll.studio.powerbell.R;
public class AboutActivity extends Activity {

View File

@@ -19,7 +19,7 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import cc.winboll.studio.libaes.views.AToolbar;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.App;
import cc.winboll.studio.powerbell.R;
import cc.winboll.studio.powerbell.beans.BackgroundPictureBean;

View File

@@ -4,11 +4,12 @@ import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Switch;
import android.widget.TextView;
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
import cc.winboll.studio.libaes.views.AToolbar;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.App;
import cc.winboll.studio.powerbell.R;
import cc.winboll.studio.powerbell.beans.BatteryInfoBean;
@@ -16,7 +17,6 @@ import cc.winboll.studio.powerbell.receivers.ControlCenterServiceReceiver;
import cc.winboll.studio.powerbell.utils.AppCacheUtils;
import cc.winboll.studio.powerbell.utils.StringUtils;
import java.util.ArrayList;
import android.widget.Switch;
public class ClearRecordActivity extends Activity {

View File

@@ -6,6 +6,7 @@ package cc.winboll.studio.powerbell.activities;
*/
import android.app.Activity;
import android.app.Dialog;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
@@ -19,11 +20,11 @@ import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import cc.winboll.studio.libaes.views.AToolbar;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import cc.winboll.studio.powerbell.MainActivity;
import cc.winboll.studio.powerbell.R;
import cc.winboll.studio.powerbell.activities.BackgroundPictureActivity;
import cc.winboll.studio.powerbell.activities.PixelPickerActivity;
import cc.winboll.studio.powerbell.beans.BackgroundPictureBean;
import cc.winboll.studio.powerbell.utils.BackgroundPictureUtils;
@@ -233,7 +234,10 @@ public class PixelPickerActivity extends WinBoLLActivity implements IWinBoLLActi
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), BackgroundPictureActivity.class);
Intent intent = new Intent();
intent.setClass(this, BackgroundPictureActivity.class);
startActivity(intent);
//GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), );
return true;
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false。
@@ -243,7 +247,10 @@ public class PixelPickerActivity extends WinBoLLActivity implements IWinBoLLActi
@Override
public void onBackPressed() {
super.onBackPressed();
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), BackgroundPictureActivity.class);
Intent intent = new Intent();
intent.setClass(this, BackgroundPictureActivity.class);
startActivity(intent);
//GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), BackgroundPictureActivity.class);
}
}

View File

@@ -5,40 +5,99 @@ package cc.winboll.studio.powerbell.activities;
* @Date 2025/06/19 20:35
* @Describe 应用窗口基类
*/
import android.app.Activity;
import android.os.Bundle;
import android.view.MenuItem;
import cc.winboll.studio.libappbase.GlobalApplication;
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
import cc.winboll.studio.powerbell.App;
import cc.winboll.studio.powerbell.MainActivity;
import androidx.appcompat.app.AppCompatActivity;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
import android.widget.FrameLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import com.miui.zeus.mimo.sdk.BuildConfig;
import cc.winboll.studio.powerbell.R;
public abstract class WinBoLLActivity extends Activity implements IWinBoLLActivity {
@SuppressLint("SetTextI18n")
public abstract class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity {
public static final String TAG = "WinBoLLActivity";
protected TextView mTagView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
changeFullScreen(this);
}
@Override
protected void onStart() {
super.onStart();
addVersionNameToContentView();
}
protected void addVersionNameToContentView() {
if (!isTagViewVisible()) {
return;
}
if (mTagView == null) {
mTagView = new TextView(this);
mTagView.setTextColor(Color.GRAY);
mTagView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 10);
mTagView.setText("MIMO SDK V" + BuildConfig.VERSION_NAME);
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;
FrameLayout frameLayout = findViewById(android.R.id.content);
frameLayout.addView(mTagView, params);
}
}
protected boolean isTagViewVisible() {
return true;
}
public void setupToolbar() {
Toolbar mToolbar = findViewById(R.id.toolbar);
if (mToolbar != null) {
setSupportActionBar(mToolbar);
if (getSupportActionBar() != null) {
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
}
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
GlobalApplication.getWinBoLLActivityManager().add(this);
//GlobalApplication.getWinBoLLActivityManager().add(this);
}
@Override
protected void onDestroy() {
super.onDestroy();
GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
//GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home) {
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
//GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
return true;
}
// 在switch语句中处理每个ID并在处理完后返回true未处理的情况返回false。
@@ -48,6 +107,25 @@ public abstract class WinBoLLActivity extends Activity implements IWinBoLLActivi
@Override
public void onBackPressed() {
super.onBackPressed();
GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
//GlobalApplication.getWinBoLLActivityManager().startWinBoLLActivity(getApplicationContext(), MainActivity.class);
}
public void changeFullScreen(Activity activity) {
Window window = activity.getWindow();
if (window == null){
return;
}
View decorView = window.getDecorView();
if (decorView == null){
return;
}
int flag = decorView.getSystemUiVisibility();
flag |= View.SYSTEM_UI_FLAG_FULLSCREEN;
flag |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN;
flag |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
flag |= View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION;
flag |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
decorView.setSystemUiVisibility(flag);
window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
}
}

View File

@@ -14,10 +14,12 @@ 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.Looper;
import android.widget.RemoteViews;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.utils.ToastUtils;
import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.powerbell.App;
import cc.winboll.studio.powerbell.MainActivity;
import cc.winboll.studio.powerbell.R;
@@ -32,8 +34,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 android.os.Handler;
import android.os.Looper;
public class ControlCenterService extends Service {
@@ -73,8 +73,8 @@ public class ControlCenterService extends Service {
mAppConfigUtils = App.getAppConfigUtils(this);
mAppCacheUtils = App.getAppCacheUtils(this);
mNotificationHelper = new NotificationHelper(ControlCenterService.this);
if (mMyServiceConnection == null) {
mMyServiceConnection = new MyServiceConnection();
}
@@ -105,7 +105,7 @@ public class ControlCenterService extends Service {
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);
@@ -116,7 +116,7 @@ public class ControlCenterService extends Service {
mControlCenterServiceReceiver = new ControlCenterServiceReceiver(this);
mControlCenterServiceReceiver.registerAction(this);
}
new Handler(Looper.getMainLooper()).postDelayed(new Runnable(){
@Override
@@ -126,7 +126,7 @@ public class ControlCenterService extends Service {
LogUtils.i(TAG, "Service Is Start.");
}
}, 2000);
}
}
@@ -263,15 +263,15 @@ public class ControlCenterService extends Service {
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);

View File

@@ -0,0 +1,33 @@
package cc.winboll.studio.powerbell.utils;
import android.content.Context;
import android.util.DisplayMetrics;
/**
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
* @Date 2025/11/14 11:14
* @Describe 米盟 MimoUtils
*/
public final class MimoUtils {
public static final String TAG = "Utils";
public static int dpToPx(Context context, float dp) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return (int) (dp * displayMetrics.density + 0.5f);
}
public static int pxToDp(Context context, float px) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return (int) (px / displayMetrics.density + 0.5f);
}
public static int pxToSp(Context context, float pxValue) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return (int) (pxValue / displayMetrics.scaledDensity + 0.5f);
}
public static int spToPx(Context context, float spValue) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
return (int) (spValue * displayMetrics.scaledDensity + 0.5f);
}
}

View File

@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
<cc.winboll.studio.libaes.views.AToolbar
<cc.winboll.studio.libaes.views.ASupportToolbar
android:layout_width="match_parent"
android:layout_height="@dimen/toolbar_height"
android:id="@+id/toolbar"
@@ -22,14 +22,28 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activitymainRelativeLayout1"
android:background="#FFEE2121"/>
android:background="#FFB7B7B7"/>
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/activitymainFrameLayout1"/>
</RelativeLayout>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/activitymainLinearLayout1">
<LinearLayout
android:id="@+id/ads_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"/>
</LinearLayout>
</LinearLayout>

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">能源钟</string>
<string name="app_name">PowerBell</string>
<string name="app_description">一个接收手机电量信息的应用,当电量值达到设定范围时会提醒用户。</string>
<string name="about_crashed">本应用崩溃了,作者水平有限,敬请谅解!</string>
<string name="item_mainview">Main View</string>

View File

@@ -25,16 +25,15 @@
<color name="colorShuiDark">#FF0072A4</color>
<color name="colorShuiAccent">#FF33C1FF</color>
<color name="colorXinling">#FFFCC500</color>
<color name="colorPrimary">@color/colorShuiDark</color>
<!--<color name="colorPrimary">@color/colorShuiDark</color>
<color name="colorPrimaryDark">@color/colorFeng</color>
<color name="colorAccent">@color/colorShui</color>
<color name="colorYellow">#FFFFFF00</color>
<color name="colorRed">#FFFF0000</color>
<color name="colorBlue">#FF000FFF</color>
-->
<color name="colorYellow">#FFBEBE48</color>
<color name="colorRed">#FFC85C5C</color>
<color name="colorBlue">#FF2677C7</color>
<color name="colorBlack">#FF000000</color>
<color name="colorUsege">@color/colorHuo</color>
<color name="colorCurrent">@color/colorShui</color>
<color name="colorCharge">@color/colorXinling</color>
<color name="colorText">@color/colorBlack</color>
<!-- 调试配置
<color name="colorYellow">#FF630066</color>
<color name="colorRed">#FF23244D</color>
@@ -47,15 +46,19 @@
<color name="colorBlue">#FF000DE5</color>
<color name="colorBlack">#FF000000</color>
-->
<!-- 原色配置
<color name="colorYellow">#FFFFFF00</color>
<!-- 原色配置 -->
<!--<color name="colorYellow">#FFFFFF00</color>
<color name="colorRed">#FFFF0000</color>
<color name="colorBlue">#FF000FFF</color>
<color name="colorBlack">#FF000000</color>
-->
<color name="colorPrimary">@color/colorShui</color>
<color name="colorPrimaryDark">@color/colorShuiDark</color>
<color name="colorAccent">@color/colorShuiAccent</color>
<color name="colorUsege">@color/colorRed</color>
<color name="colorCurrent">@color/colorBlue</color>
<color name="colorCharge">@color/colorYellow</color>
-->
<!--CustomSlideToUnlockView控件配置-->
<color name="colorCustomSlideToUnlockViewWhite">#FFFFFFFF</color>

View File

@@ -13,6 +13,9 @@
<external-files-path
name="external_file_path"
path="." />
<external-files-path
name="files_root"
path="mimoDownload" />
<!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录-->
<external-cache-path
name="external_cache_path"

View File

@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
<debug-overrides>
<trust-anchors>
<!-- Trust user added CAs while debuggable only -->
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>