Compare commits
3 Commits
contacts-v
...
timestamp-
| Author | SHA1 | Date | |
|---|---|---|---|
| 25c352dc9e | |||
| fa5c6db163 | |||
| eaf16f1a41 |
@@ -29,29 +29,26 @@ android {
|
|||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
// 项目模块目录的 build.gradle 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "15.12"
|
versionName "15.3"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 米盟 SDK
|
buildTypes {
|
||||||
packagingOptions {
|
release {
|
||||||
doNotStrip "*/*/libmimo_1011.so"
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
// 米盟
|
api 'cc.winboll.studio:libaes:15.9.3'
|
||||||
api 'com.miui.zeus:mimo-ad-sdk:5.3.+'//请使用最新版sdk
|
api 'cc.winboll.studio:libapputils:15.8.5'
|
||||||
//注意:以下5个库必须要引入
|
api 'cc.winboll.studio:libappbase:15.9.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'
|
|
||||||
|
|
||||||
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
||||||
api 'com.github.getActivity:XXPermissions:18.63'
|
api 'com.github.getActivity:XXPermissions:18.63'
|
||||||
// 下拉控件
|
// 下拉控件
|
||||||
@@ -68,6 +65,8 @@ dependencies {
|
|||||||
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
||||||
// 应用介绍页类库
|
// 应用介绍页类库
|
||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
|
// 吐司类库
|
||||||
|
//api 'com.github.getActivity:ToastUtils:10.5'
|
||||||
// 网络连接类库
|
// 网络连接类库
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
|
|
||||||
@@ -85,15 +84,4 @@ dependencies {
|
|||||||
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||||
//api 'androidx.fragment:fragment:1.1.0'
|
//api 'androidx.fragment:fragment:1.1.0'
|
||||||
|
|
||||||
|
|
||||||
// WinBoLL库 nexus.winboll.cc 地址
|
|
||||||
//api 'cc.winboll.studio:libaes:15.12.0'
|
|
||||||
//api 'cc.winboll.studio:libappbase:15.12.2'
|
|
||||||
|
|
||||||
// WinBoLL备用库 jitpack.io 地址
|
|
||||||
api 'com.github.ZhanGSKen:AES:aes-v15.12.3'
|
|
||||||
api 'com.github.ZhanGSKen:APPBase:appbase-v15.12.2'
|
|
||||||
|
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Mon Dec 08 19:48:26 HKT 2025
|
#Mon Nov 03 12:01:02 HKT 2025
|
||||||
stageCount=1
|
stageCount=22
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.12
|
baseVersion=15.3
|
||||||
publishVersion=15.12.0
|
publishVersion=15.3.21
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.12.1
|
baseBetaVersion=15.3.22
|
||||||
|
|||||||
138
contacts/proguard-rules.pro
vendored
138
contacts/proguard-rules.pro
vendored
@@ -9,135 +9,9 @@
|
|||||||
|
|
||||||
# Add any project specific keep options here:
|
# Add any project specific keep options here:
|
||||||
|
|
||||||
# ============================== 基础通用规则 ==============================
|
# If your project uses WebView with JS, uncomment the following
|
||||||
# 保留系统组件
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
-keep public class * extends android.app.Activity
|
# class:
|
||||||
-keep public class * extends android.app.Service
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
-keep public class * extends android.content.BroadcastReceiver
|
# public *;
|
||||||
-keep public class * extends android.content.ContentProvider
|
#}
|
||||||
-keep public class * extends android.app.backup.BackupAgentHelper
|
|
||||||
-keep public class * extends android.preference.Preference
|
|
||||||
|
|
||||||
# 保留 WinBoLL 核心包及子类(合并简化规则)
|
|
||||||
-keep class cc.winboll.studio.** { *; }
|
|
||||||
-keepclassmembers class cc.winboll.studio.** { *; }
|
|
||||||
|
|
||||||
# 保留所有类中的 public static final String TAG 字段(便于日志定位)
|
|
||||||
-keepclassmembers class * {
|
|
||||||
public static final java.lang.String TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
# 保留序列化类(避免Parcelable/Gson解析异常)
|
|
||||||
-keep class * implements android.os.Parcelable {
|
|
||||||
public static final android.os.Parcelable$Creator *;
|
|
||||||
}
|
|
||||||
-keepclassmembers class * implements java.io.Serializable {
|
|
||||||
static final long serialVersionUID;
|
|
||||||
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
|
||||||
private void writeObject(java.io.ObjectOutputStream);
|
|
||||||
private void readObject(java.io.ObjectInputStream);
|
|
||||||
java.lang.Object writeReplace();
|
|
||||||
java.lang.Object readResolve();
|
|
||||||
}
|
|
||||||
|
|
||||||
# 保留 R 文件(避免资源ID混淆)
|
|
||||||
-keepclassmembers class **.R$* {
|
|
||||||
public static <fields>;
|
|
||||||
}
|
|
||||||
|
|
||||||
# 保留 native 方法(避免JNI调用失败)
|
|
||||||
-keepclasseswithmembernames class * {
|
|
||||||
native <methods>;
|
|
||||||
}
|
|
||||||
|
|
||||||
# 保留注解和泛型(避免反射/序列化异常)
|
|
||||||
-keepattributes *Annotation*
|
|
||||||
-keepattributes Signature
|
|
||||||
|
|
||||||
# 屏蔽 Java 8+ 警告(适配 Java 7 语法)
|
|
||||||
-dontwarn java.lang.invoke.*
|
|
||||||
-dontwarn android.support.v8.renderscript.*
|
|
||||||
-dontwarn java.util.function.**
|
|
||||||
|
|
||||||
# ============================== 第三方框架专项规则 ==============================
|
|
||||||
# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容)
|
|
||||||
-keep class okhttp3.** { *; }
|
|
||||||
-keep interface okhttp3.** { *; }
|
|
||||||
-keep class okhttp3.internal.** { *; }
|
|
||||||
-keep class okio.** { *; }
|
|
||||||
-dontwarn okhttp3.internal.platform.**
|
|
||||||
-dontwarn okio.**
|
|
||||||
# ============================== 必要补充规则 ==============================
|
|
||||||
# OkHttp 4.4.1 补充规则(Java 7 兼容)
|
|
||||||
-keep class okhttp3.internal.concurrent.** { *; }
|
|
||||||
-keep class okhttp3.internal.connection.** { *; }
|
|
||||||
-dontwarn okhttp3.internal.concurrent.TaskRunner
|
|
||||||
-dontwarn okhttp3.internal.connection.RealCall
|
|
||||||
|
|
||||||
# Glide 4.9.0(米盟广告图片加载依赖)
|
|
||||||
-keep public class * implements com.bumptech.glide.module.GlideModule
|
|
||||||
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
|
||||||
-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType {
|
|
||||||
**[] $VALUES;
|
|
||||||
public *;
|
|
||||||
}
|
|
||||||
-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule {
|
|
||||||
<init>();
|
|
||||||
}
|
|
||||||
-dontwarn com.bumptech.glide.**
|
|
||||||
|
|
||||||
# Gson 2.8.5(米盟广告数据序列化依赖)
|
|
||||||
-keep class com.google.gson.** { *; }
|
|
||||||
-keep interface com.google.gson.** { *; }
|
|
||||||
-keepclassmembers class * {
|
|
||||||
@com.google.gson.annotations.SerializedName <fields>;
|
|
||||||
}
|
|
||||||
|
|
||||||
# 米盟 SDK(核心广告组件,完整保留避免加载失败)
|
|
||||||
-keep class com.miui.zeus.** { *; }
|
|
||||||
-keep interface com.miui.zeus.** { *; }
|
|
||||||
# 保留米盟日志字段(便于广告加载失败排查)
|
|
||||||
-keepclassmembers class com.miui.zeus.mimo.sdk.** {
|
|
||||||
public static final java.lang.String TAG;
|
|
||||||
}
|
|
||||||
|
|
||||||
# RecyclerView 1.0.0(米盟广告布局渲染依赖)
|
|
||||||
-keep class androidx.recyclerview.** { *; }
|
|
||||||
-keep interface androidx.recyclerview.** { *; }
|
|
||||||
-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter {
|
|
||||||
public *;
|
|
||||||
}
|
|
||||||
|
|
||||||
# 其他第三方框架(按引入依赖保留,无则可删除)
|
|
||||||
# XXPermissions 18.63
|
|
||||||
-keep class com.hjq.permissions.** { *; }
|
|
||||||
-keep interface com.hjq.permissions.** { *; }
|
|
||||||
|
|
||||||
# ZXing 二维码(核心解析组件)
|
|
||||||
-keep class com.google.zxing.** { *; }
|
|
||||||
-keep class com.journeyapps.zxing.** { *; }
|
|
||||||
|
|
||||||
# Jsoup HTML解析
|
|
||||||
-keep class org.jsoup.** { *; }
|
|
||||||
|
|
||||||
# Pinyin4j 拼音搜索
|
|
||||||
-keep class net.sourceforge.pinyin4j.** { *; }
|
|
||||||
|
|
||||||
# JSch SSH组件
|
|
||||||
-keep class com.jcraft.jsch.** { *; }
|
|
||||||
|
|
||||||
# AndroidX 基础组件
|
|
||||||
-keep class androidx.appcompat.** { *; }
|
|
||||||
-keep interface androidx.appcompat.** { *; }
|
|
||||||
|
|
||||||
# ============================== 优化与调试配置 ==============================
|
|
||||||
# 优化级别(平衡混淆效果与性能)
|
|
||||||
-optimizationpasses 5
|
|
||||||
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
|
|
||||||
|
|
||||||
# 调试辅助(保留行号便于崩溃定位)
|
|
||||||
-verbose
|
|
||||||
-dontpreverify
|
|
||||||
-dontusemixedcaseclassnames
|
|
||||||
-keepattributes SourceFile,LineNumberTable
|
|
||||||
|
|
||||||
|
|||||||
@@ -183,7 +183,7 @@
|
|||||||
|
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.support.FILE_PROVIDER_PATHS"
|
android:name="android.support.FILE_PROVIDER_PATHS"
|
||||||
android:resource="@xml/file_provider"/>
|
android:resource="@xml/studio_provider"/>
|
||||||
|
|
||||||
</provider>
|
</provider>
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ package cc.winboll.studio.contacts;
|
|||||||
* @Date 2024/12/08 15:10:51
|
* @Date 2024/12/08 15:10:51
|
||||||
* @Describe 全局应用类
|
* @Describe 全局应用类
|
||||||
*/
|
*/
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import android.view.Gravity;
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.WinBoLLActivityManager;
|
||||||
|
|
||||||
public class App extends GlobalApplication {
|
public class App extends GlobalApplication {
|
||||||
|
|
||||||
@@ -15,14 +16,22 @@ public class App extends GlobalApplication {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate() {
|
public void onCreate() {
|
||||||
// 设置应用调试标志
|
// 必须在调用基类前设置应用调试标志,
|
||||||
setIsDebugging(BuildConfig.DEBUG);
|
// 这样可以预先设置日志与数据的存储根目录。
|
||||||
|
//setIsDebuging(BuildConfig.DEBUG);
|
||||||
super.onCreate();
|
super.onCreate();
|
||||||
|
// 设置 WinBoLL 应用 UI 类型
|
||||||
// 初始化窗口管理类
|
getWinBoLLActivityManager().setWinBoLLUI_TYPE(WinBoLLActivityManager.WinBoLLUI_TYPE.Aplication);
|
||||||
WinBoLLActivityManager.init(this);
|
|
||||||
|
//LogUtils.d(TAG, "onCreate");
|
||||||
|
|
||||||
// 初始化 Toast 框架
|
// 初始化 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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -40,10 +40,10 @@ import cc.winboll.studio.contacts.fragments.ContactsFragment;
|
|||||||
import cc.winboll.studio.contacts.fragments.LogFragment;
|
import cc.winboll.studio.contacts.fragments.LogFragment;
|
||||||
import cc.winboll.studio.contacts.services.MainService;
|
import cc.winboll.studio.contacts.services.MainService;
|
||||||
import cc.winboll.studio.contacts.utils.AppGoToSettingsUtil;
|
import cc.winboll.studio.contacts.utils.AppGoToSettingsUtil;
|
||||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
|
||||||
import cc.winboll.studio.libaes.views.ADsBannerView;
|
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.LogView;
|
import cc.winboll.studio.libappbase.LogView;
|
||||||
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||||
import com.google.android.material.tabs.TabLayout;
|
import com.google.android.material.tabs.TabLayout;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -57,8 +57,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct
|
|||||||
public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoLL.ACTION_SOS";
|
public static final String ACTION_SOS = "cc.winboll.studio.libappbase.WinBoLL.ACTION_SOS";
|
||||||
|
|
||||||
static MainActivity _MainActivity;
|
static MainActivity _MainActivity;
|
||||||
ADsBannerView mADsBannerView;
|
|
||||||
|
|
||||||
LogView mLogView;
|
LogView mLogView;
|
||||||
Toolbar mToolbar;
|
Toolbar mToolbar;
|
||||||
CheckBox cbMainService;
|
CheckBox cbMainService;
|
||||||
@@ -107,9 +105,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct
|
|||||||
initUIAndLogic(savedInstanceState);
|
initUIAndLogic(savedInstanceState);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 米盟广告栏
|
|
||||||
mADsBannerView = findViewById(R.id.adsbanner);
|
|
||||||
|
|
||||||
//ToastUtils.show("onCreate");
|
//ToastUtils.show("onCreate");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -298,10 +293,7 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct
|
|||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
LogUtils.d(TAG, "onDestroy() SOS");
|
||||||
if (mADsBannerView != null) {
|
|
||||||
mADsBannerView.releaseAdResources();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -322,10 +314,6 @@ final public class MainActivity extends AppCompatActivity implements IWinBoLLAct
|
|||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
|
|
||||||
if (mADsBannerView != null) {
|
|
||||||
mADsBannerView.resumeADs(MainActivity.this);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isDefaultPhoneCallApp() {
|
public boolean isDefaultPhoneCallApp() {
|
||||||
|
|||||||
@@ -13,11 +13,10 @@ import android.widget.LinearLayout;
|
|||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
import cc.winboll.studio.contacts.R;
|
import cc.winboll.studio.contacts.R;
|
||||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
import cc.winboll.studio.libaes.winboll.APPInfo;
|
||||||
import cc.winboll.studio.libaes.models.APPInfo;
|
import cc.winboll.studio.libaes.winboll.AboutView;
|
||||||
import cc.winboll.studio.libaes.views.AboutView;
|
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||||
|
|
||||||
public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity {
|
public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||||
|
|
||||||
@@ -66,13 +65,13 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
|
|||||||
);
|
);
|
||||||
layout.addView(aboutView, params);
|
layout.addView(aboutView, params);
|
||||||
|
|
||||||
WinBoLLActivityManager.getInstance().add(this);
|
GlobalApplication.getWinBoLLActivityManager().add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onDestroy() {
|
protected void onDestroy() {
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
WinBoLLActivityManager.getInstance().registeRemove(this);
|
GlobalApplication.getWinBoLLActivityManager().registeRemove(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AboutView CreateAboutView() {
|
public AboutView CreateAboutView() {
|
||||||
@@ -81,11 +80,11 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
|
|||||||
appInfo.setAppName("Contacts");
|
appInfo.setAppName("Contacts");
|
||||||
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
||||||
appInfo.setAppDescription("这是可以根据正则表达式匹配拦截骚扰电话的手机拨号应用。");
|
appInfo.setAppDescription("这是可以根据正则表达式匹配拦截骚扰电话的手机拨号应用。");
|
||||||
appInfo.setAppGitName("WinBoLL");
|
appInfo.setAppGitName("APPBase");
|
||||||
appInfo.setAppGitOwner("Studio");
|
appInfo.setAppGitOwner("Studio");
|
||||||
appInfo.setAppGitAPPBranch(szBranchName);
|
appInfo.setAppGitAPPBranch(szBranchName);
|
||||||
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
||||||
appInfo.setAppHomePage("https://www.winboll.cc/apks/index.php?project=Contacts");
|
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=4&extra=page%3D1");
|
||||||
appInfo.setAppAPKName("Contacts");
|
appInfo.setAppAPKName("Contacts");
|
||||||
appInfo.setAppAPKFolderName("Contacts");
|
appInfo.setAppAPKFolderName("Contacts");
|
||||||
return new AboutView(mContext, appInfo);
|
return new AboutView(mContext, appInfo);
|
||||||
|
|||||||
@@ -35,10 +35,9 @@ import cc.winboll.studio.contacts.bobulltoon.TomCat;
|
|||||||
import cc.winboll.studio.contacts.dun.Rules;
|
import cc.winboll.studio.contacts.dun.Rules;
|
||||||
import cc.winboll.studio.contacts.services.MainService;
|
import cc.winboll.studio.contacts.services.MainService;
|
||||||
import cc.winboll.studio.contacts.views.DuInfoTextView;
|
import cc.winboll.studio.contacts.views.DuInfoTextView;
|
||||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
|
||||||
import cc.winboll.studio.libaes.utils.WinBoLLActivityManager;
|
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||||
import java.lang.reflect.Field;
|
import java.lang.reflect.Field;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -243,17 +242,14 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
ToastUtils.show("悬浮窗已开启");
|
ToastUtils.show("悬浮窗已开启");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onCleanBoBullToonData(View view) {
|
|
||||||
TomCat tomCat = TomCat.getInstance(this);
|
|
||||||
tomCat.cleanBoBullToon();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void onResetBoBullToonURL(View view) {
|
public void onResetBoBullToonURL(View view) {
|
||||||
Rules.getInstance(this).resetDefaultBoBullToonURL();
|
Rules.getInstance(this).resetDefaultBoBullToonURL();
|
||||||
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
|
EditText etBoBullToonURL = findViewById(R.id.bobulltoonurl_et);
|
||||||
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
|
etBoBullToonURL.setText(Rules.getInstance(this).getBoBullToonURL());
|
||||||
ToastUtils.show("已重置 BoBullToon URL。");
|
|
||||||
|
final TomCat tomCat = TomCat.getInstance(this);
|
||||||
|
tomCat.cleanBoBullToon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDownloadBoBullToon(View view) {
|
public void onDownloadBoBullToon(View view) {
|
||||||
@@ -267,7 +263,6 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (tomCat.downloadBoBullToon()) {
|
if (tomCat.downloadBoBullToon()) {
|
||||||
ToastUtils.show("BoBullToon downlaod OK!");
|
|
||||||
LogUtils.d(TAG, "BoBullToon downlaod OK!");
|
LogUtils.d(TAG, "BoBullToon downlaod OK!");
|
||||||
MainService.restartMainService(SettingsActivity.this);
|
MainService.restartMainService(SettingsActivity.this);
|
||||||
Rules.getInstance(SettingsActivity.this).reload();
|
Rules.getInstance(SettingsActivity.this).reload();
|
||||||
@@ -340,10 +335,10 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void onAbout(View view) {
|
public void onAbout(View view) {
|
||||||
WinBoLLActivityManager.getInstance().startWinBoLLActivity(this, AboutActivity.class);
|
App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onLogView(View view) {
|
public void onLogView(View view) {
|
||||||
WinBoLLActivityManager.getInstance().startLogActivity(this);
|
App.getWinBoLLActivityManager().startLogActivity(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import android.app.Activity;
|
|||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
|
import cc.winboll.studio.libaes.beans.AESThemeBean;
|
||||||
import cc.winboll.studio.libaes.models.AESThemeBean;
|
|
||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||||
|
|
||||||
public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
|
public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import cc.winboll.studio.contacts.R;
|
|||||||
import cc.winboll.studio.contacts.beans.CallLogModel;
|
import cc.winboll.studio.contacts.beans.CallLogModel;
|
||||||
import cc.winboll.studio.contacts.utils.ContactUtils;
|
import cc.winboll.studio.contacts.utils.ContactUtils;
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import cc.winboll.studio.contacts.R;
|
|||||||
import cc.winboll.studio.contacts.beans.ContactModel;
|
import cc.winboll.studio.contacts.beans.ContactModel;
|
||||||
import cc.winboll.studio.contacts.utils.ContactUtils;
|
import cc.winboll.studio.contacts.utils.ContactUtils;
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
|
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
|
||||||
|
|||||||
@@ -20,8 +20,8 @@ import cc.winboll.studio.contacts.R;
|
|||||||
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
|
import cc.winboll.studio.contacts.beans.PhoneConnectRuleModel;
|
||||||
import cc.winboll.studio.contacts.dun.Rules;
|
import cc.winboll.studio.contacts.dun.Rules;
|
||||||
import cc.winboll.studio.contacts.views.LeftScrollView;
|
import cc.winboll.studio.contacts.views.LeftScrollView;
|
||||||
import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import android.content.Context;
|
|||||||
import cc.winboll.studio.contacts.R;
|
import cc.winboll.studio.contacts.R;
|
||||||
import cc.winboll.studio.contacts.dun.Rules;
|
import cc.winboll.studio.contacts.dun.Rules;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileFilter;
|
import java.io.FileFilter;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import cc.winboll.studio.contacts.R;
|
|||||||
import cc.winboll.studio.contacts.adapters.ContactAdapter;
|
import cc.winboll.studio.contacts.adapters.ContactAdapter;
|
||||||
import cc.winboll.studio.contacts.beans.ContactModel;
|
import cc.winboll.studio.contacts.beans.ContactModel;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.ExecutorService;
|
import java.util.concurrent.ExecutorService;
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
import android.content.IntentFilter;
|
||||||
import cc.winboll.studio.contacts.services.MainService;
|
import cc.winboll.studio.contacts.services.MainService;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
|
|
||||||
public class MainReceiver extends BroadcastReceiver {
|
public class MainReceiver extends BroadcastReceiver {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import android.content.ServiceConnection;
|
|||||||
import android.media.AudioManager;
|
import android.media.AudioManager;
|
||||||
import android.os.Binder;
|
import android.os.Binder;
|
||||||
import android.os.IBinder;
|
import android.os.IBinder;
|
||||||
|
import cc.winboll.studio.contacts.App;
|
||||||
import cc.winboll.studio.contacts.beans.MainServiceBean;
|
import cc.winboll.studio.contacts.beans.MainServiceBean;
|
||||||
import cc.winboll.studio.contacts.beans.RingTongBean;
|
import cc.winboll.studio.contacts.beans.RingTongBean;
|
||||||
import cc.winboll.studio.contacts.bobulltoon.TomCat;
|
import cc.winboll.studio.contacts.bobulltoon.TomCat;
|
||||||
@@ -28,6 +29,8 @@ import cc.winboll.studio.contacts.receivers.MainReceiver;
|
|||||||
import cc.winboll.studio.contacts.services.MainService;
|
import cc.winboll.studio.contacts.services.MainService;
|
||||||
import cc.winboll.studio.contacts.threads.MainServiceThread;
|
import cc.winboll.studio.contacts.threads.MainServiceThread;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.sos.SOS;
|
||||||
|
import cc.winboll.studio.libappbase.winboll.WinBoLL;
|
||||||
import java.util.Timer;
|
import java.util.Timer;
|
||||||
import java.util.TimerTask;
|
import java.util.TimerTask;
|
||||||
|
|
||||||
@@ -126,11 +129,11 @@ public class MainService extends Service {
|
|||||||
// 唤醒守护进程
|
// 唤醒守护进程
|
||||||
wakeupAndBindAssistant();
|
wakeupAndBindAssistant();
|
||||||
// 召唤 WinBoLL APP 绑定本服务
|
// 召唤 WinBoLL APP 绑定本服务
|
||||||
// if (App.isDebugging()) {
|
if (App.isDebuging()) {
|
||||||
// WinBoLL.bindToAPPBaseBeta(this, MainService.class.getName());
|
WinBoLL.bindToAPPBaseBeta(this, MainService.class.getName());
|
||||||
// } else {
|
} else {
|
||||||
// WinBoLL.bindToAPPBase(this, MainService.class.getName());
|
WinBoLL.bindToAPPBase(this, MainService.class.getName());
|
||||||
// }
|
}
|
||||||
|
|
||||||
// 初始化服务运行参数
|
// 初始化服务运行参数
|
||||||
_TomCat = TomCat.getInstance(this);
|
_TomCat = TomCat.getInstance(this);
|
||||||
@@ -236,11 +239,11 @@ public class MainService extends Service {
|
|||||||
if (mMainServiceBean.isEnable()) {
|
if (mMainServiceBean.isEnable()) {
|
||||||
// 唤醒守护进程
|
// 唤醒守护进程
|
||||||
wakeupAndBindAssistant();
|
wakeupAndBindAssistant();
|
||||||
// if (App.isDebuging()) {
|
if (App.isDebuging()) {
|
||||||
// SOS.sosToAppBase(getApplicationContext(), MainService.class.getName());
|
SOS.sosToAppBase(getApplicationContext(), MainService.class.getName());
|
||||||
// } else {
|
} else {
|
||||||
// SOS.sosToAppBaseBeta(getApplicationContext(), MainService.class.getName());
|
SOS.sosToAppBaseBeta(getApplicationContext(), MainService.class.getName());
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
isBound = false;
|
isBound = false;
|
||||||
mAssistantService = null;
|
mAssistantService = null;
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import android.database.Cursor;
|
|||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.provider.ContactsContract;
|
import android.provider.ContactsContract;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import android.content.Intent;
|
|||||||
import android.widget.RemoteViews;
|
import android.widget.RemoteViews;
|
||||||
import cc.winboll.studio.contacts.R;
|
import cc.winboll.studio.contacts.R;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.ToastUtils;
|
import cc.winboll.studio.libappbase.utils.ToastUtils;
|
||||||
|
|
||||||
public class APPStatusWidget extends AppWidgetProvider {
|
public class APPStatusWidget extends AppWidgetProvider {
|
||||||
|
|
||||||
|
|||||||
@@ -12,11 +12,6 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:id="@+id/activitymainToolbar1"/>
|
android:id="@+id/activitymainToolbar1"/>
|
||||||
|
|
||||||
<cc.winboll.studio.libaes.views.ADsBannerView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:id="@+id/adsbanner"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
|
|||||||
@@ -195,48 +195,30 @@
|
|||||||
android:text="拨不通电话记录查询:"/>
|
android:text="拨不通电话记录查询:"/>
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="vertical"
|
android:orientation="horizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="right"
|
android:gravity="right"
|
||||||
android:layout_margin="10dp">
|
android:layout_margin="10dp">
|
||||||
|
|
||||||
<EditText
|
<EditText
|
||||||
android:layout_width="match_parent"
|
android:layout_width="0dp"
|
||||||
android:ems="10"
|
android:ems="10"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_weight="1.0"
|
||||||
android:id="@+id/bobulltoonurl_et"/>
|
android:id="@+id/bobulltoonurl_et"/>
|
||||||
|
|
||||||
<HorizontalScrollView
|
<Button
|
||||||
android:layout_width="match_parent"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:text="重置地址"
|
||||||
|
android:onClick="onResetBoBullToonURL"/>
|
||||||
|
|
||||||
<LinearLayout
|
<Button
|
||||||
android:orientation="horizontal"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_height="wrap_content">
|
android:text="下载数据"
|
||||||
|
android:onClick="onDownloadBoBullToon"/>
|
||||||
<Button
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="下载数据"
|
|
||||||
android:onClick="onDownloadBoBullToon"/>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="清空 BoBullToon 数据"
|
|
||||||
android:onClick="onCleanBoBullToonData"/>
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="重置地址"
|
|
||||||
android:onClick="onResetBoBullToonURL"/>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -336,11 +318,6 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="其他:"/>
|
android:text="其他:"/>
|
||||||
|
|
||||||
<cc.winboll.studio.libaes.views.ADsControlView
|
|
||||||
android:id="@+id/ads_control_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content" />
|
|
||||||
|
|
||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
|
|||||||
@@ -2,6 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">Contacts</string>
|
<string name="app_name">Contacts</string>
|
||||||
<string name="default_bobulltoon_url">https://gitea.winboll.cc/Studio/BoBullToon/archive/main.zip</string>
|
<string name="default_bobulltoon_url">https://gitee.com/zhangsken/bobulltoon/repository/archive/main.zip</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -18,37 +18,44 @@ def genVersionName(def versionName){
|
|||||||
}
|
}
|
||||||
|
|
||||||
android {
|
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 {
|
defaultConfig {
|
||||||
applicationId "cc.winboll.studio.timestamp"
|
applicationId "cc.winboll.studio.timestamp"
|
||||||
minSdkVersion 24
|
minSdkVersion 23
|
||||||
targetSdkVersion 29
|
targetSdkVersion 30
|
||||||
versionCode 1
|
versionCode 1
|
||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "15.1"
|
versionName "15.12"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
buildTypes {
|
// 米盟 SDK
|
||||||
release {
|
packagingOptions {
|
||||||
minifyEnabled false
|
doNotStrip "*/*/libmimo_1011.so"
|
||||||
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
|
||||||
api 'cc.winboll.studio:libaes:15.6.0'
|
// 米盟
|
||||||
api 'cc.winboll.studio:libapputils:15.3.4'
|
api 'com.miui.zeus:mimo-ad-sdk:5.3.+'//请使用最新版sdk
|
||||||
api 'cc.winboll.studio:libappbase:15.7.6'
|
//注意:以下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
|
// SSH
|
||||||
api 'com.jcraft:jsch:0.1.55'
|
api 'com.jcraft:jsch:0.1.55'
|
||||||
// Html 解析
|
// Html 解析
|
||||||
@@ -58,8 +65,6 @@ dependencies {
|
|||||||
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
||||||
// 应用介绍页类库
|
// 应用介绍页类库
|
||||||
api 'io.github.medyo:android-about-page:2.0.0'
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
// 吐司类库
|
|
||||||
api 'com.github.getActivity:ToastUtils:10.5'
|
|
||||||
// 网络连接类库
|
// 网络连接类库
|
||||||
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
// AndroidX 类库
|
// AndroidX 类库
|
||||||
@@ -69,4 +74,14 @@ dependencies {
|
|||||||
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||||
//api 'androidx.fragment:fragment:1.1.0'
|
//api 'androidx.fragment:fragment:1.1.0'
|
||||||
|
|
||||||
|
// WinBoLL库 nexus.winboll.cc 地址
|
||||||
|
//api 'cc.winboll.studio:libaes:15.12.0'
|
||||||
|
//api 'cc.winboll.studio:libappbase:15.12.2'
|
||||||
|
|
||||||
|
// WinBoLL备用库 jitpack.io 地址
|
||||||
|
api 'com.github.ZhanGSKen:AES:aes-v15.12.4'
|
||||||
|
api 'com.github.ZhanGSKen:APPBase:appbase-v15.12.2'
|
||||||
|
|
||||||
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Sep 28 13:16:52 HKT 2025
|
#Tue Dec 09 13:15:55 GMT 2025
|
||||||
stageCount=5
|
stageCount=0
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.1
|
baseVersion=15.12
|
||||||
publishVersion=15.1.4
|
publishVersion=15.12.0
|
||||||
buildCount=0
|
buildCount=19
|
||||||
baseBetaVersion=15.1.5
|
baseBetaVersion=15.12.1
|
||||||
|
|||||||
164
timestamp/proguard-rules.pro
vendored
164
timestamp/proguard-rules.pro
vendored
@@ -1,21 +1,143 @@
|
|||||||
# Add project specific ProGuard rules here.
|
# Add project specific ProGuard rules here.
|
||||||
# You can control the set of applied configuration files using the
|
# By default, the flags in this file are appended to flags specified
|
||||||
# proguardFiles setting in build.gradle.
|
# in C:\tools\adt-bundle-windows-x86_64-20131030\sdk/tools/proguard/proguard-android.txt
|
||||||
#
|
# You can edit the include path and order by changing the proguardFiles
|
||||||
# For more details, see
|
# directive in build.gradle.
|
||||||
# http://developer.android.com/guide/developing/tools/proguard.html
|
#
|
||||||
|
# For more details, see
|
||||||
# If your project uses WebView with JS, uncomment the following
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
# and specify the fully qualified class name to the JavaScript interface
|
|
||||||
# class:
|
# Add any project specific keep options here:
|
||||||
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
|
||||||
# public *;
|
# ============================== 基础通用规则 ==============================
|
||||||
#}
|
# 保留系统组件
|
||||||
|
-keep public class * extends android.app.Activity
|
||||||
# Uncomment this to preserve the line number information for
|
-keep public class * extends android.app.Service
|
||||||
# debugging stack traces.
|
-keep public class * extends android.content.BroadcastReceiver
|
||||||
#-keepattributes SourceFile,LineNumberTable
|
-keep public class * extends android.content.ContentProvider
|
||||||
|
-keep public class * extends android.app.backup.BackupAgentHelper
|
||||||
# If you keep the line number information, uncomment this to
|
-keep public class * extends android.preference.Preference
|
||||||
# hide the original source file name.
|
|
||||||
#-renamesourcefileattribute SourceFile
|
# 保留 WinBoLL 核心包及子类(合并简化规则)
|
||||||
|
-keep class cc.winboll.studio.** { *; }
|
||||||
|
-keepclassmembers class cc.winboll.studio.** { *; }
|
||||||
|
|
||||||
|
# 保留所有类中的 public static final String TAG 字段(便于日志定位)
|
||||||
|
-keepclassmembers class * {
|
||||||
|
public static final java.lang.String TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留序列化类(避免Parcelable/Gson解析异常)
|
||||||
|
-keep class * implements android.os.Parcelable {
|
||||||
|
public static final android.os.Parcelable$Creator *;
|
||||||
|
}
|
||||||
|
-keepclassmembers class * implements java.io.Serializable {
|
||||||
|
static final long serialVersionUID;
|
||||||
|
private static final java.io.ObjectStreamField[] serialPersistentFields;
|
||||||
|
private void writeObject(java.io.ObjectOutputStream);
|
||||||
|
private void readObject(java.io.ObjectInputStream);
|
||||||
|
java.lang.Object writeReplace();
|
||||||
|
java.lang.Object readResolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留 R 文件(避免资源ID混淆)
|
||||||
|
-keepclassmembers class **.R$* {
|
||||||
|
public static <fields>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留 native 方法(避免JNI调用失败)
|
||||||
|
-keepclasseswithmembernames class * {
|
||||||
|
native <methods>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 保留注解和泛型(避免反射/序列化异常)
|
||||||
|
-keepattributes *Annotation*
|
||||||
|
-keepattributes Signature
|
||||||
|
|
||||||
|
# 屏蔽 Java 8+ 警告(适配 Java 7 语法)
|
||||||
|
-dontwarn java.lang.invoke.*
|
||||||
|
-dontwarn android.support.v8.renderscript.*
|
||||||
|
-dontwarn java.util.function.**
|
||||||
|
|
||||||
|
# ============================== 第三方框架专项规则 ==============================
|
||||||
|
# OkHttp 4.4.1(米盟广告请求依赖,完善Lambda兼容)
|
||||||
|
-keep class okhttp3.** { *; }
|
||||||
|
-keep interface okhttp3.** { *; }
|
||||||
|
-keep class okhttp3.internal.** { *; }
|
||||||
|
-keep class okio.** { *; }
|
||||||
|
-dontwarn okhttp3.internal.platform.**
|
||||||
|
-dontwarn okio.**
|
||||||
|
# ============================== 必要补充规则 ==============================
|
||||||
|
# OkHttp 4.4.1 补充规则(Java 7 兼容)
|
||||||
|
-keep class okhttp3.internal.concurrent.** { *; }
|
||||||
|
-keep class okhttp3.internal.connection.** { *; }
|
||||||
|
-dontwarn okhttp3.internal.concurrent.TaskRunner
|
||||||
|
-dontwarn okhttp3.internal.connection.RealCall
|
||||||
|
|
||||||
|
# Glide 4.9.0(米盟广告图片加载依赖)
|
||||||
|
-keep public class * implements com.bumptech.glide.module.GlideModule
|
||||||
|
-keep public class * extends com.bumptech.glide.module.AppGlideModule
|
||||||
|
-keep public enum com.bumptech.glide.load.ImageHeaderParser$ImageType {
|
||||||
|
**[] $VALUES;
|
||||||
|
public *;
|
||||||
|
}
|
||||||
|
-keepclassmembers class * implements com.bumptech.glide.module.AppGlideModule {
|
||||||
|
<init>();
|
||||||
|
}
|
||||||
|
-dontwarn com.bumptech.glide.**
|
||||||
|
|
||||||
|
# Gson 2.8.5(米盟广告数据序列化依赖)
|
||||||
|
-keep class com.google.gson.** { *; }
|
||||||
|
-keep interface com.google.gson.** { *; }
|
||||||
|
-keepclassmembers class * {
|
||||||
|
@com.google.gson.annotations.SerializedName <fields>;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 米盟 SDK(核心广告组件,完整保留避免加载失败)
|
||||||
|
-keep class com.miui.zeus.** { *; }
|
||||||
|
-keep interface com.miui.zeus.** { *; }
|
||||||
|
# 保留米盟日志字段(便于广告加载失败排查)
|
||||||
|
-keepclassmembers class com.miui.zeus.mimo.sdk.** {
|
||||||
|
public static final java.lang.String TAG;
|
||||||
|
}
|
||||||
|
|
||||||
|
# RecyclerView 1.0.0(米盟广告布局渲染依赖)
|
||||||
|
-keep class androidx.recyclerview.** { *; }
|
||||||
|
-keep interface androidx.recyclerview.** { *; }
|
||||||
|
-keepclassmembers class androidx.recyclerview.widget.RecyclerView$Adapter {
|
||||||
|
public *;
|
||||||
|
}
|
||||||
|
|
||||||
|
# 其他第三方框架(按引入依赖保留,无则可删除)
|
||||||
|
# XXPermissions 18.63
|
||||||
|
-keep class com.hjq.permissions.** { *; }
|
||||||
|
-keep interface com.hjq.permissions.** { *; }
|
||||||
|
|
||||||
|
# ZXing 二维码(核心解析组件)
|
||||||
|
-keep class com.google.zxing.** { *; }
|
||||||
|
-keep class com.journeyapps.zxing.** { *; }
|
||||||
|
|
||||||
|
# Jsoup HTML解析
|
||||||
|
-keep class org.jsoup.** { *; }
|
||||||
|
|
||||||
|
# Pinyin4j 拼音搜索
|
||||||
|
-keep class net.sourceforge.pinyin4j.** { *; }
|
||||||
|
|
||||||
|
# JSch SSH组件
|
||||||
|
-keep class com.jcraft.jsch.** { *; }
|
||||||
|
|
||||||
|
# AndroidX 基础组件
|
||||||
|
-keep class androidx.appcompat.** { *; }
|
||||||
|
-keep interface androidx.appcompat.** { *; }
|
||||||
|
|
||||||
|
# ============================== 优化与调试配置 ==============================
|
||||||
|
# 优化级别(平衡混淆效果与性能)
|
||||||
|
-optimizationpasses 5
|
||||||
|
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
|
||||||
|
|
||||||
|
# 调试辅助(保留行号便于崩溃定位)
|
||||||
|
-verbose
|
||||||
|
-dontpreverify
|
||||||
|
-dontusemixedcaseclassnames
|
||||||
|
-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
|||||||
@@ -62,6 +62,8 @@
|
|||||||
|
|
||||||
</receiver>
|
</receiver>
|
||||||
|
|
||||||
|
<activity android:name="cc.winboll.studio.timestamp.activities.SettingsActivity"/>
|
||||||
|
|
||||||
</application>
|
</application>
|
||||||
|
|
||||||
</manifest>
|
</manifest>
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ import android.os.Handler;
|
|||||||
import android.os.Looper;
|
import android.os.Looper;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.Gravity;
|
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
import android.view.MenuItem;
|
import android.view.MenuItem;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
@@ -22,9 +21,9 @@ import android.widget.HorizontalScrollView;
|
|||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import cc.winboll.studio.timestamp.R;
|
|
||||||
import cc.winboll.studio.libappbase.GlobalApplication;
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
import com.hjq.toast.ToastUtils;
|
import cc.winboll.studio.libappbase.ToastUtils;
|
||||||
|
import cc.winboll.studio.timestamp.R;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.Closeable;
|
import java.io.Closeable;
|
||||||
@@ -52,11 +51,7 @@ public class App extends GlobalApplication {
|
|||||||
|
|
||||||
// 初始化 Toast 框架
|
// 初始化 Toast 框架
|
||||||
ToastUtils.init(this);
|
ToastUtils.init(this);
|
||||||
// 设置 Toast 布局样式
|
|
||||||
//ToastUtils.setView(R.layout.view_toast);
|
|
||||||
//ToastUtils.setStyle(new WhiteToastStyle());
|
|
||||||
ToastUtils.setGravity(Gravity.BOTTOM, 0, 200);
|
|
||||||
|
|
||||||
//CrashHandler.getInstance().registerGlobal(this);
|
//CrashHandler.getInstance().registerGlobal(this);
|
||||||
//CrashHandler.getInstance().registerPart(this);
|
//CrashHandler.getInstance().registerPart(this);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,9 @@
|
|||||||
package cc.winboll.studio.timestamp;
|
package cc.winboll.studio.timestamp;
|
||||||
|
|
||||||
|
import android.content.Intent;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
@@ -8,14 +11,16 @@ import android.widget.TextView;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import androidx.appcompat.widget.Toolbar;
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import cc.winboll.studio.libaes.views.ADsBannerView;
|
||||||
import cc.winboll.studio.libappbase.LogUtils;
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.LogView;
|
import cc.winboll.studio.libappbase.LogView;
|
||||||
import cc.winboll.studio.timestamp.MainService;
|
import cc.winboll.studio.timestamp.MainService;
|
||||||
import cc.winboll.studio.timestamp.R;
|
import cc.winboll.studio.timestamp.R;
|
||||||
|
import cc.winboll.studio.timestamp.activities.SettingsActivity;
|
||||||
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
|
import cc.winboll.studio.timestamp.utils.AppConfigsUtil;
|
||||||
import cc.winboll.studio.timestamp.utils.ClipboardUtil;
|
import cc.winboll.studio.timestamp.utils.ClipboardUtil;
|
||||||
import cc.winboll.studio.timestamp.utils.TimeStampUtil;
|
import cc.winboll.studio.timestamp.utils.TimeStampUtil;
|
||||||
import com.hjq.toast.ToastUtils;
|
import java.lang.reflect.Method;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneId;
|
import java.time.ZoneId;
|
||||||
@@ -29,9 +34,10 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
TextView mtvTimeStampFormatString;
|
TextView mtvTimeStampFormatString;
|
||||||
EditText metTimeStampCopyFormatString;
|
EditText metTimeStampCopyFormatString;
|
||||||
TextView mtvTimeStampCopyFormatString;
|
TextView mtvTimeStampCopyFormatString;
|
||||||
|
|
||||||
LogView mLogView;
|
LogView mLogView;
|
||||||
Switch mswEnableMainService;
|
Switch mswEnableMainService;
|
||||||
|
ADsBannerView mADsBannerView;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
@@ -40,46 +46,107 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
|
|
||||||
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
|
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
|
mADsBannerView = findViewById(R.id.adsbanner);
|
||||||
|
|
||||||
metTimeStampFormatString = findViewById(R.id.et_timestampformatstring);
|
metTimeStampFormatString = findViewById(R.id.et_timestampformatstring);
|
||||||
mtvTimeStampFormatString = findViewById(R.id.tv_timestampformatstring);
|
mtvTimeStampFormatString = findViewById(R.id.tv_timestampformatstring);
|
||||||
metTimeStampCopyFormatString = findViewById(R.id.et_timestampcopyformatstring);
|
metTimeStampCopyFormatString = findViewById(R.id.et_timestampcopyformatstring);
|
||||||
mtvTimeStampCopyFormatString = findViewById(R.id.tv_timestampcopyformatstring);
|
mtvTimeStampCopyFormatString = findViewById(R.id.tv_timestampcopyformatstring);
|
||||||
|
|
||||||
metTimeStampFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampFormatString());
|
metTimeStampFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampFormatString());
|
||||||
showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString);
|
showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString);
|
||||||
metTimeStampCopyFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampCopyFormatString());
|
metTimeStampCopyFormatString.setText(AppConfigsUtil.getInstance(this).getAppConfigsModel().getTimeStampCopyFormatString());
|
||||||
showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString);
|
showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString);
|
||||||
|
|
||||||
mswEnableMainService = findViewById(R.id.activitymainSwitch1);
|
mswEnableMainService = findViewById(R.id.activitymainSwitch1);
|
||||||
mswEnableMainService.setChecked(AppConfigsUtil.getInstance(this).loadAppConfigs().isEnableService());
|
mswEnableMainService.setChecked(AppConfigsUtil.getInstance(this).loadAppConfigs().isEnableService());
|
||||||
|
|
||||||
mLogView = findViewById(R.id.logview);
|
mLogView = findViewById(R.id.logview);
|
||||||
|
|
||||||
ToastUtils.show("onCreate");
|
//ToastUtils.show("onCreate");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onResume() {
|
protected void onResume() {
|
||||||
super.onResume();
|
super.onResume();
|
||||||
mLogView.start();
|
mLogView.start();
|
||||||
|
if (mADsBannerView != null) {
|
||||||
|
mADsBannerView.resumeADs(MainActivity.this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onDestroy() {
|
||||||
|
super.onDestroy();
|
||||||
|
if (mADsBannerView != null) {
|
||||||
|
mADsBannerView.releaseAdResources();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
if (item.getItemId() == R.id.item_settings) {
|
||||||
|
Intent intent = new Intent(this, SettingsActivity.class);
|
||||||
|
startActivity(intent);
|
||||||
|
} else {
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void onSetMainServiceStatus(View view) {
|
public void onSetMainServiceStatus(View view) {
|
||||||
MainService.setMainServiceStatus(this, mswEnableMainService.isChecked());
|
MainService.setMainServiceStatus(this, mswEnableMainService.isChecked());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSaveFormatString(View view) {
|
public void onSaveFormatString(View view) {
|
||||||
if(showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString)) {
|
if (showPreViewResult(metTimeStampFormatString, mtvTimeStampFormatString)) {
|
||||||
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampFormatString(metTimeStampFormatString.getText().toString());
|
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampFormatString(metTimeStampFormatString.getText().toString());
|
||||||
AppConfigsUtil.getInstance(this).saveAppConfigs();
|
AppConfigsUtil.getInstance(this).saveAppConfigs();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onSaveCopyFormatString(View view) {
|
public void onSaveCopyFormatString(View view) {
|
||||||
if(showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString)) {
|
if (showPreViewResult(metTimeStampCopyFormatString, mtvTimeStampCopyFormatString)) {
|
||||||
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampCopyFormatString(metTimeStampCopyFormatString.getText().toString());
|
AppConfigsUtil.getInstance(this).getAppConfigsModel().setTimeStampCopyFormatString(metTimeStampCopyFormatString.getText().toString());
|
||||||
AppConfigsUtil.getInstance(this).saveAppConfigs();
|
AppConfigsUtil.getInstance(this).saveAppConfigs();
|
||||||
}
|
}
|
||||||
@@ -100,20 +167,20 @@ public class MainActivity extends AppCompatActivity {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onTimeStamp(View view) {
|
public void onTimeStamp(View view) {
|
||||||
// 在这里编写按钮点击后要执行的代码
|
// 在这里编写按钮点击后要执行的代码
|
||||||
TimeStampUtil.getInstance(this).genTimeStamp();
|
TimeStampUtil.getInstance(this).genTimeStamp();
|
||||||
String formattedDateTime = TimeStampUtil.getInstance(this).getTimeStampCopyString();
|
String formattedDateTime = TimeStampUtil.getInstance(this).getTimeStampCopyString();
|
||||||
ClipboardUtil.copyTextToClipboard(this, formattedDateTime);
|
ClipboardUtil.copyTextToClipboard(this, formattedDateTime);
|
||||||
|
|
||||||
// 更新时间戳文本框显示内容
|
// 更新时间戳文本框显示内容
|
||||||
EditText etTimeStamp = findViewById(R.id.et_timestamp);
|
EditText etTimeStamp = findViewById(R.id.et_timestamp);
|
||||||
etTimeStamp.setText(formattedDateTime);
|
etTimeStamp.setText(formattedDateTime);
|
||||||
|
|
||||||
// 输出一个提示音
|
// 输出一个提示音
|
||||||
TimeStampUtil.getInstance(this).playNotifyMusic(this);
|
TimeStampUtil.getInstance(this).playNotifyMusic(this);
|
||||||
|
|
||||||
// 比如显示一个 Toast
|
// 比如显示一个 Toast
|
||||||
Toast.makeText(this, "时间戳:\n" + TimeStampUtil.getInstance(this).getTimeStampCopyString() + "\n已拷贝到剪贴板。", Toast.LENGTH_SHORT).show();
|
Toast.makeText(this, "时间戳:\n" + TimeStampUtil.getInstance(this).getTimeStampCopyString() + "\n已拷贝到剪贴板。", Toast.LENGTH_SHORT).show();
|
||||||
MainService.updateCopiedTimeStamp();
|
MainService.updateCopiedTimeStamp();
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package cc.winboll.studio.timestamp.activities;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.view.View;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import cc.winboll.studio.libappbase.LogUtils;
|
||||||
|
import cc.winboll.studio.timestamp.R;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
|
||||||
|
* @Date 2025/12/09 20:50
|
||||||
|
* @Describe SettingActivity
|
||||||
|
*/
|
||||||
|
public class SettingsActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
public static final String TAG = "SettingsActivity";
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_settings);
|
||||||
|
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
// 显示后退按钮
|
||||||
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||||
|
getSupportActionBar().setSubtitle(TAG);
|
||||||
|
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
|
||||||
|
@Override
|
||||||
|
public void onClick(View v) {
|
||||||
|
LogUtils.d(TAG, "【导航栏】点击返回");
|
||||||
|
finish();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
11
timestamp/src/main/res/drawable/ic_settings.xml
Normal file
11
timestamp/src/main/res/drawable/ic_settings.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="24dp"
|
||||||
|
android:height="24dp"
|
||||||
|
android:viewportHeight="24"
|
||||||
|
android:viewportWidth="24">
|
||||||
|
<path
|
||||||
|
android:fillColor="#ff000000"
|
||||||
|
android:pathData="M12,15.5A3.5,3.5 0,0 1,8.5 12A3.5,3.5 0,0 1,12 8.5A3.5,3.5 0,0 1,15.5 12A3.5,3.5 0,0 1,12 15.5M19.43,12.97C19.47,12.65 19.5,12.33 19.5,12C19.5,11.67 19.47,11.34 19.43,11L21.54,9.37C21.73,9.22 21.78,8.95 21.66,8.73L19.66,5.27C19.54,5.05 19.27,4.96 19.05,5.05L16.56,6.05C16.04,5.66 15.5,5.32 14.87,5.07L14.5,2.42C14.46,2.18 14.25,2 14,2H10C9.75,2 9.54,2.18 9.5,2.42L9.13,5.07C8.5,5.32 7.96,5.66 7.44,6.05L4.95,5.05C4.73,4.96 4.46,5.05 4.34,5.27L2.34,8.73C2.21,8.95 2.27,9.22 2.46,9.37L4.57,11C4.53,11.34 4.5,11.67 4.5,12C4.5,12.33 4.53,12.65 4.57,12.97L2.46,14.63C2.27,14.78 2.21,15.05 2.34,15.27L4.34,18.73C4.46,18.95 4.73,19.03 4.95,18.95L7.44,17.94C7.96,18.34 8.5,18.68 9.13,18.93L9.5,21.58C9.54,21.82 9.75,22 10,22H14C14.25,22 14.46,21.82 14.5,21.58L14.87,18.93C15.5,18.67 16.04,18.34 16.56,17.94L19.05,18.95C19.27,19.03 19.54,18.95 19.66,18.73L21.66,15.27C21.78,15.05 21.73,14.78 21.54,14.63L19.43,12.97Z"/>
|
||||||
|
|
||||||
|
</vector>
|
||||||
@@ -2,8 +2,8 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
<ScrollView
|
<ScrollView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -171,10 +171,22 @@
|
|||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<cc.winboll.studio.libappbase.LogView
|
<RelativeLayout
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="200dp"
|
android:layout_height="200dp">
|
||||||
android:id="@+id/logview"/>
|
|
||||||
|
<cc.winboll.studio.libappbase.LogView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/logview"/>
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.views.ADsBannerView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_alignParentBottom="true"
|
||||||
|
android:id="@+id/adsbanner"/>
|
||||||
|
|
||||||
|
</RelativeLayout>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
36
timestamp/src/main/res/layout/activity_settings.xml
Normal file
36
timestamp/src/main/res/layout/activity_settings.xml
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<LinearLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto"
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<com.google.android.material.appbar.AppBarLayout
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
|
||||||
|
|
||||||
|
<androidx.appcompat.widget.Toolbar
|
||||||
|
android:id="@+id/toolbar"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="?attr/actionBarSize"
|
||||||
|
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
|
||||||
|
|
||||||
|
</com.google.android.material.appbar.AppBarLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1.0">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libaes.views.ADsControlView
|
||||||
|
android:id="@+id/ads_control_view"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content" />
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
12
timestamp/src/main/res/menu/toolbar_main.xml
Normal file
12
timestamp/src/main/res/menu/toolbar_main.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/item_settings"
|
||||||
|
android:title="Settings"
|
||||||
|
android:icon="@drawable/ic_settings"
|
||||||
|
android:showAsAction="ifRoom"
|
||||||
|
app:showAsAction="ifRoom"/>
|
||||||
|
|
||||||
|
</menu>
|
||||||
Reference in New Issue
Block a user