From 63580b111cb3506af8c1a5d8b00dbebc794edc9d Mon Sep 17 00:00:00 2001 From: LaizyBoy Date: Fri, 8 May 2026 20:46:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9ESMSRecycle2Activity?= =?UTF-8?q?=E8=87=AA=E7=94=B1=E6=A8=A1=E5=BC=8F=E5=9B=9E=E6=94=B6=E7=AB=99?= =?UTF-8?q?=E4=B8=8E=E5=88=BB=E5=BA=A6=E5=85=A8=E5=B1=80=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增SMSRecycle2Activity窗口,每项使用ProtectModeTextView显示短信内容 - 顶部添加示例ProtectModeTextView,刻度值通过SP全局同步到列表所有项 - AppSettingsActivity新增回收站模式RadioGroup:简洁模式/自由模式 - MainActivity回收站菜单根据配置路由到对应Activity - AppConfigBean新增recycleBinClass字段持久化模式选择 - ProtectModeTextView新增OnScaleChangedListener与setContentTextWithScale --- gradlew | 0 mymessagemanager/build.gradle | 15 ++- mymessagemanager/build.properties | 4 +- mymessagemanager/src/main/AndroidManifest.xml | 2 + .../activitys/AppSettingsActivity.java | 15 +++ .../activitys/MainActivity.java | 8 +- .../activitys/SMSRecycle2Activity.java | 120 ++++++++++++++++++ .../adapters/SMSRecycle2Adapter.java | 78 ++++++++++++ .../mymessagemanager/beans/AppConfigBean.java | 13 ++ .../views/ProtectModeTextView.java | 19 +++ .../main/res/layout/activity_appsettings.xml | 48 +++++++ .../main/res/layout/activity_smsrecycle2.xml | 54 ++++++++ .../main/res/layout/listview_smsrecycle2.xml | 44 +++++++ 13 files changed, 411 insertions(+), 9 deletions(-) mode change 100644 => 100755 gradlew create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycle2Activity.java create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycle2Adapter.java create mode 100644 mymessagemanager/src/main/res/layout/activity_smsrecycle2.xml create mode 100644 mymessagemanager/src/main/res/layout/listview_smsrecycle2.xml 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 @@ + + + + + + + + + + + + + + + +