Compare commits
85 Commits
aes-v15.9.
...
apputils-v
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa338ec8c7 | ||
|
|
7a3a1f4bcd | ||
|
|
ad991e3da2 | ||
|
|
c0ff228845 | ||
|
|
a0fe8f17a8 | ||
|
|
16bd40fc59 | ||
|
|
ffaf683c54 | ||
|
|
26f5f8d3db | ||
|
|
917e25cdc8 | ||
|
|
707bed52c7 | ||
|
|
b7f8b76ace | ||
|
|
38fe941a8b | ||
|
|
e80d7e7b03 | ||
|
|
6e0a833fde | ||
|
|
c596ee5fa4 | ||
|
|
5e99f1278e | ||
|
|
b7158d1ebd | ||
|
|
9b51250ebf | ||
|
|
23920a7ff1 | ||
|
|
17c373c490 | ||
|
|
5f7c94b349 | ||
|
|
c2b739d345 | ||
|
|
67a05cd457 | ||
|
|
554ab758bf | ||
|
|
20e118cd34 | ||
|
|
f370ae8ffb | ||
|
|
c92c874ea1 | ||
|
|
90a6116c0a | ||
|
|
45208ecbb1 | ||
|
|
c28d655fe3 | ||
|
|
4b5905f74e | ||
|
|
6bd01780ec | ||
|
|
a6699262f8 | ||
|
|
ea2d38defc | ||
|
|
e430b7abe4 | ||
|
|
945eadb617 | ||
|
|
c5bffc5eef | ||
|
|
88597fe407 | ||
|
|
53f985533a | ||
|
|
a3950f13ad | ||
|
|
c878e9dc02 | ||
|
|
f2f7cab330 | ||
|
|
6c8b0dcfa5 | ||
|
|
7de8a4f084 | ||
|
|
219c6614be | ||
|
|
0f5bb020b9 | ||
|
|
7794ff80ec | ||
|
|
7463ad3352 | ||
|
|
69187e3ed0 | ||
|
|
753032efed | ||
|
|
2b4c43c9af | ||
|
|
711c98d556 | ||
|
|
202205588a | ||
|
|
42c4978b44 | ||
|
|
1a2b7b862d | ||
|
|
eb253b374f | ||
|
|
c4e88e9593 | ||
|
|
08d9d92ae4 | ||
|
|
74841c08dc | ||
|
|
945bacb825 | ||
|
|
0e464495fd | ||
|
|
e8682ce410 | ||
|
|
2e4003dae0 | ||
|
|
198b0975ce | ||
|
|
24a578a9d2 | ||
|
|
46de24447f | ||
|
|
ac1c008035 | ||
|
|
b124487cb1 | ||
|
|
9621d35f79 | ||
|
|
17de0832a6 | ||
|
|
1320984829 | ||
|
|
abf1e5ba42 | ||
|
|
1cd2f88038 | ||
|
|
3f6e583d68 | ||
|
|
271456bfcd | ||
|
|
ee5458d82c | ||
|
|
3a83367f71 | ||
|
|
40a5b9c339 | ||
|
|
fd79113572 | ||
|
|
9b911b583c | ||
|
|
37817c3e8c | ||
|
|
0b5402f5f3 | ||
|
|
bea22e3853 | ||
|
|
89dac91cc6 | ||
|
|
3809c1bcab |
@@ -113,10 +113,10 @@ if [[ $? -eq 0 ]]; then
|
|||||||
# 如果Git已经提交了所有代码就执行标签和应用发布操作
|
# 如果Git已经提交了所有代码就执行标签和应用发布操作
|
||||||
|
|
||||||
# 预先询问是否添加工作流标签
|
# 预先询问是否添加工作流标签
|
||||||
echo "Add Github Workflows Tag? (yes/No)"
|
#echo "Add Github Workflows Tag? (yes/No)"
|
||||||
result=$(askAddWorkflowsTag)
|
#result=$(askAddWorkflowsTag)
|
||||||
nAskAddWorkflowsTag=$?
|
#nAskAddWorkflowsTag=$?
|
||||||
echo $result
|
#echo $result
|
||||||
|
|
||||||
# 发布应用
|
# 发布应用
|
||||||
echo "Publishing WinBoLL APK ..."
|
echo "Publishing WinBoLL APK ..."
|
||||||
@@ -138,17 +138,17 @@ if [[ $? -eq 0 ]]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# 添加 GitHub 工作流标签
|
# 添加 GitHub 工作流标签
|
||||||
if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
|
#if [[ $nAskAddWorkflowsTag -eq 1 ]]; then
|
||||||
# 如果用户选择添加工作流标签
|
# 如果用户选择添加工作流标签
|
||||||
result=$(addWorkflowsTag $1)
|
#result=$(addWorkflowsTag $1)
|
||||||
if [[ $? -eq 0 ]]; then
|
#if [[ $? -eq 0 ]]; then
|
||||||
echo $result
|
# echo $result
|
||||||
# 工作流标签添加成功
|
# 工作流标签添加成功
|
||||||
else
|
#else
|
||||||
echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
|
#echo -e "${0}: addWorkflowsTag $1\n${result}\nAdd workflows tag cancel."
|
||||||
exit 1 # addWorkflowsTag 异常
|
#exit 1 # addWorkflowsTag 异常
|
||||||
fi
|
#fi
|
||||||
fi
|
#fi
|
||||||
|
|
||||||
## 清理更新描述文件内容
|
## 清理更新描述文件内容
|
||||||
echo "" > $1/app_update_description.txt
|
echo "" > $1/app_update_description.txt
|
||||||
|
|||||||
@@ -114,9 +114,12 @@
|
|||||||
|
|
||||||
# 本项目要实际运用需要注意以下几个步骤:
|
# 本项目要实际运用需要注意以下几个步骤:
|
||||||
# 在项目根目录下:
|
# 在项目根目录下:
|
||||||
## 1. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。
|
## ★. 项目模块编译环境设置(必须),settings.gradle-demo 要复制为 settings.gradle,并取消相应项目模块的注释。
|
||||||
## 2. 项目 Android SDK 编译环境设置(可选),local.properties-demo 要复制为 local.properties,并按需要设置 Android SDK 目录。
|
## ★. 项目模块编译环境设置(必须) 在根目录拷贝 gradle.properties-androidx-demo 或者 gradle.properties-android-demo 文件为 gradle.properties。
|
||||||
## 3. 类库型模块编译环境设置(可选),winboll.properties-demo 要复制为 winboll.properties,并按需要设置 WinBoLL Maven 库登录用户信息。
|
## ★. 项目 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 到项目根目录即可。
|
||||||
|
## ☆. 类库型模块编译环境设置(可选),winboll.properties-demo 要复制为 winboll.properties,并按需要设置 WinBoLL Maven 库登录用户信息。
|
||||||
|
|
||||||
|
|
||||||
# ☆类库型项目编译方法
|
# ☆类库型项目编译方法
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Mon Jun 09 01:44:28 HKT 2025
|
#Sat Jun 28 12:59:51 HKT 2025
|
||||||
stageCount=1
|
stageCount=3
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.9
|
baseVersion=15.9
|
||||||
publishVersion=15.9.0
|
publishVersion=15.9.2
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.9.1
|
baseBetaVersion=15.9.3
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
|
|||||||
appInfo.setAppGitOwner("Studio");
|
appInfo.setAppGitOwner("Studio");
|
||||||
appInfo.setAppGitAPPBranch(szBranchName);
|
appInfo.setAppGitAPPBranch(szBranchName);
|
||||||
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
appInfo.setAppGitAPPSubProjectFolder(szBranchName);
|
||||||
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=2&fromuid=1");
|
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=3&extra=page%3D1");
|
||||||
appInfo.setAppAPKName("AES");
|
appInfo.setAppAPKName("AES");
|
||||||
appInfo.setAppAPKFolderName("AES");
|
appInfo.setAppAPKFolderName("AES");
|
||||||
//appInfo.setIsAddDebugTools(false);
|
//appInfo.setIsAddDebugTools(false);
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ dependencies {
|
|||||||
//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'
|
||||||
|
|
||||||
api 'cc.winboll.studio:libaes:15.8.0'
|
api 'cc.winboll.studio:libaes:15.9.2'
|
||||||
api 'cc.winboll.studio:libapputils:15.8.2'
|
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun Jun 01 08:03:56 GMT 2025
|
#Sat Jun 28 05:02:54 GMT 2025
|
||||||
stageCount=0
|
stageCount=0
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.0
|
baseVersion=15.0
|
||||||
publishVersion=15.0.0
|
publishVersion=15.0.0
|
||||||
buildCount=24
|
buildCount=27
|
||||||
baseBetaVersion=15.0.1
|
baseBetaVersion=15.0.1
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ android {
|
|||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "15.8"
|
versionName "15.9"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Jun 05 08:59:45 GMT 2025
|
#Sun Aug 31 04:33:09 CST 2025
|
||||||
stageCount=8
|
stageCount=6
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.8
|
baseVersion=15.9
|
||||||
publishVersion=15.8.7
|
publishVersion=15.9.5
|
||||||
buildCount=14
|
buildCount=0
|
||||||
baseBetaVersion=15.8.8
|
baseBetaVersion=15.9.6
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue Jun 03 15:05:48 HKT 2025
|
#Mon Sep 01 07:56:11 HKT 2025
|
||||||
stageCount=5
|
stageCount=7
|
||||||
libraryProject=libapputils
|
libraryProject=libapputils
|
||||||
baseVersion=15.8
|
baseVersion=15.8
|
||||||
publishVersion=15.8.4
|
publishVersion=15.8.6
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.8.5
|
baseBetaVersion=15.8.7
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Sun May 04 05:32:00 GMT 2025
|
#Tue Jun 24 09:54:47 HKT 2025
|
||||||
stageCount=1
|
stageCount=3
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.2
|
baseVersion=15.2
|
||||||
publishVersion=15.2.0
|
publishVersion=15.2.2
|
||||||
buildCount=74
|
buildCount=0
|
||||||
baseBetaVersion=15.2.1
|
baseBetaVersion=15.2.3
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
https://github.com/aJIEw/PhoneCallApp.git
|
https://github.com/aJIEw/PhoneCallApp.git
|
||||||
|
|
||||||
#### 介绍
|
#### 介绍
|
||||||
通讯录与拨号
|
这是可以根据正则表达式匹配拦截骚扰电话的手机拨号应用。
|
||||||
|
|
||||||
#### 软件架构
|
#### 软件架构
|
||||||
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
|
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
|
||||||
|
|||||||
@@ -45,9 +45,9 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
api 'cc.winboll.studio:libaes:15.8.0'
|
api 'cc.winboll.studio:libaes:15.9.2'
|
||||||
api 'cc.winboll.studio:libapputils:15.8.1'
|
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||||
api 'cc.winboll.studio:libappbase:15.8.1'
|
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||||
|
|
||||||
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
// 权限请求框架:https://github.com/getActivity/XXPermissions
|
||||||
api 'com.github.getActivity:XXPermissions:18.63'
|
api 'com.github.getActivity:XXPermissions:18.63'
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue May 20 13:02:18 HKT 2025
|
#Thu Jul 17 09:57:24 HKT 2025
|
||||||
stageCount=3
|
stageCount=12
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.3
|
baseVersion=15.3
|
||||||
publishVersion=15.3.2
|
publishVersion=15.3.11
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.3.3
|
baseBetaVersion=15.3.12
|
||||||
|
|||||||
@@ -79,12 +79,12 @@ public class AboutActivity extends AppCompatActivity implements IWinBoLLActivity
|
|||||||
APPInfo appInfo = new APPInfo();
|
APPInfo appInfo = new APPInfo();
|
||||||
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("APP");
|
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/studio/details.php?app=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);
|
||||||
|
|||||||
@@ -198,6 +198,9 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
settingsModel.setDunTotalCount(Integer.parseInt(etDunTotalCount.getText().toString()));
|
settingsModel.setDunTotalCount(Integer.parseInt(etDunTotalCount.getText().toString()));
|
||||||
settingsModel.setDunResumeSecondCount(Integer.parseInt(etDunResumeSecondCount.getText().toString()));
|
settingsModel.setDunResumeSecondCount(Integer.parseInt(etDunResumeSecondCount.getText().toString()));
|
||||||
settingsModel.setDunResumeCount(Integer.parseInt(etDunResumeCount.getText().toString()));
|
settingsModel.setDunResumeCount(Integer.parseInt(etDunResumeCount.getText().toString()));
|
||||||
|
|
||||||
|
// 应用效果提示
|
||||||
|
ToastUtils.show((settingsModel.getDunTotalCount() == 1)?"电话骚扰防御力几乎为0。":String.format("以下设置将在连拨%d次后接通电话。", settingsModel.getDunTotalCount()));
|
||||||
}
|
}
|
||||||
settingsModel.setIsEnableDun(isEnableDun);
|
settingsModel.setIsEnableDun(isEnableDun);
|
||||||
Rules.getInstance(this).saveDun();
|
Rules.getInstance(this).saveDun();
|
||||||
@@ -207,6 +210,7 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
|
etDunTotalCount.setText(Integer.toString(settingsModel.getDunTotalCount()));
|
||||||
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
|
etDunResumeSecondCount.setText(Integer.toString(settingsModel.getDunResumeSecondCount()));
|
||||||
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
|
etDunResumeCount.setText(Integer.toString(settingsModel.getDunResumeCount()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateStreamVolumeTextView() {
|
void updateStreamVolumeTextView() {
|
||||||
@@ -243,6 +247,9 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
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());
|
||||||
|
|
||||||
|
final TomCat tomCat = TomCat.getInstance(this);
|
||||||
|
tomCat.cleanBoBullToon();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void onDownloadBoBullToon(View view) {
|
public void onDownloadBoBullToon(View view) {
|
||||||
@@ -330,4 +337,8 @@ public class SettingsActivity extends AppCompatActivity implements IWinBoLLActiv
|
|||||||
public void onAbout(View view) {
|
public void onAbout(View view) {
|
||||||
App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
|
App.getWinBoLLActivityManager().startWinBoLLActivity(this, AboutActivity.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void onLogView(View view) {
|
||||||
|
App.getWinBoLLActivityManager().startLogActivity(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,13 +5,18 @@ package cc.winboll.studio.contacts.adapters;
|
|||||||
* @Date 2025/02/26 13:09:32
|
* @Date 2025/02/26 13:09:32
|
||||||
* @Describe CallLogAdapter
|
* @Describe CallLogAdapter
|
||||||
*/
|
*/
|
||||||
|
import android.content.ClipData;
|
||||||
|
import android.content.ClipboardManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import cc.winboll.studio.contacts.R;
|
import cc.winboll.studio.contacts.R;
|
||||||
@@ -47,6 +52,38 @@ public class CallLogAdapter extends RecyclerView.Adapter<CallLogAdapter.CallLogV
|
|||||||
public void onBindViewHolder(@NonNull CallLogViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull CallLogViewHolder holder, int position) {
|
||||||
final CallLogModel callLog = callLogList.get(position);
|
final CallLogModel callLog = callLogList.get(position);
|
||||||
holder.phoneNumber.setText(callLog.getPhoneNumber() + "☎" + mContactUtils.getContactsName(callLog.getPhoneNumber()));
|
holder.phoneNumber.setText(callLog.getPhoneNumber() + "☎" + mContactUtils.getContactsName(callLog.getPhoneNumber()));
|
||||||
|
holder.phoneNumber.setOnLongClickListener(new View.OnLongClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View p1) {
|
||||||
|
// 弹出复制菜单
|
||||||
|
PopupMenu menu = new PopupMenu(mContext, holder.phoneNumber);
|
||||||
|
//加载菜单资源
|
||||||
|
menu.getMenuInflater().inflate(R.menu.toolbar_calllog_phonenumber, menu.getMenu());
|
||||||
|
//设置点击事件的响应
|
||||||
|
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||||
|
int nItemId = menuItem.getItemId();
|
||||||
|
if (nItemId == R.id.item_calllog_phonenumber_copy) {
|
||||||
|
// Gets a handle to the clipboard service.
|
||||||
|
ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
|
// Creates a new text clip to put on the clipboard
|
||||||
|
ClipData clip = ClipData.newPlainText("simple text", callLog.getPhoneNumber());
|
||||||
|
// Set the clipboard's primary clip.
|
||||||
|
clipboard.setPrimaryClip(clip);
|
||||||
|
Toast.makeText(mContext, "Copy to clipboard.", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//一定要调用show()来显示弹出式菜单
|
||||||
|
menu.show();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
holder.callStatus.setText(callLog.getCallStatus());
|
holder.callStatus.setText(callLog.getCallStatus());
|
||||||
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
|
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault());
|
||||||
holder.callDate.setText(dateFormat.format(callLog.getCallDate()));
|
holder.callDate.setText(dateFormat.format(callLog.getCallDate()));
|
||||||
|
|||||||
@@ -5,19 +5,25 @@ package cc.winboll.studio.contacts.adapters;
|
|||||||
* @Date 2025/02/26 13:35:44
|
* @Date 2025/02/26 13:35:44
|
||||||
* @Describe ContactAdapter
|
* @Describe ContactAdapter
|
||||||
*/
|
*/
|
||||||
|
import android.content.ClipData;
|
||||||
|
import android.content.ClipboardManager;
|
||||||
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MenuItem;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.LinearLayout;
|
||||||
|
import android.widget.PopupMenu;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
import androidx.recyclerview.widget.RecyclerView;
|
||||||
import cc.winboll.studio.contacts.R;
|
import cc.winboll.studio.contacts.R;
|
||||||
import cc.winboll.studio.contacts.beans.ContactModel;
|
import cc.winboll.studio.contacts.beans.ContactModel;
|
||||||
|
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import cc.winboll.studio.libaes.views.AOHPCTCSeekBar;
|
|
||||||
|
|
||||||
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
|
public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactViewHolder> {
|
||||||
|
|
||||||
@@ -26,8 +32,10 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV
|
|||||||
private static final int REQUEST_CALL_PHONE = 1;
|
private static final int REQUEST_CALL_PHONE = 1;
|
||||||
|
|
||||||
private List<ContactModel> contactList;
|
private List<ContactModel> contactList;
|
||||||
|
Context mContext;
|
||||||
|
|
||||||
public ContactAdapter(List<ContactModel> contactList) {
|
public ContactAdapter(Context context, List<ContactModel> contactList) {
|
||||||
|
mContext = context;
|
||||||
this.contactList = contactList;
|
this.contactList = contactList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -41,6 +49,37 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV
|
|||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {
|
public void onBindViewHolder(@NonNull ContactViewHolder holder, int position) {
|
||||||
final ContactModel contact = contactList.get(position);
|
final ContactModel contact = contactList.get(position);
|
||||||
|
holder.llPhoneNumberMain.setOnLongClickListener(new View.OnLongClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onLongClick(View p1) {
|
||||||
|
// 弹出复制菜单
|
||||||
|
PopupMenu menu = new PopupMenu(mContext, holder.llPhoneNumberMain);
|
||||||
|
//加载菜单资源
|
||||||
|
menu.getMenuInflater().inflate(R.menu.toolbar_contact_phonenumber, menu.getMenu());
|
||||||
|
//设置点击事件的响应
|
||||||
|
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
|
||||||
|
@Override
|
||||||
|
public boolean onMenuItemClick(MenuItem menuItem) {
|
||||||
|
int nItemId = menuItem.getItemId();
|
||||||
|
if (nItemId == R.id.item_contact_phonenumber_copy) {
|
||||||
|
// Gets a handle to the clipboard service.
|
||||||
|
ClipboardManager clipboard = (ClipboardManager) mContext.getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
|
// Creates a new text clip to put on the clipboard
|
||||||
|
ClipData clip = ClipData.newPlainText("simple text", contact.getNumber());
|
||||||
|
// Set the clipboard's primary clip.
|
||||||
|
clipboard.setPrimaryClip(clip);
|
||||||
|
Toast.makeText(mContext, "Copy to clipboard.", Toast.LENGTH_SHORT).show();
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//一定要调用show()来显示弹出式菜单
|
||||||
|
menu.show();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
});
|
||||||
holder.contactName.setText(contact.getName());
|
holder.contactName.setText(contact.getName());
|
||||||
holder.contactNumber.setText(contact.getNumber());
|
holder.contactNumber.setText(contact.getNumber());
|
||||||
|
|
||||||
@@ -69,12 +108,14 @@ public class ContactAdapter extends RecyclerView.Adapter<ContactAdapter.ContactV
|
|||||||
}
|
}
|
||||||
|
|
||||||
public class ContactViewHolder extends RecyclerView.ViewHolder {
|
public class ContactViewHolder extends RecyclerView.ViewHolder {
|
||||||
|
LinearLayout llPhoneNumberMain;
|
||||||
TextView contactName;
|
TextView contactName;
|
||||||
TextView contactNumber;
|
TextView contactNumber;
|
||||||
AOHPCTCSeekBar dialAOHPCTCSeekBar;
|
AOHPCTCSeekBar dialAOHPCTCSeekBar;
|
||||||
|
|
||||||
public ContactViewHolder(@NonNull View itemView) {
|
public ContactViewHolder(@NonNull View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
|
llPhoneNumberMain = itemView.findViewById(R.id.itemcontactLinearLayout1);
|
||||||
contactName = itemView.findViewById(R.id.contact_name);
|
contactName = itemView.findViewById(R.id.contact_name);
|
||||||
contactNumber = itemView.findViewById(R.id.contact_number);
|
contactNumber = itemView.findViewById(R.id.contact_number);
|
||||||
dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
|
dialAOHPCTCSeekBar = itemView.findViewById(R.id.aohpctcseekbar_dial);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ package cc.winboll.studio.contacts.adapters;
|
|||||||
*/
|
*/
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
|
import android.view.MotionEvent;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.widget.Button;
|
import android.widget.Button;
|
||||||
@@ -20,6 +21,7 @@ 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.libappbase.LogUtils;
|
||||||
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog;
|
||||||
import com.hjq.toast.ToastUtils;
|
import com.hjq.toast.ToastUtils;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -60,6 +62,10 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V
|
|||||||
final SimpleViewHolder simpleViewHolder = (SimpleViewHolder) holder;
|
final SimpleViewHolder simpleViewHolder = (SimpleViewHolder) holder;
|
||||||
String szView = model.getRuleText().trim().equals("") ?"[NULL]": model.getRuleText();
|
String szView = model.getRuleText().trim().equals("") ?"[NULL]": model.getRuleText();
|
||||||
simpleViewHolder.tvRuleText.setText(szView);
|
simpleViewHolder.tvRuleText.setText(szView);
|
||||||
|
simpleViewHolder.checkBoxAllow.setChecked(model.isAllowConnection());
|
||||||
|
simpleViewHolder.checkBoxAllow.setEnabled(false);
|
||||||
|
simpleViewHolder.checkBoxEnable.setChecked(model.isEnable());
|
||||||
|
simpleViewHolder.checkBoxEnable.setEnabled(false);
|
||||||
simpleViewHolder.scrollView.setOnActionListener(new LeftScrollView.OnActionListener(){
|
simpleViewHolder.scrollView.setOnActionListener(new LeftScrollView.OnActionListener(){
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -215,16 +221,22 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V
|
|||||||
|
|
||||||
private final LeftScrollView scrollView;
|
private final LeftScrollView scrollView;
|
||||||
private final TextView tvRuleText;
|
private final TextView tvRuleText;
|
||||||
|
CheckBox checkBoxAllow;
|
||||||
|
CheckBox checkBoxEnable;
|
||||||
|
|
||||||
|
|
||||||
public SimpleViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) {
|
public SimpleViewHolder(@NonNull ViewGroup parent, @NonNull View itemView) {
|
||||||
super(itemView);
|
super(itemView);
|
||||||
scrollView = itemView.findViewById(R.id.scrollView);
|
scrollView = itemView.findViewById(R.id.scrollView);
|
||||||
//tvRuleText = itemView.findViewById(R.id.ruletext_tv);
|
LayoutInflater inflater = LayoutInflater.from(itemView.getContext());
|
||||||
tvRuleText = new TextView(itemView.getContext());
|
View viewContent = inflater.inflate(R.layout.view_phone_connect_rule_simple_content, parent, false);
|
||||||
|
tvRuleText = viewContent.findViewById(R.id.ruletext_tv);
|
||||||
|
checkBoxAllow = viewContent.findViewById(R.id.checkbox_allow);
|
||||||
|
checkBoxEnable = viewContent.findViewById(R.id.checkbox_enable);
|
||||||
|
//tvRuleText = new TextView(itemView.getContext());
|
||||||
scrollView.setContentWidth(parent.getWidth());
|
scrollView.setContentWidth(parent.getWidth());
|
||||||
//scrollView.setContentWidth(600);
|
//scrollView.setContentWidth(600);
|
||||||
scrollView.addContentLayout(tvRuleText);
|
scrollView.addContentLayout(viewContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -243,5 +255,9 @@ public class PhoneConnectRuleAdapter extends RecyclerView.Adapter<RecyclerView.V
|
|||||||
buttonConfirm = itemView.findViewById(R.id.button_confirm);
|
buttonConfirm = itemView.findViewById(R.id.button_confirm);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void setCheckBoxTouchListener(CheckBox checkBox) {
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ public class TomCat {
|
|||||||
}
|
}
|
||||||
return _TomCat;
|
return _TomCat;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDefaultBobulltoonUrl() {
|
public String getDefaultBobulltoonUrl() {
|
||||||
return mContext.getString(R.string.default_bobulltoon_url);
|
return mContext.getString(R.string.default_bobulltoon_url);
|
||||||
}
|
}
|
||||||
@@ -123,7 +123,7 @@ public class TomCat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 更新新文件
|
// 更新新文件
|
||||||
if(downloadAndExtractZip(zipUrl, destinationFolder)) {
|
if (downloadAndExtractZip(zipUrl, destinationFolder)) {
|
||||||
LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
|
LogUtils.d(TAG, "ZIP 文件下载并解压成功。");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -155,6 +155,19 @@ public class TomCat {
|
|||||||
return mContext.getExternalFilesDir(TAG);
|
return mContext.getExternalFilesDir(TAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void cleanBoBullToon() {
|
||||||
|
String destinationFolder = getWorkingFolder().getPath(); // 替换为实际的目标文件夹路径
|
||||||
|
// 删除旧文件
|
||||||
|
File fOldFolder = new File(destinationFolder);
|
||||||
|
if (fOldFolder.exists()) {
|
||||||
|
deleteFolderRecursive(fOldFolder);
|
||||||
|
fOldFolder.mkdirs();
|
||||||
|
}
|
||||||
|
|
||||||
|
ToastUtils.show("已清空 BoBullToon 数据!");
|
||||||
|
LogUtils.d(TAG, "已清空 BoBullToon 数据");
|
||||||
|
}
|
||||||
|
|
||||||
public boolean loadPhoneBoBullToon() {
|
public boolean loadPhoneBoBullToon() {
|
||||||
listPhoneBoBullToon.clear();
|
listPhoneBoBullToon.clear();
|
||||||
File fBoBullToon = new File(getWorkingFolder(), "bobulltoon");
|
File fBoBullToon = new File(getWorkingFolder(), "bobulltoon");
|
||||||
|
|||||||
@@ -145,6 +145,14 @@ public class Rules {
|
|||||||
LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect));
|
LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检验拨不通号码群
|
||||||
|
if (!isDefend && MainService.isPhoneInBoBullToon(phoneNumber)) {
|
||||||
|
LogUtils.d(TAG, String.format("PhoneNumber %s\n Is In BoBullToon", phoneNumber));
|
||||||
|
isDefend = true;
|
||||||
|
isConnect = false;
|
||||||
|
LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect));
|
||||||
|
}
|
||||||
|
|
||||||
// 查询通讯录是否有该联系人
|
// 查询通讯录是否有该联系人
|
||||||
boolean isPhoneInContacts = ContactUtils.getInstance(mContext).isPhoneInContacts(mContext, phoneNumber);
|
boolean isPhoneInContacts = ContactUtils.getInstance(mContext).isPhoneInContacts(mContext, phoneNumber);
|
||||||
if (!isDefend) {
|
if (!isDefend) {
|
||||||
@@ -158,14 +166,6 @@ public class Rules {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检验拨不通号码群
|
|
||||||
if (!isDefend && MainService.isPhoneInBoBullToon(phoneNumber)) {
|
|
||||||
LogUtils.d(TAG, String.format("PhoneNumber %s\n Is In BoBullToon", phoneNumber));
|
|
||||||
isDefend = true;
|
|
||||||
isConnect = false;
|
|
||||||
LogUtils.d(TAG, String.format("isDefend == %s\nisConnect == %s", isDefend, isConnect));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 正则匹配规则名单校验
|
// 正则匹配规则名单校验
|
||||||
if (!isDefend) {
|
if (!isDefend) {
|
||||||
for (int i = 0; i < _PhoneConnectRuleModelList.size(); i++) {
|
for (int i = 0; i < _PhoneConnectRuleModelList.size(); i++) {
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ public class ContactsFragment extends Fragment {
|
|||||||
super.onViewCreated(view, savedInstanceState);
|
super.onViewCreated(view, savedInstanceState);
|
||||||
recyclerView = view.findViewById(R.id.contacts_recycler_view);
|
recyclerView = view.findViewById(R.id.contacts_recycler_view);
|
||||||
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
|
||||||
contactAdapter = new ContactAdapter(contactList);
|
contactAdapter = new ContactAdapter(getContext(), contactList);
|
||||||
recyclerView.setAdapter(contactAdapter);
|
recyclerView.setAdapter(contactAdapter);
|
||||||
|
|
||||||
searchEditText = view.findViewById(R.id.search_edit_text);
|
searchEditText = view.findViewById(R.id.search_edit_text);
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ public class LeftScrollView extends HorizontalScrollView {
|
|||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addContentLayout(TextView textView) {
|
public void addContentLayout(View viewContent) {
|
||||||
contentLayout.addView(textView, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
|
contentLayout.addView(viewContent, LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setContentWidth(int contentWidth) {
|
public void setContentWidth(int contentWidth) {
|
||||||
|
|||||||
@@ -269,6 +269,19 @@
|
|||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:gravity="center_horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="<<==向左拉动列表项可编辑内容"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
<androidx.recyclerview.widget.RecyclerView
|
||||||
android:id="@+id/recycler_view"
|
android:id="@+id/recycler_view"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
@@ -287,6 +300,12 @@
|
|||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:gravity="right">
|
android:gravity="right">
|
||||||
|
|
||||||
|
<Button
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="LogView"
|
||||||
|
android:onClick="onLogView"/>
|
||||||
|
|
||||||
<Button
|
<Button
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
|
|||||||
@@ -15,8 +15,10 @@
|
|||||||
<Button
|
<Button
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Test Main"
|
android:text="Add Demo Rules(While size is 0) and Test"
|
||||||
android:onClick="onTestMain"/>
|
android:onClick="onTestMain"
|
||||||
|
android:textSize="10sp"
|
||||||
|
android:textAllCaps="false"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -43,7 +45,8 @@
|
|||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="Test Phone"
|
android:text="Test Phone"
|
||||||
android:onClick="onTestPhone"/>
|
android:onClick="onTestPhone"
|
||||||
|
android:textAllCaps="false"/>
|
||||||
|
|
||||||
</LinearLayout>
|
</LinearLayout>
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,8 @@
|
|||||||
<LinearLayout
|
<LinearLayout
|
||||||
android:orientation="horizontal"
|
android:orientation="horizontal"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content">
|
android:layout_height="wrap_content"
|
||||||
|
android:id="@+id/itemcontactLinearLayout1">
|
||||||
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/contact_number"
|
android:id="@+id/contact_number"
|
||||||
|
|||||||
@@ -23,7 +23,7 @@
|
|||||||
android:id="@+id/checkbox_allow"
|
android:id="@+id/checkbox_allow"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:text="允许连接"/>
|
android:text="连接"/>
|
||||||
|
|
||||||
<CheckBox
|
<CheckBox
|
||||||
android:id="@+id/checkbox_enable"
|
android:id="@+id/checkbox_enable"
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<HorizontalScrollView
|
|
||||||
xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:scrollbars="none"
|
|
||||||
android:id="@+id/scrollView">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<!-- 内容区域 -->
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/content_layout"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="16dp"
|
|
||||||
android:background="@color/white">
|
|
||||||
<!-- 这里放置你的列表项内容 -->
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/text_view"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:textSize="16sp"/>
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<!-- 操作按钮 -->
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/action_layout"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:background="@color/lightgray">
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/edit_btn"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:text="编辑"
|
|
||||||
android:background="@color/blue" />
|
|
||||||
|
|
||||||
<Button
|
|
||||||
android:id="@+id/delete_btn"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:text="删除"
|
|
||||||
android:background="@color/red" />
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
</HorizontalScrollView>
|
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
<?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="horizontal"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_gravity="center_vertical"
|
||||||
|
android:gravity="center_vertical">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="Text"
|
||||||
|
android:layout_weight="1.0"
|
||||||
|
android:id="@+id/ruletext_tv"/>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/checkbox_allow"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="连接"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"/>
|
||||||
|
|
||||||
|
<CheckBox
|
||||||
|
android:id="@+id/checkbox_enable"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="启用"
|
||||||
|
android:clickable="false"
|
||||||
|
android:focusable="false"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?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_calllog_phonenumber_copy"
|
||||||
|
android:title="Copy"/>
|
||||||
|
|
||||||
|
</menu>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<?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_contact_phonenumber_copy"
|
||||||
|
android:title="Copy"/>
|
||||||
|
|
||||||
|
</menu>
|
||||||
@@ -2,6 +2,6 @@
|
|||||||
<resources>
|
<resources>
|
||||||
|
|
||||||
<string name="app_name">Contacts</string>
|
<string name="app_name">Contacts</string>
|
||||||
<string name="default_bobulltoon_url">http://10.8.0.12:3000/Studio/BoBullToon/archive/main.zip</string>
|
<string name="default_bobulltoon_url">https://gitea.winboll.cc/Studio/BoBullToon/archive/main.zip</string>
|
||||||
|
|
||||||
</resources>
|
</resources>
|
||||||
|
|||||||
@@ -42,23 +42,24 @@ android {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
compileOptions {
|
/*compileOptions {
|
||||||
sourceCompatibility JavaVersion.VERSION_11
|
sourceCompatibility JavaVersion.VERSION_11
|
||||||
targetCompatibility JavaVersion.VERSION_11
|
targetCompatibility JavaVersion.VERSION_11
|
||||||
}
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
api project(':libjc')
|
||||||
|
api 'cc.winboll.studio:libaes:15.9.1'
|
||||||
|
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||||
|
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||||
|
|
||||||
// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on
|
// https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on
|
||||||
//implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
|
//implementation 'org.bouncycastle:bcprov-jdk15on:1.70'
|
||||||
implementation 'org.bouncycastle:bcprov-jdk15to18:1.69'
|
implementation 'org.bouncycastle:bcprov-jdk15to18:1.69'
|
||||||
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.69'
|
implementation 'org.bouncycastle:bcpkix-jdk15to18:1.69'
|
||||||
|
|
||||||
api project(':libjc')
|
|
||||||
api 'androidx.appcompat:appcompat:1.0.0'
|
api 'androidx.appcompat:appcompat:1.0.0'
|
||||||
api 'com.google.android.material:material:1.0.0'
|
api 'com.google.android.material:material:1.0.0'
|
||||||
|
|
||||||
api 'cc.winboll.studio:libapputils:9.1.0'
|
|
||||||
api 'cc.winboll.studio:libappbase:1.0.3'
|
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Fri Jan 10 22:03:57 GMT 2025
|
#Tue Jun 24 11:17:30 GMT 2025
|
||||||
stageCount=0
|
stageCount=0
|
||||||
libraryProject=libjc
|
libraryProject=libjc
|
||||||
baseVersion=1.0
|
baseVersion=1.0
|
||||||
publishVersion=1.0.0
|
publishVersion=1.0.0
|
||||||
buildCount=133
|
buildCount=135
|
||||||
baseBetaVersion=1.0.1
|
baseBetaVersion=1.0.1
|
||||||
|
|||||||
@@ -15,10 +15,10 @@ import android.widget.LinearLayout;
|
|||||||
import android.widget.ScrollView;
|
import android.widget.ScrollView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
import cc.winboll.studio.jc.R;
|
import cc.winboll.studio.jc.R;
|
||||||
import cc.winboll.studio.libapputils.log.LogUtils;
|
|
||||||
import cc.winboll.studio.libjc.JAR_RUNNING_MODE;
|
|
||||||
import cc.winboll.studio.libjc.JCMainThread;
|
import cc.winboll.studio.libjc.JCMainThread;
|
||||||
import cc.winboll.studio.libjc.net.JCSocketClient;
|
import cc.winboll.studio.libjc.net.JCSocketClient;
|
||||||
|
import cc.winboll.studio.libjc.util.LogUtils;
|
||||||
|
import cc.winboll.studio.libjc.Main;
|
||||||
|
|
||||||
final public class MainActivity extends Activity implements JCMainThread.OnMessageListener {
|
final public class MainActivity extends Activity implements JCMainThread.OnMessageListener {
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ final public class MainActivity extends Activity implements JCMainThread.OnMessa
|
|||||||
// 启动主线程
|
// 启动主线程
|
||||||
_JCMainThread = JCMainThread.getInstance(getPackageName());
|
_JCMainThread = JCMainThread.getInstance(getPackageName());
|
||||||
_JCMainThread.setOnLogListener(this);
|
_JCMainThread.setOnLogListener(this);
|
||||||
_JCMainThread.setRunningMode(JAR_RUNNING_MODE.JC);
|
//_JCMainThread.setRunningMode(Main.JAR_RUNNING_MODE.JC);
|
||||||
_JCMainThread.start();
|
_JCMainThread.start();
|
||||||
|
|
||||||
// 设置 WinBoll 应用 UI 类型
|
// 设置 WinBoll 应用 UI 类型
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
api 'cc.winboll.studio:libapputils:15.8.2'
|
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||||
|
|
||||||
// 吐司类库
|
// 吐司类库
|
||||||
api 'com.github.getActivity:ToastUtils:10.5'
|
api 'com.github.getActivity:ToastUtils:10.5'
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Mon Jun 09 01:44:28 HKT 2025
|
#Sat Jun 28 12:59:30 HKT 2025
|
||||||
stageCount=1
|
stageCount=3
|
||||||
libraryProject=libaes
|
libraryProject=libaes
|
||||||
baseVersion=15.9
|
baseVersion=15.9
|
||||||
publishVersion=15.9.0
|
publishVersion=15.9.2
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.9.1
|
baseBetaVersion=15.9.3
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ public class AboutView extends LinearLayout {
|
|||||||
mszAppDescription = mAPPInfo.getAppDescription();
|
mszAppDescription = mAPPInfo.getAppDescription();
|
||||||
mnAppIcon = mAPPInfo.getAppIcon();
|
mnAppIcon = mAPPInfo.getAppIcon();
|
||||||
|
|
||||||
mszWinBoLLServerHost = GlobalApplication.isDebuging() ? "https://dev.winboll.cc": "https://www.winboll.cc";
|
mszWinBoLLServerHost = GlobalApplication.isDebuging() ? "https://yun-preivew.winboll.cc": "https://yun.winboll.cc";
|
||||||
|
|
||||||
try {
|
try {
|
||||||
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
|
mszAppVersionName = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0).versionName;
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Thu Jun 05 08:59:45 GMT 2025
|
#Mon Aug 18 03:56:26 HKT 2025
|
||||||
stageCount=8
|
stageCount=6
|
||||||
libraryProject=libappbase
|
libraryProject=libappbase
|
||||||
baseVersion=15.8
|
baseVersion=15.9
|
||||||
publishVersion=15.8.7
|
publishVersion=15.9.5
|
||||||
buildCount=14
|
buildCount=0
|
||||||
baseBetaVersion=15.8.8
|
baseBetaVersion=15.9.6
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
api 'cc.winboll.studio:libappbase:15.8.2'
|
api 'cc.winboll.studio:libappbase:15.9.5'
|
||||||
|
|
||||||
// 二维码类库
|
// 二维码类库
|
||||||
api 'com.google.zxing:core:3.4.1'
|
api 'com.google.zxing:core:3.4.1'
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue Jun 03 15:05:42 HKT 2025
|
#Mon Sep 01 07:56:11 HKT 2025
|
||||||
stageCount=5
|
stageCount=7
|
||||||
libraryProject=libapputils
|
libraryProject=libapputils
|
||||||
baseVersion=15.8
|
baseVersion=15.8
|
||||||
publishVersion=15.8.4
|
publishVersion=15.8.6
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.8.5
|
baseBetaVersion=15.8.7
|
||||||
|
|||||||
@@ -0,0 +1,32 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Fri Jan 10 22:03:57 GMT 2025
|
#Tue Jun 24 11:17:30 GMT 2025
|
||||||
stageCount=0
|
stageCount=0
|
||||||
libraryProject=libjc
|
libraryProject=libjc
|
||||||
baseVersion=1.0
|
baseVersion=1.0
|
||||||
publishVersion=1.0.0
|
publishVersion=1.0.0
|
||||||
buildCount=133
|
buildCount=135
|
||||||
baseBetaVersion=1.0.1
|
baseBetaVersion=1.0.1
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ public class Main {
|
|||||||
public final static int JAR_RUNNING_MODE_JCNDK_DEBUG = 4;
|
public final static int JAR_RUNNING_MODE_JCNDK_DEBUG = 4;
|
||||||
public final static int JAR_RUNNING_MODE_JC = 5;
|
public final static int JAR_RUNNING_MODE_JC = 5;
|
||||||
public final static int JAR_RUNNING_MODE_JC_DEBUG = 6;
|
public final static int JAR_RUNNING_MODE_JC_DEBUG = 6;
|
||||||
public enum JAR_RUNNING_MODE {
|
public static enum JAR_RUNNING_MODE {
|
||||||
UNKNOWN(JAR_RUNNING_MODE_UNKNOWN),
|
UNKNOWN(JAR_RUNNING_MODE_UNKNOWN),
|
||||||
CONSOLE(JAR_RUNNING_MODE_CONSOLE),
|
CONSOLE(JAR_RUNNING_MODE_CONSOLE),
|
||||||
CONSOLE_DEBUG(JAR_RUNNING_MODE_CONSOLE_DEBUG),
|
CONSOLE_DEBUG(JAR_RUNNING_MODE_CONSOLE_DEBUG),
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ android {
|
|||||||
// versionName 更新后需要手动设置
|
// versionName 更新后需要手动设置
|
||||||
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||||
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
versionName "15.2"
|
versionName "15.3"
|
||||||
if(true) {
|
if(true) {
|
||||||
versionName = genVersionName("${versionName}")
|
versionName = genVersionName("${versionName}")
|
||||||
}
|
}
|
||||||
@@ -45,9 +45,9 @@ android {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api fileTree(dir: 'libs', include: ['*.jar'])
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
api 'cc.winboll.studio:libaes:15.8.0'
|
api 'cc.winboll.studio:libaes:15.9.2'
|
||||||
api 'cc.winboll.studio:libapputils:15.8.1'
|
api 'cc.winboll.studio:libapputils:15.8.4'
|
||||||
api 'cc.winboll.studio:libappbase:15.8.1'
|
api 'cc.winboll.studio:libappbase:15.8.4'
|
||||||
|
|
||||||
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.github.getActivity:ToastUtils:10.5'
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
#Created by .winboll/winboll_app_build.gradle
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
#Tue May 20 20:39:06 HKT 2025
|
#Thu Jul 03 13:50:15 HKT 2025
|
||||||
stageCount=6
|
stageCount=2
|
||||||
libraryProject=
|
libraryProject=
|
||||||
baseVersion=15.2
|
baseVersion=15.3
|
||||||
publishVersion=15.2.5
|
publishVersion=15.3.1
|
||||||
buildCount=0
|
buildCount=0
|
||||||
baseBetaVersion=15.2.6
|
baseBetaVersion=15.3.2
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
|||||||
import cc.winboll.studio.mymessagemanager.App;
|
import cc.winboll.studio.mymessagemanager.App;
|
||||||
import cc.winboll.studio.mymessagemanager.R;
|
import cc.winboll.studio.mymessagemanager.R;
|
||||||
|
|
||||||
public class AboutActivity extends WinBollActivity implements IWinBoLLActivity {
|
public class AboutActivity extends WinBoLLActivity implements IWinBoLLActivity {
|
||||||
|
|
||||||
public static final String TAG = "AboutActivity";
|
public static final String TAG = "AboutActivity";
|
||||||
|
|
||||||
@@ -79,11 +79,11 @@ public class AboutActivity extends WinBollActivity implements IWinBoLLActivity {
|
|||||||
appInfo.setAppName(getString(R.string.app_name));
|
appInfo.setAppName(getString(R.string.app_name));
|
||||||
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll);
|
||||||
appInfo.setAppDescription(getString(R.string.app_description));
|
appInfo.setAppDescription(getString(R.string.app_description));
|
||||||
appInfo.setAppGitName("APP");
|
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/studio/details.php?app=MyMessageManager");
|
appInfo.setAppHomePage("https://discuz.winboll.cc/forum.php?mod=viewthread&tid=5&extra=page%3D1");
|
||||||
appInfo.setAppAPKName("MyMessageManager");
|
appInfo.setAppAPKName("MyMessageManager");
|
||||||
appInfo.setAppAPKFolderName("MyMessageManager");
|
appInfo.setAppAPKFolderName("MyMessageManager");
|
||||||
return new AboutView(mContext, appInfo);
|
return new AboutView(mContext, appInfo);
|
||||||
|
|||||||
@@ -103,6 +103,9 @@ abstract public class BaseActivity extends AppCompatActivity {
|
|||||||
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
AESThemeUtil.saveThemeStyleID(this, R.style.MyAppTheme);
|
AESThemeUtil.saveThemeStyleID(this, R.style.MyAppTheme);
|
||||||
recreate();
|
recreate();
|
||||||
|
} else if (R.id.item_defaulttheme == item.getItemId()) {
|
||||||
|
AESThemeUtil.saveThemeStyleID(this, R.style.MyAppTheme);
|
||||||
|
recreate();
|
||||||
}
|
}
|
||||||
//ToastUtils.show("nThemeStyleID " + Integer.toString(nThemeStyleID));
|
//ToastUtils.show("nThemeStyleID " + Integer.toString(nThemeStyleID));
|
||||||
|
|
||||||
|
|||||||
@@ -128,7 +128,7 @@ public class MainActivity extends BaseActivity {
|
|||||||
mToolbar = findViewById(R.id.activitymainASupportToolbar1);
|
mToolbar = findViewById(R.id.activitymainASupportToolbar1);
|
||||||
mToolbar.setSubtitle(getString(R.string.activity_name_main));
|
mToolbar.setSubtitle(getString(R.string.activity_name_main));
|
||||||
setSupportActionBar(mToolbar);
|
setSupportActionBar(mToolbar);
|
||||||
|
|
||||||
boolean isEnableService = mAppConfigUtil.mAppConfigBean.isEnableService();
|
boolean isEnableService = mAppConfigUtil.mAppConfigBean.isEnableService();
|
||||||
msvEnableService = findViewById(R.id.activitymainSwitchView1);
|
msvEnableService = findViewById(R.id.activitymainSwitchView1);
|
||||||
msvEnableService.setChecked(isEnableService);
|
msvEnableService.setChecked(isEnableService);
|
||||||
@@ -269,17 +269,9 @@ public class MainActivity extends BaseActivity {
|
|||||||
public boolean onCreateOptionsMenu(Menu menu) {
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
//return super.onCreateOptionsMenu(menu);
|
//return super.onCreateOptionsMenu(menu);
|
||||||
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
getMenuInflater().inflate(R.menu.toolbar_main, menu);
|
||||||
|
super.onCreateOptionsMenu(menu);
|
||||||
/*ThemeUtil.BaseTheme baseTheme = ThemeUtil.getTheme(mAppConfigUtil.mAppConfigBean.getAppThemeID());
|
getMenuInflater().inflate(R.menu.toolbar_main2, menu);
|
||||||
if (baseTheme == ThemeUtil.BaseTheme.DEFAULT) {
|
return true;
|
||||||
menu.findItem(R.id.app_defaulttheme).setChecked(true);
|
|
||||||
} else if (baseTheme == ThemeUtil.BaseTheme.SKY) {
|
|
||||||
menu.findItem(R.id.app_skytheme).setChecked(true);
|
|
||||||
} else if (baseTheme == ThemeUtil.BaseTheme.GOLDEN) {
|
|
||||||
menu.findItem(R.id.app_goldentheme).setChecked(true);
|
|
||||||
}*/
|
|
||||||
|
|
||||||
return super.onCreateOptionsMenu(menu);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void reloadSMS() {
|
public static void reloadSMS() {
|
||||||
@@ -306,7 +298,7 @@ public class MainActivity extends BaseActivity {
|
|||||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
} else if (nItemId == R.id.app_log) {
|
} else if (nItemId == R.id.app_log) {
|
||||||
//App.getWinBoLLActivityManager().startLogActivity(this);
|
App.getWinBoLLActivityManager().startLogActivity(this);
|
||||||
} else if (nItemId == R.id.app_unittest) {
|
} else if (nItemId == R.id.app_unittest) {
|
||||||
Intent i = new Intent(MainActivity.this, UnitTestActivity.class);
|
Intent i = new Intent(MainActivity.this, UnitTestActivity.class);
|
||||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
@@ -324,7 +316,7 @@ public class MainActivity extends BaseActivity {
|
|||||||
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
startActivity(i);
|
startActivity(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ import cc.winboll.studio.libaes.beans.AESThemeBean;
|
|||||||
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
import cc.winboll.studio.libaes.utils.AESThemeUtil;
|
||||||
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity;
|
||||||
|
|
||||||
public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity {
|
public class WinBoLLActivity extends AppCompatActivity implements IWinBoLLActivity {
|
||||||
|
|
||||||
public static final String TAG = "WinBollActivity";
|
public static final String TAG = "WinBoLLActivity";
|
||||||
|
|
||||||
protected volatile AESThemeBean.ThemeType mThemeType;
|
protected volatile AESThemeBean.ThemeType mThemeType;
|
||||||
|
|
||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
|
|
||||||
<cc.winboll.studio.shared.log.LogView
|
<cc.winboll.studio.libappbase.LogView
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:layout_weight="1.0"
|
android:layout_weight="1.0"
|
||||||
|
|||||||
@@ -17,26 +17,4 @@
|
|||||||
<item
|
<item
|
||||||
android:id="@+id/app_smsrule"
|
android:id="@+id/app_smsrule"
|
||||||
android:title="@string/text_smsrule"/>
|
android:title="@string/text_smsrule"/>
|
||||||
<item android:title="@string/app_developoptions">
|
|
||||||
<menu>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_log"
|
|
||||||
android:title="@string/app_log"/>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_unittest"
|
|
||||||
android:title="@string/app_unittest"/>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_crashtest"
|
|
||||||
android:title="@string/app_crashtest"/>
|
|
||||||
</menu>
|
|
||||||
</item>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_appsettings"
|
|
||||||
android:title="@string/text_appsettings"/>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_about"
|
|
||||||
android:title="@string/app_about"/>
|
|
||||||
<item
|
|
||||||
android:id="@+id/app_smsrecycle"
|
|
||||||
android:title="@string/app_smsrecycle"/>
|
|
||||||
</menu>
|
</menu>
|
||||||
|
|||||||
26
mymessagemanager/src/main/res/menu/toolbar_main2.xml
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
<?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:title="@string/app_developoptions">
|
||||||
|
<menu>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_log"
|
||||||
|
android:title="@string/app_log"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_unittest"
|
||||||
|
android:title="@string/app_unittest"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_crashtest"
|
||||||
|
android:title="@string/app_crashtest"/>
|
||||||
|
</menu>
|
||||||
|
</item>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_appsettings"
|
||||||
|
android:title="@string/text_appsettings"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_about"
|
||||||
|
android:title="@string/app_about"/>
|
||||||
|
<item
|
||||||
|
android:id="@+id/app_smsrecycle"
|
||||||
|
android:title="@string/app_smsrecycle"/>
|
||||||
|
</menu>
|
||||||
1
numtable/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/build
|
||||||
34
numtable/README.md
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
# NumTable
|
||||||
|
|
||||||
|
#### 介绍
|
||||||
|
桌面图标多元应用。提供一个数字风格化的桌面标识图标,快捷的桌面标识创建途径。主要应用于桌面繁多时的页面环境辅助识别。
|
||||||
|
|
||||||
|
#### 软件架构
|
||||||
|
适配安卓应用 [AIDE Pro] 的 Gradle 编译结构。
|
||||||
|
也适配安卓应用 [AndroidIDE] 的 Gradle 编译结构。
|
||||||
|
|
||||||
|
|
||||||
|
#### Gradle 编译说明
|
||||||
|
调试版编译命令 :gradle assembleBetaDebug
|
||||||
|
阶段版编译命令 :bash .winboll/bashPublishAPKAddTag.sh numtable
|
||||||
|
|
||||||
|
#### 使用说明
|
||||||
|
|
||||||
|
#### 参与贡献
|
||||||
|
|
||||||
|
1. Fork 本仓库
|
||||||
|
2. 新建 Feat_xxx 分支
|
||||||
|
3. 提交代码 : ZhanGSKen(ZhanGSKen<zhangsken@188.com>)
|
||||||
|
4. 新建 Pull Request
|
||||||
|
|
||||||
|
|
||||||
|
#### 特技
|
||||||
|
|
||||||
|
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
|
||||||
|
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
|
||||||
|
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
|
||||||
|
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
|
||||||
|
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
|
||||||
|
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)
|
||||||
|
|
||||||
|
#### 参考文档
|
||||||
1
numtable/app_update_description.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
73
numtable/build.gradle
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
apply plugin: 'com.android.application'
|
||||||
|
apply from: '../.winboll/winboll_app_build.gradle'
|
||||||
|
apply from: '../.winboll/winboll_lint_build.gradle'
|
||||||
|
|
||||||
|
def genVersionName(def versionName){
|
||||||
|
// 检查编译标志位配置
|
||||||
|
assert (winbollBuildProps['stageCount'] != null)
|
||||||
|
assert (winbollBuildProps['baseVersion'] != null)
|
||||||
|
// 保存基础版本号
|
||||||
|
winbollBuildProps.setProperty("baseVersion", "${versionName}");
|
||||||
|
//保存编译标志配置
|
||||||
|
FileOutputStream fos = new FileOutputStream(winbollBuildPropsFile)
|
||||||
|
winbollBuildProps.store(fos, "${winbollBuildPropsDesc}");
|
||||||
|
fos.close();
|
||||||
|
|
||||||
|
// 返回编译版本号
|
||||||
|
return "${versionName}." + winbollBuildProps['stageCount']
|
||||||
|
}
|
||||||
|
|
||||||
|
android {
|
||||||
|
compileSdkVersion 32
|
||||||
|
buildToolsVersion "32.0.0"
|
||||||
|
|
||||||
|
defaultConfig {
|
||||||
|
applicationId "cc.winboll.studio.numtable"
|
||||||
|
minSdkVersion 24
|
||||||
|
targetSdkVersion 30
|
||||||
|
versionCode 1
|
||||||
|
// versionName 更新后需要手动设置
|
||||||
|
// .winboll/winbollBuildProps.properties 文件的 stageCount=0
|
||||||
|
// Gradle编译环境下合起来的 versionName 就是 "${versionName}.0"
|
||||||
|
versionName "15.1"
|
||||||
|
if(true) {
|
||||||
|
versionName = genVersionName("${versionName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTypes {
|
||||||
|
release {
|
||||||
|
minifyEnabled false
|
||||||
|
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
api fileTree(dir: 'libs', include: ['*.jar'])
|
||||||
|
|
||||||
|
// SSH
|
||||||
|
api 'com.jcraft:jsch:0.1.55'
|
||||||
|
// Html 解析
|
||||||
|
api 'org.jsoup:jsoup:1.13.1'
|
||||||
|
// 二维码类库
|
||||||
|
api 'com.google.zxing:core:3.4.1'
|
||||||
|
api 'com.journeyapps:zxing-android-embedded:3.6.0'
|
||||||
|
// 应用介绍页类库
|
||||||
|
api 'io.github.medyo:android-about-page:2.0.0'
|
||||||
|
// 吐司类库
|
||||||
|
api 'com.github.getActivity:ToastUtils:10.5'
|
||||||
|
// 网络连接类库
|
||||||
|
api 'com.squareup.okhttp3:okhttp:4.4.1'
|
||||||
|
// AndroidX 类库
|
||||||
|
api 'androidx.appcompat:appcompat:1.1.0'
|
||||||
|
api 'com.google.android.material:material:1.4.0'
|
||||||
|
//api 'androidx.viewpager:viewpager:1.0.0'
|
||||||
|
//api 'androidx.vectordrawable:vectordrawable:1.1.0'
|
||||||
|
//api 'androidx.vectordrawable:vectordrawable-animated:1.1.0'
|
||||||
|
//api 'androidx.fragment:fragment:1.1.0'
|
||||||
|
|
||||||
|
api 'cc.winboll.studio:libaes:15.8.0'
|
||||||
|
api 'cc.winboll.studio:libapputils:15.8.2'
|
||||||
|
api 'cc.winboll.studio:libappbase:15.8.2'
|
||||||
|
}
|
||||||
8
numtable/build.properties
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#Created by .winboll/winboll_app_build.gradle
|
||||||
|
#Sun Jun 08 21:21:11 HKT 2025
|
||||||
|
stageCount=1
|
||||||
|
libraryProject=
|
||||||
|
baseVersion=15.1
|
||||||
|
publishVersion=15.1.0
|
||||||
|
buildCount=0
|
||||||
|
baseBetaVersion=15.1.1
|
||||||
21
numtable/proguard-rules.pro
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
# Add project specific ProGuard rules here.
|
||||||
|
# You can control the set of applied configuration files using the
|
||||||
|
# proguardFiles setting in build.gradle.
|
||||||
|
#
|
||||||
|
# For more details, see
|
||||||
|
# http://developer.android.com/guide/developing/tools/proguard.html
|
||||||
|
|
||||||
|
# If your project uses WebView with JS, uncomment the following
|
||||||
|
# and specify the fully qualified class name to the JavaScript interface
|
||||||
|
# class:
|
||||||
|
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
|
||||||
|
# public *;
|
||||||
|
#}
|
||||||
|
|
||||||
|
# Uncomment this to preserve the line number information for
|
||||||
|
# debugging stack traces.
|
||||||
|
#-keepattributes SourceFile,LineNumberTable
|
||||||
|
|
||||||
|
# If you keep the line number information, uncomment this to
|
||||||
|
# hide the original source file name.
|
||||||
|
#-renamesourcefileattribute SourceFile
|
||||||
14
numtable/src/beta/AndroidManifest.xml
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" >
|
||||||
|
|
||||||
|
<application
|
||||||
|
tools:replace="android:icon"
|
||||||
|
android:icon="@drawable/ic_launcher_beta">
|
||||||
|
|
||||||
|
<!-- Put flavor specific code here -->
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
|
|
||||||
6
numtable/src/beta/res/values/strings.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<string name="app_name">NumTable +</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
37
numtable/src/main/AndroidManifest.xml
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
|
<manifest
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
package="cc.winboll.studio.numtable">
|
||||||
|
|
||||||
|
<application
|
||||||
|
android:allowBackup="true"
|
||||||
|
android:icon="@drawable/ic_launcher"
|
||||||
|
android:roundIcon="@drawable/ic_launcher"
|
||||||
|
android:label="@string/app_name"
|
||||||
|
android:theme="@style/MyAppTheme"
|
||||||
|
android:resizeableActivity="true"
|
||||||
|
android:name=".App">
|
||||||
|
|
||||||
|
<activity
|
||||||
|
android:name=".MainActivity"
|
||||||
|
android:label="@string/app_name">
|
||||||
|
|
||||||
|
<intent-filter>
|
||||||
|
|
||||||
|
<action android:name="android.intent.action.MAIN"/>
|
||||||
|
|
||||||
|
<category android:name="android.intent.category.LAUNCHER"/>
|
||||||
|
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
|
</activity>
|
||||||
|
|
||||||
|
<meta-data
|
||||||
|
android:name="android.max_aspect"
|
||||||
|
android:value="4.0"/>
|
||||||
|
|
||||||
|
<activity android:name=".GlobalApplication$CrashActivity"/>
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
345
numtable/src/main/java/cc/winboll/studio/numtable/App.java
Normal file
@@ -0,0 +1,345 @@
|
|||||||
|
package cc.winboll.studio.numtable;
|
||||||
|
|
||||||
|
import android.app.Activity;
|
||||||
|
import android.content.ClipData;
|
||||||
|
import android.content.ClipboardManager;
|
||||||
|
import android.content.Context;
|
||||||
|
import android.content.Intent;
|
||||||
|
import android.content.pm.PackageInfo;
|
||||||
|
import android.content.res.Resources;
|
||||||
|
import android.graphics.Typeface;
|
||||||
|
import android.os.Build;
|
||||||
|
import android.os.Bundle;
|
||||||
|
import android.os.Handler;
|
||||||
|
import android.os.Looper;
|
||||||
|
import android.text.TextUtils;
|
||||||
|
import android.util.Log;
|
||||||
|
import android.view.Gravity;
|
||||||
|
import android.view.Menu;
|
||||||
|
import android.view.MenuItem;
|
||||||
|
import android.view.ViewGroup;
|
||||||
|
import android.widget.HorizontalScrollView;
|
||||||
|
import android.widget.ScrollView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
import cc.winboll.studio.libappbase.GlobalApplication;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
import com.hjq.toast.style.WhiteToastStyle;
|
||||||
|
import java.io.ByteArrayInputStream;
|
||||||
|
import java.io.ByteArrayOutputStream;
|
||||||
|
import java.io.Closeable;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.lang.Thread.UncaughtExceptionHandler;
|
||||||
|
import java.text.DateFormat;
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
|
public class App extends GlobalApplication {
|
||||||
|
|
||||||
|
private static Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onCreate() {
|
||||||
|
super.onCreate();
|
||||||
|
|
||||||
|
// 初始化 Toast 框架
|
||||||
|
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().registerPart(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write(InputStream input, OutputStream output) throws IOException {
|
||||||
|
byte[] buf = new byte[1024 * 8];
|
||||||
|
int len;
|
||||||
|
while ((len = input.read(buf)) != -1) {
|
||||||
|
output.write(buf, 0, len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void write(File file, byte[] data) throws IOException {
|
||||||
|
File parent = file.getParentFile();
|
||||||
|
if (parent != null && !parent.exists()) parent.mkdirs();
|
||||||
|
|
||||||
|
ByteArrayInputStream input = new ByteArrayInputStream(data);
|
||||||
|
FileOutputStream output = new FileOutputStream(file);
|
||||||
|
try {
|
||||||
|
write(input, output);
|
||||||
|
} finally {
|
||||||
|
closeIO(input, output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String toString(InputStream input) throws IOException {
|
||||||
|
ByteArrayOutputStream output = new ByteArrayOutputStream();
|
||||||
|
write(input, output);
|
||||||
|
try {
|
||||||
|
return output.toString("UTF-8");
|
||||||
|
} finally {
|
||||||
|
closeIO(input, output);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void closeIO(Closeable... closeables) {
|
||||||
|
for (Closeable closeable : closeables) {
|
||||||
|
try {
|
||||||
|
if (closeable != null) closeable.close();
|
||||||
|
} catch (IOException ignored) {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class CrashHandler {
|
||||||
|
|
||||||
|
public static final UncaughtExceptionHandler DEFAULT_UNCAUGHT_EXCEPTION_HANDLER = Thread.getDefaultUncaughtExceptionHandler();
|
||||||
|
|
||||||
|
private static CrashHandler sInstance;
|
||||||
|
|
||||||
|
private PartCrashHandler mPartCrashHandler;
|
||||||
|
|
||||||
|
public static CrashHandler getInstance() {
|
||||||
|
if (sInstance == null) {
|
||||||
|
sInstance = new CrashHandler();
|
||||||
|
}
|
||||||
|
return sInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerGlobal(Context context) {
|
||||||
|
registerGlobal(context, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerGlobal(Context context, String crashDir) {
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandlerImpl(context.getApplicationContext(), crashDir));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregister() {
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler(DEFAULT_UNCAUGHT_EXCEPTION_HANDLER);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerPart(Context context) {
|
||||||
|
unregisterPart(context);
|
||||||
|
mPartCrashHandler = new PartCrashHandler(context.getApplicationContext());
|
||||||
|
MAIN_HANDLER.postAtFrontOfQueue(mPartCrashHandler);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unregisterPart(Context context) {
|
||||||
|
if (mPartCrashHandler != null) {
|
||||||
|
mPartCrashHandler.isRunning.set(false);
|
||||||
|
mPartCrashHandler = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class PartCrashHandler implements Runnable {
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
public AtomicBoolean isRunning = new AtomicBoolean(true);
|
||||||
|
|
||||||
|
public PartCrashHandler(Context context) {
|
||||||
|
this.mContext = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
while (isRunning.get()) {
|
||||||
|
try {
|
||||||
|
Looper.loop();
|
||||||
|
} catch (final Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
if (isRunning.get()) {
|
||||||
|
MAIN_HANDLER.post(new Runnable(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
Toast.makeText(mContext, e.toString(), Toast.LENGTH_LONG).show();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
if (e instanceof RuntimeException) {
|
||||||
|
throw (RuntimeException)e;
|
||||||
|
} else {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class UncaughtExceptionHandlerImpl implements UncaughtExceptionHandler {
|
||||||
|
|
||||||
|
private static DateFormat DATE_FORMAT = new SimpleDateFormat("yyyy_MM_dd-HH_mm_ss");
|
||||||
|
|
||||||
|
private final Context mContext;
|
||||||
|
|
||||||
|
private final File mCrashDir;
|
||||||
|
|
||||||
|
public UncaughtExceptionHandlerImpl(Context context, String crashDir) {
|
||||||
|
this.mContext = context;
|
||||||
|
this.mCrashDir = TextUtils.isEmpty(crashDir) ? new File(mContext.getExternalCacheDir(), "crash") : new File(crashDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void uncaughtException(Thread thread, Throwable throwable) {
|
||||||
|
try {
|
||||||
|
|
||||||
|
String log = buildLog(throwable);
|
||||||
|
writeLog(log);
|
||||||
|
|
||||||
|
try {
|
||||||
|
Intent intent = new Intent(mContext, CrashActivity.class);
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
intent.putExtra(Intent.EXTRA_TEXT, log);
|
||||||
|
mContext.startActivity(intent);
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
writeLog(e.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
throwable.printStackTrace();
|
||||||
|
android.os.Process.killProcess(android.os.Process.myPid());
|
||||||
|
System.exit(0);
|
||||||
|
|
||||||
|
} catch (Throwable e) {
|
||||||
|
if (DEFAULT_UNCAUGHT_EXCEPTION_HANDLER != null) DEFAULT_UNCAUGHT_EXCEPTION_HANDLER.uncaughtException(thread, throwable);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String buildLog(Throwable throwable) {
|
||||||
|
String time = DATE_FORMAT.format(new Date());
|
||||||
|
|
||||||
|
String versionName = "unknown";
|
||||||
|
long versionCode = 0;
|
||||||
|
try {
|
||||||
|
PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(), 0);
|
||||||
|
versionName = packageInfo.versionName;
|
||||||
|
versionCode = Build.VERSION.SDK_INT >= 28 ? packageInfo.getLongVersionCode() : packageInfo.versionCode;
|
||||||
|
} catch (Throwable ignored) {}
|
||||||
|
|
||||||
|
LinkedHashMap<String, String> head = new LinkedHashMap<String, String>();
|
||||||
|
head.put("Time Of Crash", time);
|
||||||
|
head.put("Device", String.format("%s, %s", Build.MANUFACTURER, Build.MODEL));
|
||||||
|
head.put("Android Version", String.format("%s (%d)", Build.VERSION.RELEASE, Build.VERSION.SDK_INT));
|
||||||
|
head.put("App Version", String.format("%s (%d)", versionName, versionCode));
|
||||||
|
head.put("Kernel", getKernel());
|
||||||
|
head.put("Support Abis", Build.VERSION.SDK_INT >= 21 && Build.SUPPORTED_ABIS != null ? Arrays.toString(Build.SUPPORTED_ABIS): "unknown");
|
||||||
|
head.put("Fingerprint", Build.FINGERPRINT);
|
||||||
|
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
|
||||||
|
for (String key : head.keySet()) {
|
||||||
|
if (builder.length() != 0) builder.append("\n");
|
||||||
|
builder.append(key);
|
||||||
|
builder.append(" : ");
|
||||||
|
builder.append(head.get(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append("\n\n");
|
||||||
|
builder.append(Log.getStackTraceString(throwable));
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void writeLog(String log) {
|
||||||
|
String time = DATE_FORMAT.format(new Date());
|
||||||
|
File file = new File(mCrashDir, "crash_" + time + ".txt");
|
||||||
|
try {
|
||||||
|
write(file, log.getBytes("UTF-8"));
|
||||||
|
} catch (Throwable e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getKernel() {
|
||||||
|
try {
|
||||||
|
return App.toString(new FileInputStream("/proc/version")).trim();
|
||||||
|
} catch (Throwable e) {
|
||||||
|
return e.getMessage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static final class CrashActivity extends Activity {
|
||||||
|
|
||||||
|
private String mLog;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
|
setTheme(android.R.style.Theme_DeviceDefault);
|
||||||
|
setTitle("App Crash");
|
||||||
|
|
||||||
|
mLog = getIntent().getStringExtra(Intent.EXTRA_TEXT);
|
||||||
|
|
||||||
|
ScrollView contentView = new ScrollView(this);
|
||||||
|
contentView.setFillViewport(true);
|
||||||
|
|
||||||
|
HorizontalScrollView horizontalScrollView = new HorizontalScrollView(this);
|
||||||
|
|
||||||
|
TextView textView = new TextView(this);
|
||||||
|
int padding = dp2px(16);
|
||||||
|
textView.setPadding(padding, padding, padding, padding);
|
||||||
|
textView.setText(mLog);
|
||||||
|
textView.setTextIsSelectable(true);
|
||||||
|
textView.setTypeface(Typeface.DEFAULT);
|
||||||
|
textView.setLinksClickable(true);
|
||||||
|
|
||||||
|
horizontalScrollView.addView(textView);
|
||||||
|
contentView.addView(horizontalScrollView, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
|
||||||
|
|
||||||
|
setContentView(contentView);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void restart() {
|
||||||
|
Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
|
||||||
|
if (intent != null) {
|
||||||
|
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
startActivity(intent);
|
||||||
|
}
|
||||||
|
finish();
|
||||||
|
android.os.Process.killProcess(android.os.Process.myPid());
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static int dp2px(float dpValue) {
|
||||||
|
final float scale = Resources.getSystem().getDisplayMetrics().density;
|
||||||
|
return (int) (dpValue * scale + 0.5f);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onCreateOptionsMenu(Menu menu) {
|
||||||
|
menu.add(0, android.R.id.copy, 0, android.R.string.copy)
|
||||||
|
.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
|
||||||
|
return super.onCreateOptionsMenu(menu);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case android.R.id.copy:
|
||||||
|
ClipboardManager cm = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
|
||||||
|
cm.setPrimaryClip(ClipData.newPlainText(getPackageName(), mLog));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onBackPressed() {
|
||||||
|
restart();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package cc.winboll.studio.numtable;
|
||||||
|
|
||||||
|
import android.os.Bundle;
|
||||||
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
|
import androidx.appcompat.widget.Toolbar;
|
||||||
|
import cc.winboll.studio.libappbase.LogView;
|
||||||
|
import com.hjq.toast.ToastUtils;
|
||||||
|
|
||||||
|
public class MainActivity extends AppCompatActivity {
|
||||||
|
|
||||||
|
LogView mLogView;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
setContentView(R.layout.activity_main);
|
||||||
|
|
||||||
|
Toolbar toolbar=(Toolbar)findViewById(R.id.toolbar);
|
||||||
|
setSupportActionBar(toolbar);
|
||||||
|
|
||||||
|
mLogView = findViewById(R.id.logview);
|
||||||
|
|
||||||
|
ToastUtils.show("onCreate");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onResume() {
|
||||||
|
super.onResume();
|
||||||
|
mLogView.start();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:aapt="http://schemas.android.com/aapt"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportHeight="108"
|
||||||
|
android:viewportWidth="108">
|
||||||
|
<path
|
||||||
|
android:fillType="evenOdd"
|
||||||
|
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:strokeWidth="1">
|
||||||
|
<aapt:attr name="android:fillColor">
|
||||||
|
<gradient
|
||||||
|
android:endX="78.5885"
|
||||||
|
android:endY="90.9159"
|
||||||
|
android:startX="48.7653"
|
||||||
|
android:startY="61.0927"
|
||||||
|
android:type="linear">
|
||||||
|
<item
|
||||||
|
android:color="#44000000"
|
||||||
|
android:offset="0.0" />
|
||||||
|
<item
|
||||||
|
android:color="#00000000"
|
||||||
|
android:offset="1.0" />
|
||||||
|
</gradient>
|
||||||
|
</aapt:attr>
|
||||||
|
</path>
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFFFF"
|
||||||
|
android:fillType="nonZero"
|
||||||
|
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
|
||||||
|
android:strokeColor="#00000000"
|
||||||
|
android:strokeWidth="1" />
|
||||||
|
</vector>
|
||||||
13
numtable/src/main/res/drawable/ic_launcher.xml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="512dp"
|
||||||
|
android:height="512dp"
|
||||||
|
android:viewportWidth="512"
|
||||||
|
android:viewportHeight="512">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FF3D8A1C"
|
||||||
|
android:strokeColor="#FFF5DD00"
|
||||||
|
android:strokeWidth="20.0"
|
||||||
|
android:strokeLineCap="round"
|
||||||
|
android:strokeMiterLimit="10"
|
||||||
|
android:pathData="M47.53 417.75C38.23 258.17 97.09 94.95 156.27 94.16 211.66 98.38 260.9 237.99 329.08 242.47 351.54 241.69 397.94 228.17 449.46 88.59 447.52 262.11 394.97 417.45 338.71 418.74 279.06 412.93 220.17 297.22 157.81 295.26 132.98 294.7 116.37 308.69 47.53 417.75Z"/>
|
||||||
|
</vector>
|
||||||
170
numtable/src/main/res/drawable/ic_launcher_background.xml
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:width="108dp"
|
||||||
|
android:height="108dp"
|
||||||
|
android:viewportHeight="108"
|
||||||
|
android:viewportWidth="108">
|
||||||
|
<path
|
||||||
|
android:fillColor="#FFFBC41E"
|
||||||
|
android:pathData="M0,0h108v108h-108z" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M9,0L9,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,0L19,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,0L29,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,0L39,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,0L49,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,0L59,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,0L69,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,0L79,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M89,0L89,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M99,0L99,108"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,9L108,9"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,19L108,19"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,29L108,29"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,39L108,39"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,49L108,49"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,59L108,59"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,69L108,69"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,79L108,79"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,89L108,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M0,99L108,99"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,29L89,29"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,39L89,39"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,49L89,49"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,59L89,59"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,69L89,69"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M19,79L89,79"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M29,19L29,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M39,19L39,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M49,19L49,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M59,19L59,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M69,19L69,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
<path
|
||||||
|
android:fillColor="#00000000"
|
||||||
|
android:pathData="M79,19L79,89"
|
||||||
|
android:strokeColor="#33FFFFFF"
|
||||||
|
android:strokeWidth="0.8" />
|
||||||
|
</vector>
|
||||||
11
numtable/src/main/res/drawable/ic_launcher_beta.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:clickable="true">
|
||||||
|
<item android:drawable="@drawable/ic_launcher_background"/>
|
||||||
|
<item
|
||||||
|
android:left="15dp"
|
||||||
|
android:top="15dp"
|
||||||
|
android:right="15dp"
|
||||||
|
android:bottom="15dp"
|
||||||
|
android:drawable="@drawable/ic_launcher"/>
|
||||||
|
</layer-list>
|
||||||
51
numtable/src/main/res/layout/activity_main.xml
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
<?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:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:orientation="vertical">
|
||||||
|
|
||||||
|
<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"
|
||||||
|
android:gravity="center_vertical|center_horizontal">
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="NumTable"
|
||||||
|
android:textAppearance="?android:attr/textAppearanceLarge"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
<LinearLayout
|
||||||
|
android:orientation="vertical"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="0dp"
|
||||||
|
android:layout_weight="1.0">
|
||||||
|
|
||||||
|
<cc.winboll.studio.libappbase.LogView
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent"
|
||||||
|
android:id="@+id/logview"/>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
|
</LinearLayout>
|
||||||
|
|
||||||
5
numtable/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@drawable/ic_launcher_background" />
|
||||||
|
<foreground android:drawable="@drawable/ic_launcher_foreground" />
|
||||||
|
</adaptive-icon>
|
||||||
BIN
numtable/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 3.0 KiB |
BIN
numtable/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 4.9 KiB |
BIN
numtable/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
numtable/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 2.8 KiB |
BIN
numtable/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
numtable/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 6.9 KiB |
BIN
numtable/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.3 KiB |
BIN
numtable/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
numtable/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 9.0 KiB |
BIN
numtable/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
6
numtable/src/main/res/values/colors.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="colorPrimary">#009688</color>
|
||||||
|
<color name="colorPrimaryDark">#00796B</color>
|
||||||
|
<color name="colorAccent">#FF9800</color>
|
||||||
|
</resources>
|
||||||
4
numtable/src/main/res/values/strings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<resources>
|
||||||
|
<string name="app_name">NumTable</string>
|
||||||
|
|
||||||
|
</resources>
|
||||||
11
numtable/src/main/res/values/styles.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Base application theme. -->
|
||||||
|
<style name="MyAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
|
||||||
|
<!-- Customize your theme here. -->
|
||||||
|
<item name="colorPrimary">@color/colorPrimary</item>
|
||||||
|
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
|
||||||
|
<item name="colorAccent">@color/colorAccent</item>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</resources>
|
||||||
12
numtable/src/stage/AndroidManifest.xml
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
xmlns:tools="http://schemas.android.com/tools" >
|
||||||
|
|
||||||
|
<application>
|
||||||
|
|
||||||
|
<!-- Put flavor specific code here -->
|
||||||
|
|
||||||
|
</application>
|
||||||
|
|
||||||
|
</manifest>
|
||||||
|
|
||||||
6
numtable/src/stage/res/values/strings.xml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
|
||||||
|
<!-- Put flavor specific strings here -->
|
||||||
|
|
||||||
|
</resources>
|
||||||
@@ -22,6 +22,7 @@
|
|||||||
|
|
||||||
// JC 项目编译设置
|
// JC 项目编译设置
|
||||||
//include ':jc'
|
//include ':jc'
|
||||||
|
//include ':libjc'
|
||||||
//rootProject.name = "jc"
|
//rootProject.name = "jc"
|
||||||
|
|
||||||
// AES 项目编译设置
|
// AES 项目编译设置
|
||||||
@@ -52,3 +53,7 @@
|
|||||||
// Ollama 项目编译设置
|
// Ollama 项目编译设置
|
||||||
//include ':ollama'
|
//include ':ollama'
|
||||||
//rootProject.name = "ollama"
|
//rootProject.name = "ollama"
|
||||||
|
|
||||||
|
// NumTable 项目编译设置
|
||||||
|
//include ':numtable'
|
||||||
|
//rootProject.name = "numtable"
|
||||||
|
|||||||