diff --git a/mymessagemanager/build.gradle b/mymessagemanager/build.gradle index 7f9a2d1..32cf15f 100644 --- a/mymessagemanager/build.gradle +++ b/mymessagemanager/build.gradle @@ -18,18 +18,18 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 30 - buildToolsVersion "30.0.3" + compileSdkVersion 32 + buildToolsVersion "32.0.0" defaultConfig { applicationId "cc.winboll.studio.mymessagemanager" - minSdkVersion 26 + minSdkVersion 24 targetSdkVersion 29 versionCode 8 // versionName 更新后需要手动设置 // .winboll/winbollBuildProps.properties 文件的 stageCount=0 // Gradle编译环境下合起来的 versionName 就是 "${versionName}.0" - versionName "4.1" + versionName "15.2" if(true) { versionName = genVersionName("${versionName}") } @@ -44,26 +44,27 @@ android { } dependencies { - api 'cc.winboll.studio:winboll-shared:1.6.4' - api 'io.github.medyo:android-about-page:2.0.0' + api fileTree(dir: 'libs', include: ['*.jar']) + api 'cc.winboll.studio:libaes:15.6.0' + api 'cc.winboll.studio:libapputils:15.3.4' + api 'cc.winboll.studio:libappbase:15.7.6' + + api 'io.github.medyo:android-about-page:2.0.0' api 'com.github.getActivity:ToastUtils:10.5' api 'com.jcraft:jsch:0.1.55' api 'org.jsoup:jsoup:1.13.1' api 'com.squareup.okhttp3:okhttp:4.4.1' - api 'androidx.appcompat:appcompat:1.0.0' - api 'androidx.fragment:fragment:1.0.0' - api 'com.google.android.material:material:1.0.0' - // 权限请求框架:https://github.com/getActivity/XXPermissions api 'com.github.getActivity:XXPermissions:18.63' api 'com.baoyz.pullrefreshlayout:library:1.2.0' - api 'androidx.appcompat:appcompat:1.0.0' - api 'androidx.fragment:fragment:1.0.0' + // AndroidX 类库 + api 'androidx.appcompat:appcompat:1.1.0' + api 'com.google.android.material:material:1.4.0' + //api 'androidx.viewpager:viewpager:1.0.0' + //api 'androidx.vectordrawable:vectordrawable:1.1.0' + //api 'androidx.vectordrawable:vectordrawable-animated:1.1.0' + //api 'androidx.fragment:fragment:1.1.0' api 'com.google.android.material:material:1.0.0' - - api 'cc.winboll.studio:libaes:7.6.0' - - api fileTree(dir: 'libs', include: ['*.jar']) } diff --git a/mymessagemanager/build.properties b/mymessagemanager/build.properties index 2414519..4994138 100644 --- a/mymessagemanager/build.properties +++ b/mymessagemanager/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Tue Feb 25 10:52:41 GMT 2025 -stageCount=14 +#Sat May 03 12:49:28 GMT 2025 +stageCount=5 libraryProject= -baseVersion=4.1 -publishVersion=4.1.13 -buildCount=5 -baseBetaVersion=4.1.14 +baseVersion=15.2 +publishVersion=15.2.4 +buildCount=14 +baseBetaVersion=15.2.5 diff --git a/mymessagemanager/src/main/AndroidManifest.xml b/mymessagemanager/src/main/AndroidManifest.xml index c1e89fa..7647205 100644 --- a/mymessagemanager/src/main/AndroidManifest.xml +++ b/mymessagemanager/src/main/AndroidManifest.xml @@ -53,30 +53,28 @@ + android:requestLegacyExternalStorage="true" + android:networkSecurityConfig="@xml/network_security_config"> + android:name=".activitys.SMSActivity"/> + android:name=".activitys.SMSReceiveRuleActivity"> @@ -98,17 +96,14 @@ + android:name=".activitys.TTSPlayRuleActivity"/> + android:name=".activitys.AboutActivity"/> + android:exported="true"> @@ -122,8 +117,7 @@ + android:exported="true"> @@ -226,6 +220,8 @@ + + diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/App.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/App.java new file mode 100644 index 0000000..7894f6d --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/App.java @@ -0,0 +1,46 @@ +package cc.winboll.studio.mymessagemanager; + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2023/07/24 01:46:59 + * @Describe 全局应用类 + */ +import android.view.Gravity; +import cc.winboll.studio.libappbase.GlobalApplication; +import cc.winboll.studio.mymessagemanager.R; +import com.hjq.toast.ToastUtils; +import java.io.File; + +public class App extends GlobalApplication { + + public static final String TAG = "GlobalApplication"; + + static String _mszAppExternalFilesDir; + static String _mszConfigUtilFileName = "ConfigUtil.json"; + static String _mszConfigUtilPath; + static String _mszSMSReceiveRuleUtilFileName = "SMSReceiveRuleUtil.json"; + static String _mszSMSReceiveRuleUtilPath; + + public static final int USER_ID = -1; + Long mszVersionName = 1L; + Long mszDataVersionName = 1L; + + + @Override + public void onCreate() { + super.onCreate(); + + // 初始化 Toast 框架 + ToastUtils.init(this); + // 设置 Toast 布局样式 + ToastUtils.setView(R.layout.toast_custom_view); + //ToastUtils.setStyle(new WhiteToastStyle()); + ToastUtils.setGravity(Gravity.BOTTOM, 0, 200); + + //LogUtils.d(TAG, "BuildConfig.DEBUG " + Boolean.toString(BuildConfig.DEBUG)); + + _mszAppExternalFilesDir = getExternalFilesDir(TAG).toString(); + _mszConfigUtilPath = _mszAppExternalFilesDir + File.separator + _mszConfigUtilFileName; + _mszSMSReceiveRuleUtilPath = _mszAppExternalFilesDir + File.separator + _mszSMSReceiveRuleUtilFileName; + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AboutActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AboutActivity.java index 4e1e4da..739c979 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AboutActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/AboutActivity.java @@ -3,72 +3,89 @@ package cc.winboll.studio.mymessagemanager.activitys; /** * @Author ZhanGSKen * @Date 2024/07/14 13:20:33 - * @Describe 应用关于对话窗口 + * @Describe 应用介绍窗口 */ -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import androidx.appcompat.widget.Toolbar; -import cc.winboll.studio.mymessagemanager.R; -import cc.winboll.studio.shared.app.WinBollActivity; -import cc.winboll.studio.shared.app.WinBollActivityManager; -import com.hjq.toast.ToastUtils; -import cc.winboll.studio.libaes.utils.AESThemeUtil; +import android.app.Activity; import android.content.Context; +import android.os.Bundle; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libaes.winboll.APPInfo; +import cc.winboll.studio.libaes.winboll.AboutView; +import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; +import cc.winboll.studio.mymessagemanager.App; +import cc.winboll.studio.mymessagemanager.R; -final public class AboutActivity extends WinBollActivity { +public class AboutActivity extends WinBollActivity implements IWinBoLLActivity { public static final String TAG = "AboutActivity"; Context mContext; - + Toolbar mToolbar; + + @Override + public Activity getActivity() { + return this; + } + @Override public String getTag() { return TAG; } - @Override - protected boolean isEnableDisplayHomeAsUp() { - return false; - } - @Override protected void onCreate(Bundle savedInstanceState) { - setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext())); super.onCreate(savedInstanceState); + mContext = this; setContentView(R.layout.activity_about); - mContext = getApplicationContext(); + + mToolbar = findViewById(R.id.toolbar); + setSupportActionBar(mToolbar); + mToolbar.setSubtitle(TAG); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + + AboutView aboutView = CreateAboutView(); + // 在 Activity 的 onCreate 或其他生命周期方法中调用 +// LinearLayout layout = new LinearLayout(this); +// layout.setOrientation(LinearLayout.VERTICAL); +// // 创建布局参数(宽度和高度) +// ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( +// ViewGroup.LayoutParams.MATCH_PARENT, +// ViewGroup.LayoutParams.MATCH_PARENT +// ); +// addContentView(aboutView, params); + + LinearLayout layout = findViewById(R.id.aboutviewroot_ll); + // 创建布局参数(宽度和高度) + ViewGroup.LayoutParams params = new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ); + layout.addView(aboutView, params); + + App.getWinBoLLActivityManager().add(this); } @Override - protected void onPostCreate(Bundle savedInstanceState) { - super.onPostCreate(savedInstanceState); - setTitle(mContext.getString(R.string.text_about) + mContext.getString(R.string.app_name)); + protected void onDestroy() { + super.onDestroy(); + App.getWinBoLLActivityManager().registeRemove(this); } - @Override - protected boolean isAddWinBollToolBar() { - return false; - } - - @Override - protected Toolbar initToolBar() { - return findViewById(R.id.activityaboutASupportToolbar1); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.toolbar_about, menu); - return super.onCreateOptionsMenu(menu); - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - /*if (item.getItemId() == R.id.item_help) { - ToastUtils.show("R.id.item_help"); - } else */if (item.getItemId() == android.R.id.home) { - WinBollActivityManager.getInstance(getApplicationContext()).finish(this); - } - return super.onOptionsItemSelected(item); + public AboutView CreateAboutView() { + String szBranchName = "mymessagemanager"; + APPInfo appInfo = new APPInfo(); + appInfo.setAppName(getString(R.string.app_name)); + appInfo.setAppIcon(cc.winboll.studio.libaes.R.drawable.ic_winboll); + appInfo.setAppDescription(getString(R.string.app_description)); + appInfo.setAppGitName("APP"); + appInfo.setAppGitOwner("Studio"); + appInfo.setAppGitAPPBranch(szBranchName); + appInfo.setAppGitAPPSubProjectFolder(szBranchName); + appInfo.setAppHomePage("https://www.winboll.cc/studio/details.php?app=MyMessageManager"); + appInfo.setAppAPKName("MyMessageManager"); + appInfo.setAppAPKFolderName("MyMessageManager"); + return new AboutView(mContext, appInfo); } } 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 e4aa350..0bf3ddd 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 @@ -17,6 +17,8 @@ import cc.winboll.studio.libaes.views.AToolbar; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil; import cc.winboll.studio.mymessagemanager.utils.PermissionUtil; +import cc.winboll.studio.mymessagemanager.utils.NotificationHelper; +import cc.winboll.studio.libappbase.dialogs.YesNoAlertDialog; public class AppSettingsActivity extends BaseActivity { @@ -96,4 +98,18 @@ public class AppSettingsActivity extends BaseActivity { Toast.makeText(getApplication(), "应用已获得所需权限。", Toast.LENGTH_SHORT).show(); } } + + public void onCleanOldChannels(View view) { + YesNoAlertDialog.show(this, "通知设置清理", "是否清理旧的通知设置?", new YesNoAlertDialog.OnDialogResultListener(){ + @Override + public void onNo() { + } + + @Override + public void onYes() { + NotificationHelper notificationHelper = new NotificationHelper(AppSettingsActivity.this); + notificationHelper.cleanOldChannels(); + } + }); + } } diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/BaseActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/BaseActivity.java index 233f18a..066c3c8 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/BaseActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/BaseActivity.java @@ -1,6 +1,5 @@ package cc.winboll.studio.mymessagemanager.activitys; -import cc.winboll.studio.mymessagemanager.R; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -8,9 +7,8 @@ import android.view.Menu; import android.view.MenuItem; import androidx.appcompat.app.AppCompatActivity; import cc.winboll.studio.libaes.utils.AESThemeUtil; -import cc.winboll.studio.shared.log.LogUtils; -import com.hjq.toast.ToastUtils; -import cc.winboll.studio.libaes.beans.AESThemeBean; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.mymessagemanager.R; abstract public class BaseActivity extends AppCompatActivity { @@ -103,7 +101,7 @@ abstract public class BaseActivity extends AppCompatActivity { AESThemeUtil.saveThemeStyleID(this, R.style.MyTaoAESTheme); recreate(); } else if (R.id.item_defaulttheme == item.getItemId()) { - AESThemeUtil.saveThemeStyleID(this, R.style.MyDefaultAESTheme); + AESThemeUtil.saveThemeStyleID(this, R.style.MyAppTheme); recreate(); } //ToastUtils.show("nThemeStyleID " + Integer.toString(nThemeStyleID)); 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 03a7a3c..cd995b0 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 @@ -10,7 +10,6 @@ import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.SimpleAdapter; import android.widget.TextView; -import android.widget.Toast; import android.widget.Toolbar; import cc.winboll.studio.libaes.views.AOHPCTCSeekBar; import cc.winboll.studio.mymessagemanager.R; 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 a2bdbd8..0f48111 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 @@ -10,28 +10,25 @@ import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ScrollView; -import cc.winboll.studio.libaes.views.AToolbar; +import androidx.appcompat.widget.Toolbar; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.mymessagemanager.App; import cc.winboll.studio.mymessagemanager.BuildConfig; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.MainActivity; import cc.winboll.studio.mymessagemanager.adapters.PhoneArrayAdapter; import cc.winboll.studio.mymessagemanager.services.MainService; +import cc.winboll.studio.mymessagemanager.unittest.UnitTestActivity; import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil; import cc.winboll.studio.mymessagemanager.utils.AppGoToSettingsUtil; -import cc.winboll.studio.mymessagemanager.utils.NotificationUtil; import cc.winboll.studio.mymessagemanager.utils.PermissionUtil; import cc.winboll.studio.mymessagemanager.utils.SMSUtil; -import cc.winboll.studio.mymessagemanager.utils.ThemeUtil; import cc.winboll.studio.mymessagemanager.utils.ViewUtil; import cc.winboll.studio.mymessagemanager.views.ConfirmSwitchView; import cc.winboll.studio.mymessagemanager.views.PhoneListViewForScrollView; -import cc.winboll.studio.shared.log.LogUtils; -import cc.winboll.studio.shared.log.LogView; import com.baoyz.widget.PullRefreshLayout; import java.util.ArrayList; -import cc.winboll.studio.libaes.utils.AESThemeUtil; -import cc.winboll.studio.libaes.views.ASupportToolbar; -import androidx.appcompat.widget.Toolbar; public class MainActivity extends BaseActivity { @@ -45,7 +42,7 @@ public class MainActivity extends BaseActivity { public static final int MY_PERMISSIONS_REQUEST = 0; static MainActivity _mMainActivity; - LogView mLogView; + //LogView mLogView; AppConfigUtil mAppConfigUtil; ConfirmSwitchView msvEnableService; ConfirmSwitchView msvOnlyReceiveContacts; @@ -121,8 +118,8 @@ public class MainActivity extends BaseActivity { // void initView() { // 设置调试日志 - mLogView = findViewById(R.id.logview); - mLogView.start(); +// mLogView = findViewById(R.id.logview); +// mLogView.start(); // 设置消息处理函数 setOnActivityMessageReceived(mIOnActivityMessageReceived); @@ -131,12 +128,7 @@ public class MainActivity extends BaseActivity { mToolbar = findViewById(R.id.activitymainASupportToolbar1); mToolbar.setSubtitle(getString(R.string.activity_name_main)); setSupportActionBar(mToolbar); - - // 创建通知频道 - NotificationUtil nu = new NotificationUtil(); - nu.createServiceNotificationChannel(MainActivity.this); - nu.createSMSNotificationChannel(MainActivity.this); - + boolean isEnableService = mAppConfigUtil.mAppConfigBean.isEnableService(); msvEnableService = findViewById(R.id.activitymainSwitchView1); msvEnableService.setChecked(isEnableService); @@ -270,7 +262,7 @@ public class MainActivity extends BaseActivity { protected void onResume() { super.onResume(); reloadSMS(); - mLogView.start(); + //mLogView.start(); } @Override @@ -303,27 +295,33 @@ public class MainActivity extends BaseActivity { int nItemId = item.getItemId(); if (nItemId == R.id.app_ttsrule) { Intent i = new Intent(MainActivity.this, TTSPlayRuleActivity.class); - i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } else if (nItemId == R.id.app_smsrule) { Intent i = new Intent(MainActivity.this, SMSReceiveRuleActivity.class); - i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } else if (nItemId == R.id.app_appsettings) { Intent i = new Intent(MainActivity.this, AppSettingsActivity.class); - i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); - } else if (nItemId == R.id.app_crashtest) { + } else if (nItemId == R.id.app_log) { + App.getWinBoLLActivityManager().startLogActivity(this); + } else if (nItemId == R.id.app_unittest) { + Intent i = new Intent(MainActivity.this, UnitTestActivity.class); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(i); + } else if (nItemId == R.id.app_crashtest) { for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) { getString(i); } } else if (nItemId == R.id.app_about) { Intent i = new Intent(MainActivity.this, AboutActivity.class); - i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } else if (nItemId == R.id.app_smsrecycle) { Intent i = new Intent(MainActivity.this, SMSRecycleActivity.class); - i.setFlags(Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT | Intent.FLAG_ACTIVITY_NEW_TASK); + i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(i); } 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 9f354fe..0cd570e 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 @@ -18,10 +18,10 @@ 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.SMSListViewForScrollView; -import cc.winboll.studio.mymessagemanager.views.SMSView; import java.lang.ref.WeakReference; public class SMSActivity extends BaseActivity { @@ -102,7 +102,7 @@ public class SMSActivity extends BaseActivity { // 初始化标题栏 mToolbar = findViewById(R.id.activitysmsASupportToolbar1); - mToolbar.setSubtitle(getString(R.string.activity_name_smsinphone) + " < Phone : " + mszPhoneTo + " >"); + mToolbar.setSubtitle(getString(R.string.activity_name_smsinphone) + " < Phone : " + AddressUtils.getFormattedAddress(mszPhoneTo) + " >"); setActionBar(mToolbar); // 初始化滚动窗口 diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSReceiveRuleActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSReceiveRuleActivity.java index ddbd8f6..d5452fc 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSReceiveRuleActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSReceiveRuleActivity.java @@ -21,7 +21,7 @@ import android.widget.Toast; import androidx.appcompat.widget.Toolbar; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import cc.winboll.studio.mymessagemanager.GlobalApplication; +import cc.winboll.studio.mymessagemanager.App; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.SMSReceiveRuleActivity; import cc.winboll.studio.mymessagemanager.adapters.SMSAcceptRuleArrayAdapter; @@ -114,7 +114,7 @@ public class SMSReceiveRuleActivity extends BaseActivity { } void initSMSAcceptRuleBeanAdd() { - mSMSAcceptRuleBeanAdd = new SMSAcceptRuleBean(GlobalApplication.USER_ID, "", true, SMSAcceptRuleBean.RuleType.REFUSE, true); + mSMSAcceptRuleBeanAdd = new SMSAcceptRuleBean(App.USER_ID, "", true, SMSAcceptRuleBean.RuleType.REFUSE, true); } @Override diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycleActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycleActivity.java index 4a1d75a..04492b5 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycleActivity.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/SMSRecycleActivity.java @@ -8,16 +8,16 @@ package cc.winboll.studio.mymessagemanager.activitys; 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.libappbase.dialogs.YesNoAlertDialog; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.SMSRecycleActivity; import cc.winboll.studio.mymessagemanager.adapters.SMSRecycleAdapter; import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil; -import cc.winboll.studio.shared.view.YesNoAlertDialog; import com.baoyz.widget.PullRefreshLayout; import java.io.File; -import androidx.appcompat.widget.Toolbar; public class SMSRecycleActivity extends BaseActivity { diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/WinBollActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/WinBollActivity.java new file mode 100644 index 0000000..0a5ae35 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/activitys/WinBollActivity.java @@ -0,0 +1,60 @@ +package cc.winboll.studio.mymessagemanager.activitys; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/31 01:31:17 + * @Describe 应用活动窗口基类 + */ +import android.app.Activity; +import android.os.Bundle; +import android.view.MenuItem; +import androidx.appcompat.app.AppCompatActivity; +import cc.winboll.studio.libaes.beans.AESThemeBean; +import cc.winboll.studio.libaes.utils.AESThemeUtil; +import cc.winboll.studio.libappbase.winboll.IWinBoLLActivity; + +public class WinBollActivity extends AppCompatActivity implements IWinBoLLActivity { + + public static final String TAG = "WinBollActivity"; + + protected volatile AESThemeBean.ThemeType mThemeType; + + @Override + public Activity getActivity() { + return this; + } + + @Override + public String getTag() { + return TAG; + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + mThemeType = getThemeType(); + setThemeStyle(); + super.onCreate(savedInstanceState); + } + + AESThemeBean.ThemeType getThemeType() { + /*SharedPreferences sharedPreferences = getSharedPreferences( + SHAREDPREFERENCES_NAME, MODE_PRIVATE); + return AESThemeBean.ThemeType.values()[((sharedPreferences.getInt(DRAWER_THEME_TYPE, AESThemeBean.ThemeType.DEFAULT.ordinal())))]; + */ + return AESThemeBean.getThemeStyleType(AESThemeUtil.getThemeTypeID(getApplicationContext())); + } + + void setThemeStyle() { + //setTheme(AESThemeBean.getThemeStyle(getThemeType())); + setTheme(AESThemeUtil.getThemeTypeID(getApplicationContext())); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if(item.getItemId() == android.R.id.home) { + finish(); + return true; + } + return super.onOptionsItemSelected(item); + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/PhoneArrayAdapter.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/PhoneArrayAdapter.java index b8b9454..12381bc 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/PhoneArrayAdapter.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/PhoneArrayAdapter.java @@ -9,13 +9,14 @@ import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.TextView; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; import cc.winboll.studio.mymessagemanager.beans.PhoneBean; import cc.winboll.studio.mymessagemanager.beans.SMSBean; +import cc.winboll.studio.mymessagemanager.utils.AddressUtils; import cc.winboll.studio.mymessagemanager.utils.PhoneUtil; import cc.winboll.studio.mymessagemanager.utils.SMSUtil; -import cc.winboll.studio.shared.log.LogUtils; import java.util.ArrayList; import java.util.List; @@ -74,9 +75,9 @@ public class PhoneArrayAdapter extends BaseAdapter { viewHolder = (ViewHolder) convertView.getTag(); } - String szAddress = ((SMSBean)getItem(position)).getAddress(); + final String szAddress = ((SMSBean)getItem(position)).getAddress(); - viewHolder.tvAddress.setText(szAddress); + viewHolder.tvAddress.setText(AddressUtils.getFormattedAddress(szAddress)); viewHolder.tvName.setText(getName(szAddress)); //Drawable drawableFrame = AppCompatResources.getDrawable(mContext, R.drawable.bg_frame); @@ -87,7 +88,7 @@ public class PhoneArrayAdapter extends BaseAdapter { //Toast.makeText(mContext, tv.getText(), Toast.LENGTH_SHORT).show(); Intent intent = new Intent(mContext, SMSActivity.class); - intent.putExtra(SMSActivity.EXTRA_PHONE, viewHolder.tvAddress.getText()); + intent.putExtra(SMSActivity.EXTRA_PHONE, szAddress); mContext.startActivity(intent); } diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSArrayAdapter.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSArrayAdapter.java index 4671ae4..8e5ed5a 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSArrayAdapter.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSArrayAdapter.java @@ -18,7 +18,6 @@ import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity; import cc.winboll.studio.mymessagemanager.beans.SMSBean; import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog; -import cc.winboll.studio.mymessagemanager.utils.NotificationUtil; import cc.winboll.studio.mymessagemanager.utils.SMSReceiveRuleUtil; import cc.winboll.studio.mymessagemanager.utils.SMSRecycleUtil; import cc.winboll.studio.mymessagemanager.utils.SMSUtil; @@ -28,6 +27,7 @@ import cc.winboll.studio.mymessagemanager.views.SMSView; import com.hjq.toast.ToastUtils; import java.util.ArrayList; import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean; +import cc.winboll.studio.mymessagemanager.utils.NotificationHelper; public class SMSArrayAdapter extends BaseAdapter { @@ -54,7 +54,8 @@ public class SMSArrayAdapter extends BaseAdapter { public void cancelMessageNotification() { for (SMSBean bean : mData) { - NotificationUtil.cancelNotification(mContext, bean.getId()); + NotificationHelper notificationHelper = new NotificationHelper(mContext); + notificationHelper.cancelNotification(bean.getId()); } } diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycleAdapter.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycleAdapter.java index 9226383..a89a13d 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycleAdapter.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/adapters/SMSRecycleAdapter.java @@ -34,6 +34,7 @@ import cc.winboll.studio.mymessagemanager.views.DateAgoTextView; import cc.winboll.studio.mymessagemanager.views.SMSView; import com.hjq.toast.ToastUtils; import java.util.ArrayList; +import cc.winboll.studio.mymessagemanager.utils.AddressUtils; public class SMSRecycleAdapter extends RecyclerView.Adapter { @@ -154,7 +155,7 @@ public class SMSRecycleAdapter extends RecyclerView.Adapter= 0) { - NotificationUtil nu = new NotificationUtil(); - nu.sendSMSReceivedMessage(context, nResultId, szSmsAddress, szSmsBody); + NotificationHelper notificationHelper = new NotificationHelper(context); + notificationHelper.sendSMSReceivedMessage(nResultId, szSmsAddress, szSmsBody); LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(SMSActivity.ACTION_NOTIFY_SMS_CHANGED)); - GlobalApplication.showApplicationMessage("<" + szSmsAddress + "> : ( " + szSmsBody + " ) [SAVED]"); + LogUtils.d(TAG, "<" + szSmsAddress + "> : ( " + szSmsBody + " ) [SAVED]"); if (isEnableTTS) { if (isEnableTTSAnalyzeMode) { TTSPlayRuleUtil ttsPlayRuleUtil = TTSPlayRuleUtil.getInstance(context); @@ -81,12 +67,41 @@ public class SMSRecevier extends BroadcastReceiver { SMSRecycleUtil.addSMSRecycleItem(context, bean); } } - - - } + // + // 检查短信是否在接收设定规则内 + // + public static boolean checkIsSMSOK(Context context, String szSmsBody, String szSmsAddress) { + PhoneUtil phoneUtil = new PhoneUtil(context); + boolean isPhoneInContacts = phoneUtil.isPhoneInContacts(szSmsAddress); + LogUtils.d(TAG, String.format("isPhoneInContacts %s", isPhoneInContacts)); + boolean isPhoneByDigit = phoneUtil.isPhoneByDigit(szSmsAddress); + LogUtils.d(TAG, String.format("isPhoneByDigit %s", isPhoneByDigit)); + + AppConfigUtil configUtil = AppConfigUtil.getInstance(context); + boolean isOnlyReceiveContacts = configUtil.mAppConfigBean.isEnableOnlyReceiveContacts(); + LogUtils.d(TAG, String.format("isOnlyReceiveContacts %s", isOnlyReceiveContacts)); + + boolean isInSMSAcceptRule = SMSReceiveRuleUtil.getInstance(context, false).checkIsSMSAcceptInRule(context, szSmsBody); + LogUtils.d(TAG, String.format("isInSMSAcceptRule %s", isInSMSAcceptRule)); + + // 启用了只接受通讯录,通讯录里有记录 + if (isOnlyReceiveContacts && isPhoneInContacts) { + return true; + } + // 如果不是数字通讯地址,但是在通讯录内 + if (!isPhoneByDigit && isPhoneInContacts) { + return true; + } + // 通讯地址是数字,并且在短信接收规则内。 + if (isPhoneByDigit && isInSMSAcceptRule) { + return true; + } + + return false; + } } diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java index f4e976c..9ba3151 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/services/MainService.java @@ -5,6 +5,7 @@ package cc.winboll.studio.mymessagemanager.services; * @Date 2024/07/19 14:30:57 * @Describe 应用主要服务组件类 */ +import android.app.Notification; import android.app.Service; import android.content.ComponentName; import android.content.Context; @@ -12,20 +13,24 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.ServiceConnection; import android.os.IBinder; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; +import cc.winboll.studio.mymessagemanager.activitys.MainActivity; import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean; import cc.winboll.studio.mymessagemanager.receivers.SMSRecevier; import cc.winboll.studio.mymessagemanager.services.MainService; import cc.winboll.studio.mymessagemanager.utils.AppConfigUtil; -import cc.winboll.studio.mymessagemanager.utils.NotificationUtil; +import cc.winboll.studio.mymessagemanager.utils.NotificationHelper; import cc.winboll.studio.mymessagemanager.utils.ServiceUtil; -import cc.winboll.studio.shared.log.LogUtils; import com.hjq.toast.ToastUtils; public class MainService extends Service { public static String TAG = "ManagerService"; + // 前台服务通知工具 + NotificationHelper mNotificationHelper; + Notification notification; AppConfigUtil mConfigUtil; //MyBinder mMyBinder; MyServiceConnection mMyServiceConnection; @@ -73,17 +78,12 @@ public class MainService extends Service { mSMSRecevier = new SMSRecevier(); registerReceiver(mSMSRecevier, localIntentFilter); - // 显示前台通知栏 - MessageNotificationBean notificationMessage = createNotificationMessage(); - NotificationUtil nu = new NotificationUtil(); - nu.sendForegroundNotification(MainService.this, notificationMessage); + NotificationHelper helper = new NotificationHelper(this); + Intent intent = new Intent(this, MainActivity.class); + notification = helper.showForegroundNotification(intent, getString(R.string.app_name), getString(R.string.text_aboutservernotification)); + startForeground(NotificationHelper.FOREGROUND_NOTIFICATION_ID, notification); - /*if (mConfigUtil.isEnableTTS()) { - TTSPlayRuleUtil.speakText(ManagerService.this, getString(R.string.text_iamhere), 0); - GlobalApplication.showApplicationMessage(getString(R.string.text_iamhere)); - }*/ - ToastUtils.show("Service is start."); LogUtils.i(TAG, "Service is start."); } @@ -101,13 +101,6 @@ public class MainService extends Service { } - private MessageNotificationBean createNotificationMessage() { - String szTitle = getApplicationContext().getString(R.string.app_name); - String szContent = getString(R.string.text_aboutservernotification); - return new MessageNotificationBean(NotificationUtil.ID_MSG_SERVICE, "", szTitle, szContent); - - } - @Override public int onStartCommand(Intent intent, int flags, int startId) { //return super.onStartCommand(intent, flags, startId); @@ -116,12 +109,12 @@ public class MainService extends Service { return mConfigUtil.mAppConfigBean.isEnableService() ? Service.START_STICKY: super.onStartCommand(intent, flags, startId); } - /*private class MyBinder extends IMyAidlInterface.Stub { - @Override - public String getServiceName() { - return MainService.class.getSimpleName(); - } - }*/ + /*private class MyBinder extends IMyAidlInterface.Stub { + @Override + public String getServiceName() { + return MainService.class.getSimpleName(); + } + }*/ // 主进程与守护进程连接时需要用到此类 // diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/AddressUtils_Test.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/AddressUtils_Test.java new file mode 100644 index 0000000..e310a82 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/AddressUtils_Test.java @@ -0,0 +1,28 @@ +package cc.winboll.studio.mymessagemanager.unittest; +import android.content.Context; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.mymessagemanager.utils.AddressUtils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/01 13:07:32 + * @Describe AddressUtils Test + */ +public class AddressUtils_Test { + + public static final String TAG = "AddressUtils_Test"; + + public static void main(Context context) { + String szSmsBody = "无影无迹"; + String szSmsAddress = "无名小辈"; + LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress))); + szSmsAddress = "13172887736"; + LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress))); + szSmsAddress = "+8613172887736"; + LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress))); + szSmsAddress = "8613172887736"; + LogUtils.d(TAG, String.format("szSmsAddress %s\n getFormattedAddress : %s", szSmsAddress, AddressUtils.getFormattedAddress(szSmsAddress))); + + } + +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/SMSRecevier_Test.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/SMSRecevier_Test.java new file mode 100644 index 0000000..0d9257f --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/SMSRecevier_Test.java @@ -0,0 +1,56 @@ +package cc.winboll.studio.mymessagemanager.unittest; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/25 19:02:15 + * @Describe SMSRecevier 测试类 + */ +import android.content.Context; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.mymessagemanager.receivers.SMSRecevier; + +public class SMSRecevier_Test { + + public static final String TAG = "SMSRecevier_Test"; + + public static void main(Context context) { + String szSmsBody = "无影无迹"; + String szSmsAddress = "无名小辈"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "无影无迹"; + szSmsAddress = "淘宝物流"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "无影无迹"; + szSmsAddress = "1?0"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "无影无迹"; + szSmsAddress = "10000"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "【UC】无影无迹"; + szSmsAddress = "无名小辈"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "【UC】无影无迹"; + szSmsAddress = "10000"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "【UC】无影无迹"; + szSmsAddress = "13172887736"; + test1(context, szSmsBody, szSmsAddress); + + szSmsBody = "【UC】无影无迹"; + szSmsAddress = "+8613172887736"; + test1(context, szSmsBody, szSmsAddress); + + } + + public static void test1(Context context, String szSmsBody, String szSmsAddress) { + + boolean isSMSOK = SMSRecevier.checkIsSMSOK(context, szSmsBody, szSmsAddress); + LogUtils.d(TAG, String.format("szSmsBody : %s\nszSmsAddress : %s\nisSMSOK : %s", szSmsBody, szSmsAddress, isSMSOK)); + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/UnitTestActivity.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/UnitTestActivity.java new file mode 100644 index 0000000..d34fd81 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/unittest/UnitTestActivity.java @@ -0,0 +1,36 @@ +package cc.winboll.studio.mymessagemanager.unittest; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/02/25 19:00:10 + * @Describe 应用单元测试窗口 + */ +import android.app.Activity; +import android.os.Bundle; +import android.view.View; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.libappbase.LogView; +import cc.winboll.studio.mymessagemanager.R; + +public class UnitTestActivity extends Activity { + + public static final String TAG = "UnitTestActivity"; + + LogView mLogView; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_unittest); + + mLogView = findViewById(R.id.logview); + mLogView.start(); + } + + public void onMain(View view) { + LogUtils.d(TAG, "SMSRecevier_Test"); + SMSRecevier_Test.main(this); + LogUtils.d(TAG, "AddressUtils_Test"); + AddressUtils_Test.main(this); + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AddressUtils.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AddressUtils.java new file mode 100644 index 0000000..fd1566d --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/AddressUtils.java @@ -0,0 +1,20 @@ +package cc.winboll.studio.mymessagemanager.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/03/01 13:03:16 + * @Describe 通信录地址工具 + */ +public class AddressUtils { + + public static final String TAG = "AddressUtils"; + + public static String getFormattedAddress(String address) { + if (address != null && address.matches("[+]?\\d+")) { + return address; + } else { + return "【" + address + "】"; + } + } + +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/FileUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/FileUtil.java index f1a5b61..c666665 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/FileUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/FileUtil.java @@ -10,7 +10,7 @@ import android.content.Intent; import android.content.res.AssetManager; import android.net.Uri; import androidx.core.content.FileProvider; -import cc.winboll.studio.shared.log.LogUtils; +import cc.winboll.studio.libappbase.LogUtils; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java new file mode 100644 index 0000000..b086dd7 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationHelper.java @@ -0,0 +1,202 @@ +package cc.winboll.studio.mymessagemanager.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/04/01 14:10:35 + * @Describe 应用通知工具类 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.os.Build; +import android.widget.RemoteViews; +import androidx.annotation.RequiresApi; +import androidx.core.app.NotificationCompat; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.mymessagemanager.R; +import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class NotificationHelper { + public static final String TAG = "NotificationHelper"; + + // 渠道ID和名称 + private static final String CHANNEL_ID_FOREGROUND = "foreground_channel"; + private static final String CHANNEL_NAME_FOREGROUND = "Foreground Service"; + private static final String CHANNEL_ID_TEMPORARY = "temporary_channel"; + private static final String CHANNEL_NAME_TEMPORARY = "Temporary Notifications"; + + // 通知ID + public static final int FOREGROUND_NOTIFICATION_ID = 1001; + public static final int TEMPORARY_NOTIFICATION_ID = 2001; + + private final Context mContext; + private final NotificationManager mNotificationManager; + + // 示例:维护当前使用的渠道ID列表 + // 键:渠道ID,值:渠道重要性级别 + Map activeChannelConfigs = new HashMap<>(); + + public NotificationHelper(Context context) { + mContext = context; + mNotificationManager = context.getSystemService(NotificationManager.class); + + // 初始化配置 + activeChannelConfigs.put( + CHANNEL_ID_FOREGROUND, + NotificationManager.IMPORTANCE_HIGH + ); + activeChannelConfigs.put( + CHANNEL_ID_TEMPORARY, + NotificationManager.IMPORTANCE_DEFAULT + ); + + createNotificationChannels(); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createNotificationChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + createForegroundChannel(); + createTemporaryChannel(); + } + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createForegroundChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_FOREGROUND, + CHANNEL_NAME_FOREGROUND, + NotificationManager.IMPORTANCE_LOW + ); + channel.setDescription("Persistent service notifications"); + channel.setSound(null, null); + channel.enableVibration(false); + mNotificationManager.createNotificationChannel(channel); + } + + @RequiresApi(api = Build.VERSION_CODES.O) + private void createTemporaryChannel() { + NotificationChannel channel = new NotificationChannel( + CHANNEL_ID_TEMPORARY, + CHANNEL_NAME_TEMPORARY, + NotificationManager.IMPORTANCE_HIGH + ); + channel.setDescription("Temporary alert notifications"); + channel.setSound(null, null); + channel.enableVibration(true); + channel.setVibrationPattern(new long[]{100, 200, 300, 400}); + channel.setBypassDnd(true); + mNotificationManager.createNotificationChannel(channel); + } + + // 显示常驻通知(通常用于前台服务) + public Notification showForegroundNotification(Intent intent, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_FOREGROUND) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + //.setContentTitle(title) + .setContentTitle(content) + //.setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_LOW) + .setOngoing(true) + .build(); + + mNotificationManager.notify(FOREGROUND_NOTIFICATION_ID, notification); + return notification; + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, String title, String content) { + showTemporaryNotification(intent, TEMPORARY_NOTIFICATION_ID, title, content); + } + + // 显示临时通知(自动消失) + public void showTemporaryNotification(Intent intent, int notificationID, String title, String content) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setLargeIcon(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ic_launcher)) + .setContentTitle(title) + .setContentText(content) + .setContentIntent(pendingIntent) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .setVibrate(new long[]{100, 200, 300, 400}) + .build(); + + mNotificationManager.notify(notificationID, notification); + } + + // 创建自定义布局通知(可扩展) + public void showCustomNotification(Intent intent, RemoteViews contentView, RemoteViews bigContentView) { + PendingIntent pendingIntent = createPendingIntent(intent); + + Notification notification = new NotificationCompat.Builder(mContext, CHANNEL_ID_TEMPORARY) + .setSmallIcon(R.drawable.ic_launcher) + .setContentIntent(pendingIntent) + .setContent(contentView) + .setCustomBigContentView(bigContentView) + .setPriority(NotificationCompat.PRIORITY_HIGH) + .setAutoCancel(true) + .build(); + + mNotificationManager.notify(TEMPORARY_NOTIFICATION_ID + 1, notification); + } + + // 取消所有通知 + public void cancelAllNotifications() { + mNotificationManager.cancelAll(); + } + + // 取消指定通知 + public void cancelNotification(int notificationID) { + mNotificationManager.cancel(notificationID); + } + + // 创建PendingIntent(兼容不同API版本) + private PendingIntent createPendingIntent(Intent intent) { + int flags = PendingIntent.FLAG_UPDATE_CURRENT; +// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { +// flags |= PendingIntent.FLAG_IMMUTABLE; +// } + return PendingIntent.getActivity( + mContext, + 0, + intent, + flags + ); + } + + public void sendSMSReceivedMessage(int notificationID, String szPhone, String szBody) { + Intent intent = new Intent(mContext, SMSActivity.class); + intent.putExtra(SMSActivity.EXTRA_PHONE, szPhone); + String szTitle = mContext.getString(R.string.text_smsfrom) + "<" + szPhone + ">"; + String szContent = "[ " + szBody + " ]"; + showTemporaryNotification(intent, notificationID, szTitle, szContent); + } + + public void cleanOldChannels() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + List allChannels = mNotificationManager.getNotificationChannels(); + for (NotificationChannel channel : allChannels) { + LogUtils.d(TAG, "Clean channel : " + channel.getId()); + if (!activeChannelConfigs.containsKey(channel.getId())) { + // 安全删除渠道 + mNotificationManager.deleteNotificationChannel(channel.getId()); + LogUtils.d(TAG, String.format("Deleted Channel %s", channel.getId())); + } + } + } + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java new file mode 100644 index 0000000..730af52 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/NotificationUtil_Bck.java @@ -0,0 +1,168 @@ +package cc.winboll.studio.mymessagemanager.utils; + +/** + * @Author ZhanGSKen@QQ.COM + * @Date 2024/07/19 14:30:57 + * @Describe 应用通知栏工具类 + */ +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.app.PendingIntent; +import android.content.Context; +import android.content.Intent; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.media.RingtoneManager; +import android.widget.RemoteViews; +import cc.winboll.studio.libappbase.LogUtils; +import cc.winboll.studio.mymessagemanager.R; +import cc.winboll.studio.mymessagemanager.activitys.MainActivity; +import cc.winboll.studio.mymessagemanager.activitys.SMSActivity; +import cc.winboll.studio.mymessagemanager.beans.MessageNotificationBean; +import cc.winboll.studio.mymessagemanager.services.MainService; + +public class NotificationUtil_Bck { + + public static final String TAG = "NotificationUtil"; + public static final int ID_MSG_SERVICE = 10000; + + static final String szSMSChannelID = "1"; + + static final String szServiceChannelID = "0"; + + + //static int mNumSendForegroundNotification = 10000; + //static int mNumSendSMSNotification = 20000; + + public NotificationManager createServiceNotificationChannel(Context context) { + //创建通知渠道ID + String channelId = szServiceChannelID; + //创建通知渠道名称 + String channelName = "Service Message"; + //创建通知渠道重要性 + int importance = NotificationManager.IMPORTANCE_MIN; + NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); + channel.setSound(null, null); + NotificationManager notificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + notificationManager.createNotificationChannel(channel); + return notificationManager; + } + + public NotificationManager createSMSNotificationChannel(Context context) { + //创建通知渠道ID + String channelId = szSMSChannelID; + //创建通知渠道名称 + String channelName = "SMS Message"; + //创建通知渠道重要性 + int importance = NotificationManager.IMPORTANCE_HIGH; + NotificationChannel channel = new NotificationChannel(channelId, channelName, importance); + channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE), Notification.AUDIO_ATTRIBUTES_DEFAULT); + NotificationManager notificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + notificationManager.createNotificationChannel(channel); + return notificationManager; + } + + // 创建通知 + // + public void sendForegroundNotification(MainService service, MessageNotificationBean nessageNotificationBean) { + //创建Notification,传入Context和channelId + Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取 + intent.setClass(service, MainActivity.class); + + //这里放一个count用来区分每一个通知 + //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去 + + //参数1:context 上下文对象 + //参数2:发送者私有的请求码(Private request code for the sender) + //参数3:intent 意图对象 + //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个 + PendingIntent mForegroundPendingIntent = PendingIntent.getActivity(service, nessageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT); + + Notification mForegroundNotification = new Notification.Builder(service, szServiceChannelID) + .setAutoCancel(true) + .setContentTitle(nessageNotificationBean.getTitle()) + .setContentText(nessageNotificationBean.getContent()) + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.drawable.ic_launcher) + //设置红色 + .setColor(Color.parseColor("#F00606")) + .setLargeIcon(BitmapFactory.decodeResource(service.getResources(), R.drawable.ic_launcher)) + .setContentIntent(mForegroundPendingIntent) + .build(); + + + RemoteViews mrvForegroundNotificationView = new RemoteViews(service.getPackageName(), R.layout.remoteview); + mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView1, nessageNotificationBean.getTitle()); + mrvForegroundNotificationView.setTextViewText(R.id.remoteviewTextView2, nessageNotificationBean.getContent()); + mrvForegroundNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher); + mForegroundNotification.contentView = mrvForegroundNotificationView; + mForegroundNotification.bigContentView = mrvForegroundNotificationView; + + service.startForeground(nessageNotificationBean.getMessageId(), mForegroundNotification); + + } + + public void sendSMSNotification(Context context, MessageNotificationBean messageNotificationBean) { + NotificationManager notificationManager = (NotificationManager) context.getSystemService( + Context.NOTIFICATION_SERVICE); + /*NotificationManager notificationManager = createSMSNotificationChannel(context); + if (notificationManager == null) { + LogUtils.d(TAG, "createSMSNotificationChannel failed."); + return; + }*/ + + //创建Notification,传入Context和channelId + Intent intent = new Intent(context, SMSActivity.class); + intent.putExtra(SMSActivity.EXTRA_PHONE, messageNotificationBean.getPhone()); + LogUtils.d(TAG, "sendSMSNotification(...) message.getPhone() is : " + messageNotificationBean.getPhone()); + //Intent intent = new Intent();//这个intent会传给目标,可以使用getIntent来获取 + //intent.setClass(context, MainActivity.class); + //这里放一个count用来区分每一个通知 + //intent.putExtra("intent", "intent--->" + count);//这里设置一个数据,带过去 + + //参数1:context 上下文对象 + //参数2:发送者私有的请求码(Private request code for the sender) + //参数3:intent 意图对象 + //参数4:必须为FLAG_ONE_SHOT,FLAG_NO_CREATE,FLAG_CANCEL_CURRENT,FLAG_UPDATE_CURRENT,中的一个 + PendingIntent mRemindPendingIntent = PendingIntent.getActivity(context, messageNotificationBean.getMessageId(), intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_CANCEL_CURRENT); + Notification mSMSNotification = new Notification.Builder(context, szSMSChannelID) + .setAutoCancel(true) + .setContentTitle(messageNotificationBean.getTitle()) + .setContentText(messageNotificationBean.getContent()) + .setWhen(System.currentTimeMillis()) + .setSmallIcon(R.drawable.ic_launcher) + //设置红色 + .setColor(Color.parseColor("#F00606")) + .setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher)) + .setContentIntent(mRemindPendingIntent) + .build(); + + RemoteViews mrvSMSNotificationView = new RemoteViews(context.getPackageName(), R.layout.remoteview); + mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView1, messageNotificationBean.getTitle()); + mrvSMSNotificationView.setTextViewText(R.id.remoteviewTextView2, messageNotificationBean.getContent()); + mrvSMSNotificationView.setImageViewResource(R.id.remoteviewImageView1, R.drawable.ic_launcher); + mSMSNotification.contentView = mrvSMSNotificationView; + mSMSNotification.bigContentView = mrvSMSNotificationView; + notificationManager.notify(messageNotificationBean.getMessageId(), mSMSNotification); + LogUtils.d(TAG, "getMessageId is : " + Integer.toString(messageNotificationBean.getMessageId())); + + } + + public void sendSMSReceivedMessage(Context context, int nMessageId, String szPhone, String szBody) { + String szTitle = context.getString(R.string.text_smsfrom) + "<" + szPhone + ">"; + String szContent = "[ " + szBody + " ]"; + sendSMSNotification(context, new MessageNotificationBean(nMessageId, szPhone, szTitle, szContent)); + } + + public static void cancelNotification(Context context, int notificationId) { + // 获取 NotificationManager 实例 + NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); + // 撤回指定 ID 的通知栏消息 + notificationManager.cancel(notificationId); + } +} + + diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PermissionUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PermissionUtil.java index 1865c75..fcf5a37 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PermissionUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/PermissionUtil.java @@ -10,9 +10,9 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.BaseActivity; -import cc.winboll.studio.shared.log.LogUtils; import com.hjq.permissions.OnPermissionCallback; import com.hjq.permissions.Permission; import com.hjq.permissions.XXPermissions; 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 95330b3..993754c 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 @@ -10,11 +10,14 @@ import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.provider.ContactsContract; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.beans.PhoneBean; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; public class PhoneUtil { @@ -59,12 +62,57 @@ public class PhoneUtil { public boolean isPhoneInContacts(String szPhone) { List listPhoneDto = getPhoneList(); + LogUtils.d(TAG, String.format("isPhoneInContacts(...) listPhoneDto.size() %d", listPhoneDto.size())); for (int i = 0; i < listPhoneDto.size(); i++) { - if (listPhoneDto.get(i).getTelPhone().equals(szPhone)) { + if (isTheSamePhoneNumber(listPhoneDto.get(i).getTelPhone(), szPhone)) { return true; } } return false; } + + boolean isTheSamePhoneNumber(String szNum1, String szNum2) { + //LogUtils.d(TAG, String.format("szNum1 %s\nszNum2 %s", szNum1, 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))) { + LogUtils.d(TAG, "szNum1.equals(UnitAreaUtils.genCurrentUnitAreaNumber(szNum2))"); + return true; + } + } + + 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)) { + 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/SMSReceiveRuleUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSReceiveRuleUtil.java index 1ddbe9f..5e37b3a 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSReceiveRuleUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSReceiveRuleUtil.java @@ -7,9 +7,9 @@ package cc.winboll.studio.mymessagemanager.utils; */ import android.content.Context; import android.util.JsonReader; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean; import cc.winboll.studio.mymessagemanager.beans.SMSAcceptRuleBean_V1; -import cc.winboll.studio.shared.log.LogUtils; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -18,7 +18,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.nio.channels.AcceptPendingException; public class SMSReceiveRuleUtil { @@ -194,9 +193,9 @@ public class SMSReceiveRuleUtil { public ArrayList loadConfigData() { ArrayList list = new ArrayList(); SMSAcceptRuleBean.loadBeanList(mContext, list, SMSAcceptRuleBean.class); - for (int i = 0; i < list.size(); i++) { - LogUtils.d(TAG, "loadConfigData isEnable : " + Boolean.toString(list.get(i).isEnable())); - } +// for (int i = 0; i < list.size(); i++) { +// LogUtils.d(TAG, "loadConfigData isEnable : " + Boolean.toString(list.get(i).isEnable())); +// } mDataList.clear(); mDataList.addAll(list); return mDataList; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSRecycleUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSRecycleUtil.java index f1147ad..c03eff6 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSRecycleUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSRecycleUtil.java @@ -6,7 +6,7 @@ package cc.winboll.studio.mymessagemanager.utils; * @Describe 短信回收站工具类 */ import android.content.Context; -import cc.winboll.studio.mymessagemanager.GlobalApplication; +import cc.winboll.studio.mymessagemanager.App; import cc.winboll.studio.mymessagemanager.beans.SMSBean; import cc.winboll.studio.mymessagemanager.beans.SMSRecycleBean; import java.util.ArrayList; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSUtil.java index 8d01042..067729f 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/SMSUtil.java @@ -17,8 +17,8 @@ import android.os.Bundle; import android.provider.Telephony; import android.telephony.gsm.SmsManager; import android.telephony.gsm.SmsMessage; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.beans.SMSBean; -import cc.winboll.studio.shared.log.LogUtils; import com.hjq.toast.ToastUtils; import java.util.ArrayList; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TTSPlayRuleUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TTSPlayRuleUtil.java index 84388c0..955cd6d 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TTSPlayRuleUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TTSPlayRuleUtil.java @@ -10,6 +10,7 @@ import android.content.Intent; import android.os.Message; import android.util.JsonReader; import android.widget.Toast; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.activitys.TTSPlayRuleActivity; import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean; @@ -17,7 +18,6 @@ import cc.winboll.studio.mymessagemanager.beans.TTSPlayRuleBean_V1; import cc.winboll.studio.mymessagemanager.beans.TTSSpeakTextBean; import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog; import cc.winboll.studio.mymessagemanager.services.TTSPlayService; -import cc.winboll.studio.shared.log.LogUtils; import java.io.File; import java.io.IOException; import java.io.InputStream; diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TextToSpeechUtil.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TextToSpeechUtil.java index 199840c..438162f 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TextToSpeechUtil.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/TextToSpeechUtil.java @@ -14,9 +14,9 @@ import android.view.Gravity; import android.view.View; import android.view.WindowManager; import android.widget.LinearLayout; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.R; import cc.winboll.studio.mymessagemanager.beans.TTSSpeakTextBean; -import cc.winboll.studio.shared.log.LogUtils; import java.util.ArrayList; public class TextToSpeechUtil { 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 new file mode 100644 index 0000000..4d106e6 --- /dev/null +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/utils/UnitAreaUtils.java @@ -0,0 +1,47 @@ +package cc.winboll.studio.mymessagemanager.utils; + +/** + * @Author ZhanGSKen@AliYun.Com + * @Date 2025/04/14 15:55:36 + * @Describe 电话号码区域管理辅助类 + */ +import cc.winboll.studio.libappbase.LogUtils; +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; + + UnitAreaUtils(Context context) { + mContext = context; + } + + public static UnitAreaUtils getInstance(Context context) { + if (_UnitAreaUtils == null) { + _UnitAreaUtils = new UnitAreaUtils(context); + } + 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); + } + + 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)); + return szUnitArea; + } +} diff --git a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ConfirmSwitchView.java b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ConfirmSwitchView.java index 9b0b43f..4b28690 100644 --- a/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ConfirmSwitchView.java +++ b/mymessagemanager/src/main/java/cc/winboll/studio/mymessagemanager/views/ConfirmSwitchView.java @@ -8,8 +8,8 @@ import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.widget.Switch; +import cc.winboll.studio.libappbase.LogUtils; import cc.winboll.studio.mymessagemanager.dialogs.YesNoAlertDialog; -import cc.winboll.studio.shared.log.LogUtils; public class ConfirmSwitchView extends Switch { diff --git a/mymessagemanager/src/main/res/layout/activity_about.xml b/mymessagemanager/src/main/res/layout/activity_about.xml index a2dcf3f..787ec5b 100644 --- a/mymessagemanager/src/main/res/layout/activity_about.xml +++ b/mymessagemanager/src/main/res/layout/activity_about.xml @@ -1,29 +1,21 @@ - - + xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + android:orientation="vertical" + android:layout_width="match_parent" + android:layout_height="match_parent"> + android:layout_height="wrap_content" + android:id="@+id/toolbar"/> - + android:layout_height="0dp" + android:layout_weight="1.0" + android:id="@+id/aboutviewroot_ll"/> - diff --git a/mymessagemanager/src/main/res/layout/activity_appsettings.xml b/mymessagemanager/src/main/res/layout/activity_appsettings.xml index 2664de4..c663719 100644 --- a/mymessagemanager/src/main/res/layout/activity_appsettings.xml +++ b/mymessagemanager/src/main/res/layout/activity_appsettings.xml @@ -213,6 +213,12 @@ android:text="检查应用权限" android:onClick="onCheckAndGetAppPermission"/> +