From edb39867c174d5125d39357932e32302f8c2be7a Mon Sep 17 00:00:00 2001
From: pppscn <35696959@qq.com>
Date: Sat, 8 Jan 2022 14:20:57 +0800
Subject: [PATCH 1/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E5=85=81?=
=?UTF-8?q?=E8=AE=B8=E5=BC=80=E5=90=AF=E8=87=AA=E5=8A=A8=E5=85=B3=E9=97=AD?=
=?UTF-8?q?=E9=80=9A=E7=9F=A5=EF=BC=88=E5=8D=95=E6=9D=A1=E9=80=9A=E7=9F=A5?=
=?UTF-8?q?=E5=A4=84=E7=90=86=E5=AE=8C=E6=AF=95=E5=90=8E=E8=87=AA=E5=8A=A8?=
=?UTF-8?q?=E5=85=B3=E9=97=AD=EF=BC=8C=E9=81=BF=E5=85=8D=E5=A4=9A=E6=9D=A1?=
=?UTF-8?q?=E9=80=9A=E7=9F=A5=E5=A0=86=E5=8F=A0=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../idormy/sms/forwarder/SettingActivity.java | 17 +++++--
.../sms/forwarder/service/NotifyService.java | 10 +++--
.../idormy/sms/forwarder/utils/Define.java | 1 +
.../sms/forwarder/utils/SettingUtil.java | 10 +++++
app/src/main/res/layout/activity_setting.xml | 44 +++++++++++++++++++
app/src/main/res/values-en/strings.xml | 2 +
app/src/main/res/values/strings.xml | 2 +
7 files changed, 80 insertions(+), 6 deletions(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
index 61bfc09f..ca07b181 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
@@ -75,7 +75,8 @@ public class SettingActivity extends AppCompatActivity {
switchEnablePhone(switch_enable_phone);
@SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_enable_app_notify = findViewById(R.id.switch_enable_app_notify);
- switchEnableAppNotify(switch_enable_app_notify);
+ @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_cancel_app_notify = findViewById(R.id.switch_cancel_app_notify);
+ switchEnableAppNotify(switch_enable_app_notify, switch_cancel_app_notify);
@SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_exclude_from_recents = findViewById(R.id.switch_exclude_from_recents);
switchExcludeFromRecents(switch_exclude_from_recents);
@@ -121,10 +122,14 @@ public class SettingActivity extends AppCompatActivity {
}
//设置转发APP通知
- private void switchEnableAppNotify(@SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_enable_app_notify) {
- switch_enable_app_notify.setChecked(SettingUtil.getSwitchEnableAppNotify());
+ private void switchEnableAppNotify(@SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_enable_app_notify, @SuppressLint("UseSwitchCompatOrMaterialCode") Switch switch_cancel_app_notify) {
+ final LinearLayout layout_cancel_app_notify = findViewById(R.id.layout_cancel_app_notify);
+ boolean isEnable = SettingUtil.getSwitchEnableAppNotify();
+ switch_enable_app_notify.setChecked(isEnable);
+ layout_cancel_app_notify.setVisibility(isEnable ? View.VISIBLE : View.GONE);
switch_enable_app_notify.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ layout_cancel_app_notify.setVisibility(isChecked ? View.VISIBLE : View.GONE);
//TODO:校验使用APP通知转发必备的权限
if (isChecked) {
if (!CommonUtil.isNotificationListenerServiceEnabled(this)) {
@@ -139,6 +144,12 @@ public class SettingActivity extends AppCompatActivity {
SettingUtil.switchEnableAppNotify(isChecked);
Log.d(TAG, "switchEnableAppNotify:" + isChecked);
});
+
+ switch_cancel_app_notify.setChecked(SettingUtil.getSwitchCancelAppNotify());
+ switch_cancel_app_notify.setOnCheckedChangeListener((buttonView, isChecked) -> {
+ SettingUtil.switchCancelAppNotify(isChecked);
+ Log.d(TAG, "switchCancelAppNotify:" + isChecked);
+ });
}
//不在最近任务列表中显示
diff --git a/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java b/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java
index 1866db15..41747a5f 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/service/NotifyService.java
@@ -66,6 +66,12 @@ public class NotifyService extends NotificationListenerService {
packageName, title, text, time)
);
+ //自动关闭通知
+ if (SettingUtil.getSwitchCancelAppNotify()) {
+ String key = sbn.getKey();
+ cancelNotification(key);
+ }
+
//重复通知不再处理
String prevHash = SettingUtil.getPrevNoticeHash(packageName);
String currHash = CommonUtil.MD5(packageName + title + text + time);
@@ -82,7 +88,7 @@ public class NotifyService extends NotificationListenerService {
} catch (Exception e) {
Log.e(TAG, "onNotificationPosted:", e);
}
- //NotifyHelper.getInstance().onReceive(sbn);
+
}
/**
@@ -98,8 +104,6 @@ public class NotifyService extends NotificationListenerService {
if (sbn.getNotification() == null) return;
Log.d(TAG, sbn.getPackageName());
-
- //NotifyHelper.getInstance().onRemoved(sbn);
}
/**
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
index ef9de3ac..1241b916 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Define.java
@@ -9,6 +9,7 @@ public class Define {
public static final String SP_MSG_KEY_STRING_ENABLE_SMS = "tsms_msg_key_switch_enable_sms";
public static final String SP_MSG_KEY_STRING_ENABLE_PHONE = "tsms_msg_key_switch_enable_phone";
public static final String SP_MSG_KEY_STRING_ENABLE_APP_NOTIFY = "tsms_msg_key_switch_enable_app_notify";
+ public static final String SP_MSG_KEY_STRING_CANCEL_APP_NOTIFY = "tsms_msg_key_switch_cancel_app_notify";
public static final String SP_MSG_KEY_STRING_ENABLE_EXCLUDE_FROM_RECENTS = "tsms_msg_key_switch_enable_exclude_from_recents";
public static final String SP_MSG_KEY_STRING_ADD_EXTRA_DEVICE_MARK = "tsms_msg_key_string_add_extra_device_mark";
public static final String SP_MSG_KEY_STRING_ADD_EXTRA_SIM1 = "tsms_msg_key_string_add_extra_sim1";
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
index b7fe0a29..4bf2442f 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtil.java
@@ -78,6 +78,16 @@ public class SettingUtil {
return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_ENABLE_APP_NOTIFY, false);
}
+ public static void switchCancelAppNotify(Boolean enable) {
+ sp_setting.edit()
+ .putBoolean(Define.SP_MSG_KEY_STRING_CANCEL_APP_NOTIFY, enable)
+ .apply();
+ }
+
+ public static boolean getSwitchCancelAppNotify() {
+ return sp_setting.getBoolean(Define.SP_MSG_KEY_STRING_CANCEL_APP_NOTIFY, true);
+ }
+
public static void switchEnableBatteryReceiver(Boolean enable) {
sp_setting.edit()
.putBoolean(Define.SP_MSG_KEY_STRING_BATTERY_RECEIVER, enable)
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
index d38726da..35f5d654 100644
--- a/app/src/main/res/layout/activity_setting.xml
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -250,6 +250,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
Main switch, requires permissions to read call log and contacts.
Forward app notify
Main switch, requires permission to read notification.
+ Auto cancel app notify
+ After a single notification is processed, it is automatically disabled to avoid multiple notification stacking
Global custom template
Priority: custom template for forwarding rules > Global custom template > System default
Enable regular replacement content
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index d65a4525..3cceee33 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -169,6 +169,8 @@
总开关,请授予读取通话记录、联系人等权限
转发应用通知
总开关,请先授予通知使用权
+ 自动关闭通知
+ 单条通知处理完毕后,自动关闭,避免多条通知堆叠
启用自定义模版
优先级:转发规则的自定义模板 > 全局自定义模版 > 默认
启用正则替换内容
From 263a9fb6c36685f493cb38f292fe2e5f36f94b82 Mon Sep 17 00:00:00 2001
From: pppscn <35696959@qq.com>
Date: Sun, 9 Jan 2022 14:47:03 +0800
Subject: [PATCH 2/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E9=9A=90?=
=?UTF-8?q?=E7=A7=81=E6=94=BF=E7=AD=96=E5=AF=B9=E8=AF=9D=E6=A1=86=EF=BC=88?=
=?UTF-8?q?=E5=90=88=E8=A7=84=E5=8C=96=EF=BC=8C=E5=90=8C=E6=84=8F=E5=90=8E?=
=?UTF-8?q?=E6=89=8D=E8=83=BD=E4=BD=BF=E7=94=A8=E8=BD=AF=E4=BB=B6=EF=BC=89?=
=?UTF-8?q?=20=E4=BC=98=E5=8C=96=EF=BC=9Abuild.gradle=20=E4=BE=9D=E8=B5=96?=
=?UTF-8?q?=E5=8D=87=E7=BA=A7=20=E4=BC=98=E5=8C=96=EF=BC=9A=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=20Android=2012.x=20=E6=94=AF=E6=8C=81=EF=BC=88?=
=?UTF-8?q?=E5=BE=85=E9=AA=8C=E8=AF=81=EF=BC=89=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=EF=BC=9A=E5=8F=8B=E7=9B=9F=E7=BB=9F=E8=AE=A1=E5=A4=B1=E6=95=88?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/build.gradle | 30 ++++---
app/proguard-rules.pro | 4 +
app/src/main/AndroidManifest.xml | 20 ++++-
.../idormy/sms/forwarder/MainActivity.java | 64 ++++++++++++++
.../idormy/sms/forwarder/MyApplication.java | 26 +++---
.../idormy/sms/forwarder/RuleActivity.java | 2 +
.../idormy/sms/forwarder/SenderActivity.java | 2 +
.../idormy/sms/forwarder/UmInitConfig.java | 59 +++++++++++++
.../receiver/SmsBroadcastReceiver.java | 4 +
.../sms/forwarder/sender/SenderSmsMsg.java | 2 +
.../sms/forwarder/utils/CommonUtil.java | 36 --------
.../sms/forwarder/utils/PhoneUtils.java | 3 +-
.../utils/SharedPreferencesHelper.java | 87 +++++++++++++++++++
app/src/main/res/layout/activity_setting.xml | 2 +-
app/src/main/res/layout/diaologlayout.xml | 75 ++++++++++++++++
app/src/main/res/values-en/strings.xml | 4 +
app/src/main/res/values-en/styles.xml | 8 ++
app/src/main/res/values/strings.xml | 4 +
app/src/main/res/values/styles.xml | 9 ++
build.gradle | 10 ++-
version.properties | 4 +-
21 files changed, 386 insertions(+), 69 deletions(-)
create mode 100644 app/src/main/java/com/idormy/sms/forwarder/UmInitConfig.java
create mode 100644 app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreferencesHelper.java
create mode 100644 app/src/main/res/layout/diaologlayout.xml
diff --git a/app/build.gradle b/app/build.gradle
index 86ee00e2..31cf954f 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -15,7 +15,7 @@ if (versionPropsFile.exists()) {
android {
buildToolsVersion '30.0.3'
- compileSdkVersion 30
+ compileSdkVersion 31
compileOptions {
sourceCompatibility 11
targetCompatibility 11
@@ -23,7 +23,7 @@ android {
defaultConfig {
applicationId "com.idormy.sms.forwarder"
minSdkVersion 21
- targetSdkVersion 30
+ targetSdkVersion 31
versionCode versionProps['versionCode'].toInteger()
versionName versionProps['versionName']
testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
@@ -127,24 +127,26 @@ void cmdExecute(String cmd) {
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
- implementation 'androidx.appcompat:appcompat:1.3.1'
+ implementation 'androidx.appcompat:appcompat:1.4.0'
implementation 'androidx.constraintlayout:constraintlayout:2.1.2'
- implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.5.2'
- testImplementation 'junit:junit:4.+'
+ implementation 'com.google.firebase:firebase-crashlytics-buildtools:2.8.1'
+ testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.3'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
//okhttp
- implementation 'com.squareup.okhttp3:okhttp:4.9.1'
- implementation 'com.squareup.okio:okio:2.10.0'
+ //noinspection GradleDependency
+ implementation 'com.squareup.okhttp3:okhttp:4.9.3'
+ implementation 'com.squareup.okio:okio:3.0.0'
//fastjson
- implementation "com.alibaba:fastjson:1.2.78"
+ implementation "com.alibaba:fastjson:1.2.79"
//友盟统计SDK
- implementation 'com.umeng.umsdk:common:9.4.4'// 必选
- implementation 'com.umeng.umsdk:asms:1.4.1'// 必选
- //implementation 'com.umeng.umsdk:apm:1.4.2' // 错误分析升级为独立SDK,看crash数据请一定集成,可选
+ implementation 'com.umeng.umsdk:common:9.4.4'// (必选)
+ implementation 'com.umeng.umsdk:asms:1.5.0'// asms包依赖必选
+ //implementation 'com.umeng.umsdk:abtest:1.0.0'//使用U-App中ABTest能力,可选
+ implementation 'com.umeng.umsdk:apm:1.5.2'// U-APM产品包依赖(必选)
//XUpdate
implementation 'com.github.xuexiangjys:XUpdate:2.1.1'
@@ -156,11 +158,11 @@ dependencies {
//Lombok
//noinspection AnnotationProcessorOnCompilePath
- compileOnly 'org.projectlombok:lombok:1.18.20'
- annotationProcessor 'org.projectlombok:lombok:1.18.20'
+ compileOnly 'org.projectlombok:lombok:1.18.22'
+ annotationProcessor 'org.projectlombok:lombok:1.18.22'
//RxJava
- implementation 'io.reactivex.rxjava3:rxjava:3.1.1'
+ implementation 'io.reactivex.rxjava3:rxjava:3.1.3'
//AndroidAsync
implementation 'com.koushikdutta.async:androidasync:3.1.0'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index c88393ae..41a6b773 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -21,6 +21,10 @@
#-renamesourcefileattribute SourceFile
-keep class com.idormy.sms.forwarder.model.**{*;}
+-keep public class com.idormy.sms.forwarder.R$*{
+public static final int *;
+}
+
-keep class com.umeng.** {*;}
-keepclassmembers class * {
public (org.json.JSONObject);
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b81ab50a..d428ad3c 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -52,7 +52,12 @@
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
- android:usesCleartextTraffic="true">
+ android:usesCleartextTraffic="true"
+ tools:targetApi="m">
+
+
@@ -74,6 +80,7 @@
@@ -89,22 +96,28 @@
@@ -114,6 +127,7 @@
@@ -123,6 +137,7 @@
@@ -139,7 +154,8 @@
android:name=".service.NotifyService"
android:enabled="true"
android:label="@string/app_name"
- android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE">
+ android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
+ android:exported="false">
diff --git a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
index 53a572b3..27e6cbb3 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/MainActivity.java
@@ -1,6 +1,7 @@
package com.idormy.sms.forwarder;
import android.annotation.SuppressLint;
+import android.app.Dialog;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
@@ -8,6 +9,8 @@ import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
+import android.view.Gravity;
+import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
@@ -31,9 +34,11 @@ import com.idormy.sms.forwarder.utils.LogUtil;
import com.idormy.sms.forwarder.utils.NetUtil;
import com.idormy.sms.forwarder.utils.PhoneUtils;
import com.idormy.sms.forwarder.utils.SettingUtil;
+import com.idormy.sms.forwarder.utils.SharedPreferencesHelper;
import com.idormy.sms.forwarder.utils.SmsUtil;
import com.idormy.sms.forwarder.utils.TimeUtil;
import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -49,6 +54,10 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
private Intent serviceIntent;
private String currentType = "sms";
+ View inflate;
+ Dialog dialog;
+ SharedPreferencesHelper sharedPreferencesHelper;
+
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -93,6 +102,14 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
super.onStart();
Log.d(TAG, "onStart");
+ /* sp中uminit为1已经同意隐私协议*/
+ sharedPreferencesHelper = new SharedPreferencesHelper(this, "umeng");
+ String isAllowed = String.valueOf(sharedPreferencesHelper.getSharedPreference("uminit", ""));
+ if (isAllowed.equals("") || isAllowed.equals("0")) {
+ dialog();
+ return;
+ }
+
//是否关闭页面提示
TextView help_tip = findViewById(R.id.help_tip);
help_tip.setVisibility(MyApplication.showHelpTip ? View.VISIBLE : View.GONE);
@@ -163,6 +180,7 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
@Override
protected void onResume() {
super.onResume();
+ MobclickAgent.onPageStart(TAG);
MobclickAgent.onResume(this);
//第一次打开,未授权无法获取SIM信息,尝试在此重新获取
@@ -206,6 +224,7 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
@Override
protected void onPause() {
super.onPause();
+ MobclickAgent.onPageEnd(TAG);
MobclickAgent.onPause(this);
try {
if (serviceIntent != null) startService(serviceIntent);
@@ -396,4 +415,49 @@ public class MainActivity extends AppCompatActivity implements RefreshListView.I
return super.onMenuOpened(featureId, menu);
}
+ /*** 隐私协议授权弹窗*/
+ @SuppressLint({"ResourceType", "InflateParams"})
+ public void dialog() {
+ dialog = new Dialog(this, R.style.dialog);
+ inflate = LayoutInflater.from(MainActivity.this).inflate(R.layout.diaologlayout, null);
+ TextView succsebtn = (TextView) inflate.findViewById(R.id.succsebtn);
+ TextView canclebtn = (TextView) inflate.findViewById(R.id.caclebtn);
+
+ succsebtn.setOnClickListener(v -> {
+ /* uminit为1时代表已经同意隐私协议,sp记录当前状态*/
+ sharedPreferencesHelper.put("uminit", "1");
+ UMConfigure.submitPolicyGrantResult(getApplicationContext(), true);
+ /* 友盟sdk正式初始化*/
+ UmInitConfig umInitConfig = new UmInitConfig();
+ umInitConfig.UMinit(getApplicationContext());
+ //关闭弹窗
+ dialog.dismiss();
+
+ //跳转到HomeActivity
+ final Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName());
+ intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
+ startActivity(intent);
+
+ //杀掉以前进程
+ android.os.Process.killProcess(android.os.Process.myPid());
+
+ finish();
+ });
+
+ canclebtn.setOnClickListener(v -> {
+ dialog.dismiss();
+
+ UMConfigure.submitPolicyGrantResult(getApplicationContext(), false);
+ //不同意隐私协议,退出app
+ android.os.Process.killProcess(android.os.Process.myPid());
+
+ });
+
+ dialog.setContentView(inflate);
+ Window dialogWindow = dialog.getWindow();
+ dialogWindow.setGravity(Gravity.CENTER);
+
+ dialog.setCancelable(false);
+ dialog.show();
+ }
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java b/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java
index b13bc7b4..42b0f834 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/MyApplication.java
@@ -11,12 +11,11 @@ import android.util.Log;
import com.idormy.sms.forwarder.sender.SendHistory;
import com.idormy.sms.forwarder.service.BatteryService;
import com.idormy.sms.forwarder.service.FrontService;
-import com.idormy.sms.forwarder.utils.CommonUtil;
import com.idormy.sms.forwarder.utils.Define;
import com.idormy.sms.forwarder.utils.PhoneUtils;
import com.idormy.sms.forwarder.utils.SettingUtil;
+import com.idormy.sms.forwarder.utils.SharedPreferencesHelper;
import com.smailnet.emailkit.EmailKit;
-import com.umeng.analytics.MobclickAgent;
import com.umeng.commonsdk.UMConfigure;
import java.util.ArrayList;
@@ -28,6 +27,7 @@ public class MyApplication extends Application {
public static List SimInfoList = new ArrayList<>();
//是否关闭页面提示
public static boolean showHelpTip = true;
+ SharedPreferencesHelper sharedPreferencesHelper;
@Override
protected void attachBaseContext(Context base) {
@@ -40,14 +40,6 @@ public class MyApplication extends Application {
super.onCreate();
try {
- //初始化组件化基础库, 所有友盟业务SDK都必须调用此初始化接口。
- //建议在宿主App的Application.onCreate函数中调用基础组件库初始化函数。
- UMConfigure.init(this, "60254fc7425ec25f10f4293e", CommonUtil.getChannelName(this), UMConfigure.DEVICE_TYPE_PHONE, "");
- // 选用LEGACY_AUTO页面采集模式
- MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.LEGACY_MANUAL);
- //pro close log
- UMConfigure.setLogEnabled(true);
-
//前台服务
Intent intent = new Intent(this, FrontService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
@@ -77,6 +69,20 @@ public class MyApplication extends Application {
//电池状态监听
Intent batteryServiceIntent = new Intent(this, BatteryService.class);
startService(batteryServiceIntent);
+
+ //友盟统计
+ sharedPreferencesHelper = new SharedPreferencesHelper(this, "umeng");
+ //设置LOG开关,默认为false
+ //UMConfigure.setLogEnabled(true);
+ //友盟预初始化
+ UMConfigure.preInit(getApplicationContext(), "60254fc7425ec25f10f4293e", "Umeng");
+
+ //判断是否同意隐私协议,uminit为1时为已经同意,直接初始化umsdk
+ if (sharedPreferencesHelper.getSharedPreference("uminit", "").equals("1")) {
+ //友盟正式初始化
+ UmInitConfig umInitConfig = new UmInitConfig();
+ umInitConfig.UMinit(getApplicationContext());
+ }
} catch (Exception e) {
Log.e(TAG, "onCreate:", e);
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
index fe550a69..97fff669 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
@@ -592,12 +592,14 @@ public class RuleActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
+ MobclickAgent.onPageStart(TAG);
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
+ MobclickAgent.onPageEnd(TAG);
MobclickAgent.onPause(this);
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
index b931db1d..0000f140 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
@@ -1476,12 +1476,14 @@ public class SenderActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
+ MobclickAgent.onPageStart(TAG);
MobclickAgent.onResume(this);
}
@Override
protected void onPause() {
super.onPause();
+ MobclickAgent.onPageEnd(TAG);
MobclickAgent.onPause(this);
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/UmInitConfig.java b/app/src/main/java/com/idormy/sms/forwarder/UmInitConfig.java
new file mode 100644
index 00000000..855b82bb
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/UmInitConfig.java
@@ -0,0 +1,59 @@
+package com.idormy.sms.forwarder;
+
+import android.content.Context;
+
+import com.umeng.analytics.MobclickAgent;
+import com.umeng.commonsdk.UMConfigure;
+
+
+public class UmInitConfig {
+
+ private static final String TAG = "MyApplication";
+
+ public void UMinit(Context context) {
+
+ //初始化组件化基础库, 统计SDK/推送SDK/分享SDK都必须调用此初始化接口
+ UMConfigure.init(context, "60254fc7425ec25f10f4293e", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
+
+ //集成umeng-crash-vx.x.x.aar,则需要关闭原有统计SDK异常捕获功能
+ MobclickAgent.setCatchUncaughtExceptions(false);
+
+ //统计SDK是否支持采集在子进程中打点的自定义事件,默认不支持
+ UMConfigure.setProcessEvent(true);//支持多进程打点
+
+ // 页面数据采集模式
+ // setPageCollectionMode接口参数说明:
+ // 1. MobclickAgent.PageMode.AUTO: 建议大多数用户使用本采集模式,SDK在此模式下自动采集Activity
+ // 页面访问路径,开发者不需要针对每一个Activity在onResume/onPause函数中进行手动埋点。在此模式下,
+ // 开发者如需针对Fragment、CustomView等自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/
+ // MobclickAgent.onPageEnd手动埋点即可。此采集模式简化埋点工作,唯一缺点是在Android 4.0以下设备中
+ // 统计不到Activity页面数据和各类基础指标(提示:目前Android 4.0以下设备市场占比已经极小)。
+
+ // 2. MobclickAgent.PageMode.MANUAL:对于要求在Android 4.0以下设备中也能正常采集数据的App,可以使用
+ // 本模式,开发者需要在每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,在Activity的
+ // onPause函数中手动调用MobclickAgent.onPause接口。在此模式下,开发者如需针对Fragment、CustomView等
+ // 自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/MobclickAgent.onPageEnd手动埋点即可。
+
+ // 如下两种LEGACY模式不建议首次集成友盟统计SDK的新用户选用。
+ // 如果您是友盟统计SDK的老用户,App需要从老版本统计SDK升级到8.0.0版本统计SDK,
+ // 并且:您的App之前MobclickAgent.onResume/onPause接口埋点分散在所有Activity
+ // 中,逐个删除修改工作量很大且易出错。
+ // 若您的App符合以上特征,可以选用如下两种LEGACY模式,否则不建议继续使用LEGACY模式。
+ // 简单来说,升级SDK的老用户,如果不需要手动统计页面路径,选用LEGACY_AUTO模式。
+ // 如果需要手动统计页面路径,选用LEGACY_MANUAL模式。
+ // 3. MobclickAgent.PageMode.LEGACY_AUTO: 本模式适合不需要对Fragment、CustomView
+ // 等自定义页面进行页面访问统计的开发者,SDK仅对App中所有Activity进行页面统计,开发者需要在
+ // 每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,在Activity的
+ // onPause函数中手动调用MobclickAgent.onPause接口。此模式下MobclickAgent.onPageStart
+ // ,MobclickAgent.onPageEnd这两个接口无效。
+
+ // 4. MobclickAgent.PageMode.LEGACY_MANUAL: 本模式适合需要对Fragment、CustomView
+ // 等自定义页面进行手动页面统计的开发者,开发者如需针对Fragment、CustomView等
+ // 自定义页面进行页面统计,直接调用MobclickAgent.onPageStart/MobclickAgent.onPageEnd
+ // 手动埋点即可。开发者还需要在每一个Activity的onResume函数中手动调用MobclickAgent.onResume接口,
+ // 在Activity的onPause函数中手动调用MobclickAgent.onPause接口。
+ MobclickAgent.setPageCollectionMode(MobclickAgent.PageMode.AUTO);
+
+ }
+
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/SmsBroadcastReceiver.java b/app/src/main/java/com/idormy/sms/forwarder/receiver/SmsBroadcastReceiver.java
index cdf1ba43..62ac1436 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/receiver/SmsBroadcastReceiver.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/SmsBroadcastReceiver.java
@@ -3,10 +3,13 @@ package com.idormy.sms.forwarder.receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
+import android.os.Build;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
import com.idormy.sms.forwarder.model.vo.SmsVo;
import com.idormy.sms.forwarder.sender.SendUtil;
import com.idormy.sms.forwarder.utils.SettingUtil;
@@ -21,6 +24,7 @@ import java.util.Objects;
public class SmsBroadcastReceiver extends BroadcastReceiver {
+ @RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onReceive(Context context, Intent intent) {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderSmsMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderSmsMsg.java
index a9e32678..f4e4ea9f 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderSmsMsg.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderSmsMsg.java
@@ -1,5 +1,6 @@
package com.idormy.sms.forwarder.sender;
+import android.annotation.SuppressLint;
import android.os.Handler;
import android.util.Log;
@@ -11,6 +12,7 @@ public class SenderSmsMsg extends SenderBaseMsg {
static final String TAG = "SenderSmsMsg";
+ @SuppressLint("NewApi")
public static void sendMsg(final long logId, final Handler handError, int simSlot, String mobiles, Boolean onlyNoNetwork, String from, String text) throws Exception {
Log.i(TAG, "sendMsg simSlot:" + simSlot + " mobiles:" + mobiles + " onlyNoNetwork:" + onlyNoNetwork + " from:" + from + " text:" + text);
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java
index 3de12192..9f4ef297 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/CommonUtil.java
@@ -6,10 +6,8 @@ import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
-import android.text.TextUtils;
import androidx.core.app.ActivityCompat;
import androidx.core.app.NotificationManagerCompat;
@@ -27,40 +25,6 @@ public class CommonUtil {
public static final int NOTIFICATION_REQUEST_CODE = 9527;
private static final String ACTION_NOTIFICATION_LISTENER_SETTINGS = "android.settings.ACTION_NOTIFICATION_LISTENER_SETTINGS";
- /**
- *
- *
- *
- * @param ctx 上下文
- * @return 渠道名称
- */
- // 获取渠道工具函数
- public static String getChannelName(Context ctx) {
- if (ctx == null) {
- return null;
- }
- String channelName = null;
- try {
- PackageManager packageManager = ctx.getPackageManager();
- if (packageManager != null) {
- //注意此处为ApplicationInfo 而不是 ActivityInfo,因为友盟设置的meta-data是在application标签中,而不是activity标签中,所以用ApplicationInfo
- ApplicationInfo applicationInfo = packageManager.getApplicationInfo(ctx.getPackageName(), PackageManager.GET_META_DATA);
- if (applicationInfo.metaData != null) {
- channelName = applicationInfo.metaData.get("UMENG_CHANNEL") + "";
- }
- }
- } catch (PackageManager.NameNotFoundException e) {
- e.printStackTrace();
- }
- if (TextUtils.isEmpty(channelName)) {
- channelName = "Unknown";
- }
-
- return channelName;
- }
-
//是否启用通知监听服务
public static boolean isNotificationListenerServiceEnabled(Context context) {
Set packageNames = NotificationManagerCompat.getEnabledListenerPackages(context);
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
index 93140862..71bdefb3 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.java
@@ -329,7 +329,7 @@ public class PhoneUtils {
*
* @return 多Sim卡的具体信息
*/
- @SuppressLint("ObsoleteSdkInt")
+ @SuppressLint({"ObsoleteSdkInt", "Range"})
public static List getSimMultiInfo() {
List infos = new ArrayList<>();
Log.d(TAG, "Build.VERSION.SDK_INT = " + Build.VERSION.SDK_INT);
@@ -533,6 +533,7 @@ public class PhoneUtils {
/**
* 获取后一条通话记录
*/
+ @SuppressLint("Range")
public static CallInfo getLastCallInfo(String phoneNumber) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
return null;
diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreferencesHelper.java b/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreferencesHelper.java
new file mode 100644
index 00000000..c1c98722
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreferencesHelper.java
@@ -0,0 +1,87 @@
+package com.idormy.sms.forwarder.utils;
+
+import android.content.Context;
+import android.content.SharedPreferences;
+
+import java.util.Map;
+
+public class SharedPreferencesHelper {
+
+ private final SharedPreferences sharedPreferences;
+ private final SharedPreferences.Editor editor;
+
+ public SharedPreferencesHelper(Context context, String FILE_NAME) {
+ sharedPreferences = context.getSharedPreferences(FILE_NAME,
+ Context.MODE_PRIVATE);
+ editor = sharedPreferences.edit();
+ }
+
+ /**
+ * 存储
+ */
+ public void put(String key, Object object) {
+ if (object instanceof String) {
+ editor.putString(key, (String) object);
+ } else if (object instanceof Integer) {
+ editor.putInt(key, (Integer) object);
+ } else if (object instanceof Boolean) {
+ editor.putBoolean(key, (Boolean) object);
+ } else if (object instanceof Float) {
+ editor.putFloat(key, (Float) object);
+ } else if (object instanceof Long) {
+ editor.putLong(key, (Long) object);
+ } else {
+ editor.putString(key, object.toString());
+ }
+ editor.commit();
+ }
+
+ /**
+ * 获取保存的数据
+ */
+ public Object getSharedPreference(String key, Object defaultObject) {
+ if (defaultObject instanceof String) {
+ return sharedPreferences.getString(key, (String) defaultObject);
+ } else if (defaultObject instanceof Integer) {
+ return sharedPreferences.getInt(key, (Integer) defaultObject);
+ } else if (defaultObject instanceof Boolean) {
+ return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
+ } else if (defaultObject instanceof Float) {
+ return sharedPreferences.getFloat(key, (Float) defaultObject);
+ } else if (defaultObject instanceof Long) {
+ return sharedPreferences.getLong(key, (Long) defaultObject);
+ } else {
+ return sharedPreferences.getString(key, null);
+ }
+ }
+
+ /**
+ * 移除某个key值已经对应的值
+ */
+ public void remove(String key) {
+ editor.remove(key);
+ editor.commit();
+ }
+
+ /**
+ * 清除所有数据
+ */
+ public void clear() {
+ editor.clear();
+ editor.commit();
+ }
+
+ /**
+ * 查询某个key是否存在
+ */
+ public Boolean contain(String key) {
+ return sharedPreferences.contains(key);
+ }
+
+ /**
+ * 返回所有的键值对
+ */
+ public Map getAll() {
+ return sharedPreferences.getAll();
+ }
+}
diff --git a/app/src/main/res/layout/activity_setting.xml b/app/src/main/res/layout/activity_setting.xml
index 35f5d654..d2ac7f0b 100644
--- a/app/src/main/res/layout/activity_setting.xml
+++ b/app/src/main/res/layout/activity_setting.xml
@@ -702,7 +702,7 @@
android:gravity="end"
android:text="@string/enable_exclude_from_recents_tips"
android:textSize="9sp"
- tools:ignore="SmallSp" />
+ tools:ignore="SmallSp,TooManyViews" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 76e1e0eb..f0bff7f7 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -265,4 +265,8 @@
Proxy Authenticator
Username
Password
+ Privacy Policy
+ Agree
+ Disagree
+ SmsForwarder, this software is 100% free, open source, Github online compiled and release, will not collect any of your privacy data!\n\n The software version information will be reported in the following situations: \n 1. When starting the software, the version information will be sent to "Umeng +· U-APP Mobile Statistics" for analyzing the statistics of user version retention and software crash;\n 2. When manually checking the update, send the version number to check the new version;\n Other than that, there is no data!!\n\n The software will collect and use version information in accordance with the Privacy Policy, but will not collect bundled information because you have agreed to the Privacy Policy.
diff --git a/app/src/main/res/values-en/styles.xml b/app/src/main/res/values-en/styles.xml
index 45fa69ab..bbad0cda 100644
--- a/app/src/main/res/values-en/styles.xml
+++ b/app/src/main/res/values-en/styles.xml
@@ -41,4 +41,12 @@
- @drawable/txt_select_selector
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 3cceee33..ce420643 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -264,4 +264,8 @@
代理身份验证
用户
密码
+ 隐私政策
+ 同意
+ 不同意
+ SmsForwarder-短信转发器(下称本软件) 100% 免费开源,Github 在线编译发版,绝不会收集您的任何隐私数据! \n\n以下情形会上报本软件版本信息: \n 1、启动本软件时,发送版本信息发送到《友盟+·U-App移动统计》,用于分析本软件的用户版本留存与软件奔溃统计; \n 2、手动检查更新时,发送版本号用于检查新版本; \n除此之外,没有任何数据!!! \n\n本软件会遵循《隐私政策》收集、使用版本信息,但不会因为您同意了《隐私政策》而进行强制捆绑式的信息收集。
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 537b9e03..3c231574 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -43,4 +43,13 @@
- 0.1
- @drawable/txt_select_selector
+
+
diff --git a/build.gradle b/build.gradle
index 4cb3b375..ce1afdd9 100644
--- a/build.gradle
+++ b/build.gradle
@@ -2,21 +2,25 @@
buildscript {
repositories {
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/central' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
google()
- jcenter()
maven { url "https://jitpack.io" }
maven { url 'https://repo1.maven.org/maven2/' }
}
dependencies {
- classpath 'com.android.tools.build:gradle:7.0.3'
+ classpath 'com.android.tools.build:gradle:7.0.4'
classpath 'com.chenenyu:img-optimizer:1.2.0'
}
}
allprojects {
repositories {
+ maven { url 'https://maven.aliyun.com/repository/google' }
+ maven { url 'https://maven.aliyun.com/repository/central' }
+ maven { url 'https://maven.aliyun.com/repository/public' }
google()
- jcenter()
maven { url "https://jitpack.io" }
maven { url 'https://repo1.maven.org/maven2/' }
}
diff --git a/version.properties b/version.properties
index 9547b211..47f2b63c 100644
--- a/version.properties
+++ b/version.properties
@@ -1,3 +1,3 @@
#Fri Jul 16 10:33:23 CST 2021
-versionName=2.3.0
-versionCode=32
+versionName=2.4.0
+versionCode=33
From 7aee7d20388a561db24d80a06ccad0f0920dc833 Mon Sep 17 00:00:00 2001
From: pickmefly <36589961+pickmefly@users.noreply.github.com>
Date: Mon, 10 Jan 2022 16:56:27 +0800
Subject: [PATCH 3/8] =?UTF-8?q?TG=5Fbot=E8=AF=B7=E6=B1=82=E6=9B=B4?=
=?UTF-8?q?=E6=94=B9=E4=B8=BAGET?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
兼容更多反代
---
.../sms/forwarder/sender/SenderTelegramMsg.java | 16 +++-------------
1 file changed, 3 insertions(+), 13 deletions(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
index f3a141e2..441ce992 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
@@ -54,14 +54,8 @@ public class SenderTelegramMsg extends SenderBaseMsg {
}
final String requestUrl = apiToken;
Log.i(TAG, "requestUrl:" + requestUrl);
-
- Map bodyMap = new HashMap();
- bodyMap.put("chat_id", chatId);
- bodyMap.put("text", text);
- bodyMap.put("parse_mode", "HTML");
-
- final String requestMsg = JSON.toJSONString(bodyMap);
- Log.i(TAG, "requestMsg:" + requestMsg);
+ String finalText = text;
+ Log.i(TAG, "requestMsg:" + finalText);
//代理相关
final Proxy.Type proxyType = telegramSettingVo.getProxyType();
@@ -107,12 +101,8 @@ public class SenderTelegramMsg extends SenderBaseMsg {
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
}
- RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
-
final Request request = new Request.Builder()
- .url(requestUrl)
- .addHeader("Content-Type", "application/json; charset=utf-8")
- .post(requestBody)
+ .url(requestUrl+"?chat_id="+chatId+"&text="+ finalText)
.build();
client.newCall(request).enqueue(new Callback() {
From fad00d68943e7707b994dbd29807182fcaca5cd7 Mon Sep 17 00:00:00 2001
From: pickmefly <36589961+pickmefly@users.noreply.github.com>
Date: Mon, 10 Jan 2022 17:19:15 +0800
Subject: [PATCH 4/8] Update SenderTelegramMsg.java
---
.../java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
index 441ce992..ab14e10c 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
@@ -102,7 +102,7 @@ public class SenderTelegramMsg extends SenderBaseMsg {
}
final Request request = new Request.Builder()
- .url(requestUrl+"?chat_id="+chatId+"&text="+ finalText)
+ .url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
.build();
client.newCall(request).enqueue(new Callback() {
From 1eda4a182e09f1755ff996178a6d4dcc39bbafd6 Mon Sep 17 00:00:00 2001
From: pppscn <35696959@qq.com>
Date: Tue, 11 Jan 2022 21:14:03 +0800
Subject: [PATCH 5/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E9=82=AE?=
=?UTF-8?q?=E4=BB=B6=E5=8F=91=E9=80=81=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AA?=
=?UTF-8?q?=E6=94=B6=E4=BB=B6=E4=BA=BA=EF=BC=88=E4=BB=A5=E5=8D=8A=E8=A7=92?=
=?UTF-8?q?=E9=80=97=E5=8F=B7,=E5=88=86=E9=9A=94=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../sms/forwarder/sender/SenderMailMsg.java | 12 ++++--
.../res/layout/alert_dialog_setview_email.xml | 41 +++++++++++++------
app/src/main/res/values-en/strings.xml | 1 +
app/src/main/res/values/strings.xml | 1 +
4 files changed, 39 insertions(+), 16 deletions(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java
index f58f6086..e3614e78 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderMailMsg.java
@@ -8,6 +8,9 @@ import com.idormy.sms.forwarder.utils.SettingUtil;
import com.smailnet.emailkit.Draft;
import com.smailnet.emailkit.EmailKit;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
import java.util.concurrent.TimeUnit;
import io.reactivex.rxjava3.core.Observable;
@@ -35,12 +38,15 @@ public class SenderMailMsg extends SenderBaseMsg {
.setAccount(fromEmail) //发件人邮箱
.setPassword(pwd); //密码或授权码
+ //多个收件人邮箱
+ Set toSet = new HashSet<>(Arrays.asList(toAdd.replace(",", ",").split(",")));
+
//设置一封草稿邮件
Draft draft = new Draft()
.setNickname(nickname) //发件人昵称
- .setTo(toAdd) //收件人邮箱
- .setSubject(title) //邮件主题
- .setText(content); //邮件正文
+ .setTo(toSet) //收件人邮箱
+ .setSubject(title) //邮件主题
+ .setText(content); //邮件正文
//使用SMTP服务发送邮件
EmailKit.useSMTPService(config)
diff --git a/app/src/main/res/layout/alert_dialog_setview_email.xml b/app/src/main/res/layout/alert_dialog_setview_email.xml
index 18e8bf65..c1e1d972 100644
--- a/app/src/main/res/layout/alert_dialog_setview_email.xml
+++ b/app/src/main/res/layout/alert_dialog_setview_email.xml
@@ -242,27 +242,42 @@
+ android:layout_height="wrap_content"
+ android:layout_marginStart="10dp"
+ android:layout_marginEnd="10dp"
+ android:layout_marginTop="5dp"
+ android:background="@android:color/white"
+ android:gravity="center_vertical"
+ android:orientation="vertical">
-
+ android:orientation="horizontal">
+
+
+
+
+
+ tools:ignore="LabelFor,TextFields" />
Password/Auth Code
Nickname
Send To
+ Tip:Separate multiple recipients with a semicolon comma
Email Title
Webhook
Secret (optional)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index ce420643..7af9da5a 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -132,6 +132,7 @@
登录密码/授权码
发件人昵称
收件地址
+ Tip:多个收件人以半角逗号,分隔
邮件主题
Webhook 地址
加签 Secret (没有可不填)
From c34133b45bdf055f710d751689eca5ca28a9aae2 Mon Sep 17 00:00:00 2001
From: pppscn <35696959@qq.com>
Date: Tue, 11 Jan 2022 22:46:12 +0800
Subject: [PATCH 6/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9ATelegram?=
=?UTF-8?q?=E5=85=81=E8=AE=B8=E6=8C=87=E5=AE=9A=E8=AF=B7=E6=B1=82=E6=96=B9?=
=?UTF-8?q?=E5=BC=8F(POST/GET)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../idormy/sms/forwarder/SenderActivity.java | 13 +-
.../forwarder/model/vo/TelegramSettingVo.java | 13 +-
.../idormy/sms/forwarder/sender/SendUtil.java | 2 +-
.../forwarder/sender/SenderTelegramMsg.java | 33 +-
.../layout/alert_dialog_setview_telegram.xml | 38 ++
.../layout/alert_dialog_setview_webnotify.xml | 352 +++++++++---------
app/src/main/res/values-en/strings.xml | 2 +-
app/src/main/res/values/strings.xml | 2 +-
8 files changed, 263 insertions(+), 192 deletions(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
index 0000f140..9a0103a3 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/SenderActivity.java
@@ -1022,6 +1022,7 @@ public class SenderActivity extends AppCompatActivity {
final EditText editTextTelegramApiToken = view1.findViewById(R.id.editTextTelegramApiToken);
final EditText editTextTelegramChatId = view1.findViewById(R.id.editTextTelegramChatId);
+ final RadioGroup radioGroupTelegramMethod = view1.findViewById(R.id.radioGroupTelegramMethod);
final RadioGroup radioGroupProxyType = view1.findViewById(R.id.radioGroupProxyType);
final EditText editTextProxyHost = view1.findViewById(R.id.editTextProxyHost);
@@ -1058,6 +1059,7 @@ public class SenderActivity extends AppCompatActivity {
if (telegramSettingVo != null) {
editTextTelegramApiToken.setText(telegramSettingVo.getApiToken());
editTextTelegramChatId.setText(telegramSettingVo.getChatId());
+ radioGroupTelegramMethod.check(telegramSettingVo.getMethodCheckId());
radioGroupProxyType.check(telegramSettingVo.getProxyTypeCheckId());
layoutProxyAuthenticator.setVisibility(telegramSettingVo.getProxyAuthenticator() ? View.VISIBLE : View.GONE);
@@ -1102,7 +1104,8 @@ public class SenderActivity extends AppCompatActivity {
editTextProxyPort.getText().toString().trim(),
switchProxyAuthenticator.isChecked(),
editTextProxyUsername.getText().toString().trim(),
- editTextProxyPassword.getText().toString().trim()
+ editTextProxyPassword.getText().toString().trim(),
+ (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST")
);
newSenderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew));
@@ -1121,7 +1124,8 @@ public class SenderActivity extends AppCompatActivity {
editTextProxyPort.getText().toString().trim(),
switchProxyAuthenticator.isChecked(),
editTextProxyUsername.getText().toString().trim(),
- editTextProxyPassword.getText().toString().trim()
+ editTextProxyPassword.getText().toString().trim(),
+ (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST")
);
senderModel.setJsonSetting(JSON.toJSONString(telegramSettingVoNew));
SenderUtil.updateSender(senderModel);
@@ -1153,9 +1157,10 @@ public class SenderActivity extends AppCompatActivity {
editTextProxyPort.getText().toString().trim(),
switchProxyAuthenticator.isChecked(),
editTextProxyUsername.getText().toString().trim(),
- editTextProxyPassword.getText().toString().trim()
+ editTextProxyPassword.getText().toString().trim(),
+ (radioGroupTelegramMethod.getCheckedRadioButtonId() == R.id.radioTelegramMethodGet ? "GET" : "POST")
);
- SenderTelegramMsg.sendMsg(0, handler, telegramSettingVoNew, getString(R.string.test_phone_num), getString(R.string.test_sms));
+ SenderTelegramMsg.sendMsg(0, handler, telegramSettingVoNew, getString(R.string.test_phone_num), getString(R.string.test_sms), telegramSettingVoNew.getMethod());
} catch (Exception e) {
Toast.makeText(SenderActivity.this, getString(R.string.failed_to_fwd) + e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
diff --git a/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java b/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java
index b4cf4c69..fd163d8f 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/model/vo/TelegramSettingVo.java
@@ -17,6 +17,7 @@ public class TelegramSettingVo implements Serializable {
private Boolean proxyAuthenticator = false;
private String proxyUsername;
private String proxyPassword;
+ private String method;
public TelegramSettingVo() {
}
@@ -25,9 +26,10 @@ public class TelegramSettingVo implements Serializable {
this.apiToken = apiToken;
this.chatId = chatId;
this.proxyType = Proxy.Type.DIRECT;
+ this.method = "POST";
}
- public TelegramSettingVo(String apiToken, String chatId, int proxyTypeId, String proxyHost, String proxyPort, boolean proxyAuthenticator, String proxyUsername, String proxyPassword) {
+ public TelegramSettingVo(String apiToken, String chatId, int proxyTypeId, String proxyHost, String proxyPort, boolean proxyAuthenticator, String proxyUsername, String proxyPassword, String method) {
this.apiToken = apiToken;
this.chatId = chatId;
if (proxyTypeId == R.id.btnProxyHttp) {
@@ -42,6 +44,7 @@ public class TelegramSettingVo implements Serializable {
this.proxyAuthenticator = proxyAuthenticator;
this.proxyUsername = proxyUsername;
this.proxyPassword = proxyPassword;
+ this.method = method;
}
public int getProxyTypeCheckId() {
@@ -53,4 +56,12 @@ public class TelegramSettingVo implements Serializable {
return R.id.btnProxyNone;
}
}
+
+ public int getMethodCheckId() {
+ if (method == null || method.equals("POST")) {
+ return R.id.radioTelegramMethodPost;
+ } else {
+ return R.id.radioTelegramMethodGet;
+ }
+ }
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java
index babeb8c0..db4658c8 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SendUtil.java
@@ -225,7 +225,7 @@ public class SendUtil {
TelegramSettingVo telegramSettingVo = JSON.parseObject(senderModel.getJsonSetting(), TelegramSettingVo.class);
if (telegramSettingVo != null) {
try {
- SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace));
+ SenderTelegramMsg.sendMsg(logId, handError, telegramSettingVo, smsVo.getMobile(), smsVo.getSmsVoForSend(smsTemplate, regexReplace), telegramSettingVo.getMethod());
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, "senderSendMsg: SenderTelegramMsg error " + e.getMessage());
diff --git a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
index ab14e10c..6753f49b 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/sender/SenderTelegramMsg.java
@@ -37,7 +37,7 @@ public class SenderTelegramMsg extends SenderBaseMsg {
static final String TAG = "SenderTelegramMsg";
- public static void sendMsg(final long logId, final Handler handError, TelegramSettingVo telegramSettingVo, String from, String text) throws Exception {
+ public static void sendMsg(final long logId, final Handler handError, TelegramSettingVo telegramSettingVo, final String from, final String text, final String method) throws Exception {
Log.i(TAG, "sendMsg telegramSettingVo:" + telegramSettingVo.toString() + " text:" + text);
String apiToken = telegramSettingVo.getApiToken();
@@ -47,15 +47,14 @@ public class SenderTelegramMsg extends SenderBaseMsg {
}
//特殊处理避免标题重复
- text = text.replaceAll("#", "井").trim();
+ final String finalText = text.replaceAll("#", "井").trim();
if (!apiToken.startsWith("http")) {
apiToken = "https://api.telegram.org/bot" + apiToken + "/sendMessage";
}
+
final String requestUrl = apiToken;
Log.i(TAG, "requestUrl:" + requestUrl);
- String finalText = text;
- Log.i(TAG, "requestMsg:" + finalText);
//代理相关
final Proxy.Type proxyType = telegramSettingVo.getProxyType();
@@ -101,9 +100,27 @@ public class SenderTelegramMsg extends SenderBaseMsg {
.connectionPool(new ConnectionPool(5, 1, TimeUnit.SECONDS)).build();
}
- final Request request = new Request.Builder()
- .url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
- .build();
+ final Request request;
+ if (method.equals("GET")) {
+ request = new Request.Builder()
+ .url(requestUrl + "?chat_id=" + chatId + "&text=" + finalText)
+ .build();
+ } else {
+ Map bodyMap = new HashMap();
+ bodyMap.put("chat_id", chatId);
+ bodyMap.put("text", finalText);
+ bodyMap.put("parse_mode", "HTML");
+
+ String requestMsg = JSON.toJSONString(bodyMap);
+ Log.i(TAG, "requestMsg:" + requestMsg);
+
+ RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=utf-8"), requestMsg);
+ request = new Request.Builder()
+ .url(requestUrl)
+ .addHeader("Content-Type", "application/json; charset=utf-8")
+ .post(requestBody)
+ .build();
+ }
client.newCall(request).enqueue(new Callback() {
@Override
@@ -127,7 +144,7 @@ public class SenderTelegramMsg extends SenderBaseMsg {
}
}
});
-
+
} catch (Exception e) {
LogUtil.updateLog(logId, 0, e.getMessage());
Log.e(TAG, e.getMessage(), e);
diff --git a/app/src/main/res/layout/alert_dialog_setview_telegram.xml b/app/src/main/res/layout/alert_dialog_setview_telegram.xml
index 2269642b..81556c42 100644
--- a/app/src/main/res/layout/alert_dialog_setview_telegram.xml
+++ b/app/src/main/res/layout/alert_dialog_setview_telegram.xml
@@ -58,6 +58,44 @@
tools:ignore="LabelFor" />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 388d3452..40792aeb 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -147,7 +147,7 @@
ServerChan\'s SendKey
ApiToken or Custom address
ChatId
- Method
+ Method
WebServer e.g. https://a.b.com/msg?token=xyz
WebParams e.g. payload=%7B%22text%22%3A%22[msg]%22%7D [msg] will be replaced with text message content. \nSupport Json format, for example: {"text":[MSG]}.\n Note: MSG is automatically utF-8 encoded in addition to JSON format
Secret (sign is not counted if left blank)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 7af9da5a..68620352 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -147,7 +147,7 @@
设置Server酱·Turbo版的SendKey
设置Telegram机器人的ApiToken 或 自定义地址(http开头)
设置被通知人(或群组)的ChatId
- 请求方式
+ 请求方式
设置WebServer:例如:https://a.b.com/msg?token=xyz
设置WebParams:例如:payload=%7B%22text%22%3A%22[msg]%22%7D [msg]将被替换成短信内容。\n支持Json格式,例如:{"text":[msg]}。\n注意:除JSON格式外,msg会自动进行UTF-8编码
设置Secret:置空则不计算sign
From cd3857358b04b02e5410764b2b21b7b8e7dd1cfc Mon Sep 17 00:00:00 2001
From: malsony
Date: Wed, 12 Jan 2022 12:09:20 +0800
Subject: [PATCH 7/8] Update of translations
small fix
---
app/src/main/res/values-en/strings.xml | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml
index 40792aeb..1a7e6fb8 100644
--- a/app/src/main/res/values-en/strings.xml
+++ b/app/src/main/res/values-en/strings.xml
@@ -132,7 +132,7 @@
Password/Auth Code
Nickname
Send To
- Tip:Separate multiple recipients with a semicolon comma
+ Tip:Separate multiple recipients with a ","
Email Title
Webhook
Secret (optional)
@@ -168,10 +168,10 @@
Main switch, requires permissions to read and sned SMS messages, especially verification SMS texts.
Forward missed calls
Main switch, requires permissions to read call log and contacts.
- Forward app notify
+ Forward app Ntf.
Main switch, requires permission to read notification.
- Auto cancel app notify
- After a single notification is processed, it is automatically disabled to avoid multiple notification stacking
+ Auto close Ntf.
+ Automatically close a single notification after forwarding, to avoid stacking of multiple notifications.
Global custom template
Priority: custom template for forwarding rules > Global custom template > System default
Enable regular replacement content
@@ -269,5 +269,5 @@
Privacy Policy
Agree
Disagree
- SmsForwarder, this software is 100% free, open source, Github online compiled and release, will not collect any of your privacy data!\n\n The software version information will be reported in the following situations: \n 1. When starting the software, the version information will be sent to "Umeng +· U-APP Mobile Statistics" for analyzing the statistics of user version retention and software crash;\n 2. When manually checking the update, send the version number to check the new version;\n Other than that, there is no data!!\n\n The software will collect and use version information in accordance with the Privacy Policy, but will not collect bundled information because you have agreed to the Privacy Policy.
+ SmsForwarder (the "Application/App"), is 100% free and open source, and is compliled and released basing on repository hosted on GitHub. The App will not collect any of your privacy data!\n\n Version information of the App will be sent in the following situations: \n 1. As startup, version information will be sent to "Umeng +· U-APP Mobile Statistics" for user retention analyze and crash stats;\n 2. Manual update check triggered by user;\n The App collects no any other data!!\n\n The App collects and uses version information only in accordance with the Privacy Policy, and will not collect any other information as an abuse of users\' consent to the Privacy Policy;
From ad89482b4f0e01e66ab8d80ccde99a6daf3b2513 Mon Sep 17 00:00:00 2001
From: Naccl
Date: Thu, 13 Jan 2022 12:36:32 +0800
Subject: [PATCH 8/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E8=87=AA?=
=?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A8=A1=E6=9D=BF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
自定义模板时,将标签插入光标位置或替换选中的文本
---
.../idormy/sms/forwarder/RuleActivity.java | 20 ++++++++++++-------
.../idormy/sms/forwarder/SettingActivity.java | 16 ++++++++++-----
2 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
index 97fff669..0048efcd 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/RuleActivity.java
@@ -374,49 +374,49 @@ public class RuleActivity extends AppCompatActivity {
buttonInsertSender.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{来源号码}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{来源号码}}");
});
Button buttonInsertContent = view1.findViewById(R.id.bt_insert_content);
buttonInsertContent.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{短信内容}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{短信内容}}");
});
Button buttonInsertSenderApp = view1.findViewById(R.id.bt_insert_sender_app);
buttonInsertSenderApp.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{APP包名}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{APP包名}}");
});
Button buttonInsertContentApp = view1.findViewById(R.id.bt_insert_content_app);
buttonInsertContentApp.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{通知内容}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{通知内容}}");
});
Button buttonInsertExtra = view1.findViewById(R.id.bt_insert_extra);
buttonInsertExtra.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{卡槽信息}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{卡槽信息}}");
});
Button buttonInsertTime = view1.findViewById(R.id.bt_insert_time);
buttonInsertTime.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{接收时间}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{接收时间}}");
});
Button buttonInsertDeviceName = view1.findViewById(R.id.bt_insert_device_name);
buttonInsertDeviceName.setOnClickListener(view -> {
textSmsTemplate.setFocusable(true);
textSmsTemplate.requestFocus();
- textSmsTemplate.append("{{设备名称}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{设备名称}}");
});
//正则替换
@@ -433,6 +433,12 @@ public class RuleActivity extends AppCompatActivity {
}
+ private void insertOrReplaceText2Cursor(EditText editText, String str) {
+ int start = Math.max(editText.getSelectionStart(), 0);
+ int end = Math.max(editText.getSelectionEnd(), 0);
+ editText.getText().replace(Math.min(start, end), Math.max(start, end), str, 0, str.length());
+ }
+
//当更新选择的字段的时候,更新之下各个选项的状态
// 如果设置了转发全部,禁用选择模式和匹配值输入
// 如果设置了多重规则,选择模式置为是
diff --git a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
index ca07b181..f06aabca 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
+++ b/app/src/main/java/com/idormy/sms/forwarder/SettingActivity.java
@@ -356,24 +356,30 @@ public class SettingActivity extends AppCompatActivity {
textSmsTemplate.requestFocus();
switch (v.getId()) {
case R.id.bt_insert_sender:
- textSmsTemplate.append("{{来源号码}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{来源号码}}");
return;
case R.id.bt_insert_content:
- textSmsTemplate.append("{{短信内容}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{短信内容}}");
return;
case R.id.bt_insert_extra:
- textSmsTemplate.append("{{卡槽信息}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{卡槽信息}}");
return;
case R.id.bt_insert_time:
- textSmsTemplate.append("{{接收时间}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{接收时间}}");
return;
case R.id.bt_insert_device_name:
- textSmsTemplate.append("{{设备名称}}");
+ insertOrReplaceText2Cursor(textSmsTemplate, "{{设备名称}}");
return;
default:
}
}
+ private void insertOrReplaceText2Cursor(EditText editText, String str) {
+ int start = Math.max(editText.getSelectionStart(), 0);
+ int end = Math.max(editText.getSelectionEnd(), 0);
+ editText.getText().replace(Math.min(start, end), Math.max(start, end), str, 0, str.length());
+ }
+
//恢复初始化配置
public void initSetting(View view) {