diff --git a/app/build.gradle b/app/build.gradle
index 54ac9411..cc7e5750 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -306,6 +306,11 @@ dependencies {
implementation 'gatewayapps.crondroid:crondroid:1.0.0'
//Java Parser For Cron Expressions: https://github.com/grahamar/cron-parser
implementation 'net.redhogs.cronparser:cron-parser-core:3.5'
+
+ // 侧边栏菜单:https://github.com/yarolegovich/SlidingRootNav
+ implementation 'com.yarolegovich:sliding-root-nav:1.1.1'
+ // TabBar:https://github.com/xuexiangjys/JPTabBar
+ // implementation 'com.github.xuexiangjys:JPTabBar:1.0.1'
}
//自动添加X-Library依赖
apply from: 'x-library.gradle'
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
index 30973e29..b2391d59 100644
--- a/app/proguard-rules.pro
+++ b/app/proguard-rules.pro
@@ -298,3 +298,7 @@
-dontwarn javax.lang.model.**
-dontwarn javax.naming.**
-dontwarn javax.naming.directory.**
+
+# This is generated automatically by the Android Gradle plugin.
+-dontwarn org.joda.convert.**
+-dontwarn org.slf4j.impl.**
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index dd4cc8d2..a8aead44 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -16,6 +16,7 @@
+
-
-
-
-
() //结束时间
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 df647990..fedd988a 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
@@ -1,77 +1,94 @@
package com.idormy.sms.forwarder.activity
-import android.annotation.SuppressLint
import android.app.ActivityManager
import android.content.Context
import android.content.Intent
+import android.graphics.drawable.Drawable
import android.os.Build
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
-import android.view.MenuItem
-import android.view.View
-import androidx.appcompat.app.ActionBarDrawerToggle
-import androidx.appcompat.widget.Toolbar
+import android.widget.LinearLayout
+import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView
-import androidx.viewpager.widget.ViewPager
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
-import com.google.android.material.bottomnavigation.BottomNavigationView
-import com.google.android.material.bottomsheet.BottomSheetDialog
+import com.google.android.material.tabs.TabLayout
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.adapter.WidgetItemAdapter
+import com.idormy.sms.forwarder.adapter.menu.DrawerAdapter
+import com.idormy.sms.forwarder.adapter.menu.DrawerItem
+import com.idormy.sms.forwarder.adapter.menu.SimpleItem
+import com.idormy.sms.forwarder.adapter.menu.SpaceItem
import com.idormy.sms.forwarder.core.BaseActivity
import com.idormy.sms.forwarder.core.webview.AgentWebActivity
-import com.idormy.sms.forwarder.database.AppDatabase
import com.idormy.sms.forwarder.databinding.ActivityMainBinding
-import com.idormy.sms.forwarder.fragment.*
+import com.idormy.sms.forwarder.fragment.AboutFragment
+import com.idormy.sms.forwarder.fragment.AppListFragment
+import com.idormy.sms.forwarder.fragment.ClientFragment
+import com.idormy.sms.forwarder.fragment.FrpcFragment
+import com.idormy.sms.forwarder.fragment.LogsFragment
+import com.idormy.sms.forwarder.fragment.RulesFragment
+import com.idormy.sms.forwarder.fragment.SendersFragment
+import com.idormy.sms.forwarder.fragment.ServerFragment
+import com.idormy.sms.forwarder.fragment.SettingsFragment
+import com.idormy.sms.forwarder.fragment.TasksFragment
import com.idormy.sms.forwarder.service.ForegroundService
-import com.idormy.sms.forwarder.utils.*
+import com.idormy.sms.forwarder.utils.FRPC_LIB_DOWNLOAD_URL
+import com.idormy.sms.forwarder.utils.FRPC_LIB_VERSION
+import com.idormy.sms.forwarder.utils.SettingUtils
+import com.idormy.sms.forwarder.utils.XToastUtils
import com.idormy.sms.forwarder.utils.sdkinit.XUpdateInit
import com.idormy.sms.forwarder.widget.GuideTipsDialog.Companion.showTips
-import com.idormy.sms.forwarder.widget.GuideTipsDialog.Companion.showTipsForce
import com.idormy.sms.forwarder.workers.LoadAppListWorker
-import com.jeremyliao.liveeventbus.LiveEventBus
-import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.callback.DownloadProgressCallBack
import com.xuexiang.xhttp2.exception.ApiException
-import com.xuexiang.xpage.base.XPageFragment
-import com.xuexiang.xpage.core.PageOption
-import com.xuexiang.xpage.model.PageInfo
-import com.xuexiang.xui.adapter.FragmentAdapter
-import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
-import com.xuexiang.xui.utils.DensityUtils
import com.xuexiang.xui.utils.ResUtils
+import com.xuexiang.xui.utils.ThemeUtils
+import com.xuexiang.xui.utils.ViewUtils
import com.xuexiang.xui.utils.WidgetUtils
-import com.xuexiang.xui.widget.alpha.XUIAlphaTextView
import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.GravityEnum
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.net.NetworkUtils
+import com.yarolegovich.slidingrootnav.SlideGravity
+import com.yarolegovich.slidingrootnav.SlidingRootNav
+import com.yarolegovich.slidingrootnav.SlidingRootNavBuilder
+import com.yarolegovich.slidingrootnav.callback.DragStateListener
import frpclib.Frpclib
-import io.reactivex.CompletableObserver
-import io.reactivex.android.schedulers.AndroidSchedulers
-import io.reactivex.disposables.Disposable
-import io.reactivex.schedulers.Schedulers
import java.io.File
-@Suppress("DEPRECATION", "PrivatePropertyName")
-class MainActivity : BaseActivity(),
- View.OnClickListener,
- BottomNavigationView.OnNavigationItemSelectedListener,
- Toolbar.OnMenuItemClickListener,
- RecyclerViewHolder.OnItemClickListener {
+@Suppress("PrivatePropertyName", "unused", "DEPRECATION")
+class MainActivity : BaseActivity(), DrawerAdapter.OnItemSelectedListener {
private val TAG: String = MainActivity::class.java.simpleName
- private lateinit var mTitles: Array
- private var logsType: String = "sms"
- private var ruleType: String = "sms"
+ //private lateinit var mTitles: Array
+ //private var logsType: String = "sms"
+ //private var ruleType: String = "sms"
+
+ private val POS_LOG = 0
+ private val POS_RULE = 1
+ private val POS_SENDER = 2
+ private val POS_SETTING = 3
+ private val POS_TASK = 5 //4为空行
+ private val POS_SERVER = 6
+ private val POS_CLIENT = 7
+ private val POS_FRPC = 8
+ private val POS_APPS = 9
+ private val POS_HELP = 11 //10为空行
+ private val POS_ABOUT = 12
+
+ private lateinit var mTabLayout: TabLayout
+ private lateinit var mSlidingRootNav: SlidingRootNav
+ private lateinit var mLLMenu: LinearLayout
+ private lateinit var mMenuTitles: Array
+ private lateinit var mMenuIcons: Array
+ private lateinit var mAdapter: DrawerAdapter
override fun viewBindingInflate(inflater: LayoutInflater?): ActivityMainBinding {
return ActivityMainBinding.inflate(inflater!!)
@@ -79,9 +96,10 @@ class MainActivity : BaseActivity(),
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
- initViews()
+
initData()
- initListeners()
+ initViews()
+ initSlidingMenu(savedInstanceState)
//不在最近任务列表中显示
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && SettingUtils.enableExcludeFromRecents) {
@@ -95,26 +113,23 @@ class MainActivity : BaseActivity(),
}
//检查通知权限是否获取
- XXPermissions.with(this)
- .permission(Permission.NOTIFICATION_SERVICE)
- .permission(Permission.POST_NOTIFICATIONS)
- .request(OnPermissionCallback { _, allGranted ->
- if (!allGranted) {
- XToastUtils.error(R.string.tips_notification)
- return@OnPermissionCallback
- }
+ XXPermissions.with(this).permission(Permission.NOTIFICATION_SERVICE).permission(Permission.POST_NOTIFICATIONS).request(OnPermissionCallback { _, allGranted ->
+ if (!allGranted) {
+ XToastUtils.error(R.string.tips_notification)
+ return@OnPermissionCallback
+ }
- //启动前台服务
- if (!ForegroundService.isRunning) {
- val serviceIntent = Intent(this, ForegroundService::class.java)
- serviceIntent.action = "START"
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- startForegroundService(serviceIntent)
- } else {
- startService(serviceIntent)
- }
+ //启动前台服务
+ if (!ForegroundService.isRunning) {
+ val serviceIntent = Intent(this, ForegroundService::class.java)
+ serviceIntent.action = "START"
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ startForegroundService(serviceIntent)
+ } else {
+ startService(serviceIntent)
}
- })
+ }
+ })
}
override val isSupportSlideBack: Boolean
@@ -122,24 +137,37 @@ class MainActivity : BaseActivity(),
private fun initViews() {
WidgetUtils.clearActivityBackground(this)
- mTitles = ResUtils.getStringArray(R.array.home_titles)
- binding!!.includeMain.toolbar.title = mTitles[0]
- binding!!.includeMain.toolbar.inflateMenu(R.menu.menu_logs)
- binding!!.includeMain.toolbar.setOnMenuItemClickListener(this)
+ initTab()
+ }
- //主页内容填充
- val fragments = arrayOf(
- LogsFragment(),
- RulesFragment(),
- SendersFragment(),
- SettingsFragment()
- )
- val adapter = FragmentAdapter(supportFragmentManager, fragments)
- binding!!.includeMain.viewPager.offscreenPageLimit = mTitles.size - 1
- binding!!.includeMain.viewPager.adapter = adapter
+ private fun initTab() {
+ mTabLayout = binding!!.tabs
+ WidgetUtils.addTabWithoutRipple(mTabLayout, getString(R.string.menu_logs), R.drawable.selector_icon_tabbar_logs)
+ WidgetUtils.addTabWithoutRipple(mTabLayout, getString(R.string.menu_rules), R.drawable.selector_icon_tabbar_rules)
+ WidgetUtils.addTabWithoutRipple(mTabLayout, getString(R.string.menu_senders), R.drawable.selector_icon_tabbar_senders)
+ WidgetUtils.addTabWithoutRipple(mTabLayout, getString(R.string.menu_settings), R.drawable.selector_icon_tabbar_settings)
+ WidgetUtils.setTabLayoutTextFont(mTabLayout)
+ switchPage(LogsFragment::class.java)
+ mTabLayout.addOnTabSelectedListener(object : TabLayout.OnTabSelectedListener {
+ override fun onTabSelected(tab: TabLayout.Tab) {
+ mAdapter.setSelected(tab.position)
+ when (tab.position) {
+ POS_LOG -> switchPage(LogsFragment::class.java)
+ POS_RULE -> switchPage(RulesFragment::class.java)
+ POS_SENDER -> switchPage(SendersFragment::class.java)
+ POS_SETTING -> switchPage(SettingsFragment::class.java)
+ }
+ }
+
+ override fun onTabUnselected(tab: TabLayout.Tab) {}
+ override fun onTabReselected(tab: TabLayout.Tab) {}
+ })
}
private fun initData() {
+ mMenuTitles = ResUtils.getStringArray(this, R.array.menu_titles)
+ mMenuIcons = ResUtils.getDrawableArray(this, R.array.menu_icons)
+
//仅当开启自动检查且有网络时自动检查更新/获取提示
if (SettingUtils.autoCheckUpdate && NetworkUtils.isHaveInternet()) {
showTips(this)
@@ -147,243 +175,6 @@ class MainActivity : BaseActivity(),
}
}
- fun initListeners() {
- val toggle = ActionBarDrawerToggle(
- this,
- binding!!.drawerLayout,
- binding!!.includeMain.toolbar,
- R.string.navigation_drawer_open,
- R.string.navigation_drawer_close
- )
- binding!!.drawerLayout.addDrawerListener(toggle)
- toggle.syncState()
-
- //侧边栏点击事件
- binding!!.navView.setNavigationItemSelectedListener { menuItem: MenuItem ->
- if (menuItem.isCheckable) {
- binding!!.drawerLayout.closeDrawers()
- return@setNavigationItemSelectedListener handleNavigationItemSelected(menuItem)
- } else {
- when (menuItem.itemId) {
- R.id.nav_task -> openNewPage(TasksFragment::class.java)
- R.id.nav_server -> openNewPage(ServerFragment::class.java)
- R.id.nav_client -> openNewPage(ClientFragment::class.java)
- R.id.nav_frpc -> {
- if (!FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so")) {
- MaterialDialog.Builder(this)
- .title(
- String.format(
- getString(R.string.frpclib_download_title),
- FRPC_LIB_VERSION
- )
- )
- .content(R.string.download_frpc_tips)
- .positiveText(R.string.lab_yes)
- .negativeText(R.string.lab_no)
- .onPositive { _: MaterialDialog?, _: DialogAction? ->
- downloadFrpcLib()
- }
- .show()
- return@setNavigationItemSelectedListener false
- }
-
- if (FRPC_LIB_VERSION == Frpclib.getVersion()) {
- openNewPage(FrpcFragment::class.java)
- } else {
- MaterialDialog.Builder(this)
- .title(R.string.frpclib_version_mismatch)
- .content(R.string.download_frpc_tips)
- .positiveText(R.string.lab_yes)
- .negativeText(R.string.lab_no)
- .onPositive { _: MaterialDialog?, _: DialogAction? ->
- downloadFrpcLib()
- }
- .show()
- }
- }
-
- R.id.nav_app_list -> {
- if (App.UserAppList.isEmpty() && App.SystemAppList.isEmpty()) {
- XToastUtils.info(getString(R.string.loading_app_list))
- val request = OneTimeWorkRequestBuilder().build()
- WorkManager.getInstance(this).enqueue(request)
- Thread.sleep(2000)
- }
- openNewPage(AppListFragment::class.java)
- }
- //R.id.nav_logcat -> openNewPage(LogcatFragment::class.java)
- R.id.nav_help -> AgentWebActivity.goWeb(this, getString(R.string.url_help))
- R.id.nav_about -> openNewPage(AboutFragment::class.java)
- else -> XToastUtils.toast("Click:" + menuItem.title)
- }
- }
- true
- }
-
- //主页事件监听
- binding!!.includeMain.viewPager.addOnPageChangeListener(object :
- ViewPager.OnPageChangeListener {
- override fun onPageScrolled(
- position: Int,
- positionOffset: Float,
- positionOffsetPixels: Int,
- ) {
- }
-
- override fun onPageSelected(position: Int) {
- val item = binding!!.includeMain.bottomNavigation.menu.getItem(position)
- binding!!.includeMain.toolbar.title = item.title
- binding!!.includeMain.toolbar.menu.clear()
- when (item.title) {
- getString(R.string.menu_rules) -> binding!!.includeMain.toolbar.inflateMenu(
- R.menu.menu_rules
- )
-
- getString(R.string.menu_senders) -> binding!!.includeMain.toolbar.inflateMenu(
- R.menu.menu_senders
- )
-
- getString(R.string.menu_settings) -> binding!!.includeMain.toolbar.inflateMenu(
- R.menu.menu_settings
- )
-
- else -> binding!!.includeMain.toolbar.inflateMenu(R.menu.menu_logs)
- }
- item.isChecked = true
- updateSideNavStatus(item)
- }
-
- override fun onPageScrollStateChanged(state: Int) {}
- })
- binding!!.includeMain.bottomNavigation.setOnNavigationItemSelectedListener(this)
-
- //tabBar分类切换
- LiveEventBus.get(EVENT_UPDATE_LOGS_TYPE, String::class.java).observe(this) { type: String ->
- logsType = type
- }
- LiveEventBus.get(EVENT_UPDATE_RULE_TYPE, String::class.java).observe(this) { type: String ->
- ruleType = type
- }
- }
-
- /**
- * 处理侧边栏点击事件
- *
- * @param menuItem
- * @return
- */
- private fun handleNavigationItemSelected(menuItem: MenuItem): Boolean {
- for (index in mTitles.indices) {
- if (mTitles[index] == menuItem.title) {
- binding!!.includeMain.toolbar.title = menuItem.title
- binding!!.includeMain.viewPager.setCurrentItem(index, false)
- return true
- }
- }
- return false
- }
-
- @SuppressLint("InflateParams")
- override fun onMenuItemClick(item: MenuItem): Boolean {
- when (item.itemId) {
- R.id.action_notifications -> {
- showTipsForce(this)
- }
-
- R.id.action_clear_logs -> {
- MaterialDialog.Builder(this)
- .content(R.string.delete_type_log_tips)
- .positiveText(R.string.lab_yes)
- .negativeText(R.string.lab_no)
- .onPositive { _: MaterialDialog?, _: DialogAction? ->
- AppDatabase.getInstance(this)
- .msgDao()
- .deleteAll(logsType)
- .subscribeOn(Schedulers.io())
- .observeOn(AndroidSchedulers.mainThread())
- .subscribe(object : CompletableObserver {
- override fun onSubscribe(d: Disposable) {}
- override fun onComplete() {
- XToastUtils.success(R.string.delete_type_log_toast)
- }
-
- override fun onError(e: Throwable) {
- e.message?.let { XToastUtils.error(it) }
- }
- })
- }
- .show()
- }
-
- R.id.action_add_sender -> {
- val dialog = BottomSheetDialog(this)
- val view: View =
- LayoutInflater.from(this).inflate(R.layout.dialog_sender_bottom_sheet, null)
- val recyclerView: RecyclerView = view.findViewById(R.id.recyclerView)
-
- WidgetUtils.initGridRecyclerView(recyclerView, 4, DensityUtils.dp2px(1f))
- val widgetItemAdapter = WidgetItemAdapter(SENDER_FRAGMENT_LIST)
- widgetItemAdapter.setOnItemClickListener(this)
- recyclerView.adapter = widgetItemAdapter
-
- val bottomSheetCloseButton: XUIAlphaTextView = view.findViewById(R.id.bottom_sheet_close_button)
- bottomSheetCloseButton.setOnClickListener { dialog.dismiss() }
-
- dialog.setContentView(view)
- dialog.setCancelable(true)
- dialog.setCanceledOnTouchOutside(true)
- dialog.show()
- WidgetUtils.transparentBottomSheetDialogBackground(dialog)
- }
-
- R.id.action_add_rule -> {
- PageOption.to(RulesEditFragment::class.java)
- .putString(KEY_RULE_TYPE, ruleType)
- .setNewActivity(true)
- .open(this)
- }
- /*R.id.action_restore_settings -> {
- XToastUtils.success(logsType)
- }*/
- }
- return false
- }
-
- @SingleClick
- override fun onClick(v: View) {
- }
-
- //================Navigation================//
- /**
- * 底部导航栏点击事件
- *
- * @param menuItem
- * @return
- */
- override fun onNavigationItemSelected(menuItem: MenuItem): Boolean {
- for (index in mTitles.indices) {
- if (mTitles[index] == menuItem.title) {
- binding!!.includeMain.toolbar.title = menuItem.title
- binding!!.includeMain.viewPager.setCurrentItem(index, false)
- updateSideNavStatus(menuItem)
- return true
- }
- }
- return false
- }
-
- /**
- * 更新侧边栏菜单选中状态
- *
- * @param menuItem
- */
- private fun updateSideNavStatus(menuItem: MenuItem) {
- val side = binding!!.navView.menu.findItem(menuItem.itemId)
- if (side != null) {
- side.isChecked = true
- }
- }
-
//按返回键不退出回到桌面
@Deprecated("Deprecated in Java")
override fun onBackPressed() {
@@ -393,20 +184,137 @@ class MainActivity : BaseActivity(),
startActivity(intent)
}
- @SingleClick
- override fun onItemClick(itemView: View, widgetInfo: PageInfo, pos: Int) {
- try {
- @Suppress("UNCHECKED_CAST")
- PageOption.to(Class.forName(widgetInfo.classPath) as Class) //跳转的fragment
- .setNewActivity(true)
- .putInt(KEY_SENDER_TYPE, pos) //注意:目前刚好是这个顺序而已
- .open(this)
- } catch (e: Exception) {
- e.printStackTrace()
- XToastUtils.error(e.message.toString())
+ fun openMenu() {
+ mSlidingRootNav.openMenu()
+ }
+
+ fun closeMenu() {
+ mSlidingRootNav.closeMenu()
+ }
+
+ fun isMenuOpen(): Boolean {
+ return mSlidingRootNav.isMenuOpened
+ }
+
+ private fun initSlidingMenu(savedInstanceState: Bundle?) {
+ mSlidingRootNav = SlidingRootNavBuilder(this).withGravity(if (ResUtils.isRtl(this)) SlideGravity.RIGHT else SlideGravity.LEFT).withMenuOpened(false).withContentClickableWhenMenuOpened(false).withSavedState(savedInstanceState).withMenuLayout(R.layout.menu_left_drawer).inject()
+ mLLMenu = mSlidingRootNav.layout.findViewById(R.id.ll_menu)
+ //val ivQrcode = mSlidingRootNav.layout.findViewById(R.id.iv_qrcode)
+ //ivQrcode.setOnClickListener { openNewPage(SettingsFragment::class.java) }
+ //val ivSetting = mSlidingRootNav.layout.findViewById(R.id.iv_setting)
+ //ivSetting.setOnClickListener { openNewPage(SettingsFragment::class.java) }
+ ViewUtils.setVisibility(mLLMenu, false)
+ mAdapter = DrawerAdapter(
+ mutableListOf(
+ createItemFor(POS_LOG).setChecked(true),
+ createItemFor(POS_RULE),
+ createItemFor(POS_SENDER),
+ createItemFor(POS_SETTING),
+ SpaceItem(15),
+ createItemFor(POS_TASK),
+ createItemFor(POS_SERVER),
+ createItemFor(POS_CLIENT),
+ createItemFor(POS_FRPC),
+ createItemFor(POS_APPS),
+ SpaceItem(15),
+ createItemFor(POS_HELP),
+ createItemFor(POS_ABOUT),
+ )
+ )
+ mAdapter.setListener(this)
+ val list: RecyclerView = findViewById(R.id.list)
+ list.isNestedScrollingEnabled = false
+ list.layoutManager = LinearLayoutManager(this)
+ list.adapter = mAdapter
+ mAdapter.setSelected(POS_LOG)
+ mSlidingRootNav.isMenuLocked = false
+ mSlidingRootNav.layout.addDragStateListener(object : DragStateListener {
+ override fun onDragStart() {
+ ViewUtils.setVisibility(mLLMenu, true)
+ }
+
+ override fun onDragEnd(isMenuOpened: Boolean) {
+ ViewUtils.setVisibility(mLLMenu, isMenuOpened)
+ /*if (isMenuOpened) {
+ if (!GuideCaseView.isShowOnce(this@MainActivity, getString(R.string.guide_key_sliding_root_navigation))) {
+ val guideStep1 = GuideCaseView.Builder(this@MainActivity)
+ .title("点击进入,可切换主题样式哦~~")
+ .titleSize(18, TypedValue.COMPLEX_UNIT_SP)
+ .focusOn(ivSetting)
+ .build()
+ val guideStep2 = GuideCaseView.Builder(this@MainActivity)
+ .title("点击进入,扫码关注哦~~")
+ .titleSize(18, TypedValue.COMPLEX_UNIT_SP)
+ .focusOn(ivQrcode)
+ .build()
+ GuideCaseQueue()
+ .add(guideStep1)
+ .add(guideStep2)
+ .show()
+ GuideCaseView.setShowOnce(this@MainActivity, getString(R.string.guide_key_sliding_root_navigation))
+ }
+ }*/
+ }
+ })
+ }
+
+ override fun onItemSelected(position: Int) {
+ when (position) {
+ POS_LOG, POS_RULE, POS_SENDER, POS_SETTING -> {
+ val tab = mTabLayout.getTabAt(position)
+ tab?.select()
+ mSlidingRootNav.closeMenu()
+ }
+
+ POS_TASK -> openNewPage(TasksFragment::class.java)
+ POS_SERVER -> openNewPage(ServerFragment::class.java)
+ POS_CLIENT -> openNewPage(ClientFragment::class.java)
+ POS_FRPC -> {
+ if (FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so") && FRPC_LIB_VERSION == Frpclib.getVersion()) {
+ openNewPage(FrpcFragment::class.java)
+ return
+ }
+
+ val title = if (!FileUtils.isFileExists(filesDir.absolutePath + "/libs/libgojni.so")) {
+ String.format(getString(R.string.frpclib_download_title), FRPC_LIB_VERSION)
+ } else {
+ getString(R.string.frpclib_version_mismatch)
+ }
+
+ MaterialDialog.Builder(this)
+ .title(title)
+ .content(R.string.download_frpc_tips)
+ .positiveText(R.string.lab_yes)
+ .negativeText(R.string.lab_no)
+ .onPositive { _: MaterialDialog?, _: DialogAction? ->
+ downloadFrpcLib()
+ }
+ .show()
+ }
+
+ POS_APPS -> {
+ if (App.UserAppList.isEmpty() && App.SystemAppList.isEmpty()) {
+ XToastUtils.info(getString(R.string.loading_app_list))
+ val request = OneTimeWorkRequestBuilder().build()
+ WorkManager.getInstance(this).enqueue(request)
+ return
+ }
+ openNewPage(AppListFragment::class.java)
+ }
+
+ POS_HELP -> AgentWebActivity.goWeb(this, getString(R.string.url_help))
+ POS_ABOUT -> openNewPage(AboutFragment::class.java)
}
}
+ private fun createItemFor(position: Int): DrawerItem<*> {
+ return SimpleItem(mMenuIcons[position], mMenuTitles[position])
+ .withIconTint(ThemeUtils.resolveColor(this, R.attr.xui_config_color_content_text))
+ .withTextTint(ThemeUtils.resolveColor(this, R.attr.xui_config_color_content_text))
+ .withSelectedIconTint(ThemeUtils.getMainThemeColor(this))
+ .withSelectedTextTint(ThemeUtils.getMainThemeColor(this))
+ }
+
//动态加载FrpcLib
private fun downloadFrpcLib() {
val cpuAbi = when (Build.CPU_ABI) {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/FrpcPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/FrpcPagingAdapter.kt
index fa2e999f..34b8455d 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/FrpcPagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/FrpcPagingAdapter.kt
@@ -15,6 +15,7 @@ import com.idormy.sms.forwarder.databinding.AdapterFrpcsCardViewListItemBinding
import com.xuexiang.xutil.resource.ResUtils.getColors
import frpclib.Frpclib
+@Suppress("EmptyMethod", "unused")
class FrpcPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/LogsPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/LogsPagingAdapter.kt
index 4e448663..e8c1c78a 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/LogsPagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/LogsPagingAdapter.kt
@@ -12,7 +12,6 @@ import com.idormy.sms.forwarder.database.entity.LogsAndRuleAndSender
import com.idormy.sms.forwarder.databinding.AdapterLogsCardViewListItemBinding
import com.xuexiang.xutil.data.DateUtils
-@Suppress("unused")
class LogsPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/MsgPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/MsgPagingAdapter.kt
index c41413bb..bba93742 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/MsgPagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/MsgPagingAdapter.kt
@@ -18,6 +18,7 @@ import com.idormy.sms.forwarder.database.entity.MsgAndLogs
import com.idormy.sms.forwarder.databinding.AdapterLogsCardViewListItemBinding
import com.xuexiang.xutil.data.DateUtils
+@Suppress("EmptyMethod", "unused")
class MsgPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/RulePagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/RulePagingAdapter.kt
index e1386a2c..c8f17bca 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/RulePagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/RulePagingAdapter.kt
@@ -16,6 +16,7 @@ import com.idormy.sms.forwarder.adapter.RulePagingAdapter.MyViewHolder
import com.idormy.sms.forwarder.database.entity.Rule
import com.idormy.sms.forwarder.databinding.AdapterRulesCardViewListItemBinding
+@Suppress("EmptyMethod", "unused")
class RulePagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/SenderPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/SenderPagingAdapter.kt
index b383cdd9..220935a0 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/SenderPagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/SenderPagingAdapter.kt
@@ -11,6 +11,7 @@ import com.idormy.sms.forwarder.adapter.SenderPagingAdapter.MyViewHolder
import com.idormy.sms.forwarder.database.entity.Sender
import com.idormy.sms.forwarder.databinding.AdapterSendersCardViewListItemBinding
+@Suppress("EmptyMethod", "unused")
class SenderPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt
index f828b661..c838b16d 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskPagingAdapter.kt
@@ -18,6 +18,7 @@ import com.idormy.sms.forwarder.databinding.AdapterTasksCardViewListItemBinding
import com.idormy.sms.forwarder.entity.TaskSetting
import com.xuexiang.xutil.data.DateUtils
+@Suppress("EmptyMethod", "unused")
class TaskPagingAdapter(private val itemClickListener: OnItemClickListener) : PagingDataAdapter(diffCallback) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskSettingAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskSettingAdapter.kt
index 92d221f2..4af529fb 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskSettingAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/TaskSettingAdapter.kt
@@ -1,5 +1,3 @@
-@file:Suppress("DEPRECATION")
-
package com.idormy.sms.forwarder.adapter
import android.annotation.SuppressLint
@@ -14,6 +12,7 @@ import androidx.recyclerview.widget.RecyclerView
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.entity.TaskSetting
+@Suppress("DEPRECATION", "unused")
class TaskSettingAdapter(
val itemList: MutableList,
private val editClickListener: (Int) -> Unit,
@@ -90,11 +89,10 @@ class TaskSettingAdapter(
notifyItemMoved(fromPosition, toPosition)
}
- override fun onDragFinished() {
- TODO("Not yet implemented")
- }
+ override fun onDragFinished() {}
}
+@Suppress("DEPRECATION")
class ItemMoveCallback(private val listener: Listener) : ItemTouchHelper.Callback() {
interface Listener {
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliRecyclerAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliRecyclerAdapter.kt
index bd943c0b..86ef7527 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliRecyclerAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliRecyclerAdapter.kt
@@ -12,6 +12,7 @@ import me.samlss.broccoli.Broccoli
* @author XUE
* @since 2019/4/8 16:33
*/
+@Suppress("unused")
abstract class BroccoliRecyclerAdapter(collection: Collection?) :
BaseRecyclerAdapter(collection) {
/**
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliSimpleDelegateAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliSimpleDelegateAdapter.kt
index 94a6d4c5..df757175 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliSimpleDelegateAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/broccoli/BroccoliSimpleDelegateAdapter.kt
@@ -15,6 +15,7 @@ import me.samlss.broccoli.Broccoli
* @author xuexiang
* @since 2021/1/9 4:52 PM
*/
+@Suppress("unused")
abstract class BroccoliSimpleDelegateAdapter : SimpleDelegateAdapter {
/**
* 是否已经加载成功
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/delegate/BaseDelegateAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/delegate/BaseDelegateAdapter.kt
index 27561ea1..af639d2d 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/base/delegate/BaseDelegateAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/base/delegate/BaseDelegateAdapter.kt
@@ -9,6 +9,7 @@ import com.xuexiang.xui.adapter.recyclerview.RecyclerViewHolder
* @author xuexiang
* @since 2020/3/20 12:44 AM
*/
+@Suppress("unused")
abstract class BaseDelegateAdapter : XDelegateAdapter {
constructor() : super()
constructor(list: Collection?) : super(list)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerAdapter.kt
new file mode 100644
index 00000000..d63f77c4
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerAdapter.kt
@@ -0,0 +1,83 @@
+package com.idormy.sms.forwarder.adapter.menu
+
+import android.util.SparseArray
+import android.view.View
+import android.view.ViewGroup
+import androidx.recyclerview.widget.RecyclerView
+
+@Suppress("LeakingThis", "UNCHECKED_CAST")
+class DrawerAdapter(private val items: List>) : RecyclerView.Adapter() {
+
+ private val viewTypes: MutableMap>, Int> = HashMap()
+ private val holderFactories = SparseArray>()
+
+ private var listener: OnItemSelectedListener? = null
+
+ init {
+ processViewTypes()
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+ val holder = holderFactories.get(viewType).createViewHolder(parent)
+ holder.adapter = this
+ return holder
+ }
+
+ override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+ (items[position] as DrawerItem).bindViewHolder(holder)
+ }
+
+ override fun getItemCount(): Int = items.size
+
+ override fun getItemViewType(position: Int): Int = viewTypes[items[position]::class.java] ?: -1
+
+ private fun processViewTypes() {
+ var type = 0
+ items.forEach { item ->
+ if (!viewTypes.containsKey(item::class.java)) {
+ viewTypes[item::class.java] = type
+ holderFactories.put(type, item)
+ type++
+ }
+ }
+ }
+
+ fun setSelected(position: Int) {
+ val newChecked = items[position]
+ if (!newChecked.isSelectable()) return
+
+ items.forEachIndexed { index, item ->
+ if (item.isChecked()) {
+ item.setChecked(false)
+ notifyItemChanged(index)
+ return@forEachIndexed
+ }
+ }
+
+ newChecked.setChecked(true)
+ notifyItemChanged(position)
+
+ listener?.onItemSelected(position)
+ }
+
+ fun setListener(listener: OnItemSelectedListener?) {
+ this.listener = listener
+ }
+
+ @Suppress("DEPRECATION")
+ abstract class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView), View.OnClickListener {
+ var adapter: DrawerAdapter? = null
+
+ init {
+ itemView.setOnClickListener(this)
+ }
+
+ override fun onClick(v: View) {
+ adapter?.setSelected(adapterPosition)
+ }
+ }
+
+ interface OnItemSelectedListener {
+ fun onItemSelected(position: Int)
+ }
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerItem.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerItem.kt
new file mode 100644
index 00000000..3c91cd6e
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/DrawerItem.kt
@@ -0,0 +1,19 @@
+package com.idormy.sms.forwarder.adapter.menu
+
+import android.view.ViewGroup
+
+abstract class DrawerItem {
+ private var isChecked = false
+
+ abstract fun createViewHolder(parent: ViewGroup): T
+ abstract fun bindViewHolder(holder: T)
+
+ fun setChecked(checked: Boolean): DrawerItem {
+ isChecked = checked
+ return this
+ }
+
+ fun isChecked(): Boolean = isChecked
+
+ open fun isSelectable(): Boolean = true
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SimpleItem.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SimpleItem.kt
new file mode 100644
index 00000000..d41d022b
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SimpleItem.kt
@@ -0,0 +1,54 @@
+package com.idormy.sms.forwarder.adapter.menu
+
+import android.graphics.drawable.Drawable
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import com.idormy.sms.forwarder.R
+
+class SimpleItem(
+ private val icon: Drawable,
+ private val title: String,
+ private var selectedItemIconTint: Int = 0,
+ private var selectedItemTextTint: Int = 0,
+ private var normalItemIconTint: Int = 0,
+ private var normalItemTextTint: Int = 0
+) : DrawerItem() {
+
+ override fun createViewHolder(parent: ViewGroup): ViewHolder {
+ val inflater = LayoutInflater.from(parent.context)
+ val v = inflater.inflate(R.layout.menu_item_option, parent, false)
+ return ViewHolder(v)
+ }
+
+ override fun bindViewHolder(holder: ViewHolder) {
+ holder.title.text = title
+ holder.icon.setImageDrawable(icon)
+
+ holder.title.setTextColor(if (isChecked()) selectedItemTextTint else normalItemTextTint)
+ holder.icon.setColorFilter(if (isChecked()) selectedItemIconTint else normalItemIconTint)
+ }
+
+ fun withSelectedIconTint(selectedItemIconTint: Int): SimpleItem = apply {
+ this.selectedItemIconTint = selectedItemIconTint
+ }
+
+ fun withSelectedTextTint(selectedItemTextTint: Int): SimpleItem = apply {
+ this.selectedItemTextTint = selectedItemTextTint
+ }
+
+ fun withIconTint(normalItemIconTint: Int): SimpleItem = apply {
+ this.normalItemIconTint = normalItemIconTint
+ }
+
+ fun withTextTint(normalItemTextTint: Int): SimpleItem = apply {
+ this.normalItemTextTint = normalItemTextTint
+ }
+
+ class ViewHolder(itemView: View) : DrawerAdapter.ViewHolder(itemView) {
+ val icon: ImageView = itemView.findViewById(R.id.icon)
+ val title: TextView = itemView.findViewById(R.id.title)
+ }
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SpaceItem.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SpaceItem.kt
new file mode 100644
index 00000000..a271ee05
--- /dev/null
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/menu/SpaceItem.kt
@@ -0,0 +1,24 @@
+package com.idormy.sms.forwarder.adapter.menu
+
+import android.content.Context
+import android.view.View
+import android.view.ViewGroup
+
+class SpaceItem(private val spaceDp: Int) : DrawerItem() {
+
+ override fun createViewHolder(parent: ViewGroup): ViewHolder {
+ val context: Context = parent.context
+ val view = View(context).apply {
+ layoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT, (context.resources.displayMetrics.density * spaceDp).toInt()
+ )
+ }
+ return ViewHolder(view)
+ }
+
+ override fun bindViewHolder(holder: ViewHolder) {}
+
+ override fun isSelectable(): Boolean = false
+
+ class ViewHolder(itemView: View) : DrawerAdapter.ViewHolder(itemView)
+}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/SenderSpinnerAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/SenderSpinnerAdapter.kt
index 8769118d..8315b4c4 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/SenderSpinnerAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/adapter/spinner/SenderSpinnerAdapter.kt
@@ -76,8 +76,8 @@ class SenderSpinnerAdapter : BaseEditSpinnerAdapter, EditSpinnerFilter {
holder.statusView.setImageDrawable(
ResUtils.getDrawable(
when (item.status) {
- STATUS_OFF -> R.drawable.icon_off
- else -> R.drawable.icon_on
+ STATUS_OFF -> R.drawable.ic_stop
+ else -> R.drawable.ic_start
}
)
)
diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/BaseActivity.kt b/app/src/main/java/com/idormy/sms/forwarder/core/BaseActivity.kt
index 49590d2f..580d63f9 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/core/BaseActivity.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/core/BaseActivity.kt
@@ -26,7 +26,7 @@ import io.github.inflationx.viewpump.ViewPumpContextWrapper
* @author XUE
* @since 2019/3/22 11:21
*/
-@Suppress("MemberVisibilityCanBePrivate", "UNCHECKED_CAST", "DEPRECATION")
+@Suppress("MemberVisibilityCanBePrivate", "UNCHECKED_CAST", "DEPRECATION", "EmptyMethod")
open class BaseActivity : XPageActivity() {
/**
* 获取Binding
diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/BaseContainerFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/core/BaseContainerFragment.kt
index b10d014e..d5b27ba3 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/core/BaseContainerFragment.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/core/BaseContainerFragment.kt
@@ -16,7 +16,7 @@ import com.xuexiang.xui.widget.actionbar.TitleUtils
* @author xuexiang
* @since 2018/11/22 上午11:26
*/
-@Suppress("unused", "UNUSED_PARAMETER")
+@Suppress("UNUSED_PARAMETER", "unused")
abstract class BaseContainerFragment : XPageContainerListFragment() {
override fun initPage() {
initTitle()
diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/BaseFragment.kt b/app/src/main/java/com/idormy/sms/forwarder/core/BaseFragment.kt
index 465ef3b7..9c0fc6dd 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/core/BaseFragment.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/core/BaseFragment.kt
@@ -35,7 +35,7 @@ import java.lang.reflect.Type
* @author xuexiang
* @since 2018/5/25 下午3:44
*/
-@Suppress("MemberVisibilityCanBePrivate")
+@Suppress("MemberVisibilityCanBePrivate", "EmptyMethod")
abstract class BaseFragment : XPageFragment() {
private var mIProgressLoader: IProgressLoader? = null
@@ -204,27 +204,35 @@ abstract class BaseFragment : XPageFragment() {
is Int -> {
option.putInt(key, value)
}
+
is Float -> {
option.putFloat(key, value)
}
+
is String -> {
option.putString(key, value)
}
+
is Boolean -> {
option.putBoolean(key, value)
}
+
is Long -> {
option.putLong(key, value)
}
+
is Double -> {
option.putDouble(key, value)
}
+
is Parcelable -> {
option.putParcelable(key, value)
}
+
is Serializable -> {
option.putSerializable(key, value)
}
+
else -> {
option.putString(key, serializeObject(value))
}
diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/Core.kt b/app/src/main/java/com/idormy/sms/forwarder/core/Core.kt
index 4bdc512c..e50be018 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/core/Core.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/core/Core.kt
@@ -5,10 +5,14 @@ import android.util.Log
import androidx.work.Configuration
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.BuildConfig
-import com.idormy.sms.forwarder.database.repository.*
+import com.idormy.sms.forwarder.database.repository.FrpcRepository
+import com.idormy.sms.forwarder.database.repository.LogsRepository
+import com.idormy.sms.forwarder.database.repository.MsgRepository
+import com.idormy.sms.forwarder.database.repository.RuleRepository
+import com.idormy.sms.forwarder.database.repository.SenderRepository
+import com.idormy.sms.forwarder.database.repository.TaskRepository
import kotlinx.coroutines.launch
-@Suppress("unused")
object Core : Configuration.Provider {
lateinit var app: Application
val frpc: FrpcRepository by lazy { (app as App).frpcRepository }
diff --git a/app/src/main/java/com/idormy/sms/forwarder/core/SimpleListAdapter.kt b/app/src/main/java/com/idormy/sms/forwarder/core/SimpleListAdapter.kt
index 7289f83a..5e282ae5 100644
--- a/app/src/main/java/com/idormy/sms/forwarder/core/SimpleListAdapter.kt
+++ b/app/src/main/java/com/idormy/sms/forwarder/core/SimpleListAdapter.kt
@@ -13,6 +13,7 @@ import com.xuexiang.xutil.common.StringUtils
* @author xuexiang
* @since 2018/12/19 上午12:19
*/
+@Suppress("unused")
class SimpleListAdapter(context: Context?, data: List