diff --git a/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt b/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt index 855e494e..d226dbf7 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/activity/MainActivity.kt @@ -447,10 +447,18 @@ class MainActivity : BaseActivity(), val destFile = File("$libPath/libgojni.so") FileUtils.moveFile(srcFile, destFile, null) - val intent: Intent? = packageManager.getLaunchIntentForPackage(packageName) - intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - startActivity(intent) - android.os.Process.killProcess(android.os.Process.myPid()) //杀掉以前进程 + MaterialDialog.Builder(this@MainActivity) + .iconRes(R.drawable.ic_menu_frpc) + .title(R.string.menu_frpc) + .content(R.string.download_frpc_tips2) + .cancelable(false) + .positiveText(R.string.confirm) + .onPositive { _: MaterialDialog?, _: DialogAction? -> + val intent = Intent(App.context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + startActivity(intent) + } + .show() } }) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt index 64db091c..884983b1 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/LogsDao.kt @@ -22,6 +22,9 @@ interface LogsDao { @Query("DELETE FROM Logs where type=:type") fun deleteAll(type: String): Completable + @Query("DELETE FROM Logs") + fun deleteAll() + @Query("DELETE FROM Logs where time<:time") fun deleteTimeAgo(time: Long) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/MsgDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/MsgDao.kt index cdd1d39e..2c8f492c 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/MsgDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/MsgDao.kt @@ -22,6 +22,9 @@ interface MsgDao { @Query("DELETE FROM Msg where type=:type") fun deleteAll(type: String): Completable + @Query("DELETE FROM Msg") + fun deleteAll() + @Query("DELETE FROM Msg where time<:time") fun deleteTimeAgo(time: Long) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt b/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt index dec2b6ae..6c91739e 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/dao/RuleDao.kt @@ -19,6 +19,9 @@ interface RuleDao { @Query("DELETE FROM Rule where id=:id") fun delete(id: Long) + @Query("DELETE FROM Rule") + fun deleteAll() + @Update fun update(rule: Rule) diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt index 8c93ecba..235d6ce8 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/LogsRepository.kt @@ -24,4 +24,8 @@ class LogsRepository(private val logsDao: LogsDao) { logsDao.updateStatus(id, status, response) fun getOne(id: Long) = logsDao.getOne(id) + + fun deleteAll() { + logsDao.deleteAll() + } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt index fa0b4464..6eeafe52 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/MsgRepository.kt @@ -19,4 +19,8 @@ class MsgRepository(private val msgDao: MsgDao) { @WorkerThread suspend fun insert(msg: Msg): Long = msgDao.insert(msg) + fun deleteAll() { + msgDao.deleteAll() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt b/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt index c97710c3..9ad0e29d 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/database/repository/RuleRepository.kt @@ -36,4 +36,8 @@ class RuleRepository( //TODO:允许主线程访问,后面再优化 val all: List = ruleDao.getAll() + + fun deleteAll() { + ruleDao.deleteAll() + } } \ No newline at end of file diff --git a/app/src/main/java/com/idormy/sms/forwarder/entity/CloneInfo.kt b/app/src/main/java/com/idormy/sms/forwarder/entity/CloneInfo.kt index 399dec5a..eb800191 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/entity/CloneInfo.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/entity/CloneInfo.kt @@ -13,119 +13,8 @@ data class CloneInfo( @SerializedName("version_name") var versionName: String? = null, - @SerializedName("enable_sms") - var enableSms: Boolean = false, - - @SerializedName("enable_phone") - var enablePhone: Boolean = false, - - @SerializedName("call_type1") - var callType1: Boolean = false, - - @SerializedName("call_type2") - var callType2: Boolean = false, - - @SerializedName("call_type3") - var callType3: Boolean = false, - - @SerializedName("call_type4") - var callType4: Boolean = false, - - @SerializedName("call_type5") - var callType5: Boolean = false, - - @SerializedName("call_type6") - var callType6: Boolean = false, - - @SerializedName("enable_app_notify") - var enableAppNotify: Boolean = false, - - @SerializedName("cancel_app_notify") - var cancelAppNotify: Boolean = false, - - @SerializedName("cancel_extra_app_notify") - var cancelExtraAppNotify: String? = null, - - @SerializedName("enable_not_user_present") - var enableNotUserPresent: Boolean = false, - - @SerializedName("enable_load_app_list") - var enableLoadAppList: Boolean = false, - - @SerializedName("enable_load_user_app_list") - var enableLoadUserAppList: Boolean = false, - - @SerializedName("enable_load_system_app_list") - var enableLoadSystemAppList: Boolean = false, - - @SerializedName("duplicate_messages_limits") - var duplicateMessagesLimits: Int = 0, - - @SerializedName("enable_network_state_receiver") - var enableNetworkStateReceiver: Boolean = false, - - @SerializedName("enable_battery_receiver") - var enableBatteryReceiver: Boolean = false, - - @SerializedName("battery_level_min") - var batteryLevelMin: Int = 0, - - @SerializedName("battery_level_max") - var batteryLevelMax: Int = 0, - - @SerializedName("battery_level_once") - var batteryLevelOnce: Boolean = false, - - @SerializedName("enable_battery_cron") - var enableBatteryCron: Boolean = false, - - @SerializedName("battery_cron_start_time") - var batteryCronStartTime: String? = null, - - @SerializedName("battery_cron_interval") - var batteryCronInterval: Int = 0, - - @SerializedName("enable_exclude_from_recents") - var enableExcludeFromRecents: Boolean = false, - - @SerializedName("enable_cactus") - var enableCactus: Boolean = false, - - @SerializedName("enable_play_silence_music") - var enablePlaySilenceMusic: Boolean = false, - - @SerializedName("enable_one_pixel_activity") - var enableOnePixelActivity: Boolean = false, - - @SerializedName("request_retry_times") - var requestRetryTimes: Int = 0, - - @SerializedName("request_delay_time") - var requestDelayTime: Int = 0, - - @SerializedName("request_timeout") - var requestTimeout: Int = 0, - - @SerializedName("notify_content") - var notifyContent: String? = null, - - @SerializedName("enable_sms_template") - var enableSmsTemplate: Boolean = false, - - @SerializedName("sms_template") - var smsTemplate: String? = null, - - @SerializedName("enable_help_tip") - var enableHelpTip: Boolean = false, - - @SerializedName("enable_pure_client_mode") - var enablePureClientMode: Boolean = false, - - @SerializedName("enable_sms_command") - var enableSmsCommand: Boolean = false, - - @SerializedName("sms_command_safe_phone") - var smsCommandSafePhone: String? = null, + @SerializedName("settings") + var settings: String = "", @SerializedName("sender_list") var senderList: List? = null, diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/AboutFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/AboutFragment.kt index d8d3c1a9..eb8e1451 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/AboutFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/AboutFragment.kt @@ -4,7 +4,9 @@ import android.content.Intent import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.activity.MainActivity import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.core.webview.AgentWebActivity import com.idormy.sms.forwarder.databinding.FragmentAboutBinding @@ -19,6 +21,8 @@ import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit import com.xuexiang.xaop.annotation.SingleClick import com.xuexiang.xpage.annotation.Page import com.xuexiang.xui.widget.actionbar.TitleBar +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import com.xuexiang.xui.widget.textview.supertextview.SuperTextView import com.xuexiang.xutil.app.AppUtils import com.xuexiang.xutil.file.FileUtils @@ -74,12 +78,18 @@ class AboutFragment : BaseFragment(), SuperTextView.OnSup try { val soFile = File(context?.filesDir?.absolutePath + "/libs/libgojni.so") if (soFile.exists()) soFile.delete() - XToastUtils.success(R.string.about_frpc_deleted) - - val intent: Intent? = context?.packageManager?.getLaunchIntentForPackage(context?.packageName.toString()) - intent?.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) - startActivity(intent) - android.os.Process.killProcess(android.os.Process.myPid()) //杀掉以前进程 + MaterialDialog.Builder(requireContext()) + .iconRes(R.drawable.ic_menu_frpc) + .title(R.string.menu_frpc) + .content(R.string.about_frpc_deleted) + .cancelable(false) + .positiveText(R.string.confirm) + .onPositive { _: MaterialDialog?, _: DialogAction? -> + val intent = Intent(App.context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + startActivity(intent) + } + .show() } catch (e: Exception) { e.printStackTrace() XToastUtils.error(e.message.toString()) diff --git a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt index 4d37d57b..5eeb3b4b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/fragment/client/CloneFragment.kt @@ -1,6 +1,7 @@ package com.idormy.sms.forwarder.fragment.client import android.annotation.SuppressLint +import android.content.Intent import android.os.Environment import android.util.Log import android.view.LayoutInflater @@ -13,7 +14,9 @@ import com.google.gson.reflect.TypeToken import com.hjq.permissions.OnPermissionCallback import com.hjq.permissions.Permission import com.hjq.permissions.XXPermissions +import com.idormy.sms.forwarder.App import com.idormy.sms.forwarder.R +import com.idormy.sms.forwarder.activity.MainActivity import com.idormy.sms.forwarder.core.BaseFragment import com.idormy.sms.forwarder.databinding.FragmentClientCloneBinding import com.idormy.sms.forwarder.entity.CloneInfo @@ -30,6 +33,8 @@ import com.xuexiang.xrouter.utils.TextUtils import com.xuexiang.xui.utils.CountDownButtonHelper import com.xuexiang.xui.utils.ResUtils import com.xuexiang.xui.widget.actionbar.TitleBar +import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction +import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog import com.xuexiang.xutil.app.AppUtils import com.xuexiang.xutil.data.ConvertTools import com.xuexiang.xutil.file.FileIOUtils @@ -70,12 +75,10 @@ class CloneFragment : BaseFragment(), View.OnClickL // 申请储存权限 XXPermissions.with(this) //.permission(*Permission.Group.STORAGE) - .permission(Permission.MANAGE_EXTERNAL_STORAGE) - .request(object : OnPermissionCallback { + .permission(Permission.MANAGE_EXTERNAL_STORAGE).request(object : OnPermissionCallback { @SuppressLint("SetTextI18n") override fun onGranted(permissions: List, all: Boolean) { - backupPath = - Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path + backupPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).path binding!!.tvBackupPath.text = backupPath + File.separator + backupFile } @@ -105,8 +108,7 @@ class CloneFragment : BaseFragment(), View.OnClickL //按钮增加倒计时,避免重复点击 pushCountDownHelper = CountDownButtonHelper(binding!!.btnPush, SettingUtils.requestTimeout) - pushCountDownHelper!!.setOnCountDownListener(object : - CountDownButtonHelper.OnCountDownListener { + pushCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { override fun onCountDown(time: Int) { binding!!.btnPush.text = String.format(getString(R.string.seconds_n), time) } @@ -116,8 +118,7 @@ class CloneFragment : BaseFragment(), View.OnClickL } }) pullCountDownHelper = CountDownButtonHelper(binding!!.btnPull, SettingUtils.requestTimeout) - pullCountDownHelper!!.setOnCountDownListener(object : - CountDownButtonHelper.OnCountDownListener { + pullCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { override fun onCountDown(time: Int) { binding!!.btnPull.text = String.format(getString(R.string.seconds_n), time) } @@ -127,8 +128,7 @@ class CloneFragment : BaseFragment(), View.OnClickL } }) exportCountDownHelper = CountDownButtonHelper(binding!!.btnExport, 3) - exportCountDownHelper!!.setOnCountDownListener(object : - CountDownButtonHelper.OnCountDownListener { + exportCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { override fun onCountDown(time: Int) { binding!!.btnExport.text = String.format(getString(R.string.seconds_n), time) } @@ -138,8 +138,7 @@ class CloneFragment : BaseFragment(), View.OnClickL } }) importCountDownHelper = CountDownButtonHelper(binding!!.btnImport, 3) - importCountDownHelper!!.setOnCountDownListener(object : - CountDownButtonHelper.OnCountDownListener { + importCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener { override fun onCountDown(time: Int) { binding!!.btnImport.text = String.format(getString(R.string.seconds_n), time) } @@ -203,9 +202,7 @@ class CloneFragment : BaseFragment(), View.OnClickL //替换Date字段为当前时间 val builder = GsonBuilder() - builder.registerTypeAdapter( - Date::class.java, - JsonDeserializer { _, _, _ -> Date() }) + builder.registerTypeAdapter(Date::class.java, JsonDeserializer { _, _, _ -> Date() }) val gson = builder.create() val cloneInfo = gson.fromJson(jsonStr, CloneInfo::class.java) Log.d(TAG, "cloneInfo = $cloneInfo") @@ -214,7 +211,18 @@ class CloneFragment : BaseFragment(), View.OnClickL HttpServerUtils.compareVersion(cloneInfo) if (HttpServerUtils.restoreSettings(cloneInfo)) { - XToastUtils.success(getString(R.string.import_succeeded)) + MaterialDialog.Builder(requireContext()) + .iconRes(R.drawable.icon_api_clone) + .title(R.string.clone) + .content(R.string.import_succeeded) + .cancelable(false) + .positiveText(R.string.confirm) + .onPositive { _: MaterialDialog?, _: DialogAction? -> + val intent = Intent(App.context, MainActivity::class.java) + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) + startActivity(intent) + } + .show() } else { XToastUtils.error(getString(R.string.import_failed)) } @@ -242,19 +250,15 @@ class CloneFragment : BaseFragment(), View.OnClickL msgMap["timestamp"] = timestamp val clientSignKey = HttpServerUtils.clientSignKey if (!TextUtils.isEmpty(clientSignKey)) { - msgMap["sign"] = - HttpServerUtils.calcSign(timestamp.toString(), clientSignKey) + msgMap["sign"] = HttpServerUtils.calcSign(timestamp.toString(), clientSignKey) } msgMap["data"] = HttpServerUtils.exportSettings() var requestMsg: String = Gson().toJson(msgMap) Log.i(TAG, "requestMsg:$requestMsg") - val postRequest = XHttp.post(requestUrl) - .keepJson(true) - .timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s - .cacheMode(CacheMode.NO_CACHE) - .timeStamp(true) + val postRequest = XHttp.post(requestUrl).keepJson(true).timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s + .cacheMode(CacheMode.NO_CACHE).timeStamp(true) when (HttpServerUtils.clientSafetyMeasures) { 2 -> { @@ -342,8 +346,7 @@ class CloneFragment : BaseFragment(), View.OnClickL msgMap["timestamp"] = timestamp val clientSignKey = HttpServerUtils.clientSignKey if (!TextUtils.isEmpty(clientSignKey)) { - msgMap["sign"] = - HttpServerUtils.calcSign(timestamp.toString(), clientSignKey) + msgMap["sign"] = HttpServerUtils.calcSign(timestamp.toString(), clientSignKey) } val dataMap: MutableMap = mutableMapOf() @@ -353,11 +356,8 @@ class CloneFragment : BaseFragment(), View.OnClickL var requestMsg: String = Gson().toJson(msgMap) Log.i(TAG, "requestMsg:$requestMsg") - val postRequest = XHttp.post(requestUrl) - .keepJson(true) - .timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s - .cacheMode(CacheMode.NO_CACHE) - .timeStamp(true) + val postRequest = XHttp.post(requestUrl).keepJson(true).timeOut((SettingUtils.requestTimeout * 1000).toLong()) //超时时间10s + .cacheMode(CacheMode.NO_CACHE).timeStamp(true) when (HttpServerUtils.clientSafetyMeasures) { 2 -> { @@ -415,9 +415,7 @@ class CloneFragment : BaseFragment(), View.OnClickL //替换Date字段为当前时间 val builder = GsonBuilder() - builder.registerTypeAdapter( - Date::class.java, - JsonDeserializer { _, _, _ -> Date() }) + builder.registerTypeAdapter(Date::class.java, JsonDeserializer { _, _, _ -> Date() }) val gson = builder.create() val resp: BaseResponse = gson.fromJson(json, object : TypeToken>() {}.type) if (resp.code == 200) { diff --git a/app/src/main/java/com/idormy/sms/forwarder/receiver/BootReceiver.kt b/app/src/main/java/com/idormy/sms/forwarder/receiver/BootReceiver.kt index af853204..8e0e3533 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/receiver/BootReceiver.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/receiver/BootReceiver.kt @@ -18,9 +18,8 @@ class BootReceiver : BroadcastReceiver() { try { Log.d(TAG, "强制重启APP一次") val intent1 = Intent(context, SplashActivity::class.java) - intent1.flags = Intent.FLAG_ACTIVITY_NEW_TASK + intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK) context.startActivity(intent1) - android.os.Process.killProcess(android.os.Process.myPid()) //杀掉以前进程 } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt index e11cd706..34e60576 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/HttpServerUtils.kt @@ -144,48 +144,10 @@ class HttpServerUtils private constructor() { val cloneInfo = CloneInfo() cloneInfo.versionCode = AppUtils.getAppVersionCode() cloneInfo.versionName = AppUtils.getAppVersionName() - cloneInfo.enableSms = SettingUtils.enableSms - cloneInfo.enablePhone = SettingUtils.enablePhone - cloneInfo.callType1 = SettingUtils.enableCallType1 - cloneInfo.callType2 = SettingUtils.enableCallType2 - cloneInfo.callType3 = SettingUtils.enableCallType3 - cloneInfo.callType4 = SettingUtils.enableCallType4 - cloneInfo.callType5 = SettingUtils.enableCallType5 - cloneInfo.callType6 = SettingUtils.enableCallType6 - cloneInfo.enableAppNotify = SettingUtils.enableAppNotify - cloneInfo.cancelAppNotify = SettingUtils.enableCancelAppNotify - cloneInfo.cancelExtraAppNotify = SettingUtils.cancelExtraAppNotify - cloneInfo.enableNotUserPresent = SettingUtils.enableNotUserPresent - cloneInfo.enableLoadAppList = SettingUtils.enableLoadAppList - cloneInfo.enableLoadUserAppList = SettingUtils.enableLoadUserAppList - cloneInfo.enableLoadSystemAppList = SettingUtils.enableLoadSystemAppList - cloneInfo.duplicateMessagesLimits = SettingUtils.duplicateMessagesLimits - cloneInfo.enableNetworkStateReceiver = SettingUtils.enableNetworkStateReceiver - cloneInfo.enableBatteryReceiver = SettingUtils.enableBatteryReceiver - cloneInfo.batteryLevelMin = SettingUtils.batteryLevelMin - cloneInfo.batteryLevelMax = SettingUtils.batteryLevelMax - cloneInfo.batteryLevelOnce = SettingUtils.batteryLevelOnce - cloneInfo.enableBatteryCron = SettingUtils.enableBatteryCron - cloneInfo.batteryCronStartTime = SettingUtils.batteryCronStartTime - cloneInfo.batteryCronInterval = SettingUtils.batteryCronInterval - cloneInfo.enableExcludeFromRecents = SettingUtils.enableExcludeFromRecents - cloneInfo.enableCactus = SettingUtils.enableCactus - cloneInfo.enablePlaySilenceMusic = SettingUtils.enablePlaySilenceMusic - cloneInfo.enableOnePixelActivity = SettingUtils.enableOnePixelActivity - cloneInfo.requestRetryTimes = SettingUtils.requestRetryTimes - cloneInfo.requestDelayTime = SettingUtils.requestDelayTime - cloneInfo.requestTimeout = SettingUtils.requestTimeout - cloneInfo.notifyContent = SettingUtils.notifyContent - cloneInfo.enableSmsTemplate = SettingUtils.enableSmsTemplate - cloneInfo.smsTemplate = SettingUtils.smsTemplate - cloneInfo.enableHelpTip = SettingUtils.enableHelpTip - cloneInfo.enablePureClientMode = SettingUtils.enablePureClientMode - cloneInfo.enableSmsCommand = SettingUtils.enableSmsCommand - cloneInfo.smsCommandSafePhone = SettingUtils.smsCommandSafePhone + cloneInfo.settings = SharedPreference.exportPreference() cloneInfo.senderList = Core.sender.all cloneInfo.ruleList = Core.rule.all cloneInfo.frpcList = Core.frpc.all - return cloneInfo } @@ -193,53 +155,26 @@ class HttpServerUtils private constructor() { fun restoreSettings(cloneInfo: CloneInfo): Boolean { return try { //应用配置 - SettingUtils.enableSms = cloneInfo.enableSms - SettingUtils.enablePhone = cloneInfo.enablePhone - SettingUtils.enableCallType1 = cloneInfo.callType1 - SettingUtils.enableCallType2 = cloneInfo.callType2 - SettingUtils.enableCallType3 = cloneInfo.callType3 - SettingUtils.enableCallType4 = cloneInfo.callType4 - SettingUtils.enableCallType5 = cloneInfo.callType5 - SettingUtils.enableCallType6 = cloneInfo.callType6 - SettingUtils.enableAppNotify = cloneInfo.enableAppNotify - SettingUtils.enableCancelAppNotify = cloneInfo.cancelAppNotify - SettingUtils.cancelExtraAppNotify = cloneInfo.cancelExtraAppNotify.toString() - SettingUtils.enableNotUserPresent = cloneInfo.enableNotUserPresent - SettingUtils.enableLoadAppList = cloneInfo.enableLoadAppList - SettingUtils.enableLoadUserAppList = cloneInfo.enableLoadUserAppList - SettingUtils.enableLoadSystemAppList = cloneInfo.enableLoadSystemAppList - SettingUtils.duplicateMessagesLimits = cloneInfo.duplicateMessagesLimits - SettingUtils.enableNetworkStateReceiver = cloneInfo.enableNetworkStateReceiver - SettingUtils.enableBatteryReceiver = cloneInfo.enableBatteryReceiver - SettingUtils.batteryLevelMin = cloneInfo.batteryLevelMin - SettingUtils.batteryLevelMax = cloneInfo.batteryLevelMax - SettingUtils.batteryLevelOnce = cloneInfo.batteryLevelOnce - SettingUtils.enableBatteryCron = cloneInfo.enableBatteryCron - SettingUtils.batteryCronStartTime = cloneInfo.batteryCronStartTime.toString() - SettingUtils.batteryCronInterval = cloneInfo.batteryCronInterval - SettingUtils.enableExcludeFromRecents = cloneInfo.enableExcludeFromRecents - SettingUtils.enableCactus = cloneInfo.enableCactus - SettingUtils.enablePlaySilenceMusic = cloneInfo.enablePlaySilenceMusic - SettingUtils.enableOnePixelActivity = cloneInfo.enableOnePixelActivity - SettingUtils.requestRetryTimes = cloneInfo.requestRetryTimes - SettingUtils.requestDelayTime = cloneInfo.requestDelayTime - SettingUtils.requestTimeout = cloneInfo.requestTimeout - SettingUtils.notifyContent = cloneInfo.notifyContent.toString() - SettingUtils.enableSmsTemplate = cloneInfo.enableSmsTemplate - SettingUtils.smsTemplate = cloneInfo.smsTemplate.toString() - SettingUtils.enableHelpTip = cloneInfo.enableHelpTip - SettingUtils.enablePureClientMode = cloneInfo.enablePureClientMode - SettingUtils.enableSmsCommand = cloneInfo.enableSmsCommand - SettingUtils.smsCommandSafePhone = cloneInfo.smsCommandSafePhone.toString() - //删除发送通道、转发规则、转发日志 - Core.sender.deleteAll() + SharedPreference.clearPreference() + SharedPreference.importPreference(cloneInfo.settings) + //需要排除的配置 + SettingUtils.extraDeviceMark = "" + SettingUtils.subidSim1 = 0 + SettingUtils.extraSim1 = "" + SettingUtils.subidSim2 = 0 + SettingUtils.extraSim2 = "" + //删除消息与转发日志 + Core.logs.deleteAll() + Core.msg.deleteAll() //发送通道 + Core.sender.deleteAll() if (!cloneInfo.senderList.isNullOrEmpty()) { for (sender in cloneInfo.senderList!!) { Core.sender.insert(sender) } } //转发规则 + Core.rule.deleteAll() if (!cloneInfo.ruleList.isNullOrEmpty()) { for (rule in cloneInfo.ruleList!!) { Core.rule.insert(rule) diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreference.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreference.kt index be21c1c8..7832939b 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreference.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/SharedPreference.kt @@ -27,6 +27,67 @@ class SharedPreference(private val name: String, private val default: T) : Re //根据key删除存储数据 fun clearPreference(key: String) = preference.edit().remove(key).commit() + + //导出全部数据 + fun exportPreference(): String { + return serialize(preference.all) + } + + //导入全部数据 + fun importPreference(data: String) { + val map = deSerialization>(data) + val editor = preference.edit() + for ((key, value) in map) { + when (value) { + is Long -> editor.putLong(key, value) + is Int -> editor.putInt(key, value) + is String -> editor.putString(key, value) + is Boolean -> editor.putBoolean(key, value) + is Float -> editor.putFloat(key, value) + else -> editor.putString(key, serialize(value)) + } + } + editor.apply() + } + + /** + * 序列化对象 + * @throws IOException + */ + @Throws(IOException::class) + private fun serialize(obj: T): String { + val byteArrayOutputStream = ByteArrayOutputStream() + val objectOutputStream = ObjectOutputStream( + byteArrayOutputStream + ) + objectOutputStream.writeObject(obj) + var serStr = byteArrayOutputStream.toString("ISO-8859-1") + serStr = java.net.URLEncoder.encode(serStr, "UTF-8") + objectOutputStream.close() + byteArrayOutputStream.close() + return serStr + } + + /** + * 反序列化对象 + * @param str + * @throws IOException + * @throws ClassNotFoundException + */ + @Throws(IOException::class, ClassNotFoundException::class) + private fun deSerialization(str: String): T { + val redStr = java.net.URLDecoder.decode(str, "UTF-8") + val byteArrayInputStream = ByteArrayInputStream( + redStr.toByteArray(charset("ISO-8859-1")) + ) + val objectInputStream = ObjectInputStream( + byteArrayInputStream + ) + val obj = objectInputStream.readObject() as T + objectInputStream.close() + byteArrayInputStream.close() + return obj + } } override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { @@ -67,43 +128,4 @@ class SharedPreference(private val name: String, private val default: T) : Re else -> putString(name, serialize(value)) }.apply() } - - /** - * 序列化对象 - * @throws IOException - */ - @Throws(IOException::class) - private fun serialize(obj: T): String { - val byteArrayOutputStream = ByteArrayOutputStream() - val objectOutputStream = ObjectOutputStream( - byteArrayOutputStream - ) - objectOutputStream.writeObject(obj) - var serStr = byteArrayOutputStream.toString("ISO-8859-1") - serStr = java.net.URLEncoder.encode(serStr, "UTF-8") - objectOutputStream.close() - byteArrayOutputStream.close() - return serStr - } - - /** - * 反序列化对象 - * @param str - * @throws IOException - * @throws ClassNotFoundException - */ - @Throws(IOException::class, ClassNotFoundException::class) - private fun deSerialization(str: String): T { - val redStr = java.net.URLDecoder.decode(str, "UTF-8") - val byteArrayInputStream = ByteArrayInputStream( - redStr.toByteArray(charset("ISO-8859-1")) - ) - val objectInputStream = ObjectInputStream( - byteArrayInputStream - ) - val obj = objectInputStream.readObject() as T - objectInputStream.close() - byteArrayInputStream.close() - return obj - } } \ No newline at end of file diff --git a/app/src/main/res/values-en/strings.xml b/app/src/main/res/values-en/strings.xml index 78bf257a..0753154d 100644 --- a/app/src/main/res/values-en/strings.xml +++ b/app/src/main/res/values-en/strings.xml @@ -956,6 +956,7 @@ Disable forwarding period If the end time is less than the start time, it will span days; if it is equal, it will be disabled Do you want to download and restart to load! + Download successful, do you want to restart the loading now? AppKey AppSecret Text diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c52f374c..171f20a8 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -28,7 +28,7 @@ Frpc版本:%s 微信小程序 已清理缓存 - 已删除动态库,重启APP中… + 已删除动态库,重启APP以便生效! © %1$s PPPSCN All rights reserved. 开源仓库 GitHub @@ -916,7 +916,7 @@ 导出失败: %s 导入失败:请检查是否有外部存储访问权限! 导入失败:本地备份文件不存在! - 导入配置成功! + 导入配置成功!\n需要重启APP以便生效!\n重启后请再次核对所有配置项! 导入失败: %s 还原失败 电池状态监听 @@ -957,6 +957,7 @@ 免打扰(禁用转发)时间段 结束时间小于开始时间则跨天;相等则禁用 是否立即下载,并重启加载? + 下载成功,是否立即重启加载? AppKey AppSecret 文本类型