Compare commits
6 Commits
apputils-v
...
contacts-v
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
04df902b6b | ||
|
|
33c71ea868 | ||
|
|
ba861d910e | ||
|
|
f5d9aafe43 | ||
|
|
9e9402f84e | ||
|
|
ec18330022 |
@@ -115,7 +115,6 @@
|
||||
# 本项目要实际运用需要注意以下几个步骤:
|
||||
# 在项目根目录下:
|
||||
## ★. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。
|
||||
## ★. 项目模块编译环境设置(必须) 在根目录拷贝 gradle.properties-androidx-demo 或者 gradle.properties-android-demo 文件为 gradle.properties。
|
||||
## ★. 项目 Android SDK 编译环境设置(可选),local.properties-demo 要复制为 local.properties,并按需要设置 Android SDK 目录。
|
||||
## ★. 应用签名密钥 keystore 设置问题。一般调试编译只需用【Termux】cd 进 GenKeyStore 目录执行 $ bash gen_debug_keystore.sh 命令即可完成设置。
|
||||
## ☆. 应用 WiBoLL 签名密钥配置问题<非必须考虑>。设置时需要 clone 【keystore】模块源码并拷贝模块目录的 appkey.jks 与 appkey.keystore 到项目根目录即可。
|
||||
|
||||
@@ -67,7 +67,7 @@ dependencies {
|
||||
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||
//api 'androidx.fragment:fragment:1.1.0'
|
||||
|
||||
api 'cc.winboll.studio:libaes:15.9.2'
|
||||
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||
api 'cc.winboll.studio:libaes:15.8.0'
|
||||
api 'cc.winboll.studio:libapputils:15.8.2'
|
||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sat Jun 28 05:02:54 GMT 2025
|
||||
#Thu Jun 19 12:49:47 GMT 2025
|
||||
stageCount=0
|
||||
libraryProject=
|
||||
baseVersion=15.0
|
||||
publishVersion=15.0.0
|
||||
buildCount=27
|
||||
buildCount=26
|
||||
baseBetaVersion=15.0.1
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Sun Aug 31 04:33:09 CST 2025
|
||||
stageCount=6
|
||||
#Thu Jul 17 11:39:14 HKT 2025
|
||||
stageCount=2
|
||||
libraryProject=libappbase
|
||||
baseVersion=15.9
|
||||
publishVersion=15.9.5
|
||||
publishVersion=15.9.1
|
||||
buildCount=0
|
||||
baseBetaVersion=15.9.6
|
||||
baseBetaVersion=15.9.2
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Mon Sep 01 07:56:11 HKT 2025
|
||||
stageCount=7
|
||||
#Tue Jun 03 15:05:48 HKT 2025
|
||||
stageCount=5
|
||||
libraryProject=libapputils
|
||||
baseVersion=15.8
|
||||
publishVersion=15.8.6
|
||||
publishVersion=15.8.4
|
||||
buildCount=0
|
||||
baseBetaVersion=15.8.7
|
||||
baseBetaVersion=15.8.5
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Thu Jul 17 09:57:24 HKT 2025
|
||||
stageCount=12
|
||||
#Tue Aug 26 01:37:58 HKT 2025
|
||||
stageCount=15
|
||||
libraryProject=
|
||||
baseVersion=15.3
|
||||
publishVersion=15.3.11
|
||||
publishVersion=15.3.14
|
||||
buildCount=0
|
||||
baseBetaVersion=15.3.12
|
||||
baseBetaVersion=15.3.15
|
||||
|
||||
@@ -40,6 +40,10 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV
|
||||
this.mContactUtils = ContactUtils.getInstance(mContext);
|
||||
this.callLogList = callLogList;
|
||||
}
|
||||
|
||||
public void relaodContacts() {
|
||||
this.mContactUtils.relaodContacts();
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
|
||||
@@ -11,6 +11,7 @@ import cc.winboll.studio.contacts.dun.Rules;
|
||||
import cc.winboll.studio.libappbase.LogUtils;
|
||||
import com.hjq.toast.ToastUtils;
|
||||
import java.io.File;
|
||||
import java.io.FileFilter;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -154,6 +155,62 @@ public class TomCat {
|
||||
File getWorkingFolder() {
|
||||
return mContext.getExternalFilesDir(TAG);
|
||||
}
|
||||
|
||||
public File getBoBullToonDataFolder() {
|
||||
File fCheckRoot = getWorkingFolder();
|
||||
if (fCheckRoot == null || !fCheckRoot.exists()) {
|
||||
return fCheckRoot;
|
||||
}
|
||||
|
||||
// 递归查找符合条件的文件夹
|
||||
File targetFolder = findTargetFolder(fCheckRoot);
|
||||
return targetFolder != null ? targetFolder : fCheckRoot;
|
||||
}
|
||||
|
||||
/**
|
||||
* 递归查找同时包含LICENSE和README.md文件的文件夹
|
||||
*/
|
||||
private File findTargetFolder(File currentFolder) {
|
||||
// 检查当前文件夹是否符合条件
|
||||
if (hasRequiredFiles(currentFolder)) {
|
||||
return currentFolder;
|
||||
}
|
||||
|
||||
// 查找子文件夹(Java 7不支持方法引用,用匿名内部类过滤)
|
||||
File[] subFolders = currentFolder.listFiles(new FileFilter() {
|
||||
@Override
|
||||
public boolean accept(File file) {
|
||||
return file.isDirectory(); // 仅保留子文件夹
|
||||
}
|
||||
});
|
||||
|
||||
if (subFolders != null) {
|
||||
for (File subFolder : subFolders) {
|
||||
File result = findTargetFolder(subFolder);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 检查文件夹中是否同时存在LICENSE和README.md文件
|
||||
*/
|
||||
private boolean hasRequiredFiles(File folder) {
|
||||
if (folder == null || !folder.isDirectory()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查两个文件是否同时存在且均为文件(非文件夹)
|
||||
File licenseFile = new File(folder, "LICENSE");
|
||||
File readmeFile = new File(folder, "README.md");
|
||||
|
||||
return licenseFile.exists() && licenseFile.isFile()
|
||||
&& readmeFile.exists() && readmeFile.isFile();
|
||||
}
|
||||
|
||||
public void cleanBoBullToon() {
|
||||
String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径
|
||||
@@ -170,9 +227,9 @@ public class TomCat {
|
||||
|
||||
public boolean loadPhoneBoBullToon() {
|
||||
listPhoneBoBullToon.clear();
|
||||
File fBoBullToon = new File(getWorkingFolder(), "bobulltoon");
|
||||
File fBoBullToon = getBoBullToonDataFolder();
|
||||
if (fBoBullToon.exists()) {
|
||||
LogUtils.d(TAG, String.format("getWorkingFolder() %s", getWorkingFolder()));
|
||||
LogUtils.d(TAG, String.format("getBoBullToonDataFolder() %s", getWorkingFolder()));
|
||||
for (File userFolder : fBoBullToon.listFiles()) {
|
||||
if (userFolder.isDirectory()) {
|
||||
for (File recordFile : userFolder.listFiles()) {
|
||||
|
||||
@@ -161,4 +161,12 @@ public class CallLogFragment extends Fragment {
|
||||
_CallLogFragment.triggerUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
//ToastUtils.show("onResume");
|
||||
callLogAdapter.relaodContacts();
|
||||
readCallLog(); // 窗口回显时更新通话记录
|
||||
}
|
||||
}
|
||||
|
||||
@@ -163,5 +163,12 @@ public class ContactsFragment extends Fragment {
|
||||
}
|
||||
contactAdapter.notifyDataSetChanged();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
//ToastUtils.show("onResume");
|
||||
readContacts(); // 窗口回显时更新联系人列表
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -2,6 +2,6 @@
|
||||
<resources>
|
||||
|
||||
<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>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Mon Aug 18 03:56:26 HKT 2025
|
||||
stageCount=6
|
||||
#Thu Jul 17 11:39:14 HKT 2025
|
||||
stageCount=2
|
||||
libraryProject=libappbase
|
||||
baseVersion=15.9
|
||||
publishVersion=15.9.5
|
||||
publishVersion=15.9.1
|
||||
buildCount=0
|
||||
baseBetaVersion=15.9.6
|
||||
baseBetaVersion=15.9.2
|
||||
|
||||
@@ -21,7 +21,7 @@ android {
|
||||
|
||||
dependencies {
|
||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||
api 'cc.winboll.studio:libappbase:15.9.5'
|
||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
||||
|
||||
// 二维码类库
|
||||
api 'com.google.zxing:core:3.4.1'
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
#Created by .winboll/winboll_app_build.gradle
|
||||
#Mon Sep 01 07:56:11 HKT 2025
|
||||
stageCount=7
|
||||
#Tue Jun 03 15:05:42 HKT 2025
|
||||
stageCount=5
|
||||
libraryProject=libapputils
|
||||
baseVersion=15.8
|
||||
publishVersion=15.8.6
|
||||
publishVersion=15.8.4
|
||||
buildCount=0
|
||||
baseBetaVersion=15.8.7
|
||||
baseBetaVersion=15.8.5
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package cc.winboll.studio.libapputils.utils;
|
||||
|
||||
/**
|
||||
* @Author ZhanGSKen&豆包大模型<zhangsken@188.com>
|
||||
* @Date 2025/09/01 07:49
|
||||
* @Describe .* 前置预防针
|
||||
regex pointer preventive injection
|
||||
简称 RegexPPi
|
||||
*/
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
public class RegexPPiUtils {
|
||||
|
||||
public static final String TAG = "RegexPPiUtils";
|
||||
|
||||
//
|
||||
// 检验文本是否满足适合正则表达式模式计算
|
||||
//
|
||||
public static boolean isPPiOK(String text) {
|
||||
//String text = "这里是一些任意的文本内容";
|
||||
String regex = ".*";
|
||||
Pattern pattern = Pattern.compile(regex);
|
||||
Matcher matcher = pattern.matcher(text);
|
||||
/*if (matcher.matches()) {
|
||||
System.out.println("文本满足该正则表达式模式");
|
||||
} else {
|
||||
System.out.println("文本不满足该正则表达式模式");
|
||||
}*/
|
||||
return matcher.matches();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user