diff --git a/timestamp/build.gradle b/timestamp/build.gradle
index 2b59205..f806f31 100644
--- a/timestamp/build.gradle
+++ b/timestamp/build.gradle
@@ -18,13 +18,17 @@ def genVersionName(def versionName){
}
android {
- compileSdkVersion 32
- buildToolsVersion "32.0.0"
+
+ // 1. compileSdkVersion:必须 ≥ targetSdkVersion,建议直接等于 targetSdkVersion(30)
+ compileSdkVersion 30
+
+ // 2. buildToolsVersion:需匹配 compileSdkVersion,建议使用 30.x.x 最新稳定版(无需高于 compileSdkVersion)
+ buildToolsVersion "30.0.3" // 这是 30 对应的最新稳定版,避免使用 beta 版
defaultConfig {
applicationId "cc.winboll.studio.timestamp"
- minSdkVersion 24
- targetSdkVersion 29
+ minSdkVersion 23
+ targetSdkVersion 30
versionCode 1
// versionName 更新后需要手动设置
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
@@ -34,9 +38,24 @@ android {
versionName = genVersionName("${versionName}")
}
}
+
+ // 米盟 SDK
+ packagingOptions {
+ doNotStrip "*/*/libmimo_1011.so"
+ }
}
dependencies {
+
+ // 米盟
+ api 'com.miui.zeus:mimo-ad-sdk:5.3.+'//请使用最新版sdk
+ //注意:以下5个库必须要引入
+ //api 'androidx.appcompat:appcompat:1.4.1'
+ api 'androidx.recyclerview:recyclerview:1.0.0'
+ api 'com.google.code.gson:gson:2.8.5'
+ api 'com.github.bumptech.glide:glide:4.9.0'
+ //annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
+
// SSH
api 'com.jcraft:jsch:0.1.55'
// Html 解析
diff --git a/timestamp/build.properties b/timestamp/build.properties
index 48433fa..7384a39 100644
--- a/timestamp/build.properties
+++ b/timestamp/build.properties
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
-#Tue Dec 09 12:14:13 GMT 2025
+#Tue Dec 09 12:47:32 GMT 2025
stageCount=0
libraryProject=
baseVersion=15.12
publishVersion=15.12.0
-buildCount=3
+buildCount=9
baseBetaVersion=15.12.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 aface49..03833df 100644
--- a/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java
+++ b/timestamp/src/main/java/cc/winboll/studio/timestamp/MainActivity.java
@@ -1,6 +1,7 @@
package cc.winboll.studio.timestamp;
import android.os.Bundle;
+import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.Switch;
@@ -10,12 +11,12 @@ import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;
import cc.winboll.studio.libappbase.LogUtils;
import cc.winboll.studio.libappbase.LogView;
-import cc.winboll.studio.libappbase.ToastUtils;
import cc.winboll.studio.timestamp.MainService;
import cc.winboll.studio.timestamp.R;
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
import cc.winboll.studio.timestamp.utils.ClipboardUtil;
import cc.winboll.studio.timestamp.utils.TimeStampUtil;
+import java.lang.reflect.Method;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
@@ -29,7 +30,7 @@ public class MainActivity extends AppCompatActivity {
TextView mtvTimeStampFormatString;
EditText metTimeStampCopyFormatString;
TextView mtvTimeStampCopyFormatString;
-
+
LogView mLogView;
Switch mswEnableMainService;
@@ -40,17 +41,17 @@ public class MainActivity extends AppCompatActivity {
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
-
+
metTimeStampFormatString = findViewById(R.id.et_timestampformatstring);
mtvTimeStampFormatString = findViewById(R.id.tv_timestampformatstring);
metTimeStampCopyFormatString = findViewById(R.id.et_timestampcopyformatstring);
mtvTimeStampCopyFormatString = findViewById(R.id.tv_timestampcopyformatstring);
-
+
metTimeStampFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampFormatString());
showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString);
metTimeStampCopyFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampCopyFormatString());
showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString);
-
+
mswEnableMainService = findViewById(R.id.activitymainSwitch1);
mswEnableMainService.setChecked(AppConfigsUtil.getInstance(this).loadAppConfigs().isEnableService());
@@ -67,19 +68,56 @@ public class MainActivity extends AppCompatActivity {
mLogView.start();
}
+ // 1. 反射核心方法:强制显示菜单图标
+ private void forceShowMenuIcons(Menu menu) {
+ if (menu == null) {
+ return; // 避免空指针(低版本兼容)
+ }
+ try {
+ // 1.1 获取系统 MenuBuilder 类(隐藏类,需通过反射访问)
+ Class> menuBuilderClass = Class.forName("com.android.internal.view.menu.MenuBuilder");
+ // 1.2 获取 setOptionalIconsVisible 方法(参数为 boolean,控制图标显示)
+ Method setIconsVisibleMethod = menuBuilderClass.getDeclaredMethod(
+ "setOptionalIconsVisible", boolean.class
+ );
+ // 1.3 开放私有方法访问权限(关键:系统方法默认是 private)
+ setIconsVisibleMethod.setAccessible(true);
+ // 1.4 调用方法:传入 menu 对象 + true(显示图标)
+ setIconsVisibleMethod.invoke(menu, true);
+ } catch (Exception e) {
+ // 捕获反射异常(避免低版本系统类名/方法名变更导致崩溃)
+ LogUtils.d(TAG, e, Thread.currentThread().getStackTrace());
+ //e.printStackTrace();
+ }
+ }
+
+ // 2. 加载菜单(正常加载你的 menu.xml)
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.toolbar_main, menu); // 替换为你的菜单文件名
+ return true;
+ }
+
+ // 3. 关键:在菜单打开时触发反射(确保每次打开菜单都生效)
+ @Override
+ public boolean onMenuOpened(int featureId, Menu menu) {
+ forceShowMenuIcons(menu); // 调用反射方法显示图标
+ return super.onMenuOpened(featureId, menu);
+ }
+
public void onSetMainServiceStatus(View view) {
MainService.setMainServiceStatus(this, mswEnableMainService.isChecked());
}
public void onSaveFormatString(View view) {
- if(showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString)) {
+ if (showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString)) {
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampFormatString(metTimeStampFormatString.getText().toString());
AppConfigsUtil.getInstance(this).saveAppConfigs();
}
}
public void onSaveCopyFormatString(View view) {
- if(showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString)) {
+ if (showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString)) {
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampCopyFormatString(metTimeStampCopyFormatString.getText().toString());
AppConfigsUtil.getInstance(this).saveAppConfigs();
}
@@ -100,20 +138,20 @@ public class MainActivity extends AppCompatActivity {
}
return false;
}
-
+
public void onTimeStamp(View view) {
// 在这里编写按钮点击后要执行的代码
TimeStampUtil.getInstance(this).genTimeStamp();
String formattedDateTime = TimeStampUtil.getInstance(this).getTimeStampCopyString();
ClipboardUtil.copyTextToClipboard(this, formattedDateTime);
-
+
// 更新时间戳文本框显示内容
EditText etTimeStamp = findViewById(R.id.et_timestamp);
etTimeStamp.setText(formattedDateTime);
// 输出一个提示音
TimeStampUtil.getInstance(this).playNotifyMusic(this);
-
+
// 比如显示一个 Toast
Toast.makeText(this, "时间戳:\n" + TimeStampUtil.getInstance(this).getTimeStampCopyString() + "\n已拷贝到剪贴板。", Toast.LENGTH_SHORT).show();
MainService.updateCopiedTimeStamp();
diff --git a/timestamp/src/main/res/drawable/ic_settings.xml b/timestamp/src/main/res/drawable/ic_settings.xml
new file mode 100644
index 0000000..c5510b2
--- /dev/null
+++ b/timestamp/src/main/res/drawable/ic_settings.xml
@@ -0,0 +1,11 @@
+
+