diff --git a/README.md b/README.md index 7720d3a4..ba6e2478 100644 --- a/README.md +++ b/README.md @@ -86,9 +86,11 @@ PS.如果QQ群已满员,请看群简介加入其他群 + https://github.com/xiaoyuanhost/TranspondSms (项目原型) + https://github.com/xuexiangjys/XUI (UI框架) -+ https://github.com/xuexiangjys/XUpdateAPI (在线升级) ++ https://github.com/xuexiangjys/XUpdate (在线升级) + https://github.com/getActivity/XXPermissions (权限请求框架) + https://github.com/mainfunx/frpc_android (内网穿透) ++ https://github.com/gyf-dev/Cactus (保活措施) ++ https://github.com/yanzhenjie/AndServer (HttpServer) + [GitHub license](https://jb.gg/OpenSourceSupport) (License Certificate for JetBrains All Products Pack) -------- diff --git a/README_en.md b/README_en.md index 372bd839..918d2642 100644 --- a/README_en.md +++ b/README_en.md @@ -77,9 +77,11 @@ PS.If the QQ group is full, please see the group introduction to join other grou + https://github.com/xiaoyuanhost/TranspondSms (Foundation of `SmsForwarder`) + https://github.com/xuexiangjys/XUI (UI Framework) -+ https://github.com/xuexiangjys/XUpdateAPI (online update) ++ https://github.com/xuexiangjys/XUpdate (online update) + https://github.com/getActivity/XXPermissions (permission requiring) -+ https://github.com/mainfunx/frpc_android (内网穿透) ++ https://github.com/mainfunx/frpc_android (reverse proxy) ++ https://github.com/gyf-dev/Cactus (Keep Alive) ++ https://github.com/yanzhenjie/AndServer (HttpServer) + [GitHub license](https://jb.gg/OpenSourceSupport) (License Certificate for JetBrains All Products Pack) -------- diff --git a/app/src/main/java/com/idormy/sms/forwarder/App.kt b/app/src/main/java/com/idormy/sms/forwarder/App.kt index 8a23e5d3..2b26c1a1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/App.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/App.kt @@ -82,6 +82,8 @@ class App : Application(), CactusCallback, Configuration.Provider by Core { //Cactus运行状态 val mStatus = MutableLiveData().apply { value = true } + + var mDisposable: Disposable? = null } override fun attachBaseContext(base: Context) { @@ -139,7 +141,7 @@ class App : Application(), CactusCallback, Configuration.Provider by Core { } //Cactus 集成双进程前台服务,JobScheduler,onePix(一像素),WorkManager,无声音乐 - if (!isDebug) { + if (SettingUtils.enableCactus) { //注册广播监听器 registerReceiver(CactusReceiver(), IntentFilter().apply { addAction(Cactus.CACTUS_WORK) @@ -209,8 +211,6 @@ class App : Application(), CactusCallback, Configuration.Provider by Core { ANRWatchDogInit.init() } - private var mDisposable: Disposable? = null - @SuppressLint("CheckResult") override fun doWork(times: Int) { Log.d(TAG, "doWork:$times") diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt index 69eee51f..f7943f77 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/SettingsFragment.kt @@ -99,10 +99,9 @@ class SettingsFragment : BaseFragment(), View.OnClickL batterySetting(binding!!.layoutBatterySetting, binding!!.sbBatterySetting) //不在最近任务列表中显示 switchExcludeFromRecents(binding!!.layoutExcludeFromRecents, binding!!.sbExcludeFromRecents) - //后台播放无声音乐 - switchPlaySilenceMusic(binding!!.sbPlaySilenceMusic) - //1像素透明Activity保活(只有在android p以下可以使用) - switchOnePixelActivity(binding!!.sbOnePixelActivity) + + //Cactus增强保活措施 + switchEnableCactus(binding!!.sbEnableCactus, binding!!.scbPlaySilenceMusic, binding!!.scbOnePixelActivity) //接口请求失败重试时间间隔 editRetryDelayTime(binding!!.etRetryTimes, binding!!.etDelayTime, binding!!.etTimeout) @@ -525,25 +524,30 @@ class SettingsFragment : BaseFragment(), View.OnClickL } } - //后台播放无声音乐 - @SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode") - fun switchPlaySilenceMusic(sbPlaySilenceMusic: SwitchButton) { - sbPlaySilenceMusic.isChecked = SettingUtils.enablePlaySilenceMusic - sbPlaySilenceMusic.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> - SettingUtils.enablePlaySilenceMusic = isChecked - XToastUtils.warning(getString(R.string.need_to_restart)) + //转发应用通知 + @SuppressLint("UseSwitchCompatOrMaterialCode") + fun switchEnableCactus(sbEnableCactus: SwitchButton, scbPlaySilenceMusic: SmoothCheckBox, scbOnePixelActivity: SmoothCheckBox) { + val layoutCactusOptional: LinearLayout = binding!!.layoutCactusOptional + val isEnable: Boolean = SettingUtils.enableCactus + sbEnableCactus.isChecked = isEnable + layoutCactusOptional.visibility = if (isEnable) View.VISIBLE else View.GONE + + sbEnableCactus.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> + layoutCactusOptional.visibility = if (isChecked) View.VISIBLE else View.GONE + SettingUtils.enableCactus = isChecked } - } - //1像素透明Activity保活 - @SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode") - fun switchOnePixelActivity(sbOnePixelActivity: SwitchButton) { - if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { - binding!!.layoutOnePixelActivity.visibility = View.VISIBLE + scbPlaySilenceMusic.isChecked = SettingUtils.enablePlaySilenceMusic + scbPlaySilenceMusic.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> + SettingUtils.enablePlaySilenceMusic = isChecked + XToastUtils.warning(getString(R.string.need_to_restart)) } - sbOnePixelActivity.isChecked = SettingUtils.enableOnePixelActivity - sbOnePixelActivity.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean -> + //if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) { + binding!!.layoutOnePixelActivity.visibility = View.VISIBLE + //} + scbOnePixelActivity.isChecked = SettingUtils.enableOnePixelActivity + scbOnePixelActivity.setOnCheckedChangeListener { _: SmoothCheckBox, isChecked: Boolean -> SettingUtils.enableOnePixelActivity = isChecked XToastUtils.warning(getString(R.string.need_to_restart)) } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt index 35ddc3df..d9cfb1f0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/Constants.kt @@ -65,6 +65,7 @@ const val SP_SMS_TEMPLATE = "sms_template" const val SP_ENABLE_HELP_TIP = "enable_help_tip" const val SP_PURE_CLIENT_MODE = "enable_pure_client_mode" +const val SP_ENABLE_CACTUS = "enable_cactus" const val CACTUS_TIMER = "cactus_timer" const val CACTUS_LAST_TIMER = "cactus_last_timer" const val CACTUS_DATE = "cactus_date" diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt index 73d581a9..3b4a38cc 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SettingUtils.kt @@ -173,6 +173,14 @@ class SettingUtils private constructor() { MMKVUtils.put(SP_ENABLE_EXCLUDE_FROM_RECENTS, enableExcludeFromRecents) } + //是否转发应用通知 + @JvmStatic + var enableCactus: Boolean + get() = MMKVUtils.getBoolean(SP_ENABLE_APP_NOTIFY, false) + set(enableAppNotify) { + MMKVUtils.put(SP_ENABLE_APP_NOTIFY, enableAppNotify) + } + //是否播放静音音乐 @JvmStatic var enablePlaySilenceMusic: Boolean @@ -181,7 +189,7 @@ class SettingUtils private constructor() { MMKVUtils.put(SP_ENABLE_PLAY_SILENCE_MUSIC, enablePlaySilenceMusic) } - //是否不在最近任务列表中显示 + //是否启用1像素 @JvmStatic var enableOnePixelActivity: Boolean get() = MMKVUtils.getBoolean(SP_ENABLE_ONE_PIXEL_ACTIVITY, false) diff --git a/app/src/main/res/layout/fragment_settings.xml b/app/src/main/res/layout/fragment_settings.xml index b86de40b..07e99677 100644 --- a/app/src/main/res/layout/fragment_settings.xml +++ b/app/src/main/res/layout/fragment_settings.xml @@ -635,56 +635,74 @@ - - + - + - + - + - + + + + + + + + + - diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index c3597180..6dc97399 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -856,4 +856,7 @@ When starting the APP, it will directly enter the active control client Exit pure client mode Do you want to quit the app immediately and start it manually to take effect in pure client mode? + Optional: + Enable Cactus Keep Alive + Dual process foreground service/JobScheduler/WorkManager/1px/silent music diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 6daa2d5d..84386b7a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -602,7 +602,7 @@ 后台播放无声音乐 【按需启用】播放无声音乐让后台一直运行,可能比较耗电 1像素 - 1像素透明Activity保活 + 1像素透明Activity 【按需启用】使进程的优先级在屏幕锁屏时间由4提升为最高优先级1 可选 请按照wiki中的步骤获取 @@ -857,4 +857,7 @@ 启动APP时直接进入主动控制·客户端 退出纯客户端模式 是否立即退出App,并手动启动以生效纯客户端模式? + 可选组件: + 启用 Cactus 增强保活措施(会增加耗电) + 双进程前台服务/JobScheduler/WorkManager/1像素/无声音乐