diff --git a/gradlew b/gradlew
old mode 100644
new mode 100755
diff --git a/mymessagemanager/build.gradle b/mymessagemanager/build.gradle
index ee9dbe4..92dc90b 100644
--- a/mymessagemanager/build.gradle
+++ b/mymessagemanager/build.gradle
@@ -18,16 +18,19 @@ def genVersionName(def versionName){
}
android {
-
- // 关键:改为你已安装的 SDK 32(≥ targetSdkVersion 30,兼容已安装环境)
- compileSdkVersion 32
- // 直接使用已安装的构建工具 33.0.3(无需修改)
- buildToolsVersion "33.0.3"
+ compileSdkVersion 30
+
+ buildToolsVersion "30.0.3"
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_7
+ targetCompatibility JavaVersion.VERSION_1_7
+ }
defaultConfig {
applicationId "cc.winboll.studio.mymessagemanager"
- minSdkVersion 23
+ minSdkVersion 26
targetSdkVersion 30
versionCode 8
// versionName 更新后需要手动设置
diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties
index f0febc4..dbf8da8 100644
--- a/mymessagemanager/build.properties
+++ b/mymessagemanager/build.properties
@@ -1,8 +1,8 @@
#Created by .winboll/winboll_app_build.gradle
-#Fri May 08 11:33:06 GMT 2026
+#Fri May 08 20:38:36 CST 2026
stageCount=8
libraryProject=
baseVersion=15.12
publishVersion=15.12.7
-buildCount=9
+buildCount=18
baseBetaVersion=15.12.8
diff --git a/mymessagemanager/src/main/AndroidManifest.xml b/mymessagemanager/src/main/AndroidManifest.xml
index 27f0e1f..34e6aac 100644
--- a/mymessagemanager/src/main/AndroidManifest.xml
+++ b/mymessagemanager/src/main/AndroidManifest.xml
@@ -216,6 +216,8 @@
+
+
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AppSettingsActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AppSettingsActivity.java
index bdfb4ad..870ce80 100644
--- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AppSettingsActivity.java
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AppSettingsActivity.java
@@ -12,6 +12,8 @@ import android.os.Bundle;
import android.provider.Settings;
import android.view.View;
import android.widget.EditText;
+import android.widget.RadioButton;
+import android.widget.RadioGroup;
import android.widget.Switch;
import android.widget.Toast;
import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
@@ -40,6 +42,7 @@ public class AppSettingsActivity extends WinBoLLActivity implements IWinBoLLActi
//EditText metProtectModerRefuseChars;
EditText metProtectModerReplaceChars;
String mszProtectModerRefuseChars = "";
+ RadioGroup mRadioGroupRecycleBin;
@Override
public Activity getActivity() {
@@ -83,6 +86,13 @@ public class AppSettingsActivity extends WinBoLLActivity implements IWinBoLLActi
metProtectModerReplaceChars = findViewById(R.id.activityappsettingsEditText4);
metProtectModerReplaceChars.setText(mAppConfigUtil.mAppConfigBean.getProtectModerReplaceChars());
+ mRadioGroupRecycleBin = findViewById(R.id.activityappsettingsRadioGroup1);
+ if (mAppConfigUtil.mAppConfigBean.getRecycleBinClass().equals("SMSRecycle2Activity")) {
+ mRadioGroupRecycleBin.check(R.id.activityappsettingsRadioButton2);
+ } else {
+ mRadioGroupRecycleBin.check(R.id.activityappsettingsRadioButton1);
+ }
+
mAOHPCTCSeekBar = findViewById(R.id.activityappsettingsAOHPCTCSeekBar1);
mAOHPCTCSeekBar.setThumb(getDrawable(R.drawable.cursor_pointer));
mAOHPCTCSeekBar.setThumbOffset(0);
@@ -92,6 +102,11 @@ public class AppSettingsActivity extends WinBoLLActivity implements IWinBoLLActi
public void onOHPCommit() {
mAppConfigUtil.reLoadConfig();
mAppConfigUtil.mAppConfigBean.setIsSMSRecycleProtectMode(mswSMSRecycleProtectMode.isChecked());
+ if (mRadioGroupRecycleBin.getCheckedRadioButtonId() == R.id.activityappsettingsRadioButton2) {
+ mAppConfigUtil.mAppConfigBean.setRecycleBinClass("SMSRecycle2Activity");
+ } else {
+ mAppConfigUtil.mAppConfigBean.setRecycleBinClass("SMSRecycleActivity");
+ }
//mAppConfigUtil.mAppConfigBean.setProtectModerRefuseChars(metProtectModerRefuseChars.getText().toString());
mAppConfigUtil.mAppConfigBean.setProtectModerRefuseChars(mszProtectModerRefuseChars);
mAppConfigUtil.mAppConfigBean.setProtectModerReplaceChars(metProtectModerReplaceChars.getText().toString());
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/MainActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/MainActivity.java
index 49df3e0..8f8b73a 100644
--- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/MainActivity.java
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/MainActivity.java
@@ -329,7 +329,13 @@ public class MainActivity extends WinBoLLActivity {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
} else if (nItemId == R.id.app_smsrecycle) {
- Intent i = new Intent(MainActivity.this, SMSRecycleActivity.class);
+ Class> recycleClass;
+ if (mAppConfigUtil.mAppConfigBean.getRecycleBinClass().equals("SMSRecycle2Activity")) {
+ recycleClass = SMSRecycle2Activity.class;
+ } else {
+ recycleClass = SMSRecycleActivity.class;
+ }
+ Intent i = new Intent(MainActivity.this, recycleClass);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(i);
}
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycle2Activity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycle2Activity.java
new file mode 100644
index 0000000..ac123d7
--- /dev/null
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycle2Activity.java
@@ -0,0 +1,120 @@
+package cc.winboll.studio.mymessagemanager.activitys;
+
+import android.app.Activity;
+import android.content.SharedPreferences;
+import android.os.Bundle;
+import android.view.Menu;
+import android.view.MenuItem;
+import androidx.appcompat.widget.Toolbar;
+import androidx.recyclerview.widget.LinearLayoutManager;
+import androidx.recyclerview.widget.RecyclerView;
+import cc.winboll.studio.libaes.dialogs.YesNoAlertDialog;
+import cc.winboll.studio.libaes.interfaces.IWinBoLLActivity;
+import cc.winboll.studio.mymessagemanager.R;
+import cc.winboll.studio.mymessagemanager.adapters.SMSRecycle2Adapter;
+import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
+import cc.winboll.studio.mymessagemanager.views.ProtectModeTextView;
+import com.baoyz.widget.PullRefreshLayout;
+import java.io.File;
+
+public class SMSRecycle2Activity extends WinBoLLActivity implements IWinBoLLActivity {
+
+ public static final String TAG = "SMSRecycle2Activity";
+ private static final String SP_NAME = "smsrecycle2_config";
+ private static final String KEY_SCALE = "recycle2_scale";
+
+ Toolbar mToolbar;
+ RecyclerView mRecyclerView;
+ SMSRecycle2Adapter mSMSRecycle2Adapter;
+ ProtectModeTextView mSampleProtectModeTextView;
+ SharedPreferences mSP;
+
+ @Override
+ public Activity getActivity() {
+ return this;
+ }
+
+ @Override
+ public String getTag() {
+ return TAG;
+ }
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ setContentView(R.layout.activity_smsrecycle2);
+ mToolbar = findViewById(R.id.activitysmsrecycle2ASupportToolbar1);
+ mToolbar.setSubtitle(getString(R.string.activity_name_about));
+ setSupportActionBar(mToolbar);
+
+ mSP = getSharedPreferences(SP_NAME, MODE_PRIVATE);
+
+ mSampleProtectModeTextView = findViewById(R.id.activitysmsrecycle2SampleProtectModeTextView);
+ mSampleProtectModeTextView.setContentTextWithScale(
+ "调节本短信下方刻度滑条,可预览文本打乱效果;同时该进度条数值将作为回收站短信全局默认初始值。\n"
+ + "刻度0 = 保持原文不打乱;\n"
+ + "刻度数值越小,字符分组越细碎,文本打乱混乱程度越大;\n"
+ + "刻度数值越大,字符连串分组越长,文本打乱混乱程度越小。",
+ mSP.getInt(KEY_SCALE, 0));
+
+ mSampleProtectModeTextView.setOnScaleChangedListener(new ProtectModeTextView.OnScaleChangedListener() {
+ @Override
+ public void onScaleChanged(int progress) {
+ mSP.edit().putInt(KEY_SCALE, progress).apply();
+ mSMSRecycle2Adapter.setScaleProgress(progress);
+ mSMSRecycle2Adapter.notifyDataSetChanged();
+ }
+ });
+
+ initView();
+ }
+
+ void initView() {
+ mRecyclerView = findViewById(R.id.activitysmsrecycle2RecyclerView1);
+ RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
+ mRecyclerView.setLayoutManager(layoutManager);
+
+ mSMSRecycle2Adapter = new SMSRecycle2Adapter(this, mSP.getInt(KEY_SCALE, 0));
+ mRecyclerView.setAdapter(mSMSRecycle2Adapter);
+
+ final PullRefreshLayout pullRefreshLayout = findViewById(R.id.activitysmsrecycle2PullRefreshLayout1);
+ pullRefreshLayout.setOnRefreshListener(new PullRefreshLayout.OnRefreshListener() {
+ @Override
+ public void onRefresh() {
+ mSMSRecycle2Adapter.loadSMSRecycleList();
+ mSMSRecycle2Adapter.notifyDataSetChanged();
+ pullRefreshLayout.setRefreshing(false);
+ }
+ });
+ }
+
+ @Override
+ public boolean onCreateOptionsMenu(Menu menu) {
+ getMenuInflater().inflate(R.menu.toolbar_smsrecycle, menu);
+ return true;
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ int nItemId = item.getItemId();
+ if (nItemId == R.id.item_cleansmsrecycle) {
+ YesNoAlertDialog.show(this, "回收站清空确认", "是否清空回收站", mDeleteListener);
+ }
+ return true;
+ }
+
+ YesNoAlertDialog.OnDialogResultListener mDeleteListener = new YesNoAlertDialog.OnDialogResultListener() {
+
+ @Override
+ public void onNo() {
+ }
+
+ @Override
+ public void onYes() {
+ File file = new File(SMSRecycleUtil.getSMSRecycleListDataPath(SMSRecycle2Activity.this));
+ file.delete();
+ mSMSRecycle2Adapter.loadSMSRecycleList();
+ mSMSRecycle2Adapter.notifyDataSetChanged();
+ }
+ };
+}
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycle2Adapter.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycle2Adapter.java
new file mode 100644
index 0000000..a5db2d6
--- /dev/null
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycle2Adapter.java
@@ -0,0 +1,78 @@
+package cc.winboll.studio.mymessagemanager.adapters;
+
+import android.content.Context;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+import androidx.recyclerview.widget.RecyclerView;
+import cc.winboll.studio.mymessagemanager.R;
+import cc.winboll.studio.mymessagemanager.beans.SMSRecycleBean;
+import cc.winboll.studio.mymessagemanager.utils.AddressUtils;
+import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil;
+import cc.winboll.studio.mymessagemanager.views.DateAgoTextView;
+import cc.winboll.studio.mymessagemanager.views.ProtectModeTextView;
+import java.util.ArrayList;
+
+public class SMSRecycle2Adapter extends RecyclerView.Adapter {
+
+ public static final String TAG = "SMSRecycle2Adapter";
+
+ Context mContext;
+ ArrayList mDataList;
+ String mszSMSRecycleListDataPath;
+ int mScaleProgress;
+
+ public SMSRecycle2Adapter(Context context, int scaleProgress) {
+ mContext = context;
+ mScaleProgress = scaleProgress;
+ mszSMSRecycleListDataPath = SMSRecycleUtil.getSMSRecycleListDataPath(mContext);
+ mDataList = new ArrayList();
+ mDataList = loadSMSRecycleList();
+ }
+
+ public void setScaleProgress(int scaleProgress) {
+ mScaleProgress = scaleProgress;
+ }
+
+ public ArrayList loadSMSRecycleList() {
+ ArrayList list = new ArrayList();
+ SMSRecycleBean.loadBeanListFromFile(mszSMSRecycleListDataPath, list, SMSRecycleBean.class);
+ SMSRecycleBean.sortSMSByDeleteDateDesc(list, true);
+ mDataList.clear();
+ mDataList.addAll(list);
+ return mDataList;
+ }
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.listview_smsrecycle2, parent, false);
+ return new ViewHolder(view);
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ SMSRecycleBean item = mDataList.get(position);
+ holder.mtvAddress.setText(AddressUtils.getFormattedAddress(item.getAddress()));
+ holder.mdatvDeleteDate.setDate(item.getDeleteDate());
+ holder.mProtectModeTextView.setContentTextWithScale(item.getBody(), mScaleProgress);
+ }
+
+ @Override
+ public int getItemCount() {
+ return mDataList.size();
+ }
+
+ static class ViewHolder extends RecyclerView.ViewHolder {
+ TextView mtvAddress;
+ DateAgoTextView mdatvDeleteDate;
+ ProtectModeTextView mProtectModeTextView;
+
+ ViewHolder(View itemView) {
+ super(itemView);
+ mtvAddress = itemView.findViewById(R.id.listviewsmsrecycle2TextViewAddress);
+ mdatvDeleteDate = itemView.findViewById(R.id.listviewsmsrecycle2DateAgoTextViewDelete);
+ mProtectModeTextView = itemView.findViewById(R.id.listviewsmsrecycle2ProtectModeTextView);
+ }
+ }
+}
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean.java
index 7ba266d..689a888 100644
--- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean.java
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/beans/AppConfigBean.java
@@ -29,6 +29,8 @@ public class AppConfigBean extends BaseBean {
String protectModerRefuseChars = "设定被和谐的字符";
// 保护式预览拒绝显示的字符集的替代字符
String protectModerReplaceChars = "当前替代显示字符";
+ // 回收站打开的窗口类名 SMSRecycleActivity / SMSRecycle2Activity
+ String recycleBinClass = "SMSRecycleActivity";
//int appThemeID = ThemeUtil.getThemeID(ThemeUtil.BaseTheme.DEFAULT);
public void setProtectModerRefuseChars(String protectModerRefuseChars) {
@@ -47,6 +49,14 @@ public class AppConfigBean extends BaseBean {
return protectModerReplaceChars;
}
+ public void setRecycleBinClass(String recycleBinClass) {
+ this.recycleBinClass = recycleBinClass;
+ }
+
+ public String getRecycleBinClass() {
+ return recycleBinClass;
+ }
+
public void setIsSMSRecycleProtectMode(boolean isSMSRecycleProtectMode) {
this.isSMSRecycleProtectMode = isSMSRecycleProtectMode;
}
@@ -142,6 +152,7 @@ public class AppConfigBean extends BaseBean {
jsonWriter.name("isSMSRecycleProtectMode").value(bean.isSMSRecycleProtectMode());
jsonWriter.name("protectModerRefuseChars").value(bean.getProtectModerRefuseChars());
jsonWriter.name("protectModerReplaceChars").value(bean.getProtectModerReplaceChars());
+ jsonWriter.name("recycleBinClass").value(bean.getRecycleBinClass());
//jsonWriter.name("appThemeID").value(bean.getAppThemeID());
}
@@ -171,6 +182,8 @@ public class AppConfigBean extends BaseBean {
bean.setProtectModerRefuseChars(jsonReader.nextString());
} else if (name.equals("protectModerReplaceChars")) {
bean.setProtectModerReplaceChars(jsonReader.nextString());
+ } else if (name.equals("recycleBinClass")) {
+ bean.setRecycleBinClass(jsonReader.nextString());
} /*else if (name.equals("appThemeID")) {
bean.setAppThemeID(jsonReader.nextInt());
}*/ else {
diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ProtectModeTextView.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ProtectModeTextView.java
index 003eb2a..6e40ad8 100644
--- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ProtectModeTextView.java
+++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ProtectModeTextView.java
@@ -24,11 +24,16 @@ import java.util.Random;
*/
public class ProtectModeTextView extends LinearLayout {
+ public interface OnScaleChangedListener {
+ void onScaleChanged(int progress);
+ }
+
private TextView tvContent;
private SeekBar seekBarScale;
private String originText;
private List charAllList;
private final Random random = new Random();
+ private OnScaleChangedListener mOnScaleChangedListener;
public ProtectModeTextView(Context context) {
super(context);
@@ -60,6 +65,9 @@ public class ProtectModeTextView extends LinearLayout {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
handleTextLogic(progress);
+ if (fromUser && mOnScaleChangedListener != null) {
+ mOnScaleChangedListener.onScaleChanged(progress);
+ }
}
@Override
@@ -69,6 +77,17 @@ public class ProtectModeTextView extends LinearLayout {
});
}
+ public void setOnScaleChangedListener(OnScaleChangedListener listener) {
+ mOnScaleChangedListener = listener;
+ }
+
+ public void setContentTextWithScale(String text, int scaleProgress) {
+ this.originText = text;
+ convertToCharList(text);
+ seekBarScale.setProgress(scaleProgress);
+ handleTextLogic(scaleProgress);
+ }
+
public void setContentText(String text) {
this.originText = text;
convertToCharList(text);
diff --git a/mymessagemanager/src/main/res/layout/activity_appsettings.xml b/mymessagemanager/src/main/res/layout/activity_appsettings.xml
index e4bf151..6b489b4 100644
--- a/mymessagemanager/src/main/res/layout/activity_appsettings.xml
+++ b/mymessagemanager/src/main/res/layout/activity_appsettings.xml
@@ -119,6 +119,54 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/mymessagemanager/src/main/res/layout/listview_smsrecycle2.xml b/mymessagemanager/src/main/res/layout/listview_smsrecycle2.xml
new file mode 100644
index 0000000..f0a0da4
--- /dev/null
+++ b/mymessagemanager/src/main/res/layout/listview_smsrecycle2.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+