From d381c29452c96e279c440f15ee43e553199b04ee Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 23 Aug 2025 13:38:20 +0800 Subject: [PATCH 01/12] =?UTF-8?q?=E7=9F=AD=E4=BF=A1=E5=8F=91=E9=80=81?= =?UTF-8?q?=E7=AA=97=E5=8F=A3UI=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymessagemanager/build.properties | 4 +- .../activitys/SMSActivity.java | 280 ++++++++++-------- .../views/BottomPositionFixedScrollView.java | 125 ++++++++ .../src/main/res/layout/activity_sms.xml | 50 ++-- .../main/res/layout/view_smssend_part1.xml | 25 +- .../src/main/res/values-zh/strings.xml | 4 +- 6 files changed, 331 insertions(+), 157 deletions(-) create mode 100644 mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/BottomPositionFixedScrollView.java diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 63e9af8..5d39d10 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Jul 03 13:50:15 HKT 2025 +#Sat Aug 23 05:36:15 GMT 2025 stageCount=2 libraryProject= baseVersion=15.3 publishVersion=15.3.1 -buildCount=0 +buildCount=57 baseBetaVersion=15.3.2 diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSActivity.java index 0cd570e..41c276f 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSActivity.java @@ -4,11 +4,16 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.view.View; +import android.view.ViewTreeObserver; +import android.view.inputmethod.InputMethodManager; import android.widget.AbsListView; import android.widget.EditText; +import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; @@ -16,19 +21,17 @@ import android.widget.Toolbar; import androidx.localbroadcastmanager.content.LocalBroadcastManager; import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; import cc.winboll.studio.mymessagemanager.R; -import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; import cc.winboll.studio.mymessagemanager.adapters.SMSArrayAdapter; import cc.winboll.studio.mymessagemanager.utils.AddressUtils; import cc.winboll.studio.mymessagemanager.utils.SMSUtil; import cc.winboll.studio.mymessagemanager.utils.ViewUtil; +import cc.winboll.studio.mymessagemanager.views.BottomPositionFixedScrollView; import cc.winboll.studio.mymessagemanager.views.SMSListViewForScrollView; import java.lang.ref.WeakReference; public class SMSActivity extends BaseActivity { public static String TAG = "SMSActivity"; - public static final String ACTION_NOTIFY_SMS_CHANGED = "cc.winboll.studio.mymessagemanager.activitys.SMSActivity.ACTION_NOTIFY_SMS_CHANGED"; - public static final String EXTRA_PHONE = "Phone"; final static int MSG_SET_FOCUS = 0; @@ -36,10 +39,11 @@ public class SMSActivity extends BaseActivity { Toolbar mToolbar; String mszPhoneTo; SMSArrayAdapter mSMSArrayAdapter; - ScrollView mScrollView; + BottomPositionFixedScrollView mScrollView1; EditText metSMSBody; SMSActivityBroadcastReceiver mSMSActivityBroadcastReceiver; Handler mSetFocusHandler; + private boolean isImeVisible = false; @Override protected void onCreate(Bundle savedInstanceState) { @@ -47,45 +51,90 @@ public class SMSActivity extends BaseActivity { setContentView(R.layout.activity_sms); initView(); - mSetFocusHandler = new MyHandler(SMSActivity.this); scrollScrollView(); + setupImeStatusListener(); - // 每隔一定时间设置输入框获得焦点 - // - new Thread() { - @Override - public void run() { - while (true) { - try { - Thread.sleep(1500); - } catch (InterruptedException e) {} - Message message = mSetFocusHandler.obtainMessage(MSG_SET_FOCUS); - mSetFocusHandler.sendMessage(message); - } - }}.start(); + // 新增:监听窗口加载完成,触发mScrollView1滚动到底部 + setupScrollToBottomAfterWindowLoaded(); } - // - // 设置输入框获得焦点的类 - // - static class MyHandler extends Handler { - WeakReference mActivity; - MyHandler(SMSActivity activity) { - mActivity = new WeakReference(activity); - } - public void handleMessage(Message msg) { - SMSActivity theActivity = mActivity.get(); - switch (msg.what) { - case MSG_SET_FOCUS: - theActivity.metSMSBody.setFocusable(true); - theActivity.metSMSBody.requestFocus(); - break; - default: - break; - } - super.handleMessage(msg); - } - } + // 新增:窗口加载完成后让mScrollView1滚动到底部 + private void setupScrollToBottomAfterWindowLoaded() { + final View rootView = findViewById(android.R.id.content); + // 监听根布局绘制完成(窗口加载完成的标志) + rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + // 滚动到底部 + mScrollView1.post(new Runnable() { + @Override + public void run() { + mScrollView1.fullScroll(ScrollView.FOCUS_DOWN); + } + }); + + // 移除监听,避免重复触发 + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + } + }); + } + + private void setupImeStatusListener() { + final View rootView = findViewById(android.R.id.content); + rootView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + int rootViewHeight = rootView.getHeight(); + int screenHeight = getResources().getDisplayMetrics().heightPixels; + int imeThreshold = dp2px(200); + + boolean currentImeVisible = (screenHeight - rootViewHeight) > imeThreshold; + + if (currentImeVisible != isImeVisible) { + isImeVisible = currentImeVisible; + setupScrollView1Height(); + if (!isImeVisible) { + metSMSBody.clearFocus(); + } + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + rootView.getViewTreeObserver().removeOnGlobalLayoutListener(this); + } else { + rootView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + } + setupImeStatusListener(); + } + }); + } + + private int dp2px(int dp) { + return (int) (dp * getResources().getDisplayMetrics().density + 0.5f); + } + + /*static class MyHandler extends Handler { + WeakReference mActivity; + MyHandler(SMSActivity activity) { + mActivity = new WeakReference(activity); + } + public void handleMessage(Message msg) { + SMSActivity theActivity = mActivity.get(); + switch (msg.what) { + case MSG_SET_FOCUS: + theActivity.metSMSBody.setFocusable(true); + theActivity.metSMSBody.requestFocus(); + theActivity.setupScrollView1Height(); + break; + default: + break; + } + super.handleMessage(msg); + } + }*/ @Override protected void onDestroy() { @@ -94,135 +143,130 @@ public class SMSActivity extends BaseActivity { } void initView() { - // 发送端空号码退出 mszPhoneTo = getIntent().getStringExtra(EXTRA_PHONE); if (mszPhoneTo == null || mszPhoneTo.trim().equals("")) { finish(); } - // 初始化标题栏 - mToolbar = findViewById(R.id.activitysmsASupportToolbar1); + mToolbar = (Toolbar) findViewById(R.id.activitysmsASupportToolbar1); mToolbar.setSubtitle(getString(R.string.activity_name_smsinphone) + " < Phone : " + AddressUtils.getFormattedAddress(mszPhoneTo) + " >"); setActionBar(mToolbar); - // 初始化滚动窗口 - mScrollView = findViewById(R.id.activitysmsinphoneScrollView1); + mScrollView1 = (BottomPositionFixedScrollView) findViewById(R.id.activitysmsScrollView1); - // 初始化发送消息框 - //Drawable drawableFrame = AppCompatResources.getDrawable(this, R.drawable.bg_frame); - metSMSBody = findViewById(R.id.viewsmssendpart1EditText1); - //metSMSBody.setBackground(drawableFrame); + metSMSBody = (EditText) findViewById(R.id.viewsmssendpart1EditText1); + metSMSBody.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + setupScrollView1Height(); + } + }); + metSMSBody.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + setupScrollView1Height(); + } + }); - // 初始化发送拉动控件 - final AOHPCTCSeekBar aOHPCTCSeekBar = findViewById(R.id.viewsmssendpart1AOHPCTCSeekBar1); + final AOHPCTCSeekBar aOHPCTCSeekBar = (AOHPCTCSeekBar) findViewById(R.id.viewsmssendpart1AOHPCTCSeekBar1); aOHPCTCSeekBar.setThumb(getDrawable(R.drawable.ic_message)); aOHPCTCSeekBar.setThumbOffset(20); - aOHPCTCSeekBar.setOnOHPCListener( - new AOHPCTCSeekBar.OnOHPCListener(){ - @Override - public void onOHPCommit() { - //Toast.makeText(getApplication(), "Send", Toast.LENGTH_SHORT).show(); - sendSMS(); - } - }); + aOHPCTCSeekBar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { + @Override + public void onOHPCommit() { + sendSMS(); + } + }); - // 初始化提示框 - TextView tvAOHPCTCSeekBarMSG = findViewById(R.id.viewsmssendpart1TextView1); + TextView tvAOHPCTCSeekBarMSG = (TextView) findViewById(R.id.viewsmssendpart1TextView1); tvAOHPCTCSeekBarMSG.setText(R.string.msg_100sendmsg); - mlvSMS = (SMSListViewForScrollView) findViewById(R.id.activitysmsinphoneListView1); - - // 准备数据 + mlvSMS = (SMSListViewForScrollView) findViewById(R.id.activitysmsSMSListViewForScrollView1); mSMSArrayAdapter = new SMSArrayAdapter(SMSActivity.this, mszPhoneTo); mlvSMS.setAdapter(mSMSArrayAdapter); - // 设置短信列表滚动到底部就取消已发送的通知消息 - // mlvSMS.setOnScrollListener(new AbsListView.OnScrollListener() { - @Override - public void onScrollStateChanged(AbsListView view, int scrollState) { - } + @Override + public void onScrollStateChanged(AbsListView view, int scrollState) {} - @Override - public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { - if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) { - // 滑动到了底部 - mSMSArrayAdapter.cancelMessageNotification(); - } - } - }); + @Override + public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { + if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) { + mSMSArrayAdapter.cancelMessageNotification(); + } + } + }); mSMSActivityBroadcastReceiver = new SMSActivityBroadcastReceiver(); - IntentFilter intentFilter = new IntentFilter(); - intentFilter.addAction(ACTION_NOTIFY_SMS_CHANGED); + IntentFilter intentFilter = new IntentFilter(ACTION_NOTIFY_SMS_CHANGED); LocalBroadcastManager.getInstance(this).registerReceiver(mSMSActivityBroadcastReceiver, intentFilter); - - /*SMSView mSMSView = findViewById(R.id.viewsmssendSMSView1); - mSMSView.setSMSType(SMSView.SMSType.SEND);*/ } - // - // 更新信息列表 - // + private void setupScrollView1Height() { + mScrollView1.postDelayed(new Runnable() { + @Override + public void run() { + final ScrollView scrollView2 = (ScrollView) findViewById(R.id.activitysmsScrollView2); + final BottomPositionFixedScrollView scrollView1 = (BottomPositionFixedScrollView) findViewById(R.id.activitysmsScrollView1); + final View includeView = findViewById(R.id.activitysmsinclude1); + + scrollView2.post(new Runnable() { + @Override + public void run() { + int scrollView2Height = scrollView2.getHeight(); + int includeHeight = includeView.getHeight(); + int targetHeight = Math.max(scrollView2Height - includeHeight, 0); + + LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) scrollView1.getLayoutParams(); + params.height = targetHeight; + scrollView1.setLayoutParams(params); + } + }); + } + }, 100); + } + public void updateSMSView() { mSMSArrayAdapter.reLoadSMSList(SMSActivity.this, mszPhoneTo); mSMSArrayAdapter.notifyDataSetChanged(); } - // - // 滚动消息文本框 - // void scrollScrollView() { - - ViewUtil.scrollScrollView(mScrollView); - + ViewUtil.scrollScrollView(mScrollView1); } - // - // 发送短信 - // void sendSMS() { - // 空消息不发送 String szSMSBody = metSMSBody.getText().toString(); if (szSMSBody.equals("")) { Toast.makeText(getApplication(), "没有消息内容可发送。", Toast.LENGTH_SHORT).show(); return; } - // 发送短信 if (SMSUtil.sendMessageByInterface2(this, mszPhoneTo, szSMSBody)) { metSMSBody.setText(""); - new Handler().postDelayed(new Runnable(){ - @Override - public void run() { - updateSMSView(); - ViewUtil.scrollScrollView(mScrollView); - } - }, 1000); + metSMSBody.clearFocus(); + new Handler().postDelayed(new Runnable() { + @Override + public void run() { + updateSMSView(); + ViewUtil.scrollScrollView(mScrollView1); + } + }, 1000); } } class SMSActivityBroadcastReceiver extends BroadcastReceiver { - - public SMSActivityBroadcastReceiver() { - //LogUtils.d(TAG, "SMSActivityBroadcastReceiver()"); - } + public SMSActivityBroadcastReceiver() {} @Override public void onReceive(Context context, Intent intent) { - switch (intent.getAction()) { - case ACTION_NOTIFY_SMS_CHANGED : - //Toast.makeText(context, "ACTION_NOTIFY_SMS_CHANGED", Toast.LENGTH_SHORT).show(); - updateSMSView(); - ViewUtil.scrollScrollView(mScrollView); - //LogUtils.d(TAG, "ACTION_NOTIFY_SMS_CHANGED"); - break; - default: - throw new IllegalStateException("Unexpected value: " + intent.getAction()); + if (ACTION_NOTIFY_SMS_CHANGED.equals(intent.getAction())) { + updateSMSView(); + ViewUtil.scrollScrollView(mScrollView1); + } else { + throw new IllegalStateException("Unexpected value: " + intent.getAction()); } - } - } - } + diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/BottomPositionFixedScrollView.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/BottomPositionFixedScrollView.java new file mode 100644 index 0000000..4c31b0e --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/BottomPositionFixedScrollView.java @@ -0,0 +1,125 @@ +package cc.winboll.studio.mymessagemanager.views; + +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/08/23 00:39 + * @Describe 多级拉动响应自定义控件 + */ +import android.content.Context; +import android.util.AttributeSet; +import android.view.ViewTreeObserver; +import android.widget.ScrollView; + +public class BottomPositionFixedScrollView extends ScrollView { + public static final String TAG = "BottomPositionFixedScrollView"; + // 记录底部对应的内容绝对位置(即底部位置在内容中的y坐标,该位置需始终保持在视图底部) + private int mBottomContentY = 0; + // 标记是否是首次布局(避免初始加载误触发) + private boolean isFirstLayout = true; + + public BottomPositionFixedScrollView(Context context) { + super(context); + init(); + } + + public BottomPositionFixedScrollView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public BottomPositionFixedScrollView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + // 监听布局变化(高度改变时触发) + getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { + @Override + public void onGlobalLayout() { + if (isFirstLayout) { + isFirstLayout = false; + return; + } + // 布局变化后,恢复底部位置 + restoreBottomPosition(); + } + }); + } + + /** + * 重写滚动事件,记录“底部对应的内容绝对位置” + * (即当前视图底部边缘对应的内容y坐标,该坐标需始终保持在视图底部) + */ + @Override + protected void onScrollChanged(int l, int t, int oldl, int oldt) { + super.onScrollChanged(l, t, oldl, oldt); + if (getChildCount() == 0) { + mBottomContentY = 0; + return; + } + + // 内容总高度 + int contentHeight = getChildAt(0).getMeasuredHeight(); + // 视图可视高度(自身高度) + int scrollViewHeight = getMeasuredHeight(); + // 当前视图底部边缘对应的内容y坐标 = 顶部滚动距离(t) + 可视高度 + // (该坐标就是“底部内容的绝对位置”,需始终保持在视图底部) + mBottomContentY = t + scrollViewHeight; + + // 避免超过内容总高度(比如内容不足一屏时,底部最多到内容底部) + if (mBottomContentY > contentHeight) { + mBottomContentY = contentHeight; + } + } + + /** + * 恢复底部位置:让原记录的“底部内容绝对位置”仍保持在视图底部 + */ + private void restoreBottomPosition() { + if (getChildCount() == 0) { + return; + } + + // 新的内容总高度 + int newContentHeight = getChildAt(0).getMeasuredHeight(); + // 新的视图可视高度 + int newScrollViewHeight = getMeasuredHeight(); + + // 目标:让原mBottomContentY(底部内容绝对位置)仍位于视图底部 + // 此时需要的顶部滚动距离 = mBottomContentY - 新的可视高度 + int targetScrollY = mBottomContentY - newScrollViewHeight; + + // 边界修正: + // 1. 不能小于0(避免滚动到负数位置) + // 2. 不能大于“最大可滚动距离”(内容高度 - 可视高度,避免超出内容范围) + int maxScrollY = Math.max(newContentHeight - newScrollViewHeight, 0); + targetScrollY = Math.max(targetScrollY, 0); + targetScrollY = Math.min(targetScrollY, maxScrollY); + + // 滚动到目标位置,保持底部内容位置不变 + smoothScrollTo(0, targetScrollY); + } + + /** + * 外部手动设置底部内容绝对位置(可选) + */ + public void setBottomContentY(int bottomContentY) { + if (getChildCount() == 0) { + mBottomContentY = bottomContentY; + return; + } + // 限制不超过内容总高度 + int contentHeight = getChildAt(0).getMeasuredHeight(); + mBottomContentY = Math.min(bottomContentY, contentHeight); + restoreBottomPosition(); + } + + /** + * 获取当前底部内容绝对位置(可选) + */ + public int getBottomContentY() { + return mBottomContentY; + } +} + diff --git a/mymessagemanager/src/main/res/layout/activity_sms.xml b/mymessagemanager/src/main/res/layout/activity_sms.xml index cf27fd4..a35f500 100644 --- a/mymessagemanager/src/main/res/layout/activity_sms.xml +++ b/mymessagemanager/src/main/res/layout/activity_sms.xml @@ -10,36 +10,40 @@ android:layout_height="@dimen/toolbar_height" android:id="@+id/activitysmsASupportToolbar1"/> - + android:layout_height="0dp" + android:layout_weight="1.0" + android:id="@+id/activitysmsScrollView2"> - + android:layout_height="match_parent" + android:id="@+id/activitysmsLinearLayout1"> - + + + + + + + android:id="@+id/activitysmsinclude1"/> + + - - - - - + diff --git a/mymessagemanager/src/main/res/layout/view_smssend_part1.xml b/mymessagemanager/src/main/res/layout/view_smssend_part1.xml index 4d48375..901efa9 100644 --- a/mymessagemanager/src/main/res/layout/view_smssend_part1.xml +++ b/mymessagemanager/src/main/res/layout/view_smssend_part1.xml @@ -7,6 +7,18 @@ android:layout_height="wrap_content" android:padding="10dp"> + + + + - - - - + diff --git a/mymessagemanager/src/main/res/values-zh/strings.xml b/mymessagemanager/src/main/res/values-zh/strings.xml index 407b1d8..d1acfc2 100644 --- a/mymessagemanager/src/main/res/values-zh/strings.xml +++ b/mymessagemanager/src/main/res/values-zh/strings.xml @@ -41,6 +41,6 @@ 应用设置 TTS播放延迟时间(秒): 接收到新的消息。 - >>>拉图标动到 100% 以发送信息。>>> - >>>拉图标动到 100% 应用设置。>>> + >>>拉动到100%可发信息>>> + >>>拉动到100%可应用设置>>> From 5507126f6bd24fa5092430103bd643f85f978523 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 23 Aug 2025 13:40:21 +0800 Subject: [PATCH 02/12] APK 15.3.2 release Publish. --- mymessagemanager/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 5d39d10..5c89ede 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 23 05:36:15 GMT 2025 -stageCount=2 +#Sat Aug 23 13:40:21 HKT 2025 +stageCount=3 libraryProject= baseVersion=15.3 -publishVersion=15.3.1 -buildCount=57 -baseBetaVersion=15.3.2 +publishVersion=15.3.2 +buildCount=0 +baseBetaVersion=15.3.3 From a4988b5b68e74c90bf7dd3c6edb22b4e66526091 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Thu, 28 Aug 2025 16:02:41 +0800 Subject: [PATCH 03/12] =?UTF-8?q?=E8=81=94=E7=B3=BB=E4=BA=BA=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E5=8F=91=E9=80=81=E7=AA=97=E5=8F=A3=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E6=8B=BC=E9=9F=B3=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymessagemanager/build.gradle | 2 + mymessagemanager/build.properties | 4 +- .../activitys/ComposeSMSActivity.java | 115 +++++++++-- .../mymessagemanager/utils/PhoneUtil.java | 183 +++++++++++++++--- .../mymessagemanager/utils/UnitAreaUtils.java | 20 +- .../main/res/layout/activity_composesms.xml | 68 +++++-- 6 files changed, 325 insertions(+), 67 deletions(-) diff --git a/mymessagemanager/build.gradle b/mymessagemanager/build.gradle index 4dea4e5..9f82e28 100644 --- a/mymessagemanager/build.gradle +++ b/mymessagemanager/build.gradle @@ -54,6 +54,8 @@ dependencies { api 'com.jcraft:jsch:0.1.55' api 'org.jsoup:jsoup:1.13.1' api 'com.squareup.okhttp3:okhttp:4.4.1' + + api 'com.belerweb:pinyin4j:2.5.1' // 权限请求框架:https://github.com/getActivity/XXPermissions api 'com.github.getActivity:XXPermissions:18.63' diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 5c89ede..539460c 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 23 13:40:21 HKT 2025 +#Thu Aug 28 08:00:22 GMT 2025 stageCount=3 libraryProject= baseVersion=15.3 publishVersion=15.3.2 -buildCount=0 +buildCount=22 baseBetaVersion=15.3.3 diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java index cd995b0..4ee6488 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java @@ -35,6 +35,8 @@ public class ComposeSMSActivity extends BaseActivity { String mszSMSBody; String mszScheme; String mszPhoneTo; + TextView mtvTOName; + EditText metTONameSearch; EditText metTO; EditText metSMSBody; SimpleAdapter mSimpleAdapter; @@ -59,9 +61,9 @@ public class ComposeSMSActivity extends BaseActivity { // 初始化视图 initView(); // 设置适配器 - initAdapter(); + initAdapter(null); // 设置搜索到的匹配位置 - setListViewPrePosition(); + setListViewPrePositionByPhone(); } // @@ -76,8 +78,25 @@ public class ComposeSMSActivity extends BaseActivity { setActionBar(mToolbar); // 初始化联系人栏目框 + mtvTOName = findViewById(R.id.activitycomposesmsTextView2); mrlContracts = findViewById(R.id.activitycomposesmsRelativeLayout1); //mrlContracts.setBackground(drawableFrame); + metTONameSearch = findViewById(R.id.activitycomposesmsEditText2); + metTONameSearch.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + metTO.setText(""); + setListViewPrePositionByName(); + } + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + } + + @Override + public void afterTextChanged(Editable s) { + + } + }); // 初始化联系人列表 mlvContracts = findViewById(R.id.activitycomposesmsListView1); @@ -88,7 +107,10 @@ public class ComposeSMSActivity extends BaseActivity { metTO.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { - setListViewPrePosition(); + mtvTOName.setText(""); + //重新加载数据 + initAdapter(null); + setListViewPrePositionByPhone(); } @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { @@ -96,6 +118,7 @@ public class ComposeSMSActivity extends BaseActivity { @Override public void afterTextChanged(Editable s) { + } }); @@ -136,18 +159,34 @@ public class ComposeSMSActivity extends BaseActivity { } // - // 设置搜索到的匹配位置 + // 设置号码搜索到的匹配位置 // - void setListViewPrePosition() { - int nPrePosition = getContractsDataPrePosition(metTO.getText().toString()); + void setListViewPrePositionByPhone() { + int nPrePosition = getContractsDataPrePositionByPhone(metTO.getText().toString()); + + PhoneUtil phoneUtils = new PhoneUtil(this); + mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); + mlvContracts.setSelected(false); mlvContracts.setSelection(nPrePosition); } + + // + // 设置名称搜索到的匹配位置 + // + void setListViewPrePositionByName() { + PhoneUtil phoneUtils = new PhoneUtil(this); + List newPhoneData = phoneUtils.getPhonesByName(metTONameSearch.getText().toString()); + // 重新绑定数据 + initAdapter(newPhoneData); + mlvContracts.setSelected(false); + } + // // 返回搜索到的匹配位置 // - int getContractsDataPrePosition(String szPhone) { + int getContractsDataPrePositionByPhone(String szPhone) { for (int i = 0; i < mListPhoneBeanContracts.size(); i++) { if (mListPhoneBeanContracts.get(i).getTelPhone().compareTo(szPhone) > -1) { return i; @@ -157,15 +196,65 @@ public class ComposeSMSActivity extends BaseActivity { return 0; } + + // + // 返回搜索到的匹配位置 + // + int getContractsDataPrePositionByName(String szName) { + for (int i = 0; i < mListPhoneBeanContracts.size(); i++) { + if (mListPhoneBeanContracts.get(i).getName().startsWith(szName)) { + return i; + } + + } + return 0; + } + // // 初始化适配器 // - void initAdapter() { + /*void initAdapter() { + // 初始化联系人数据适配器 + mAdapterData = new ArrayList<>(); + // 读取联系人数据 + final PhoneUtil phoneUtils = new PhoneUtil(this); + mListPhoneBeanContracts = phoneUtils.getPhoneList(); + // 映射联系人数据给适配器数据对象 + for (int i = 0;i < mListPhoneBeanContracts.size();i++) { + Map map =new HashMap<>(); + map.put(MAP_NAME, mListPhoneBeanContracts.get(i).getName()); + map.put(MAP_PHONE, mListPhoneBeanContracts.get(i).getTelPhone()); + mAdapterData.add(map); + } + // 绑定适配器与数据 + mSimpleAdapter = new SimpleAdapter(ComposeSMSActivity.this, mAdapterData, R.layout.listview_contracts + , new String[]{MAP_NAME, MAP_PHONE} + , new int[]{R.id.listviewcontractsTextView1, R.id.listviewcontractsTextView2}); + mSimpleAdapter.setDropDownViewResource(R.layout.listview_contracts); + mlvContracts.setAdapter(mSimpleAdapter); + mlvContracts.setOnItemClickListener(new ListView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + metTO.setText(mAdapterData.get(position).get(MAP_PHONE).toString()); + mListPhoneBeanContracts = phoneUtils.getPhoneList(); + mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); + + } + }); + }*/ + + void initAdapter(List initData) { // 初始化联系人数据适配器 - mAdapterData = new ArrayList<>(); - // 读取联系人数据 - PhoneUtil phoneUtils = new PhoneUtil(this); - mListPhoneBeanContracts = phoneUtils.getPhoneList(); + mAdapterData = new ArrayList<>(); + final PhoneUtil phoneUtils = new PhoneUtil(this); + if (initData != null) { + mListPhoneBeanContracts = initData; + } else { + // 读取联系人数据 + mListPhoneBeanContracts = phoneUtils.getPhoneList(); + } + // 映射联系人数据给适配器数据对象 for (int i = 0;i < mListPhoneBeanContracts.size();i++) { Map map =new HashMap<>(); @@ -184,7 +273,7 @@ public class ComposeSMSActivity extends BaseActivity { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { metTO.setText(mAdapterData.get(position).get(MAP_PHONE).toString()); - + mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); } }); } diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java index 993754c..5b48db1 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java @@ -5,6 +5,7 @@ package cc.winboll.studio.mymessagemanager.utils; * @Date 2024/07/19 14:30:57 * @Describe 手机联系人工具类 */ + import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -12,6 +13,12 @@ import android.net.Uri; import android.provider.ContactsContract; import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.beans.PhoneBean; +import net.sourceforge.pinyin4j.PinyinHelper; +import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType; +import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; +import net.sourceforge.pinyin4j.format.HanyuPinyinToneType; +import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; + import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; @@ -38,28 +45,137 @@ public class PhoneUtil { } // 读取所有联系人 - // public List getPhoneList() { List listPhoneBean = new ArrayList<>(); ContentResolver cr = mContext.getContentResolver(); Cursor cursor = cr.query(mUriPhoneContent, new String[]{NUMBER, DISPLAY_NAME}, null, null, null); - while (cursor.moveToNext()) { - PhoneBean phoneBean = new PhoneBean(cursor.getString(1), cursor.getString(0).replaceAll("\\s", "")); - listPhoneBean.add(phoneBean); - + if (cursor != null) { + while (cursor.moveToNext()) { + // 去除号码中的空格 + String phone = cursor.getString(0).replaceAll("\\s", ""); + String name = cursor.getString(1); + PhoneBean phoneBean = new PhoneBean(name, phone); + listPhoneBean.add(phoneBean); + } + cursor.close(); } - cursor.close(); + // 按电话号码排序 Collections.sort(listPhoneBean, new Comparator() { - @Override - public int compare(PhoneBean o1, PhoneBean o2) { - return o1.getTelPhone().compareTo(o2.getTelPhone()); - } - }); + @Override + public int compare(PhoneBean o1, PhoneBean o2) { + return o1.getTelPhone().compareTo(o2.getTelPhone()); + } + }); return listPhoneBean; } + /** + * 根据联系人名称查询号码(兼容拼音查询) + * @param keyword 搜索关键词(支持汉字、拼音、拼音首字母) + * @return 匹配的联系人列表(包含姓名和号码) + */ + public List getPhonesByName(String keyword) { + List result = new ArrayList<>(); + if (keyword == null || keyword.trim().isEmpty()) { + return result; // 关键词为空,返回空列表 + } + + // 获取所有联系人 + List allContacts = getPhoneList(); + // 统一转为小写,忽略大小写 + String keywordLower = keyword.trim().toLowerCase(); + + for (PhoneBean contact : allContacts) { + String name = contact.getName(); + if (name == null || name.isEmpty()) { + continue; + } + + // 1. 直接匹配姓名(包含关键词) + if (name.toLowerCase().contains(keywordLower)) { + result.add(contact); + continue; + } + + // 2. 匹配姓名的全拼(包含关键词) + String namePinyin = getPinyin(name).toLowerCase(); + if (namePinyin.contains(keywordLower)) { + result.add(contact); + continue; + } + + // 3. 匹配姓名的拼音首字母(包含关键词) + String namePinyinFirstLetter = getPinyinFirstLetter(name).toLowerCase(); + if (namePinyinFirstLetter.contains(keywordLower)) { + result.add(contact); + continue; + } + } + + return result; + } + + /** + * 将汉字转为全拼(不带声调,小写) + * 例如:"张三" → "zhangsan" + */ + private String getPinyin(String chinese) { + StringBuilder pinyin = new StringBuilder(); + HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); + format.setCaseType(HanyuPinyinCaseType.LOWERCASE); // 小写 + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); // 不带声调 + + char[] chars = chinese.toCharArray(); + for (char c : chars) { + // 如果是汉字,转换为拼音;否则直接拼接(如字母、数字、符号) + if (Character.toString(c).matches("[\\u4e00-\\u9fa5]")) { + try { + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format); + if (pinyinArray != null && pinyinArray.length > 0) { + pinyin.append(pinyinArray[0]); // 取第一个拼音(多音字默认取第一个) + } + } catch (BadHanyuPinyinOutputFormatCombination e) { + LogUtils.e(TAG, "拼音转换失败:" + e.getMessage()); + } + } else { + pinyin.append(c); + } + } + return pinyin.toString(); + } + + /** + * 将汉字转为拼音首字母(小写) + * 例如:"张三" → "zs" + */ + private String getPinyinFirstLetter(String chinese) { + StringBuilder firstLetters = new StringBuilder(); + HanyuPinyinOutputFormat format = new HanyuPinyinOutputFormat(); + format.setCaseType(HanyuPinyinCaseType.LOWERCASE); + format.setToneType(HanyuPinyinToneType.WITHOUT_TONE); + + char[] chars = chinese.toCharArray(); + for (char c : chars) { + if (Character.toString(c).matches("[\\u4e00-\\u9fa5]")) { + try { + String[] pinyinArray = PinyinHelper.toHanyuPinyinStringArray(c, format); + if (pinyinArray != null && pinyinArray.length > 0) { + // 取拼音首字母(如"zhang" → "z") + firstLetters.append(pinyinArray[0].charAt(0)); + } + } catch (BadHanyuPinyinOutputFormatCombination e) { + LogUtils.e(TAG, "拼音首字母转换失败:" + e.getMessage()); + } + } else { + // 非汉字直接拼接首字符(如"李3" → "l3") + firstLetters.append(c); + } + } + return firstLetters.toString(); + } + public boolean isPhoneInContacts(String szPhone) { List listPhoneDto = getPhoneList(); LogUtils.d(TAG, String.format("isPhoneInContacts(...) listPhoneDto.size() %d", listPhoneDto.size())); @@ -70,49 +186,56 @@ public class PhoneUtil { } return false; } - + + public String getNameByPhone(String szPhone) { + if (szPhone == null || szPhone.equals("")) { + return ""; + } + + List listPhoneDto = getPhoneList(); + LogUtils.d(TAG, String.format("getNameByPhone(...) listPhoneDto.size() %d", listPhoneDto.size())); + for (int i = 0; i < listPhoneDto.size(); i++) { + if (isTheSamePhoneNumber(listPhoneDto.get(i).getTelPhone(), szPhone)) { + return listPhoneDto.get(i).getName(); + } + } + return ""; + } + boolean isTheSamePhoneNumber(String szNum1, String szNum2) { - //LogUtils.d(TAG, String.format("szNum1 %s\nszNum2 %s", szNum1, szNum2)); - if(szNum1.equals(szNum2)) { + if (szNum1.equals(szNum2)) { LogUtils.d(TAG, "szNum1.equals(szNum2)"); return true; } - - if(UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum1)) { - if(szNum1.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum2))) { + + if (UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum1)) { + if (szNum1.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum2))) { LogUtils.d(TAG, "szNum1.equals(UnitAreaUtils.genCurrentUnitAreaNumber(szNum2))"); return true; } } - - if(UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum2)) { - if(szNum2.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum1))) { + + if (UnitAreaUtils.getInstance(mContext).isCurrentUnitAreaNumber(szNum2)) { + if (szNum2.equals(UnitAreaUtils.getInstance(mContext).genCurrentUnitAreaNumber(szNum1))) { LogUtils.d(TAG, "szNum2.equals(UnitAreaUtils.genCurrentUnitAreaNumber(szNum1))"); return true; } } - + LogUtils.d(TAG, "isTheSamePhoneNumber(...) return false;"); return false; } - // // 检验电话号码是否是数字 - // public static boolean isPhoneByDigit(String szPhone) { - if(!RegexPPiUtils.isPPiOK(szPhone)) { + if (!RegexPPiUtils.isPPiOK(szPhone)) { return false; } - //String text = "这里是一些任意的文本内容"; String regex = "[+]?\\d+"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(szPhone); LogUtils.d(TAG, String.format("matcher.matches() : %s", matcher.matches())); - /*if (matcher.matches()) { - System.out.println("文本满足该正则表达式模式"); - } else { - System.out.println("文本不满足该正则表达式模式"); - }*/ return matcher.matches(); } } + diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java index 4d106e6..8d531b8 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java @@ -10,9 +10,9 @@ import cc.winboll.studio.mymessagemanager.beans.AppConfigBean; import android.content.Context; public class UnitAreaUtils { - + public static final String TAG = "UnitAreaUtils"; - + static UnitAreaUtils _UnitAreaUtils; Context mContext; @@ -26,19 +26,25 @@ public class UnitAreaUtils { } return _UnitAreaUtils; } - + public boolean isCurrentUnitAreaNumber(String szPhoneNumer) { String szUnitArea = getUnitArea(); - LogUtils.d(TAG, String.format("szPhoneNumer.substring(1,3) %s", szPhoneNumer.substring(1,3))); - return szPhoneNumer.substring(1,3).equals(szUnitArea); + try { + String szPhoneNumerUnitArea = szPhoneNumer.substring(1, 3); + LogUtils.d(TAG, String.format("szPhoneNumerUnitArea %s", szPhoneNumerUnitArea)); + return szPhoneNumerUnitArea.equals(szUnitArea); + } catch (StringIndexOutOfBoundsException e) { + LogUtils.d(TAG, e, Thread.currentThread().getStackTrace()); + } + return false; } - + public String genCurrentUnitAreaNumber(String szPhoneNumer) { String szUnitArea = getUnitArea(); LogUtils.d(TAG, String.format("szUnitArea %s", szUnitArea)); return "+" + szUnitArea + szPhoneNumer; } - + String getUnitArea() { String szUnitArea = AppConfigUtil.getInstance(mContext).mAppConfigBean.getCountryCode(); LogUtils.d(TAG, String.format("szUnitArea %s", szUnitArea)); diff --git a/mymessagemanager/src/main/res/layout/activity_composesms.xml b/mymessagemanager/src/main/res/layout/activity_composesms.xml index 09f6358..fd06f8a 100644 --- a/mymessagemanager/src/main/res/layout/activity_composesms.xml +++ b/mymessagemanager/src/main/res/layout/activity_composesms.xml @@ -21,25 +21,63 @@ android:layout_height="wrap_content" android:id="@+id/activitycomposesmsRelativeLayout1"> - - - + android:layout_marginLeft="10dp" + android:layout_alignParentLeft="true"> + + + + + + + + + + + + + + + + From e13c8e7af05980a14fcb6cad473c6a8d86c48f57 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Thu, 28 Aug 2025 16:03:47 +0800 Subject: [PATCH 04/12] Start New Stage Version. --- mymessagemanager/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 539460c..40a1cc1 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,5 +1,5 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Aug 28 08:00:22 GMT 2025 +#Thu Aug 28 16:03:39 HKT 2025 stageCount=3 libraryProject= baseVersion=15.3 From 9ece6778b7b4b60dd911248fafff12e365cfc868 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Thu, 28 Aug 2025 21:13:38 +0800 Subject: [PATCH 05/12] APK 15.3.3 release Publish. --- mymessagemanager/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 40a1cc1..d2b80dc 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Aug 28 16:03:39 HKT 2025 -stageCount=3 +#Thu Aug 28 21:13:38 HKT 2025 +stageCount=4 libraryProject= baseVersion=15.3 -publishVersion=15.3.2 -buildCount=22 -baseBetaVersion=15.3.3 +publishVersion=15.3.3 +buildCount=0 +baseBetaVersion=15.3.4 From 52f738b45bb62e4588a7d8111cffcbd9230c2240 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 30 Aug 2025 11:40:55 +0800 Subject: [PATCH 06/12] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E9=80=89=E9=A1=B9?= =?UTF-8?q?=E5=BC=80=E5=85=B3=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymessagemanager/build.properties | 4 ++-- mymessagemanager/src/main/res/layout/activity_main.xml | 2 +- mymessagemanager/src/main/res/values-zh/strings.xml | 2 +- mymessagemanager/src/main/res/values/strings.xml | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index d2b80dc..a13cbbd 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Thu Aug 28 21:13:38 HKT 2025 +#Sat Aug 30 03:39:40 GMT 2025 stageCount=4 libraryProject= baseVersion=15.3 publishVersion=15.3.3 -buildCount=0 +buildCount=3 baseBetaVersion=15.3.4 diff --git a/mymessagemanager/src/main/res/layout/activity_main.xml b/mymessagemanager/src/main/res/layout/activity_main.xml index fe12c67..5f891a9 100644 --- a/mymessagemanager/src/main/res/layout/activity_main.xml +++ b/mymessagemanager/src/main/res/layout/activity_main.xml @@ -27,7 +27,7 @@ android:layout_width="match_parent" android:layout_height="60dp" android:padding="10dp" - android:text="@string/text_onlyreceivecontacts" + android:text="@string/text_norulesreceivecontacts" android:id="@+id/activitymainSwitchView2"/> 清理设置 发送短信 短信服务管理总开关 - 只接收联系人短信 + 无限制接收联系人短信 使用TTS语音播报 使用TTS语音自定义规则 短信管理服务已启动。 diff --git a/mymessagemanager/src/main/res/values/strings.xml b/mymessagemanager/src/main/res/values/strings.xml index 464d98b..b8b478d 100644 --- a/mymessagemanager/src/main/res/values/strings.xml +++ b/mymessagemanager/src/main/res/values/strings.xml @@ -34,7 +34,7 @@ Clean Setting Send SMS Main Service - Only Receive Contacts + No rules Receive Contacts Using TTS Using TTS Rule The main service is start. From 6d9adc124e94012c19467ba398f8600d7f4e44a1 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 30 Aug 2025 11:42:36 +0800 Subject: [PATCH 07/12] APK 15.3.4 release Publish. --- mymessagemanager/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index a13cbbd..c81b523 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 30 03:39:40 GMT 2025 -stageCount=4 +#Sat Aug 30 11:42:36 HKT 2025 +stageCount=5 libraryProject= baseVersion=15.3 -publishVersion=15.3.3 -buildCount=3 -baseBetaVersion=15.3.4 +publishVersion=15.3.4 +buildCount=0 +baseBetaVersion=15.3.5 From b374f3117a5feb2c2aa32a68e4e118e5fee45476 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 30 Aug 2025 21:15:01 +0800 Subject: [PATCH 08/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=81=94=E7=B3=BB?= =?UTF-8?q?=E4=BA=BA=E6=9F=A5=E8=AF=A2=E4=B8=8E=E7=9F=AD=E4=BF=A1=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=A1=86=EF=BC=8C=E5=9C=A8=E6=90=9C=E7=B4=A2=E5=88=B0?= =?UTF-8?q?=E7=A9=BA=E6=95=B0=E6=8D=AE=E6=97=B6=E7=9A=84=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymessagemanager/build.properties | 4 +- .../activitys/ComposeSMSActivity.java | 440 ++++++++++-------- .../mymessagemanager/utils/PhoneUtil.java | 7 +- 3 files changed, 243 insertions(+), 208 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index c81b523..fe062c9 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 30 11:42:36 HKT 2025 +#Sat Aug 30 13:11:45 GMT 2025 stageCount=5 libraryProject= baseVersion=15.3 publishVersion=15.3.4 -buildCount=0 +buildCount=4 baseBetaVersion=15.3.5 diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java index 4ee6488..5229fd5 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/ComposeSMSActivity.java @@ -1,5 +1,10 @@ package cc.winboll.studio.mymessagemanager.activitys; +/** + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/08/30 14:32 + * @Describe 联系人查询与短信发送窗口 + */ import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -11,13 +16,17 @@ import android.widget.RelativeLayout; import android.widget.SimpleAdapter; import android.widget.TextView; import android.widget.Toolbar; +import android.content.Intent; +import android.graphics.drawable.Drawable; + import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; import cc.winboll.studio.mymessagemanager.R; -import cc.winboll.studio.mymessagemanager.activitys.ComposeSMSActivity; import cc.winboll.studio.mymessagemanager.beans.PhoneBean; import cc.winboll.studio.mymessagemanager.utils.PhoneUtil; import cc.winboll.studio.mymessagemanager.utils.SMSUtil; import com.hjq.toast.ToastUtils; +import cc.winboll.studio.libappbase.LogUtils; + import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -26,255 +35,282 @@ import java.util.Map; public class ComposeSMSActivity extends BaseActivity { public static String TAG = "ComposeSMSActivity"; - public static String EXTRA_SMSBODY = "sms_body"; + private static final String MAP_NAME = "NAME"; + private static final String MAP_PHONE = "PHONE"; - static String MAP_NAME = "NAME"; - static String MAP_PHONE = "PHONE"; - - String mszSMSBody; - String mszScheme; - String mszPhoneTo; - TextView mtvTOName; - EditText metTONameSearch; - EditText metTO; - EditText metSMSBody; - SimpleAdapter mSimpleAdapter; - List> mAdapterData = new ArrayList<>(); - ListView mlvContracts; - List mListPhoneBeanContracts; - Toolbar mToolbar; - AOHPCTCSeekBar mAOHPCTCSeekBar; - RelativeLayout mrlContracts; + private String mszSMSBody; + private String mszScheme; + private String mszPhoneTo; + private TextView mtvTOName; + private EditText metTONameSearch; + private EditText metTO; + private EditText metSMSBody; + private SimpleAdapter mSimpleAdapter; + private List> mAdapterData = new ArrayList>(); + private ListView mlvContracts; + private List mListPhoneBeanContracts; + private Toolbar mToolbar; + private AOHPCTCSeekBar mAOHPCTCSeekBar; + private RelativeLayout mrlContracts; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_composesms); - mszSMSBody = getIntent().getStringExtra(EXTRA_SMSBODY); - mszScheme = getIntent().getData().getScheme(); - mszPhoneTo = getIntent().getData().getSchemeSpecificPart(); - if (!mszScheme.equals("smsto")) { - // 其他方式未支持就退出 - finish(); + + // 初始化Intent数据(增加空判断,避免NullPointerException) + Intent intent = getIntent(); + if (intent != null) { + mszSMSBody = intent.getStringExtra(EXTRA_SMSBODY); + if (intent.getData() != null) { + mszScheme = intent.getData().getScheme(); + mszPhoneTo = intent.getData().getSchemeSpecificPart(); + } } - // 初始化视图 + + // 校验启动方式,非smsto则退出 + if (mszScheme == null || !"smsto".equals(mszScheme)) { + ToastUtils.show("不支持的启动方式"); + finish(); + return; + } + initView(); - // 设置适配器 - initAdapter(null); - // 设置搜索到的匹配位置 + initAdapter(null); // 初始加载所有联系人 setListViewPrePositionByPhone(); } - // - // 初始化视图 - // - void initView() { - //Drawable drawableFrame = AppCompatResources.getDrawable(this, R.drawable.bg_frame); - + private void initView() { // 初始化标题栏 - mToolbar = findViewById(R.id.activitycomposesmsASupportToolbar1); + mToolbar = (Toolbar) findViewById(R.id.activitycomposesmsASupportToolbar1); mToolbar.setSubtitle(getString(R.string.activity_name_composesms)); setActionBar(mToolbar); - // 初始化联系人栏目框 - mtvTOName = findViewById(R.id.activitycomposesmsTextView2); - mrlContracts = findViewById(R.id.activitycomposesmsRelativeLayout1); - //mrlContracts.setBackground(drawableFrame); - metTONameSearch = findViewById(R.id.activitycomposesmsEditText2); - metTONameSearch.addTextChangedListener(new TextWatcher() { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - metTO.setText(""); - setListViewPrePositionByName(); - } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } + // 初始化联系人姓名显示和搜索栏 + mtvTOName = (TextView) findViewById(R.id.activitycomposesmsTextView2); + mrlContracts = (RelativeLayout) findViewById(R.id.activitycomposesmsRelativeLayout1); + metTONameSearch = (EditText) findViewById(R.id.activitycomposesmsEditText2); - @Override - public void afterTextChanged(Editable s) { + // 姓名搜索框文本变化监听 + metTONameSearch.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + metTO.setText(""); // 清空号码输入框,避免冲突 + String input = s == null ? "" : s.toString().trim(); + if (input.isEmpty()) { + initAdapter(null); // 空搜索时显示所有联系人 + } else { + setListViewPrePositionByName(); // 按姓名搜索 + } + } - } - }); + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // 无操作 + } - // 初始化联系人列表 - mlvContracts = findViewById(R.id.activitycomposesmsListView1); - - // 初始化联系人输入框 - metTO = findViewById(R.id.activitycomposesmsEditText1); - metTO.setText(mszPhoneTo); - metTO.addTextChangedListener(new TextWatcher() { - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) { - mtvTOName.setText(""); - //重新加载数据 - initAdapter(null); - setListViewPrePositionByPhone(); - } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { - } - - @Override - public void afterTextChanged(Editable s) { - - } - }); - - // 初始化发送拉动控件 - mAOHPCTCSeekBar = findViewById(R.id.viewsmssendpart1AOHPCTCSeekBar1); - mAOHPCTCSeekBar.setThumb(getDrawable(R.drawable.ic_message)); - mAOHPCTCSeekBar.setThumbOffset(20); - mAOHPCTCSeekBar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { - @Override - public void onOHPCommit() { - // 空号码不发送 - mszPhoneTo = metTO.getText().toString(); - if (mszPhoneTo.trim().equals("")) { - ToastUtils.show("没有设置接收号码。"); - return; - } - // 空消息不发送 - mszSMSBody = metSMSBody.getText().toString(); - if (mszSMSBody.equals("")) { - ToastUtils.show("没有消息内容可发送。"); - return; - } - // 发送消息 - if (SMSUtil.sendMessageByInterface2(ComposeSMSActivity.this, mszPhoneTo, mszSMSBody)) { - ComposeSMSActivity.this.finish(); - } - } + @Override + public void afterTextChanged(Editable s) { + // 无操作 + } }); - // 初始化提示框 - TextView tvAOHPCTCSeekBarMSG = findViewById(R.id.viewsmssendpart1TextView1); + // 初始化联系人列表 + mlvContracts = (ListView) findViewById(R.id.activitycomposesmsListView1); + + // 初始化号码输入框(核心:优化文本变化监听逻辑) + metTO = (EditText) findViewById(R.id.activitycomposesmsEditText1); + if (mszPhoneTo != null) { + metTO.setText(mszPhoneTo); + } + metTO.addTextChangedListener(new TextWatcher() { + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + mtvTOName.setText(""); // 清空姓名显示 + String inputPhone = s == null ? "" : s.toString().trim(); + + if (inputPhone.isEmpty()) { + // 输入为空时,显示所有联系人 + initAdapter(null); + } else { + // 输入非空时,按号码搜索并更新列表(无结果则清空) + filterListByPhone(inputPhone); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + // 无操作 + } + + @Override + public void afterTextChanged(Editable s) { + // 无操作 + } + }); + + // 初始化发送控件 + mAOHPCTCSeekBar = (AOHPCTCSeekBar) findViewById(R.id.viewsmssendpart1AOHPCTCSeekBar1); + Drawable thumbDrawable = getResources().getDrawable(R.drawable.ic_message); // Java 7兼容写法 + mAOHPCTCSeekBar.setThumb(thumbDrawable); + mAOHPCTCSeekBar.setThumbOffset(20); + mAOHPCTCSeekBar.setOnOHPCListener(new AOHPCTCSeekBar.OnOHPCListener() { + @Override + public void onOHPCommit() { + sendSMS(); + } + }); + + // 初始化短信内容输入框 + TextView tvAOHPCTCSeekBarMSG = (TextView) findViewById(R.id.viewsmssendpart1TextView1); tvAOHPCTCSeekBarMSG.setText(R.string.msg_100sendmsg); - - // 初始化发送消息框 - metSMSBody = findViewById(R.id.viewsmssendpart1EditText1); - //metSMSBody.setBackground(drawableFrame); - metSMSBody.setText(mszSMSBody); + metSMSBody = (EditText) findViewById(R.id.viewsmssendpart1EditText1); + if (mszSMSBody != null) { + metSMSBody.setText(mszSMSBody); + } } - // - // 设置号码搜索到的匹配位置 - // - void setListViewPrePositionByPhone() { - int nPrePosition = getContractsDataPrePositionByPhone(metTO.getText().toString()); + // 核心优化:根据输入号码筛选列表(无结果则显示空列表) + private void filterListByPhone(String inputPhone) { + PhoneUtil phoneUtil = new PhoneUtil(this); + List allContacts = phoneUtil.getPhoneList(); + List matchedContacts = new ArrayList(); - PhoneUtil phoneUtils = new PhoneUtil(this); - mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); + // 遍历所有联系人,匹配包含输入号码的联系人 + for (PhoneBean contact : allContacts) { + if (contact.getTelPhone().contains(inputPhone) + || phoneUtil.isTheSamePhoneNumber(contact.getTelPhone(), inputPhone)) { + matchedContacts.add(contact); + } + } - mlvContracts.setSelected(false); - mlvContracts.setSelection(nPrePosition); + LogUtils.d(TAG, "号码搜索:输入'" + inputPhone + "', 匹配" + matchedContacts.size() + "个结果"); + + // 用筛选结果更新列表(无结果则传入空列表) + initAdapter(matchedContacts.isEmpty() ? new ArrayList() : matchedContacts); + + // 定位到第一个匹配项(如果有) + if (!matchedContacts.isEmpty()) { + mlvContracts.setSelection(0); + mtvTOName.setText(matchedContacts.get(0).getName()); + } else { + mtvTOName.setText(""); // 无结果时清空姓名显示 + } } - - // - // 设置名称搜索到的匹配位置 - // - void setListViewPrePositionByName() { - PhoneUtil phoneUtils = new PhoneUtil(this); - List newPhoneData = phoneUtils.getPhonesByName(metTONameSearch.getText().toString()); - // 重新绑定数据 - initAdapter(newPhoneData); - mlvContracts.setSelected(false); + // 根据姓名搜索联系人 + private void setListViewPrePositionByName() { + String searchName = metTONameSearch.getText().toString().trim(); + PhoneUtil phoneUtil = new PhoneUtil(this); + List matchedContacts = phoneUtil.getPhonesByName(searchName); + initAdapter(matchedContacts); + if (!matchedContacts.isEmpty()) { + mlvContracts.setSelection(0); + } } - // - // 返回搜索到的匹配位置 - // - int getContractsDataPrePositionByPhone(String szPhone) { + // 初始定位号码对应的联系人 + private void setListViewPrePositionByPhone() { + String inputPhone = metTO.getText().toString().trim(); + if (inputPhone.isEmpty()) { + return; + } + filterListByPhone(inputPhone); // 复用筛选逻辑 + } + + // 获取号码匹配的位置(兼容旧逻辑) + private int getContractsDataPrePositionByPhone(String szPhone) { + if (mListPhoneBeanContracts == null || mListPhoneBeanContracts.isEmpty()) { + return 0; + } for (int i = 0; i < mListPhoneBeanContracts.size(); i++) { - if (mListPhoneBeanContracts.get(i).getTelPhone().compareTo(szPhone) > -1) { + PhoneBean bean = mListPhoneBeanContracts.get(i); + if (bean.getTelPhone().compareTo(szPhone) >= 0) { return i; } - } return 0; } - - // - // 返回搜索到的匹配位置 - // - int getContractsDataPrePositionByName(String szName) { + // 获取姓名匹配的位置(兼容旧逻辑) + private int getContractsDataPrePositionByName(String szName) { + if (mListPhoneBeanContracts == null || mListPhoneBeanContracts.isEmpty()) { + return 0; + } for (int i = 0; i < mListPhoneBeanContracts.size(); i++) { if (mListPhoneBeanContracts.get(i).getName().startsWith(szName)) { return i; } - } return 0; } - // - // 初始化适配器 - // - /*void initAdapter() { - // 初始化联系人数据适配器 - mAdapterData = new ArrayList<>(); - // 读取联系人数据 - final PhoneUtil phoneUtils = new PhoneUtil(this); - mListPhoneBeanContracts = phoneUtils.getPhoneList(); - // 映射联系人数据给适配器数据对象 - for (int i = 0;i < mListPhoneBeanContracts.size();i++) { - Map map =new HashMap<>(); - map.put(MAP_NAME, mListPhoneBeanContracts.get(i).getName()); - map.put(MAP_PHONE, mListPhoneBeanContracts.get(i).getTelPhone()); - mAdapterData.add(map); - } - // 绑定适配器与数据 - mSimpleAdapter = new SimpleAdapter(ComposeSMSActivity.this, mAdapterData, R.layout.listview_contracts - , new String[]{MAP_NAME, MAP_PHONE} - , new int[]{R.id.listviewcontractsTextView1, R.id.listviewcontractsTextView2}); - mSimpleAdapter.setDropDownViewResource(R.layout.listview_contracts); - mlvContracts.setAdapter(mSimpleAdapter); - mlvContracts.setOnItemClickListener(new ListView.OnItemClickListener() { + // 初始化或更新列表适配器 + private void initAdapter(List initData) { + mAdapterData.clear(); // 清空旧数据 + final PhoneUtil phoneUtil = new PhoneUtil(this); - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - metTO.setText(mAdapterData.get(position).get(MAP_PHONE).toString()); - mListPhoneBeanContracts = phoneUtils.getPhoneList(); - mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); - - } - }); - }*/ - - void initAdapter(List initData) { - // 初始化联系人数据适配器 - mAdapterData = new ArrayList<>(); - final PhoneUtil phoneUtils = new PhoneUtil(this); + // 确定数据源:传入的筛选数据或所有联系人 if (initData != null) { - mListPhoneBeanContracts = initData; - } else { - // 读取联系人数据 - mListPhoneBeanContracts = phoneUtils.getPhoneList(); - } - - // 映射联系人数据给适配器数据对象 - for (int i = 0;i < mListPhoneBeanContracts.size();i++) { - Map map =new HashMap<>(); - map.put(MAP_NAME, mListPhoneBeanContracts.get(i).getName()); - map.put(MAP_PHONE, mListPhoneBeanContracts.get(i).getTelPhone()); - mAdapterData.add(map); + mListPhoneBeanContracts = initData; + } else { + mListPhoneBeanContracts = phoneUtil.getPhoneList(); } - // 绑定适配器与数据 - mSimpleAdapter = new SimpleAdapter(ComposeSMSActivity.this, mAdapterData, R.layout.listview_contracts - , new String[]{MAP_NAME, MAP_PHONE} - , new int[]{R.id.listviewcontractsTextView1, R.id.listviewcontractsTextView2}); - mSimpleAdapter.setDropDownViewResource(R.layout.listview_contracts); - mlvContracts.setAdapter(mSimpleAdapter); - mlvContracts.setOnItemClickListener(new ListView.OnItemClickListener() { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - metTO.setText(mAdapterData.get(position).get(MAP_PHONE).toString()); - mtvTOName.setText(phoneUtils.getNameByPhone(metTO.getText().toString())); - } - }); + // 转换数据为SimpleAdapter所需格式 + if (mListPhoneBeanContracts != null) { + for (PhoneBean bean : mListPhoneBeanContracts) { + Map map = new HashMap(); + map.put(MAP_NAME, bean.getName()); + map.put(MAP_PHONE, bean.getTelPhone()); + mAdapterData.add(map); + } + } + + // 初始化或更新适配器 + if (mSimpleAdapter == null) { + mSimpleAdapter = new SimpleAdapter( + ComposeSMSActivity.this, + mAdapterData, + R.layout.listview_contracts, + new String[]{MAP_NAME, MAP_PHONE}, + new int[]{R.id.listviewcontractsTextView1, R.id.listviewcontractsTextView2} + ); + mSimpleAdapter.setDropDownViewResource(R.layout.listview_contracts); + mlvContracts.setAdapter(mSimpleAdapter); + + // 列表项点击事件 + mlvContracts.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + if (position < mAdapterData.size()) { + String phone = mAdapterData.get(position).get(MAP_PHONE).toString(); + metTO.setText(phone); + mtvTOName.setText(phoneUtil.getNameByPhone(phone)); + } + } + }); + } else { + mSimpleAdapter.notifyDataSetChanged(); // 数据更新时通知适配器 + } + } + + // 发送短信逻辑 + private void sendSMS() { + String phoneTo = metTO.getText().toString().trim(); + if (phoneTo.isEmpty()) { + ToastUtils.show("没有设置接收号码。"); + return; + } + String smsBody = metSMSBody.getText().toString().trim(); + if (smsBody.isEmpty()) { + ToastUtils.show("没有消息内容可发送。"); + return; + } + if (SMSUtil.sendMessageByInterface2(ComposeSMSActivity.this, phoneTo, smsBody)) { + finish(); + } } } + diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java index 5b48db1..d36ce2c 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PhoneUtil.java @@ -1,11 +1,10 @@ package cc.winboll.studio.mymessagemanager.utils; /** - * @Author ZhanGSKen - * @Date 2024/07/19 14:30:57 + * @Author ZhanGSKen&豆包大模型 + * @Date 2025/08/30 14:32 * @Describe 手机联系人工具类 */ - import android.content.ContentResolver; import android.content.Context; import android.database.Cursor; @@ -202,7 +201,7 @@ public class PhoneUtil { return ""; } - boolean isTheSamePhoneNumber(String szNum1, String szNum2) { + public boolean isTheSamePhoneNumber(String szNum1, String szNum2) { if (szNum1.equals(szNum2)) { LogUtils.d(TAG, "szNum1.equals(szNum2)"); return true; From 3795cf8631dbeb8af61d70eea6a4889579b10988 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 31 Aug 2025 01:10:33 +0800 Subject: [PATCH 09/12] APK 15.3.5 release Publish. --- mymessagemanager/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index fe062c9..ca87b9f 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 30 13:11:45 GMT 2025 -stageCount=5 +#Sun Aug 31 01:10:33 HKT 2025 +stageCount=6 libraryProject= baseVersion=15.3 -publishVersion=15.3.4 -buildCount=4 -baseBetaVersion=15.3.5 +publishVersion=15.3.5 +buildCount=0 +baseBetaVersion=15.3.6 From 687fff7216e375c7cfa567c77758f7bc9e158a65 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 31 Aug 2025 06:10:17 +0800 Subject: [PATCH 10/12] Start New Stage Version. --- mymessagemanager/build.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index ca87b9f..d6f6e2f 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,5 +1,5 @@ #Created by .winboll/winboll_app_build.gradle -#Sun Aug 31 01:10:33 HKT 2025 +#Sun Aug 31 06:10:16 CST 2025 stageCount=6 libraryProject= baseVersion=15.3 From 2421ecb94374f1067f61abc2840f856a94beaec8 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 31 Aug 2025 06:12:49 +0800 Subject: [PATCH 11/12] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=B1=BB=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mymessagemanager/build.gradle | 6 +++--- mymessagemanager/build.properties | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.gradle b/mymessagemanager/build.gradle index 9f82e28..ca1b9a7 100644 --- a/mymessagemanager/build.gradle +++ b/mymessagemanager/build.gradle @@ -45,9 +45,9 @@ android { dependencies { api fileTree(dir: 'libs', include: ['*.jar']) - api 'cc.winboll.studio:libaes:15.9.2' - api 'cc.winboll.studio:libapputils:15.8.4' - api 'cc.winboll.studio:libappbase:15.8.4' + api 'cc.winboll.studio:libaes:15.9.3' + api 'cc.winboll.studio:libapputils:15.8.5' + api 'cc.winboll.studio:libappbase:15.9.5' api 'io.github.medyo:android-about-page:2.0.0' api 'com.github.getActivity:ToastUtils:10.5' diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index d6f6e2f..f6f8070 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sun Aug 31 06:10:16 CST 2025 +#Sat Aug 30 22:12:11 GMT 2025 stageCount=6 libraryProject= baseVersion=15.3 publishVersion=15.3.5 -buildCount=0 +buildCount=1 baseBetaVersion=15.3.6 From 870e9a94fba473d6445fff10ee3ccbea9d44414e Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sun, 31 Aug 2025 06:13:45 +0800 Subject: [PATCH 12/12] APK 15.3.6 release Publish. --- mymessagemanager/build.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index f6f8070..68eda2b 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Aug 30 22:12:11 GMT 2025 -stageCount=6 +#Sun Aug 31 06:13:45 CST 2025 +stageCount=7 libraryProject= baseVersion=15.3 -publishVersion=15.3.5 -buildCount=1 -baseBetaVersion=15.3.6 +publishVersion=15.3.6 +buildCount=0 +baseBetaVersion=15.3.7