From 234d2d57de5a18e3d7f338e1aa0929c23109d739 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Fri, 21 Feb 2025 11:37:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=BB=91=E5=90=8D=E5=8D=95?= =?UTF-8?q?=E8=A7=84=E5=88=99=E5=92=8C=E5=8C=BA=E5=8F=B7=E8=A7=84=E5=88=99?= =?UTF-8?q?=E8=AE=BE=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 2 +- contacts/build.properties | 4 +- .../contacts/beans/PhoneBlackRuleBean.java | 88 +++++++++++++++++++ .../cc/winboll/studio/contacts/dun/Rules.java | 65 ++++++++++++-- .../phonecallui/PhoneCallManager.java | 2 - .../phonecallui/PhoneCallService.java | 20 +++-- .../studio/contacts/services/MainService.java | 5 ++ winboll-shared/build.properties | 4 +- 8 files changed, 172 insertions(+), 18 deletions(-) create mode 100644 contacts/src/main/java/cc/winboll/studio/contacts/beans/PhoneBlackRuleBean.java diff --git a/contacts/build.gradle b/contacts/build.gradle index 32df31f..552a42a 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -65,7 +65,7 @@ dependencies { api 'com.google.android.material:material:1.4.0' api 'cc.winboll.studio:libapputils:9.3.2' - api 'cc.winboll.studio:libappbase:1.5.5' + api 'cc.winboll.studio:libappbase:1.5.6' api fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/contacts/build.properties b/contacts/build.properties index d73febf..8d99001 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Feb 21 01:46:02 GMT 2025 +#Fri Feb 21 03:30:46 GMT 2025 stageCount=0 libraryProject=winboll-shared baseVersion=1.0 publishVersion=1.0.0 -buildCount=175 +buildCount=194 baseBetaVersion=1.0.1 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/beans/PhoneBlackRuleBean.java b/contacts/src/main/java/cc/winboll/studio/contacts/beans/PhoneBlackRuleBean.java new file mode 100644 index 0000000..69550cc --- /dev/null +++ b/contacts/src/main/java/cc/winboll/studio/contacts/beans/PhoneBlackRuleBean.java @@ -0,0 +1,88 @@ +package cc.winboll.studio.contacts.beans; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/21 09:52:10 + * @Describe 电话黑名单规则 + */ +import android.util.JsonReader; +import android.util.JsonWriter; +import cc.winboll.studio.libappbase.BaseBean; +import java.io.IOException; + +public class PhoneBlackRuleBean extends BaseBean { + + public static final String TAG = "PhoneBlackRuleBean"; + + String ruleText; + boolean isEnable; + + public PhoneBlackRuleBean() { + this.ruleText = ""; + this.isEnable = false; + } + + public PhoneBlackRuleBean(String ruleText, boolean isEnable) { + this.ruleText = ruleText; + this.isEnable = isEnable; + } + + public void setRuleText(String ruleText) { + this.ruleText = ruleText; + } + + public String getRuleText() { + return ruleText; + } + + public void setIsEnable(boolean isEnable) { + this.isEnable = isEnable; + } + + public boolean isEnable() { + return isEnable; + } + + @Override + public String getName() { + return PhoneBlackRuleBean.class.getName(); + } + + @Override + public void writeThisToJsonWriter(JsonWriter jsonWriter) throws IOException { + super.writeThisToJsonWriter(jsonWriter); + jsonWriter.name("ruleText").value(getRuleText()); + jsonWriter.name("isEnable").value(isEnable()); + + } + + @Override + public boolean initObjectsFromJsonReader(JsonReader jsonReader, String name) throws IOException { + if (super.initObjectsFromJsonReader(jsonReader, name)) { return true; } else { + if (name.equals("ruleText")) { + setRuleText(jsonReader.nextString()); + } else if (name.equals("isEnable")) { + setIsEnable(jsonReader.nextBoolean()); + } else { + return false; + } + } + return true; + } + + @Override + public BaseBean readBeanFromJsonReader(JsonReader jsonReader) throws IOException { + jsonReader.beginObject(); + while (jsonReader.hasNext()) { + String name = jsonReader.nextName(); + if (!initObjectsFromJsonReader(jsonReader, name)) { + jsonReader.skipValue(); + } + } + // 结束 JSON 对象 + jsonReader.endObject(); + return this; + } + + +} diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/dun/Rules.java b/contacts/src/main/java/cc/winboll/studio/contacts/dun/Rules.java index 8f78c1f..a4f9a1e 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/dun/Rules.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/dun/Rules.java @@ -5,19 +5,72 @@ package cc.winboll.studio.contacts.dun; * @Date 2025/02/21 06:15:10 * @Describe 云盾防御规则 */ +import cc.winboll.studio.contacts.beans.PhoneBlackRuleBean; +import java.util.ArrayList; import java.util.regex.Pattern; +import android.content.Context; public class Rules { public static final String TAG = "Rules"; - public static boolean isValidPhoneNumber(String phoneNumber) { - // 中国手机号码正则表达式,以1开头,第二位可以是3、4、5、6、7、8、9,后面跟9位数字 - String regex = "^1[3-9]\\d{9}$"; - return Pattern.matches(regex, phoneNumber); + ArrayList _PhoneBlacRuleBeanList; + static volatile Rules _Rules; + Context mContext; + + Rules(Context context) { + mContext = context; + _PhoneBlacRuleBeanList = new ArrayList(); + PhoneBlackRuleBean.loadBeanList(mContext, _PhoneBlacRuleBeanList, PhoneBlackRuleBean.class); + + } + public static synchronized Rules getInstance(Context context) { + if (_Rules == null) { + _Rules = new Rules(context); + } + return _Rules; } - public static boolean isAllowed(String phoneNumber) { - return isValidPhoneNumber(phoneNumber); + public boolean isAllowed(String phoneNumber) { + // 黑名单拒接 + for (int i = 0; i < _PhoneBlacRuleBeanList.size(); i++) { + if (_PhoneBlacRuleBeanList.get(i).isEnable()) { + String regex = _PhoneBlacRuleBeanList.get(i).getRuleText(); + if (Pattern.matches(regex, phoneNumber)) { + return false; + } + } + } + + // 手机号码允许 + // 中国手机号码正则表达式,以1开头,第二位可以是3、4、5、6、7、8、9,后面跟9位数字 + String regex = "^1[3-9]\\d{9}$"; + if (Pattern.matches(regex, phoneNumber)) { + return true; + } + + // 指定区号号码允许 + regex = "^0660\\d+$"; + if (Pattern.matches(regex, phoneNumber)) { + return true; + } + + // 指定区号号码允许 + regex = "^020\\d+$"; + if (Pattern.matches(regex, phoneNumber)) { + return true; + } + + // 其他拒接 + return false; + } + + public void add(String phoneRuleBlack, boolean isEnable) { + _PhoneBlacRuleBeanList.add(new PhoneBlackRuleBean(phoneRuleBlack, isEnable)); + PhoneBlackRuleBean.saveBeanList(mContext, _PhoneBlacRuleBeanList, PhoneBlackRuleBean.class); + } + + public ArrayList getPhoneBlacRuleBeanList() { + return _PhoneBlacRuleBeanList; } } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallManager.java b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallManager.java index 5cb6e9b..6fd2f52 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallManager.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallManager.java @@ -27,8 +27,6 @@ public class PhoneCallManager { */ public void answer() { if (call != null) { - Call.Details details = call.getDetails(); - String phoneNumber = details.getHandle().getSchemeSpecificPart(); call.answer(VideoProfile.STATE_AUDIO_ONLY); openSpeaker(); } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java index 67f3e3f..a4d334b 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/phonecallui/PhoneCallService.java @@ -13,13 +13,23 @@ import android.telecom.Call; import android.telecom.InCallService; import androidx.annotation.RequiresApi; import cc.winboll.studio.contacts.ActivityStack; +import cc.winboll.studio.contacts.beans.PhoneBlackRuleBean; import cc.winboll.studio.contacts.dun.Rules; +import java.util.ArrayList; @RequiresApi(api = Build.VERSION_CODES.M) public class PhoneCallService extends InCallService { - + + @Override + public void onCreate() { + super.onCreate(); + + } + + + private int originalRingVolume; - + private final Call.Callback callback = new Call.Callback() { @Override public void onStateChanged(Call call, int state) { @@ -41,7 +51,7 @@ public class PhoneCallService extends InCallService { @Override public void onCallAdded(Call call) { super.onCallAdded(call); - + call.registerCallback(callback); PhoneCallManager.call = call; CallType callType = null; @@ -59,13 +69,13 @@ public class PhoneCallService extends InCallService { // 记录原始铃声音量 AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE); originalRingVolume = audioManager.getStreamVolume(AudioManager.STREAM_RING); - if (!Rules.isAllowed(phoneNumber)) { + if (!Rules.getInstance(this).isAllowed(phoneNumber)) { // 预先静音 audioManager.setStreamVolume(AudioManager.STREAM_RING, 0, 0); call.disconnect(); return; } - + PhoneCallActivity.actionStart(this, phoneNumber, callType); } } diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java index 40cf20f..643f064 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/services/MainService.java @@ -27,6 +27,7 @@ import cc.winboll.studio.contacts.widgets.APPStatusWidget; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.libappbase.SOS; import cc.winboll.studio.libappbase.bean.APPSOSBean; +import cc.winboll.studio.contacts.dun.Rules; public class MainService extends Service { @@ -99,6 +100,10 @@ public class MainService extends Service { mMainReceiver.registerAction(this); } + Rules.getInstance(this); + //Rules.getInstance(this).add("18888888888", true); + //Rules.getInstance(this).add("16769764848", true); + startPhoneCallListener(); MainServiceThread.getInstance(this, mMainServiceHandler).start(); diff --git a/winboll-shared/build.properties b/winboll-shared/build.properties index d73febf..8d99001 100644 --- a/winboll-shared/build.properties +++ b/winboll-shared/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Fri Feb 21 01:46:02 GMT 2025 +#Fri Feb 21 03:30:46 GMT 2025 stageCount=0 libraryProject=winboll-shared baseVersion=1.0 publishVersion=1.0.0 -buildCount=175 +buildCount=194 baseBetaVersion=1.0.1