整理:code review

pull/408/head
pppscn 5 months ago
parent 5ca161629f
commit 0faa6bf26a

@ -1,3 +1,4 @@
#file: noinspection YAMLSchemaValidation
blank_issues_enabled: false
contact_links:
- name: SmsForwarder 使用流程与问题排查流程

@ -1,3 +1,5 @@
//file:noinspection GrDeprecatedAPIUsage
//file:noinspection DependencyNotationArgument
plugins {
id 'com.android.application'
id 'kotlin-android'
@ -159,7 +161,7 @@ android {
}
}
android.applicationVariants.all { variant ->
android.applicationVariants.configureEach { variant ->
// Assigns a different version code for each output APK.
variant.outputs.each { output ->
def date = new Date().format("yyyyMMdd", TimeZone.getTimeZone("GMT+08"))
@ -197,8 +199,11 @@ dependencies {
androidTestImplementation 'androidx.test.ext:junit:1.1.5'
androidTestImplementation deps.espresso.core
//noinspection GradleDependency
implementation 'androidx.core:core-ktx:1.9.0'
//noinspection GradleDependency
implementation 'androidx.activity:activity-ktx:1.6.1'
//noinspection GradleDependency
implementation 'androidx.fragment:fragment-ktx:1.5.5'
implementation "androidx.cardview:cardview:1.0.0"
implementation 'androidx.appcompat:appcompat:1.6.1'
@ -231,15 +236,22 @@ dependencies {
//implementation 'com.meituan.android.walle:library:1.1.6'
def work_version = '2.8.1'
//noinspection GradleDependency
api("androidx.work:work-multiprocess:$work_version")
//noinspection GradleDependency
api("androidx.work:work-runtime-ktx:$work_version")
//Android Room
def room_version = '2.5.2'
//noinspection GradleDependency
implementation "androidx.room:room-ktx:$room_version"
//noinspection GradleDependency
implementation "androidx.room:room-runtime:$room_version"
//noinspection GradleDependency
implementation "androidx.room:room-paging:$room_version"
//noinspection GradleDependency
implementation "androidx.room:room-rxjava2:$room_version"
//noinspection KaptUsageInsteadOfKsp
kapt "androidx.room:room-compiler:$room_version"
//CodeViewhttps://github.com/AmrDeveloper/CodeView
@ -258,12 +270,14 @@ dependencies {
implementation "com.squareup.retrofit2:adapter-rxjava2:$retrofit2_version"
def paging_version = "3.1.1"
//noinspection GradleDependency
implementation "androidx.paging:paging-runtime-ktx:$paging_version"
// alternatively - without Android dependencies for tests
//noinspection GradleDependency
testImplementation "androidx.paging:paging-common-ktx:$paging_version"
//https://github.com/getActivity/XXPermissions
implementation 'com.github.getActivity:XXPermissions:18.2'
implementation 'com.github.getActivity:XXPermissions:18.5'
def mail_version = '1.6.7'
implementation "com.sun.mail:android-mail:$mail_version"

@ -230,7 +230,8 @@
android:enabled="true" />
<service
android:name=".service.LocationService"
android:enabled="true" />
android:enabled="true"
android:foregroundServiceType="location" />
<service
android:name=".service.NotificationService"
android:enabled="true"
@ -241,10 +242,6 @@
<action android:name="android.service.notification.NotificationListenerService" />
</intent-filter>
</service>
<service
android:name=".workers.CronWorker"
android:exported="false"
android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver
android:name=".receiver.BatteryReceiver"

@ -14,8 +14,8 @@ import com.alibaba.android.vlayout.DelegateAdapter
* @author xuexiang
* @since 2020/3/20 12:17 AM
*/
@Suppress("unused", "WRONG_TYPE_PARAMETER_NULLABILITY_FOR_JAVA_OVERRIDE")
abstract class XDelegateAdapter<T, V : RecyclerView.ViewHolder?> : DelegateAdapter.Adapter<V> {
@Suppress("unused")
abstract class XDelegateAdapter<T, V : RecyclerView.ViewHolder> : DelegateAdapter.Adapter<V> {
/**
* 数据源
*/

@ -3,7 +3,7 @@ package com.idormy.sms.forwarder.adapter.spinner
import android.graphics.drawable.Drawable
import com.xuexiang.xui.utils.ResUtils
@Suppress("unused")
@Suppress("unused", "DEPRECATION")
class AppListAdapterItem {
var name: String = ""

@ -4,7 +4,7 @@ import android.content.Context
import android.graphics.drawable.Drawable
import com.xuexiang.xui.utils.ResUtils
@Suppress("unused")
@Suppress("unused", "DEPRECATION")
class SenderAdapterItem {
//标题内容

@ -20,6 +20,7 @@ import java.net.URISyntaxException
* @author xuexiang
* @since 2019-10-21 9:51
*/
@Suppress("DEPRECATION")
class WebViewInterceptDialog : AppCompatActivity(), DialogInterface.OnDismissListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

@ -8,7 +8,7 @@ import androidx.room.PrimaryKey
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.STATUS_ON
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.Date
@Parcelize
@Entity(tableName = "Frpc")

@ -1,10 +1,13 @@
package com.idormy.sms.forwarder.database.entity
import android.os.Parcelable
import androidx.room.*
import com.idormy.sms.forwarder.R
import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.ForeignKey
import androidx.room.Index
import androidx.room.PrimaryKey
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.Date
@Parcelize
@Entity(

@ -4,9 +4,24 @@ import android.os.Parcelable
import androidx.room.ColumnInfo
import androidx.room.DatabaseView
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.TYPE_BARK
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_GROUP_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_INNER_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_EMAIL
import com.idormy.sms.forwarder.utils.TYPE_FEISHU
import com.idormy.sms.forwarder.utils.TYPE_FEISHU_APP
import com.idormy.sms.forwarder.utils.TYPE_GOTIFY
import com.idormy.sms.forwarder.utils.TYPE_PUSHPLUS
import com.idormy.sms.forwarder.utils.TYPE_SERVERCHAN
import com.idormy.sms.forwarder.utils.TYPE_SMS
import com.idormy.sms.forwarder.utils.TYPE_SOCKET
import com.idormy.sms.forwarder.utils.TYPE_TELEGRAM
import com.idormy.sms.forwarder.utils.TYPE_URL_SCHEME
import com.idormy.sms.forwarder.utils.TYPE_WEBHOOK
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_AGENT
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_ROBOT
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.Date
@Parcelize
@DatabaseView("SELECT LOGS.id,LOGS.type,LOGS.msg_id,LOGS.rule_id,LOGS.sender_id,LOGS.forward_status,LOGS.forward_response,LOGS.TIME,Rule.filed AS rule_filed,Rule.`check` AS rule_check,Rule.value AS rule_value,Rule.sim_slot AS rule_sim_slot,Sender.type AS sender_type,Sender.NAME AS sender_name FROM LOGS LEFT JOIN Rule ON LOGS.rule_id = Rule.id LEFT JOIN Sender ON LOGS.sender_id = Sender.id")

@ -7,7 +7,7 @@ import androidx.room.Index
import androidx.room.PrimaryKey
import com.idormy.sms.forwarder.R
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.Date
@Parcelize
@Entity(

@ -5,9 +5,25 @@ import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.idormy.sms.forwarder.utils.TYPE_BARK
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_GROUP_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_INNER_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_EMAIL
import com.idormy.sms.forwarder.utils.TYPE_FEISHU
import com.idormy.sms.forwarder.utils.TYPE_FEISHU_APP
import com.idormy.sms.forwarder.utils.TYPE_GOTIFY
import com.idormy.sms.forwarder.utils.TYPE_PUSHPLUS
import com.idormy.sms.forwarder.utils.TYPE_SERVERCHAN
import com.idormy.sms.forwarder.utils.TYPE_SMS
import com.idormy.sms.forwarder.utils.TYPE_SOCKET
import com.idormy.sms.forwarder.utils.TYPE_TELEGRAM
import com.idormy.sms.forwarder.utils.TYPE_URL_SCHEME
import com.idormy.sms.forwarder.utils.TYPE_WEBHOOK
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_AGENT
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_ROBOT
import kotlinx.parcelize.Parcelize
import java.util.*
import java.util.Date
@Parcelize
@Entity(tableName = "Sender")

@ -1,7 +1,7 @@
package com.idormy.sms.forwarder.database.ext
import androidx.room.TypeConverter
import java.util.*
import java.util.Date
@Suppress("unused")
class ConvertersDate {

@ -3,7 +3,6 @@ package com.idormy.sms.forwarder.database.ext
import androidx.room.TypeConverter
import com.idormy.sms.forwarder.core.Core
import com.idormy.sms.forwarder.database.entity.Sender
import java.util.*
@Suppress("unused")
class ConvertersSenderList {

@ -1,20 +1,13 @@
package com.idormy.sms.forwarder.database.viewmodel
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import androidx.paging.Pager
import androidx.paging.PagingConfig
import androidx.paging.PagingData
import androidx.paging.cachedIn
import com.idormy.sms.forwarder.database.dao.LogsDao
import com.idormy.sms.forwarder.database.entity.LogsAndRuleAndSender
import com.idormy.sms.forwarder.database.ext.ioThread
import kotlinx.coroutines.flow.Flow
class LogsViewModel(private val dao: LogsDao) : ViewModel() {
private var type: String = "sms"
//private var type: String = "sms"
fun setType(type: String): LogsViewModel {
/*fun setType(type: String): LogsViewModel {
this.type = type
return this
}
@ -27,7 +20,7 @@ class LogsViewModel(private val dao: LogsDao) : ViewModel() {
)
) {
dao.pagingSource(type)
}.flow.cachedIn(viewModelScope)
}.flow.cachedIn(viewModelScope)*/
fun delete(id: Long) = ioThread {
dao.delete(id)

@ -1,5 +1,6 @@
package com.idormy.sms.forwarder.entity.result
@Suppress("PropertyName")
data class FeishuAppResult(
var code: Long,
var msg: String,

@ -1,5 +1,6 @@
package com.idormy.sms.forwarder.entity.result
@Suppress("PropertyName")
data class WeworkAgentResult(
var errcode: Long,
var errmsg: String,

@ -36,7 +36,7 @@ import com.xuexiang.xutil.XUtil
class AppListFragment : BaseFragment<FragmentAppListBinding?>() {
private val TAG: String = AppListFragment::class.java.simpleName
var appListAdapter: AppListAdapter? = null
private var appListAdapter: AppListAdapter? = null
private val appListObserver = Observer { it: String ->
Log.d(TAG, "EVENT_LOAD_APP_LIST: $it")
appListAdapter?.refresh(getAppsList(false))

@ -16,7 +16,14 @@ import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentClientBinding
import com.idormy.sms.forwarder.server.model.BaseResponse
import com.idormy.sms.forwarder.server.model.ConfigData
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.Base64
import com.idormy.sms.forwarder.utils.CLIENT_FRAGMENT_LIST
import com.idormy.sms.forwarder.utils.CommonUtils
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.RSACrypt
import com.idormy.sms.forwarder.utils.SM4Crypt
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.XToastUtils
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
@ -38,11 +45,11 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName")
@Page(name = "主动控制·客户端")
class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListener, RecyclerViewHolder.OnItemClickListener<PageInfo> {
val TAG: String = ClientFragment::class.java.simpleName
private val TAG: String = ClientFragment::class.java.simpleName
private var appContext: App? = null
private var serverConfig: ConfigData? = null
private var serverHistory: MutableMap<String, String> = mutableMapOf()
@ -125,14 +132,17 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
safetyMeasuresId = R.id.rb_safety_measures_sign
binding!!.tvSignKey.text = getString(R.string.sign_key)
}
2 -> {
safetyMeasuresId = R.id.rb_safety_measures_rsa
binding!!.tvSignKey.text = getString(R.string.public_key)
}
3 -> {
safetyMeasuresId = R.id.rb_safety_measures_sm4
binding!!.tvSignKey.text = getString(R.string.sm4_key)
}
else -> {
binding!!.layoutSignKey.visibility = View.GONE
}
@ -146,14 +156,17 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
safetyMeasures = 1
binding!!.tvSignKey.text = getString(R.string.sign_key)
}
R.id.rb_safety_measures_rsa -> {
safetyMeasures = 2
binding!!.tvSignKey.text = getString(R.string.public_key)
}
R.id.rb_safety_measures_sm4 -> {
safetyMeasures = 3
binding!!.tvSignKey.text = getString(R.string.sm4_key)
}
else -> {
binding!!.layoutSignKey.visibility = View.GONE
}
@ -185,6 +198,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
}
CommonUtils.previewPicture(this, getString(R.string.url_wechat_miniprogram), null)
}
R.id.btn_server_history -> {
if (serverHistory.isEmpty()) {
XToastUtils.warning(getString(R.string.no_server_history))
@ -213,14 +227,17 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
safetyMeasuresId = R.id.rb_safety_measures_sign
binding!!.tvSignKey.text = getString(R.string.sign_key)
}
"2" -> {
safetyMeasuresId = R.id.rb_safety_measures_rsa
binding!!.tvSignKey.text = getString(R.string.public_key)
}
"3" -> {
safetyMeasuresId = R.id.rb_safety_measures_sm4
binding!!.tvSignKey.text = getString(R.string.sm4_key)
}
else -> {
binding!!.tvSignKey.visibility = View.GONE
binding!!.etSignKey.visibility = View.GONE
@ -237,6 +254,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
HttpServerUtils.serverHistory = ""
}.show()
}
R.id.btn_server_test -> {
if (!CommonUtils.checkUrl(HttpServerUtils.serverAddress)) {
XToastUtils.error(getString(R.string.invalid_service_address))
@ -244,6 +262,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
}
queryConfig(true)
}
else -> {}
}
}
@ -311,6 +330,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -325,6 +345,7 @@ class ClientFragment : BaseFragment<FragmentClientBinding?>(), View.OnClickListe
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}

@ -31,8 +31,8 @@ import com.xuexiang.xui.widget.edittext.materialedittext.MaterialEditText
@Page(name = "Frp内网穿透·编辑配置")
class FrpcEditFragment : BaseFragment<FragmentFrpcEditBinding?>() {
var titleBar: TitleBar? = null
var frpc: Frpc? = null
private var titleBar: TitleBar? = null
private var frpc: Frpc? = null
private val viewModel by viewModels<FrpcViewModel> { BaseViewModelFactory(context) }
override fun initViews() {

@ -17,7 +17,14 @@ import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
import com.idormy.sms.forwarder.database.viewmodel.FrpcViewModel
import com.idormy.sms.forwarder.databinding.FragmentFrpcsBinding
import com.idormy.sms.forwarder.service.ForegroundService
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.EVENT_FRPC_DELETE_CONFIG
import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_ERROR
import com.idormy.sms.forwarder.utils.EVENT_FRPC_RUNNING_SUCCESS
import com.idormy.sms.forwarder.utils.EVENT_FRPC_UPDATE_CONFIG
import com.idormy.sms.forwarder.utils.FrpcUtils
import com.idormy.sms.forwarder.utils.INTENT_FRPC_APPLY_FILE
import com.idormy.sms.forwarder.utils.INTENT_FRPC_EDIT_FILE
import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xaop.annotation.SingleClick
@ -41,7 +48,7 @@ import kotlinx.coroutines.launch
@Page(name = "Frp内网穿透")
class FrpcFragment : BaseFragment<FragmentFrpcsBinding?>(), FrpcPagingAdapter.OnItemClickListener {
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var adapter = FrpcPagingAdapter(this)
private val viewModel by viewModels<FrpcViewModel> { BaseViewModelFactory(context) }

@ -36,11 +36,11 @@ import kotlinx.coroutines.launch
import java.text.SimpleDateFormat
import java.util.*
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "转发日志")
class LogsFragment : BaseFragment<FragmentLogsBinding?>(), MsgPagingAdapter.OnItemClickListener {
val TAG: String = LogsFragment::class.java.simpleName
private val TAG: String = LogsFragment::class.java.simpleName
private var adapter = MsgPagingAdapter(this)
private val viewModel by viewModels<MsgViewModel> { BaseViewModelFactory(context) }
private var currentType: String = "sms"

@ -52,11 +52,11 @@ import java.util.*
class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = RulesEditFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<RuleViewModel> { BaseViewModelFactory(context) }
var callType = 1
var callTypeIndex = 0
private var callType = 1
private var callTypeIndex = 0
//免打扰(禁用转发)时间段
private val mTimeOption = DataProvider.timePeriodOption
@ -64,12 +64,12 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
private var silentPeriodEnd = 0
//当前发送通道
var senderId = 0L
var senderListSelected: MutableList<Sender> = mutableListOf()
private var senderId = 0L
private var senderListSelected: MutableList<Sender> = mutableListOf()
private var senderItemMap = HashMap<Long, LinearLayout>(2)
//发送通道列表
var senderListAll: MutableList<Sender> = mutableListOf()
private var senderListAll: MutableList<Sender> = mutableListOf()
private val senderSpinnerList = ArrayList<SenderAdapterItem>()
private lateinit var senderSpinnerAdapter: SenderSpinnerAdapter<*>

@ -14,7 +14,11 @@ import com.idormy.sms.forwarder.database.entity.Rule
import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
import com.idormy.sms.forwarder.database.viewmodel.RuleViewModel
import com.idormy.sms.forwarder.databinding.FragmentRulesBinding
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.EVENT_UPDATE_RULE_TYPE
import com.idormy.sms.forwarder.utils.KEY_RULE_CLONE
import com.idormy.sms.forwarder.utils.KEY_RULE_ID
import com.idormy.sms.forwarder.utils.KEY_RULE_TYPE
import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xpage.annotation.Page
@ -26,11 +30,11 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Suppress("PropertyName")
@Suppress("DEPRECATION")
@Page(name = "转发规则")
class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.OnItemClickListener {
val TAG: String = RulesFragment::class.java.simpleName
//private val TAG: String = RulesFragment::class.java.simpleName
private var adapter = RulePagingAdapter(this)
private val viewModel by viewModels<RuleViewModel> { BaseViewModelFactory(context) }
private var currentType: String = "sms"
@ -101,6 +105,7 @@ class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.O
.putBoolean(KEY_RULE_CLONE, true)
.open(this)
}
R.id.iv_edit -> {
PageOption.to(RulesEditFragment::class.java)
.setNewActivity(true)
@ -108,6 +113,7 @@ class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.O
.putString(KEY_RULE_TYPE, item.type)
.open(this)
}
R.id.iv_delete -> {
MaterialDialog.Builder(requireContext())
.title(R.string.delete_rule_title)
@ -120,6 +126,7 @@ class RulesFragment : BaseFragment<FragmentRulesBinding?>(), RulePagingAdapter.O
}
.show()
}
else -> {}
}
}

@ -15,8 +15,42 @@ import com.idormy.sms.forwarder.database.entity.Sender
import com.idormy.sms.forwarder.database.viewmodel.BaseViewModelFactory
import com.idormy.sms.forwarder.database.viewmodel.SenderViewModel
import com.idormy.sms.forwarder.databinding.FragmentSendersBinding
import com.idormy.sms.forwarder.fragment.senders.*
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.fragment.senders.BarkFragment
import com.idormy.sms.forwarder.fragment.senders.DingtalkGroupRobotFragment
import com.idormy.sms.forwarder.fragment.senders.DingtalkInnerRobotFragment
import com.idormy.sms.forwarder.fragment.senders.EmailFragment
import com.idormy.sms.forwarder.fragment.senders.FeishuAppFragment
import com.idormy.sms.forwarder.fragment.senders.FeishuFragment
import com.idormy.sms.forwarder.fragment.senders.GotifyFragment
import com.idormy.sms.forwarder.fragment.senders.PushplusFragment
import com.idormy.sms.forwarder.fragment.senders.ServerchanFragment
import com.idormy.sms.forwarder.fragment.senders.SmsFragment
import com.idormy.sms.forwarder.fragment.senders.SocketFragment
import com.idormy.sms.forwarder.fragment.senders.TelegramFragment
import com.idormy.sms.forwarder.fragment.senders.UrlSchemeFragment
import com.idormy.sms.forwarder.fragment.senders.WebhookFragment
import com.idormy.sms.forwarder.fragment.senders.WeworkAgentFragment
import com.idormy.sms.forwarder.fragment.senders.WeworkRobotFragment
import com.idormy.sms.forwarder.utils.KEY_SENDER_CLONE
import com.idormy.sms.forwarder.utils.KEY_SENDER_ID
import com.idormy.sms.forwarder.utils.KEY_SENDER_TYPE
import com.idormy.sms.forwarder.utils.TYPE_BARK
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_GROUP_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_DINGTALK_INNER_ROBOT
import com.idormy.sms.forwarder.utils.TYPE_EMAIL
import com.idormy.sms.forwarder.utils.TYPE_FEISHU
import com.idormy.sms.forwarder.utils.TYPE_FEISHU_APP
import com.idormy.sms.forwarder.utils.TYPE_GOTIFY
import com.idormy.sms.forwarder.utils.TYPE_PUSHPLUS
import com.idormy.sms.forwarder.utils.TYPE_SERVERCHAN
import com.idormy.sms.forwarder.utils.TYPE_SMS
import com.idormy.sms.forwarder.utils.TYPE_SOCKET
import com.idormy.sms.forwarder.utils.TYPE_TELEGRAM
import com.idormy.sms.forwarder.utils.TYPE_URL_SCHEME
import com.idormy.sms.forwarder.utils.TYPE_WEBHOOK
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_AGENT
import com.idormy.sms.forwarder.utils.TYPE_WEWORK_ROBOT
import com.idormy.sms.forwarder.utils.XToastUtils
import com.scwang.smartrefresh.layout.api.RefreshLayout
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xpage.core.PageOption
@ -27,11 +61,11 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "发送通道")
class SendersFragment : BaseFragment<FragmentSendersBinding?>(), SenderPagingAdapter.OnItemClickListener {
val TAG: String = SendersFragment::class.java.simpleName
private val TAG: String = SendersFragment::class.java.simpleName
private var adapter = SenderPagingAdapter(this)
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var currentStatus: Int = 1
@ -119,6 +153,7 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(), SenderPagingAda
.putBoolean(KEY_SENDER_CLONE, true)
.open(this)
}
R.id.iv_edit -> {
PageOption.to(
when (item.type) {
@ -145,6 +180,7 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(), SenderPagingAda
.putInt(KEY_SENDER_TYPE, item.type)
.open(this)
}
R.id.iv_delete -> {
MaterialDialog.Builder(requireContext())
.title(R.string.delete_sender_title)
@ -157,6 +193,7 @@ class SendersFragment : BaseFragment<FragmentSendersBinding?>(), SenderPagingAda
}
.show()
}
else -> {}
}
}

@ -29,6 +29,7 @@ class ServiceProtocolFragment : BaseFragment<FragmentServiceProtocolBinding?>()
@JvmField
@AutoWired(name = KEY_IS_IMMERSIVE)
var isImmersive = false
override fun initArgs() {
XRouter.getInstance().inject(this)
}

@ -55,11 +55,11 @@ import com.xuexiang.xutil.app.AppUtils.getAppPackageName
import kotlinx.coroutines.*
import java.util.*
@Suppress("PropertyName", "SpellCheckingInspection")
@Suppress("SpellCheckingInspection", "PrivatePropertyName")
@Page(name = "通用设置")
class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickListener {
val TAG: String = SettingsFragment::class.java.simpleName
private val TAG: String = SettingsFragment::class.java.simpleName
private val mTimeOption = DataProvider.timePeriodOption
//已安装App信息列表
@ -86,39 +86,28 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
@SuppressLint("NewApi", "SetTextI18n")
override fun initViews() {
//转发短信广播
switchEnableSms(binding!!.sbEnableSms)
//转发通话记录
switchEnablePhone(
binding!!.sbEnablePhone, binding!!.scbCallType1, binding!!.scbCallType2, binding!!.scbCallType3, binding!!.scbCallType4, binding!!.scbCallType5, binding!!.scbCallType6
)
switchEnablePhone(binding!!.sbEnablePhone, binding!!.scbCallType1, binding!!.scbCallType2, binding!!.scbCallType3, binding!!.scbCallType4, binding!!.scbCallType5, binding!!.scbCallType6)
//转发应用通知
switchEnableAppNotify(
binding!!.sbEnableAppNotify, binding!!.scbCancelAppNotify, binding!!.scbNotUserPresent
)
switchEnableAppNotify(binding!!.sbEnableAppNotify, binding!!.scbCancelAppNotify, binding!!.scbNotUserPresent)
//启用GPS定位功能
switchEnableLocation(binding!!.sbEnableLocation, binding!!.layoutLocationSetting, binding!!.rgAccuracy, binding!!.rgPowerRequirement, binding!!.xsbMinInterval, binding!!.xsbMinDistance)
//短信指令
switchEnableSmsCommand(binding!!.sbEnableSmsCommand, binding!!.etSafePhone)
//启动时异步获取已安装App信息
switchEnableLoadAppList(binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp)
//设置自动消除额外APP通知
editExtraAppList(binding!!.etAppList)
//启动时异步获取已安装App信息
switchEnableLoadAppList(
binding!!.sbEnableLoadAppList, binding!!.scbLoadUserApp, binding!!.scbLoadSystemApp
)
//过滤多久内重复消息
//自动过滤多久内重复消息
binding!!.xsbDuplicateMessagesLimits.setDefaultValue(SettingUtils.duplicateMessagesLimits)
binding!!.xsbDuplicateMessagesLimits.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.duplicateMessagesLimits = newValue
}
//免打扰(禁用转发)时间段
binding!!.tvSilentPeriod.text = mTimeOption[SettingUtils.silentPeriodStart] + " ~ " + mTimeOption[SettingUtils.silentPeriodEnd]
//自动删除N天前的转发记录
binding!!.xsbAutoCleanLogs.setDefaultValue(SettingUtils.autoCleanLogsDays)
binding!!.xsbAutoCleanLogs.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.autoCleanLogsDays = newValue
}
//开机启动
checkWithReboot(binding!!.sbWithReboot, binding!!.tvAutoStartup)
@ -126,12 +115,8 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
batterySetting(binding!!.layoutBatterySetting, binding!!.sbBatterySetting)
//不在最近任务列表中显示
switchExcludeFromRecents(binding!!.layoutExcludeFromRecents, binding!!.sbExcludeFromRecents)
//Cactus增强保活措施
switchEnableCactus(
binding!!.sbEnableCactus, binding!!.scbPlaySilenceMusic, binding!!.scbOnePixelActivity
)
switchEnableCactus(binding!!.sbEnableCactus, binding!!.scbPlaySilenceMusic, binding!!.scbOnePixelActivity)
//接口请求失败重试时间间隔
editRetryDelayTime(binding!!.xsbRetryTimes, binding!!.xsbDelayTime, binding!!.xsbTimeout)
@ -145,23 +130,16 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
editAddExtraSim1(binding!!.etExtraSim1)
//SIM2备注
editAddExtraSim2(binding!!.etExtraSim2)
//通知内容
editNotifyContent(binding!!.etNotifyContent)
//启用自定义模版
switchSmsTemplate(binding!!.sbSmsTemplate)
//自定义模板
editSmsTemplate(binding!!.etSmsTemplate)
//纯客户端模式
switchDirectlyToClient(binding!!.sbDirectlyToClient)
//纯自动任务模式
switchDirectlyToTask(binding!!.sbDirectlyToTask)
//启用 {{定位信息}} 标签
switchEnableLocation(binding!!.sbEnableLocation, binding!!.layoutLocationSetting, binding!!.rgAccuracy, binding!!.rgPowerRequirement, binding!!.xsbMinInterval, binding!!.xsbMinDistance)
}
override fun onResume() {
@ -183,7 +161,6 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//监听已安装App信息列表加载完成事件
LiveEventBus.get(EVENT_LOAD_APP_LIST, String::class.java).observeStickyForever(appListObserver)
}
@SuppressLint("SetTextI18n")
@ -295,7 +272,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//转发短信
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnableSms(sbEnableSms: SwitchButton) {
private fun switchEnableSms(sbEnableSms: SwitchButton) {
sbEnableSms.isChecked = SettingUtils.enableSms
sbEnableSms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
SettingUtils.enableSms = isChecked
@ -338,9 +315,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//转发通话
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnablePhone(
sbEnablePhone: SwitchButton, scbCallType1: SmoothCheckBox, scbCallType2: SmoothCheckBox, scbCallType3: SmoothCheckBox, scbCallType4: SmoothCheckBox, scbCallType5: SmoothCheckBox, scbCallType6: SmoothCheckBox
) {
private fun switchEnablePhone(sbEnablePhone: SwitchButton, scbCallType1: SmoothCheckBox, scbCallType2: SmoothCheckBox, scbCallType3: SmoothCheckBox, scbCallType4: SmoothCheckBox, scbCallType5: SmoothCheckBox, scbCallType6: SmoothCheckBox) {
sbEnablePhone.isChecked = SettingUtils.enablePhone
scbCallType1.isChecked = SettingUtils.enableCallType1
scbCallType2.isChecked = SettingUtils.enableCallType2
@ -441,9 +416,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//转发应用通知
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnableAppNotify(
sbEnableAppNotify: SwitchButton, scbCancelAppNotify: SmoothCheckBox, scbNotUserPresent: SmoothCheckBox
) {
private fun switchEnableAppNotify(sbEnableAppNotify: SwitchButton, scbCancelAppNotify: SmoothCheckBox, scbNotUserPresent: SmoothCheckBox) {
val isEnable: Boolean = SettingUtils.enableAppNotify
sbEnableAppNotify.isChecked = isEnable
@ -482,9 +455,99 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
}
//启用定位功能
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") switchEnableLocation: SwitchButton, layoutLocationSetting: LinearLayout, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, xsbMinInterval: XSeekBar, xsbMinDistance: XSeekBar) {
//是否启用定位功能
switchEnableLocation.isChecked = SettingUtils.enableLocation
layoutLocationSetting.visibility = if (SettingUtils.enableLocation) View.VISIBLE else View.GONE
switchEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
SettingUtils.enableLocation = isChecked
if (isChecked) {
XXPermissions.with(this).permission(Permission.ACCESS_COARSE_LOCATION).permission(Permission.ACCESS_FINE_LOCATION).permission(Permission.ACCESS_BACKGROUND_LOCATION).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
restartLocationService()
}
override fun onDenied(permissions: List<String>, never: Boolean) {
if (never) {
XToastUtils.error(R.string.toast_denied_never)
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(requireContext(), permissions)
} else {
XToastUtils.error(R.string.toast_denied)
}
SettingUtils.enableLocation = false
switchEnableLocation.isChecked = false
restartLocationService()
}
})
} else {
restartLocationService()
}
layoutLocationSetting.visibility = if (isChecked) View.VISIBLE else View.GONE
}
//设置位置精度:高精度(默认)
rgAccuracy.check(
when (SettingUtils.locationAccuracy) {
Criteria.ACCURACY_FINE -> R.id.rb_accuracy_fine
Criteria.ACCURACY_COARSE -> R.id.rb_accuracy_coarse
Criteria.NO_REQUIREMENT -> R.id.rb_accuracy_no_requirement
else -> R.id.rb_accuracy_fine
}
)
rgAccuracy.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
SettingUtils.locationAccuracy = when (checkedId) {
R.id.rb_accuracy_fine -> Criteria.ACCURACY_FINE
R.id.rb_accuracy_coarse -> Criteria.ACCURACY_COARSE
R.id.rb_accuracy_no_requirement -> Criteria.NO_REQUIREMENT
else -> Criteria.ACCURACY_FINE
}
restartLocationService()
}
//设置电量消耗:低电耗(默认)
rgPowerRequirement.check(
when (SettingUtils.locationPowerRequirement) {
Criteria.POWER_HIGH -> R.id.rb_power_requirement_high
Criteria.POWER_MEDIUM -> R.id.rb_power_requirement_medium
Criteria.POWER_LOW -> R.id.rb_power_requirement_low
Criteria.NO_REQUIREMENT -> R.id.rb_power_requirement_no_requirement
else -> R.id.rb_power_requirement_low
}
)
rgPowerRequirement.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
SettingUtils.locationPowerRequirement = when (checkedId) {
R.id.rb_power_requirement_high -> Criteria.POWER_HIGH
R.id.rb_power_requirement_medium -> Criteria.POWER_MEDIUM
R.id.rb_power_requirement_low -> Criteria.POWER_LOW
R.id.rb_power_requirement_no_requirement -> Criteria.NO_REQUIREMENT
else -> Criteria.POWER_LOW
}
restartLocationService()
}
//设置位置更新最小时间间隔(单位:毫秒); 默认间隔10000毫秒最小间隔1000毫秒
xsbMinInterval.setDefaultValue((SettingUtils.locationMinInterval / 1000).toInt())
xsbMinInterval.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.locationMinInterval = newValue * 1000L
restartLocationService()
}
//设置位置更新最小距离单位默认距离0米
xsbMinDistance.setDefaultValue(SettingUtils.locationMinDistance)
xsbMinDistance.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.locationMinDistance = newValue
restartLocationService()
}
}
//重启定位服务
private fun restartLocationService() {
val serviceIntent = Intent(requireContext(), LocationService::class.java)
serviceIntent.action = "START"
requireContext().startService(serviceIntent)
}
//接受短信指令
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnableSmsCommand(sbEnableSmsCommand: SwitchButton, etSafePhone: EditText) {
private fun switchEnableSmsCommand(sbEnableSmsCommand: SwitchButton, etSafePhone: EditText) {
sbEnableSmsCommand.isChecked = SettingUtils.enableSmsCommand
etSafePhone.visibility = if (SettingUtils.enableSmsCommand) View.VISIBLE else View.GONE
@ -549,9 +612,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//启动时异步获取已安装App信息
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnableLoadAppList(
sbEnableLoadAppList: SwitchButton, scbLoadUserApp: SmoothCheckBox, scbLoadSystemApp: SmoothCheckBox
) {
private fun switchEnableLoadAppList(sbEnableLoadAppList: SwitchButton, scbLoadUserApp: SmoothCheckBox, scbLoadSystemApp: SmoothCheckBox) {
val isEnable: Boolean = SettingUtils.enableLoadAppList
sbEnableLoadAppList.isChecked = isEnable
@ -600,9 +661,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
//开机启动
private fun checkWithReboot(
@SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton, tvAutoStartup: TextView
) {
private fun checkWithReboot(@SuppressLint("UseSwitchCompatOrMaterialCode") sbWithReboot: SwitchButton, tvAutoStartup: TextView) {
tvAutoStartup.text = getAutoStartTips()
//获取组件
@ -624,7 +683,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//电池优化设置
@RequiresApi(api = Build.VERSION_CODES.M)
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun batterySetting(layoutBatterySetting: LinearLayout, sbBatterySetting: SwitchButton) {
private fun batterySetting(layoutBatterySetting: LinearLayout, sbBatterySetting: SwitchButton) {
//安卓6.0以下没有忽略电池优化
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
layoutBatterySetting.visibility = View.GONE
@ -652,9 +711,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//不在最近任务列表中显示
@SuppressLint("ObsoleteSdkInt,UseSwitchCompatOrMaterialCode")
fun switchExcludeFromRecents(
layoutExcludeFromRecents: LinearLayout, sbExcludeFromRecents: SwitchButton
) {
private fun switchExcludeFromRecents(layoutExcludeFromRecents: LinearLayout, sbExcludeFromRecents: SwitchButton) {
//安卓6.0以下没有不在最近任务列表中显示
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
layoutExcludeFromRecents.visibility = View.GONE
@ -675,11 +732,9 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
}
//转发应用通知
//Cactus增强保活措施
@SuppressLint("UseSwitchCompatOrMaterialCode")
fun switchEnableCactus(
sbEnableCactus: SwitchButton, scbPlaySilenceMusic: SmoothCheckBox, scbOnePixelActivity: SmoothCheckBox
) {
private fun switchEnableCactus(sbEnableCactus: SwitchButton, scbPlaySilenceMusic: SmoothCheckBox, scbOnePixelActivity: SmoothCheckBox) {
val layoutCactusOptional: LinearLayout = binding!!.layoutCactusOptional
val isEnable: Boolean = SettingUtils.enableCactus
sbEnableCactus.isChecked = isEnable
@ -708,9 +763,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
//接口请求失败重试时间间隔
private fun editRetryDelayTime(
xsbRetryTimes: XSeekBar, xsbDelayTime: XSeekBar, xsbTimeout: XSeekBar
) {
private fun editRetryDelayTime(xsbRetryTimes: XSeekBar, xsbDelayTime: XSeekBar, xsbTimeout: XSeekBar) {
xsbRetryTimes.setDefaultValue(SettingUtils.requestRetryTimes)
xsbRetryTimes.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.requestRetryTimes = newValue
@ -814,7 +867,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
//设置转发时启用自定义模版
@SuppressLint("UseSwitchCompatOrMaterialCode", "SetTextI18n")
fun switchSmsTemplate(sbSmsTemplate: SwitchButton) {
private fun switchSmsTemplate(sbSmsTemplate: SwitchButton) {
val isOn: Boolean = SettingUtils.enableSmsTemplate
sbSmsTemplate.isChecked = isOn
val layoutSmsTemplate: LinearLayout = binding!!.layoutSmsTemplate
@ -876,96 +929,6 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
}
//启用定位功能
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") switchEnableLocation: SwitchButton, layoutLocationSetting: LinearLayout, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, xsbMinInterval: XSeekBar, xsbMinDistance: XSeekBar) {
//是否启用定位功能
switchEnableLocation.isChecked = SettingUtils.enableLocation
layoutLocationSetting.visibility = if (SettingUtils.enableLocation) View.VISIBLE else View.GONE
switchEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
SettingUtils.enableLocation = isChecked
if (isChecked) {
XXPermissions.with(this).permission(Permission.ACCESS_COARSE_LOCATION).permission(Permission.ACCESS_FINE_LOCATION).permission(Permission.ACCESS_BACKGROUND_LOCATION).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
restartLocationService()
}
override fun onDenied(permissions: List<String>, never: Boolean) {
if (never) {
XToastUtils.error(R.string.toast_denied_never)
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(requireContext(), permissions)
} else {
XToastUtils.error(R.string.toast_denied)
}
SettingUtils.enableLocation = false
switchEnableLocation.isChecked = false
restartLocationService()
}
})
} else {
restartLocationService()
}
layoutLocationSetting.visibility = if (isChecked) View.VISIBLE else View.GONE
}
//设置位置精度:高精度(默认)
rgAccuracy.check(
when (SettingUtils.locationAccuracy) {
Criteria.ACCURACY_FINE -> R.id.rb_accuracy_fine
Criteria.ACCURACY_COARSE -> R.id.rb_accuracy_coarse
Criteria.NO_REQUIREMENT -> R.id.rb_accuracy_no_requirement
else -> R.id.rb_accuracy_fine
}
)
rgAccuracy.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
SettingUtils.locationAccuracy = when (checkedId) {
R.id.rb_accuracy_fine -> Criteria.ACCURACY_FINE
R.id.rb_accuracy_coarse -> Criteria.ACCURACY_COARSE
R.id.rb_accuracy_no_requirement -> Criteria.NO_REQUIREMENT
else -> Criteria.ACCURACY_FINE
}
restartLocationService()
}
//设置电量消耗:低电耗(默认)
rgPowerRequirement.check(
when (SettingUtils.locationPowerRequirement) {
Criteria.POWER_HIGH -> R.id.rb_power_requirement_high
Criteria.POWER_MEDIUM -> R.id.rb_power_requirement_medium
Criteria.POWER_LOW -> R.id.rb_power_requirement_low
Criteria.NO_REQUIREMENT -> R.id.rb_power_requirement_no_requirement
else -> R.id.rb_power_requirement_low
}
)
rgPowerRequirement.setOnCheckedChangeListener { _: RadioGroup?, checkedId: Int ->
SettingUtils.locationPowerRequirement = when (checkedId) {
R.id.rb_power_requirement_high -> Criteria.POWER_HIGH
R.id.rb_power_requirement_medium -> Criteria.POWER_MEDIUM
R.id.rb_power_requirement_low -> Criteria.POWER_LOW
R.id.rb_power_requirement_no_requirement -> Criteria.NO_REQUIREMENT
else -> Criteria.POWER_LOW
}
restartLocationService()
}
//设置位置更新最小时间间隔(单位:毫秒); 默认间隔10000毫秒最小间隔1000毫秒
xsbMinInterval.setDefaultValue((SettingUtils.locationMinInterval / 1000).toInt())
xsbMinInterval.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.locationMinInterval = newValue * 1000L
restartLocationService()
}
//设置位置更新最小距离单位默认距离0米
xsbMinDistance.setDefaultValue(SettingUtils.locationMinDistance)
xsbMinDistance.setOnSeekBarListener { _: XSeekBar?, newValue: Int ->
SettingUtils.locationMinDistance = newValue
restartLocationService()
}
}
//重启定位服务
private fun restartLocationService() {
val serviceIntent = Intent(requireContext(), LocationService::class.java)
serviceIntent.action = "START"
requireContext().startService(serviceIntent)
}
//获取当前手机品牌
private fun getAutoStartTips(): String {
return when (Build.BRAND.lowercase(Locale.ROOT)) {

@ -58,7 +58,7 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
private val TAG: String = TasksEditFragment::class.java.simpleName
private val that = this
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<TaskViewModel> { BaseViewModelFactory(context) }
private val dialog: BottomSheetDialog by lazy {
BottomSheetDialog(requireContext())

@ -32,12 +32,12 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch
@Suppress("PropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "自动任务")
class TasksFragment : BaseFragment<FragmentTasksBinding?>(), TaskPagingAdapter.OnItemClickListener {
val TAG: String = TasksFragment::class.java.simpleName
var titleBar: TitleBar? = null
private val TAG: String = TasksFragment::class.java.simpleName
private var titleBar: TitleBar? = null
private var adapter = TaskPagingAdapter(this)
private val viewModel by viewModels<TaskViewModel> { BaseViewModelFactory(context) }
private var currentType: String = "mine"

@ -29,7 +29,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class FrpcFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
private val TAG: String = FrpcFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField

@ -29,7 +29,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class HttpServerFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
private val TAG: String = HttpServerFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField

@ -41,7 +41,7 @@ import java.util.*
class NotificationFragment : BaseFragment<FragmentTasksActionNotificationBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = NotificationFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField

@ -46,7 +46,7 @@ import com.xuexiang.xutil.XUtil
class SendSmsFragment : BaseFragment<FragmentTasksActionSendSmsBinding?>(), View.OnClickListener {
private val TAG: String = SendSmsFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField

@ -10,7 +10,12 @@ import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentClientBatteryQueryBinding
import com.idormy.sms.forwarder.entity.BatteryInfo
import com.idormy.sms.forwarder.server.model.BaseResponse
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.Base64
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.RSACrypt
import com.idormy.sms.forwarder.utils.SM4Crypt
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.XToastUtils
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
import com.xuexiang.xhttp2.callback.SimpleCallBack
@ -22,11 +27,11 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.grouplist.XUIGroupListView
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程查电量")
class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>() {
val TAG: String = BatteryQueryFragment::class.java.simpleName
private val TAG: String = BatteryQueryFragment::class.java.simpleName
override fun viewBindingInflate(
inflater: LayoutInflater,
@ -82,6 +87,7 @@ class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>()
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -96,6 +102,7 @@ class BatteryQueryFragment : BaseFragment<FragmentClientBatteryQueryBinding?>()
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}

@ -50,11 +50,11 @@ import com.xuexiang.xutil.data.DateUtils
import com.xuexiang.xutil.system.ClipboardUtils
import me.samlss.broccoli.Broccoli
@Suppress("PropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程查通话")
class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
val TAG: String = CallQueryFragment::class.java.simpleName
private val TAG: String = CallQueryFragment::class.java.simpleName
private var mAdapter: SimpleDelegateAdapter<CallInfo>? = null
private var callType: Int = 3
private var pageNum: Int = 1
@ -133,6 +133,10 @@ class CallQueryFragment : BaseFragment<FragmentClientCallQueryBinding?>() {
.addPlaceholder(PlaceholderHelper.getParameter(holder.findView(R.id.iv_call)))
.addPlaceholder(PlaceholderHelper.getParameter(holder.findView(R.id.iv_reply)))
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
TODO("Not yet implemented")
}
}
val delegateAdapter = DelegateAdapter(virtualLayoutManager)

@ -42,11 +42,11 @@ import com.xuexiang.xutil.file.FileUtils
import java.io.File
import java.util.*
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "一键换新机")
class CloneFragment : BaseFragment<FragmentClientCloneBinding?>(), View.OnClickListener {
val TAG: String = CloneFragment::class.java.simpleName
private val TAG: String = CloneFragment::class.java.simpleName
private var backupPath: String? = null
private val backupFile = "SmsForwarder.json"
private var pushCountDownHelper: CountDownButtonHelper? = null

@ -25,11 +25,11 @@ import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程加话簿")
class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), View.OnClickListener {
val TAG: String = ContactAddFragment::class.java.simpleName
private val TAG: String = ContactAddFragment::class.java.simpleName
private var mCountDownHelper: CountDownButtonHelper? = null
override fun viewBindingInflate(
@ -120,6 +120,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -134,6 +135,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}
@ -174,6 +176,7 @@ class ContactAddFragment : BaseFragment<FragmentClientContactAddBinding?>(), Vie
}
})
}
else -> {}
}
}

@ -49,11 +49,11 @@ import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.system.ClipboardUtils
import me.samlss.broccoli.Broccoli
@Suppress("PropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程查话簿")
class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>() {
val TAG: String = ContactQueryFragment::class.java.simpleName
private val TAG: String = ContactQueryFragment::class.java.simpleName
private var mAdapter: SimpleDelegateAdapter<ContactInfo>? = null
private var keyword: String = ""
@ -124,6 +124,10 @@ class ContactQueryFragment : BaseFragment<FragmentClientContactQueryBinding?>()
.addPlaceholder(PlaceholderHelper.getParameter(holder.findView(R.id.iv_call)))
.addPlaceholder(PlaceholderHelper.getParameter(holder.findView(R.id.iv_reply)))
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
TODO("Not yet implemented")
}
}
val delegateAdapter = DelegateAdapter(virtualLayoutManager)

@ -11,7 +11,12 @@ import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentClientLocationBinding
import com.idormy.sms.forwarder.entity.LocationInfo
import com.idormy.sms.forwarder.server.model.BaseResponse
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.Base64
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.RSACrypt
import com.idormy.sms.forwarder.utils.SM4Crypt
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.XToastUtils
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
@ -25,11 +30,11 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xui.widget.grouplist.XUIGroupListView
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程找手机")
class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.OnClickListener {
val TAG: String = LocationFragment::class.java.simpleName
private val TAG: String = LocationFragment::class.java.simpleName
private var mCountDownHelper: CountDownButtonHelper? = null
override fun viewBindingInflate(
@ -72,6 +77,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
R.id.btn_refresh -> {
getLocation()
}
else -> {}
}
}
@ -110,6 +116,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -124,6 +131,7 @@ class LocationFragment : BaseFragment<FragmentClientLocationBinding?>(), View.On
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}

@ -49,11 +49,11 @@ import com.xuexiang.xutil.data.ConvertTools
import com.xuexiang.xutil.data.DateUtils
import me.samlss.broccoli.Broccoli
@Suppress("PropertyName", "DEPRECATION")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程查短信")
class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
val TAG: String = SmsQueryFragment::class.java.simpleName
private val TAG: String = SmsQueryFragment::class.java.simpleName
private var mAdapter: SimpleDelegateAdapter<SmsInfo>? = null
private var smsType: Int = 1
private var pageNum: Int = 1
@ -122,6 +122,10 @@ class SmsQueryFragment : BaseFragment<FragmentClientSmsQueryBinding?>() {
.addPlaceholder(PlaceholderHelper.getParameter(holder.findView(R.id.iv_reply)))
}
override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
TODO("Not yet implemented")
}
}
val delegateAdapter = DelegateAdapter(virtualLayoutManager)

@ -26,11 +26,11 @@ import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程发短信")
class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnClickListener {
val TAG: String = SmsSendFragment::class.java.simpleName
private val TAG: String = SmsSendFragment::class.java.simpleName
private var mCountDownHelper: CountDownButtonHelper? = null
override fun viewBindingInflate(
@ -138,6 +138,7 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -152,6 +153,7 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}
@ -192,6 +194,7 @@ class SmsSendFragment : BaseFragment<FragmentClientSmsSendBinding?>(), View.OnCl
}
})
}
else -> {}
}
}

@ -10,7 +10,12 @@ import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentClientWolSendBinding
import com.idormy.sms.forwarder.server.model.BaseResponse
import com.idormy.sms.forwarder.utils.*
import com.idormy.sms.forwarder.utils.Base64
import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.RSACrypt
import com.idormy.sms.forwarder.utils.SM4Crypt
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.XToastUtils
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
@ -25,11 +30,11 @@ import com.xuexiang.xui.widget.dialog.materialdialog.DialogAction
import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
import com.xuexiang.xutil.data.ConvertTools
@Suppress("PropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@Page(name = "远程WOL")
class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnClickListener {
val TAG: String = WolSendFragment::class.java.simpleName
private val TAG: String = WolSendFragment::class.java.simpleName
private var mCountDownHelper: CountDownButtonHelper? = null
private var wolHistory: MutableMap<String, String> = mutableMapOf()
@ -103,6 +108,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
}
.show()
}
R.id.btn_submit -> {
val requestUrl: String = HttpServerUtils.serverAddress + "/wol/send"
Log.i(TAG, "requestUrl:$requestUrl")
@ -166,6 +172,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
}
postRequest.upString(requestMsg)
}
3 -> {
try {
val sm4Key = ConvertTools.hexStringToByteArray(HttpServerUtils.clientSignKey)
@ -180,6 +187,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
}
postRequest.upString(requestMsg)
}
else -> {
postRequest.upJson(requestMsg)
}
@ -223,6 +231,7 @@ class WolSendFragment : BaseFragment<FragmentClientWolSendBinding?>(), View.OnCl
}
})
}
else -> {}
}
}

@ -28,7 +28,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class BatteryFragment : BaseFragment<FragmentTasksConditionBatteryBinding?>(), View.OnClickListener {
private val TAG: String = BatteryFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -27,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class ChargeFragment : BaseFragment<FragmentTasksConditionChargeBinding?>(), View.OnClickListener {
private val TAG: String = ChargeFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -41,7 +41,7 @@ import java.util.Locale
class CronFragment : BaseFragment<FragmentTasksConditionCronBinding?>(), View.OnClickListener {
private val TAG: String = CronFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
@JvmField

@ -35,7 +35,7 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
class LeaveAddressFragment : BaseFragment<FragmentTasksConditionLeaveAddressBinding?>(), View.OnClickListener {
private val TAG: String = LeaveAddressFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -27,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class LockScreenFragment : BaseFragment<FragmentTasksConditionLockScreenBinding?>(), View.OnClickListener {
private val TAG: String = LockScreenFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -29,7 +29,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class NetworkFragment : BaseFragment<FragmentTasksConditionNetworkBinding?>(), View.OnClickListener {
private val TAG: String = NetworkFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -27,7 +27,7 @@ import com.xuexiang.xui.widget.actionbar.TitleBar
class SimFragment : BaseFragment<FragmentTasksConditionSimBinding?>(), View.OnClickListener {
private val TAG: String = SimFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -35,7 +35,7 @@ import com.xuexiang.xui.widget.dialog.materialdialog.MaterialDialog
class ToAddressFragment : BaseFragment<FragmentTasksConditionToAddressBinding?>(), View.OnClickListener {
private val TAG: String = ToAddressFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
@JvmField
@AutoWired(name = KEY_EVENT_DATA_CONDITION)

@ -50,7 +50,7 @@ import java.util.Date
class BarkFragment : BaseFragment<FragmentSendersBarkBinding?>(), View.OnClickListener {
private val TAG: String = BarkFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null
private var barkLevel: String = "active" //通知级别

@ -48,7 +48,7 @@ import java.util.Date
class DingtalkGroupRobotFragment : BaseFragment<FragmentSendersDingtalkGroupRobotBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = DingtalkGroupRobotFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -43,7 +43,7 @@ import java.util.*
class DingtalkInnerRobotFragment : BaseFragment<FragmentSendersDingtalkInnerRobotBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = DingtalkInnerRobotFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -48,7 +48,7 @@ import java.util.Date
class EmailFragment : BaseFragment<FragmentSendersEmailBinding?>(), View.OnClickListener {
private val TAG: String = EmailFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null
private var mailType: String = getString(R.string.other_mail_type) //邮箱类型

@ -46,7 +46,7 @@ import java.util.Date
class FeishuAppFragment : BaseFragment<FragmentSendersFeishuAppBinding?>(), View.OnClickListener {
private val TAG: String = FeishuAppFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -46,7 +46,7 @@ import java.util.Date
class FeishuFragment : BaseFragment<FragmentSendersFeishuBinding?>(), View.OnClickListener {
private val TAG: String = FeishuFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -46,7 +46,7 @@ import java.util.Date
class GotifyFragment : BaseFragment<FragmentSendersGotifyBinding?>(), View.OnClickListener {
private val TAG: String = GotifyFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -47,7 +47,7 @@ import java.util.Date
class PushplusFragment : BaseFragment<FragmentSendersPushplusBinding?>(), View.OnClickListener {
private val TAG: String = PushplusFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -44,7 +44,7 @@ import java.util.Date
class ServerchanFragment : BaseFragment<FragmentSendersServerchanBinding?>(), View.OnClickListener {
private val TAG: String = ServerchanFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -49,7 +49,7 @@ import java.util.Date
class SmsFragment : BaseFragment<FragmentSendersSmsBinding?>(), View.OnClickListener {
private val TAG: String = SmsFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -46,7 +46,7 @@ import java.util.Date
class SocketFragment : BaseFragment<FragmentSendersSocketBinding?>(), View.OnClickListener {
private val TAG: String = SocketFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -47,7 +47,7 @@ import java.util.Date
class TelegramFragment : BaseFragment<FragmentSendersTelegramBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = TelegramFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -49,7 +49,7 @@ import java.util.Date
class UrlSchemeFragment : BaseFragment<FragmentSendersUrlSchemeBinding?>(), View.OnClickListener {
private val TAG: String = UrlSchemeFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -48,7 +48,7 @@ import java.util.Date
class WebhookFragment : BaseFragment<FragmentSendersWebhookBinding?>(), View.OnClickListener {
private val TAG: String = WebhookFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null
private var headerItemMap = HashMap<Int, LinearLayout>(2)

@ -42,7 +42,7 @@ import java.util.*
class WeworkAgentFragment : BaseFragment<FragmentSendersWeworkAgentBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = WeworkAgentFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -47,7 +47,7 @@ import java.util.Date
class WeworkRobotFragment : BaseFragment<FragmentSendersWeworkRobotBinding?>(), View.OnClickListener, CompoundButton.OnCheckedChangeListener {
private val TAG: String = WeworkRobotFragment::class.java.simpleName
var titleBar: TitleBar? = null
private var titleBar: TitleBar? = null
private val viewModel by viewModels<SenderViewModel> { BaseViewModelFactory(context) }
private var mCountDownHelper: CountDownButtonHelper? = null

@ -15,10 +15,10 @@ import com.idormy.sms.forwarder.utils.TaskWorker
import com.idormy.sms.forwarder.utils.task.TaskUtils
import com.idormy.sms.forwarder.workers.BatteryWorker
@Suppress("PropertyName")
@Suppress("PrivatePropertyName")
class BatteryReceiver : BroadcastReceiver() {
val TAG: String = BatteryReceiver::class.java.simpleName
private val TAG: String = BatteryReceiver::class.java.simpleName
override fun onReceive(context: Context?, intent: Intent?) {

@ -6,10 +6,10 @@ import android.content.Intent
import android.util.Log
import com.idormy.sms.forwarder.activity.SplashActivity
@Suppress("PropertyName")
@Suppress("PrivatePropertyName")
class BootCompletedReceiver : BroadcastReceiver() {
val TAG: String = BootCompletedReceiver::class.java.simpleName
private val TAG: String = BootCompletedReceiver::class.java.simpleName
override fun onReceive(context: Context, intent: Intent?) {

@ -12,10 +12,10 @@ import com.idormy.sms.forwarder.utils.TaskWorker
import com.idormy.sms.forwarder.utils.task.TaskUtils
import com.idormy.sms.forwarder.workers.LockScreenWorker
@Suppress("PropertyName")
@Suppress("PrivatePropertyName")
class LockScreenReceiver : BroadcastReceiver() {
val TAG: String = LockScreenReceiver::class.java.simpleName
private val TAG: String = LockScreenReceiver::class.java.simpleName
override fun onReceive(context: Context?, intent: Intent?) {

@ -8,7 +8,7 @@ import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.xuexiang.xui.utils.ResUtils.getString
import com.yanzhenjie.andserver.annotation.*
@Suppress("PrivatePropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@RestController
@RequestMapping(path = ["/clone"])
class CloneController {

@ -15,7 +15,7 @@ import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.XUtil
import com.yanzhenjie.andserver.annotation.*
@Suppress("PrivatePropertyName")
@Suppress("PrivatePropertyName", "DEPRECATION")
@RestController
@RequestMapping(path = ["/sms"])
class SmsController {

@ -56,8 +56,10 @@ class NotificationService : NotificationListenerService() {
val extras = notification.extras ?: return
//自动消除额外APP通知
if (!TextUtils.isEmpty(SettingUtils.cancelExtraAppNotify)) {
for (app in SettingUtils.cancelExtraAppNotify.split("\n")) {
SettingUtils.cancelExtraAppNotify
.takeIf { it.isNotEmpty() }
?.split("\n")
?.forEach { app ->
if (sbn.packageName == app.trim()) {
Log.d(TAG, "自动消除额外APP通知$app")
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
@ -65,10 +67,10 @@ class NotificationService : NotificationListenerService() {
} else {
cancelNotification(sbn.packageName, sbn.tag, sbn.id)
}
break
return@forEach
}
}
}
//总开关
if (!SettingUtils.enableAppNotify) return
@ -79,16 +81,10 @@ class NotificationService : NotificationListenerService() {
val from = sbn.packageName
//自身通知跳过
if (PACKAGE_NAME == sbn.packageName) return
//通知标题
var title = ""
if (extras["android.title"] != null) {
title = extras["android.title"].toString()
}
//通知内容
var text = ""
if (extras["android.text"] != null) {
text = extras["android.text"].toString()
}
// 标题
var title = extras["android.title"]?.toString() ?: ""
// 通知内容
var text = extras["android.text"]?.toString() ?: ""
if (text.isEmpty() && notification.tickerText != null) {
text = notification.tickerText.toString()
}

@ -1,7 +1,6 @@
package com.idormy.sms.forwarder.utils
import android.annotation.SuppressLint
import android.content.Intent
import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo
import android.content.pm.PackageManager
@ -68,13 +67,13 @@ object AppUtils {
}
}
fun openApp(packageName: String) {
/*fun openApp(packageName: String) {
val packageManager = App.context.packageManager
val intent = packageManager.getLaunchIntentForPackage(packageName)
if (intent != null) {
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
App.context.startActivity(intent)
}
}
}*/
}

@ -8,7 +8,7 @@ import com.xuexiang.xui.utils.ResUtils.getString
@Suppress("DEPRECATION", "MemberVisibilityCanBePrivate")
object BatteryUtils {
private const val TAG = "BatteryUtils"
//private const val TAG = "BatteryUtils"
fun getBatteryInfo(intent: Intent?): BatteryInfo {
val batteryInfo = BatteryInfo()

@ -43,7 +43,7 @@ import java.util.regex.Pattern
/**
* 常用工具类
*/
@Suppress("RegExpRedundantEscape", "unused", "RegExpUnnecessaryNonCapturingGroup")
@Suppress("RegExpRedundantEscape", "unused", "RegExpUnnecessaryNonCapturingGroup", "DEPRECATION")
class CommonUtils private constructor() {
companion object {
/**
@ -235,17 +235,17 @@ class CommonUtils private constructor() {
}
//是否合法的IP地址
fun checkIP(IP: String): String {
if (TextUtils.isEmpty(IP)) return "Neither"
fun checkIP(ip: String): String {
if (TextUtils.isEmpty(ip)) return "Neither"
if (IP.contains(".")) {
if (ip.contains(".")) {
val chunkIPv4 = "([\\d]|[1-9][\\d]|1[\\d][\\d]|2[0-4][\\d]|25[0-5])"
val pattenIPv4 = Pattern.compile("^($chunkIPv4\\.){3}$chunkIPv4$")
return if (pattenIPv4.matcher(IP).matches()) "IPv4" else "Neither"
} else if (IP.contains(":")) {
return if (pattenIPv4.matcher(ip).matches()) "IPv4" else "Neither"
} else if (ip.contains(":")) {
val chunkIPv6 = "([\\da-fA-F]{1,4})"
val pattenIPv6 = Pattern.compile("^($chunkIPv6\\:){7}$chunkIPv6$")
return if (pattenIPv6.matcher(IP).matches()) "IPv6" else "Neither"
return if (pattenIPv6.matcher(ip).matches()) "IPv6" else "Neither"
}
return "Neither"
}
@ -295,7 +295,7 @@ class CommonUtils private constructor() {
val address = addresses.nextElement()
if (address is Inet4Address || address is Inet6Address) {
ipAddresses.add(address.hostAddress)
address.hostAddress?.let { ipAddresses.add(it) }
}
}
}

@ -63,7 +63,6 @@ const val ENABLE_LOAD_SYSTEM_APP_LIST = "enable_load_system_app_list"
const val SP_DUPLICATE_MESSAGES_LIMITS = "duplicate_messages_limits"
const val SP_SILENT_PERIOD_START = "silent_period_start"
const val SP_SILENT_PERIOD_END = "silent_period_end"
const val SP_AUTO_CLEAN_LOGS_DAYS = "auto_clean_logs_days"
const val SP_ENABLE_EXCLUDE_FROM_RECENTS = "enable_exclude_from_recents"
const val SP_ENABLE_PLAY_SILENCE_MUSIC = "enable_play_silence_music"

@ -5,6 +5,7 @@ import com.idormy.sms.forwarder.entity.ContactInfo
import com.idormy.sms.forwarder.entity.SmsInfo
import com.xuexiang.xaop.annotation.MemoryCache
@Suppress("SameParameterValue")
object DataProvider {
//用于占位的空信息

@ -21,6 +21,7 @@ import javax.crypto.spec.SecretKeySpec
/**
* HttpServer工具类
*/
@Suppress("DEPRECATION")
class HttpServerUtils private constructor() {
companion object {

@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.idormy.sms.forwarder.utils
import android.util.Log
@ -35,8 +37,8 @@ object RuleLineUtils {
}
@Throws(Exception::class)
fun checkRuleLines(msg: MsgInfo, RuleLines: String?): Boolean {
val scanner = Scanner(RuleLines)
fun checkRuleLines(msg: MsgInfo, ruleLines: String?): Boolean {
val scanner = Scanner(ruleLines)
var lineNum = 0
var headRuleLine: RuleLine? = null
var beforeRuleLine: RuleLine? = null

@ -72,9 +72,6 @@ class SettingUtils private constructor() {
//免打扰(禁用转发)时间段——结束
var silentPeriodEnd: Int by SharedPreference(SP_SILENT_PERIOD_END, 0)
//自动删除N天前的转发记录
var autoCleanLogsDays: Int by SharedPreference(SP_AUTO_CLEAN_LOGS_DAYS, 0)
//是否不在最近任务列表中显示
var enableExcludeFromRecents: Boolean by SharedPreference(SP_ENABLE_EXCLUDE_FROM_RECENTS, false)

@ -77,7 +77,7 @@ class SmsCommandUtils {
GlobalScope.async(Dispatchers.IO) {
val frpc = AppDatabase.getInstance(App.context).frpcDao().getOne(param)
if (frpc == null) {
if (frpc.uid.isEmpty()) {
Log.d(TAG, "没有找到指定的Frpc")
return@async
}

@ -14,13 +14,11 @@ import com.xuexiang.xhttp2.XHttp
import com.xuexiang.xhttp2.cache.model.CacheMode
import com.xuexiang.xhttp2.callback.SimpleCallBack
import com.xuexiang.xhttp2.exception.ApiException
import java.net.URLEncoder
import java.util.regex.Pattern
import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
@Suppress("unused")
@Suppress("unused", "RegExpRedundantEscape")
class BarkUtils {
companion object {
@ -74,7 +72,7 @@ class BarkUtils {
val pattern = Regex("(?<!回复)(验证码|授权码|校验码|检验码|确认码|激活码|动态码|安全码|(验证)?代码|校验代码|检验代码|激活代码|确认代码|动态代码|安全代码|登入码|认证码|识别码|短信口令|动态密码|交易码|上网密码|动态口令|随机码|驗證碼|授權碼|校驗碼|檢驗碼|確認碼|激活碼|動態碼|(驗證)?代碼|校驗代碼|檢驗代碼|確認代碼|激活代碼|動態代碼|登入碼|認證碼|識別碼|一次性密码|[Cc][Oo][Dd][Ee]|[Vv]erification)")
if (pattern.containsMatchIn(content)) {
var code = content.replace("(.*)((代|授权|验证|动态|校验)码|[【\\[].*[】\\]]|[Cc][Oo][Dd][Ee]|[Vv]erification\\s?([Cc]ode)?)\\s?(G-|<#>)?([:\\s是为]|[Ii][Ss]){0,3}[\\(\\[【{「]?(([0-9\\s]{4,7})|([\\dA-Za-z]{5,6})(?!([Vv]erification)?([Cc][Oo][Dd][Ee])|:))[」}】\\]\\)]?(?=([^0-9a-zA-Z]|\$))(.*)".toRegex(), "$7").trim()
code = code.replace("[^\\d]*[\\(\\[【{「]?([0-9]{3}\\s?[0-9]{1,3})[」}】\\]\\)]?(?=.*((代|授权|验证|动态|校验)码|[【\\[].*[】\\]]|[Cc][Oo][Dd][Ee]|[Vv]erification\\s?([Cc]ode)?))(.*)".toRegex(), "$1").trim()
code = code.replace("\\D*[\\(\\[【{「]?([0-9]{3}\\s?[0-9]{1,3})[」}】\\]\\)]?(?=.*((代|授权|验证|动态|校验)码|[【\\[].*[】\\]]|[Cc][Oo][Dd][Ee]|[Vv]erification\\s?([Cc]ode)?))(.*)".toRegex(), "$1").trim()
if (code.isNotEmpty()) {
msgMap["copy"] = code
msgMap["automaticallyCopy"] = 1
@ -85,7 +83,7 @@ class BarkUtils {
Log.i(TAG, "requestMsg:$requestMsg")
//推送加密
if (setting.transformation.isNotEmpty() && "none" != setting.transformation && setting.key.isNotEmpty() && setting.iv.isNotEmpty()) {
var transformation = setting.transformation.replace("AES128", "AES").replace("AES192", "AES").replace("AES256", "AES")
val transformation = setting.transformation.replace("AES128", "AES").replace("AES192", "AES").replace("AES256", "AES")
val ciphertext = encrypt(requestMsg, transformation, setting.key, setting.iv)
//Log.d(TAG, "ciphertext: $ciphertext")
//val plainText = decrypt(ciphertext, transformation, setting.key, setting.iv)

@ -26,6 +26,7 @@ import java.net.PasswordAuthentication
import java.net.Proxy
//钉钉企业内机器人
@Suppress("DEPRECATION")
class DingtalkInnerRobotUtils private constructor() {
companion object {

@ -11,6 +11,7 @@ import com.idormy.sms.forwarder.utils.mail.Mail
import com.idormy.sms.forwarder.utils.mail.MailSender
import com.xuexiang.xui.utils.ResUtils
@Suppress("DEPRECATION")
class EmailUtils {
companion object {
@ -43,12 +44,14 @@ class EmailUtils {
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@exmail.qq.com" -> {
setting.host = "smtp.exmail.qq.com"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@msn.com" -> {
setting.host = "smtp-mail.outlook.com"
setting.port = "587"
@ -56,6 +59,7 @@ class EmailUtils {
setting.startTls = true
setting.fromEmail += setting.mailType
}
"@outlook.com", "@office365.com", "@live.com", "@hotmail.com" -> {
setting.host = "smtp.office365.com"
setting.port = "587"
@ -63,6 +67,7 @@ class EmailUtils {
setting.startTls = true
setting.fromEmail += setting.mailType
}
"@gmail.com" -> {
setting.host = "smtp.gmail.com"
setting.port = "587"
@ -70,48 +75,56 @@ class EmailUtils {
setting.startTls = true
setting.fromEmail += setting.mailType
}
"@yeah.net" -> {
setting.host = "smtp.yeah.net"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@163.com" -> {
setting.host = "smtp.163.com"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@126.com" -> {
setting.host = "smtp.126.com"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@sina.com" -> {
setting.host = "smtp.sina.com"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@sina.cn" -> {
setting.host = "smtp.sina.cn"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@139.com" -> {
setting.host = "smtp.139.com"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
"@189.cn" -> {
setting.host = "smtp.189.cn"
setting.port = "465"
setting.ssl = true
setting.fromEmail += setting.mailType
}
else -> {}
}

@ -18,6 +18,7 @@ import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xui.utils.ResUtils.getString
//飞书企业应用
@Suppress("DEPRECATION")
class FeishuAppUtils private constructor() {
companion object {

@ -16,6 +16,7 @@ import com.xuexiang.xhttp2.callback.SimpleCallBack
import com.xuexiang.xhttp2.exception.ApiException
import com.xuexiang.xui.utils.ResUtils
@Suppress("DEPRECATION")
class PushplusUtils private constructor() {
companion object {

@ -16,6 +16,7 @@ import com.xuexiang.xui.utils.ResUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.net.NetworkUtils
@Suppress("DEPRECATION")
class SmsUtils {
companion object {

@ -114,7 +114,7 @@ object ShareReflectUtil {
+ name
+ " with parameters "
+ listOf(*parameterTypes)
+ " not found in " + tClazz
+ " not found in tClazz"
)
}

@ -13,6 +13,7 @@ import com.xuexiang.xupdate.listener.OnUpdateFailureListener
* @author xuexiang
* @since 2019/4/15 上午12:01
*/
@Suppress("DEPRECATION")
class CustomUpdateFailureListener @JvmOverloads constructor(
/**
* 是否需要错误提示

@ -17,6 +17,7 @@ import com.xuexiang.xupdate.XUpdate
* @author xuexiang
* @since 2019-06-15 00:06
*/
@Suppress("DEPRECATION")
class UpdateTipDialog : AppCompatActivity(), DialogInterface.OnDismissListener {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)

@ -19,6 +19,7 @@ import com.xuexiang.xutil.net.JsonUtil
* @author xuexiang
* @since 2018/8/12 上午11:46
*/
@Suppress("DEPRECATION")
class XHttpUpdateHttpServiceImpl : IUpdateHttpService {
override fun asyncGet(
url: String,

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<animated-selector
xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_checked="true" android:drawable="@drawable/auto_task_radio_button_select" />
<item android:state_checked="true" android:drawable="@drawable/auto_task_radio_button_select" />
<item android:state_checked="false" android:drawable="@drawable/auto_task_radio_button_un_select" />
<item android:state_enabled="true" android:drawable="@drawable/auto_task_radio_button_select" />
<item android:drawable="@drawable/auto_task_radio_button_un_select" />
</animated-selector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_68" android:width="@dimen/view_dimen_68" android:viewportWidth="68.0" android:viewportHeight="68.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_select_radio_out_color" android:pathData="M34,66C51.6731,66 66,51.6731 66,34C66,16.3269 51.6731,2 34,2C16.3269,2 2,16.3269 2,34C2,51.6731 16.3269,66 34,66Z" />
<path android:fillColor="#00000000" android:pathData="M34,67C52.2254,67 67,52.2254 67,34C67,15.7746 52.2254,1 34,1C15.7746,1 1,15.7746 1,34C1,52.2254 15.7746,67 34,67Z" android:strokeColor="#ffffffff" android:strokeWidth="2.0" android:strokeAlpha="0.1" />
<path android:fillColor="#ffffffff" android:pathData="M34,49C42.2843,49 49,42.2843 49,34C49,25.7157 42.2843,19 34,19C25.7157,19 19,25.7157 19,34C19,42.2843 25.7157,49 34,49Z" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_68" android:width="@dimen/view_dimen_68" android:viewportWidth="70.0" android:viewportHeight="70.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#ff000000" android:pathData="M35,67C52.6731,67 67,52.6731 67,35C67,17.3269 52.6731,3 35,3C17.3269,3 3,17.3269 3,35C3,52.6731 17.3269,67 35,67Z" android:fillAlpha="0.06" />
<path android:fillColor="#00000000" android:pathData="M35,68.5C53.5015,68.5 68.5,53.5015 68.5,35C68.5,16.4985 53.5015,1.5 35,1.5C16.4985,1.5 1.5,16.4985 1.5,35C1.5,53.5015 16.4985,68.5 35,68.5Z" android:strokeColor="#ffffffff" android:strokeWidth="3.0" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_56" android:width="@dimen/view_dimen_56" android:viewportWidth="56.0" android:viewportHeight="56.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#ff0d84ff" android:pathData="M46.8171,18.1513C48.0496,16.6622 47.8417,14.4559 46.3527,13.2234C44.8636,11.9908 42.6573,12.1987 41.4247,13.6878L22.9535,36.0029L13.4007,26.45C12.0338,25.0832 9.8177,25.0832 8.4509,26.45C7.0841,27.8169 7.0841,30.0329 8.4509,31.3998L20.7077,43.6566C21.7243,44.6732 23.2108,44.9337 24.4682,44.438C25.0159,44.2301 25.5189,43.8816 25.9192,43.398L46.8171,18.1513Z" android:fillType="evenOdd" />
</vector>

@ -63,7 +63,7 @@
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="right" />
android:gravity="end|bottom" />
</LinearLayout>

@ -20,7 +20,8 @@
android:layout_height="wrap_content"
android:layout_gravity="end"
android:padding="@dimen/config_margin_10dp"
app:srcCompat="@drawable/ic_action_close_white" />
app:srcCompat="@drawable/ic_action_close_white"
tools:ignore="ImageContrastCheck" />
<LinearLayout
android:layout_width="match_parent"
@ -52,7 +53,8 @@
android:layout_width="match_parent"
android:layout_marginTop="@dimen/config_margin_16dp"
android:text="@string/tip_title"
android:textColor="?attr/colorAccent" />
android:textColor="?attr/colorAccent"
tools:ignore="TextContrastCheck" />
<TextView
android:id="@+id/tv_content"
@ -84,12 +86,14 @@
android:layout_height="wrap_content"
android:button="@drawable/xui_icon_checkbox"
android:scaleX="0.8"
android:scaleY="0.8" />
android:scaleY="0.8"
tools:ignore="PrivateResource,TouchTargetSizeCheck" />
<TextView
style="@style/TextStyle.Explain"
android:layout_marginStart="@dimen/config_margin_4dp"
android:text="@string/tip_ignore_message" />
android:text="@string/tip_ignore_message"
tools:ignore="TextContrastCheck" />
</LinearLayout>
</LinearLayout>

@ -534,7 +534,7 @@
android:layout_height="wrap_content"
android:text="@string/silent_time_period_tips"
android:textSize="9sp"
tools:ignore="SmallSp" />
tools:ignore="SmallSp,TooManyViews" />
</LinearLayout>

@ -349,7 +349,6 @@
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:background="@color/setting_bar_color"
android:gravity="center_vertical"
android:orientation="vertical"
android:paddingStart="10dp"
android:paddingTop="10dp"
@ -358,6 +357,7 @@
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
@ -822,53 +822,6 @@
</LinearLayout>
<LinearLayout
style="@style/settingBarStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingEnd="15dp"
tools:ignore="RtlSymmetry">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/auto_clean_logs"
android:textStyle="bold"
tools:ignore="RelativeOverlap" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/auto_clean_logs_tips"
android:textSize="9sp"
tools:ignore="SmallSp" />
</LinearLayout>
<com.xuexiang.xui.widget.picker.XSeekBar
android:id="@+id/xsb_auto_clean_logs"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:layout_weight="1"
app:xsb_max="60"
app:xsb_min="0" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="5dp"
android:text="@string/day"
android:textSize="12sp"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"

@ -128,7 +128,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="0-59"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="DuplicateSpeakableTextCheck,HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_minute"
@ -136,7 +138,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="0-59"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_hour"
@ -144,7 +148,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="0-23"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_day"
@ -152,7 +158,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1-31"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_month"
@ -160,7 +168,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1-12"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_week"
@ -168,7 +178,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="1-7"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
<EditText
android:id="@+id/et_year"
@ -176,7 +188,9 @@
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="*"
android:textAlignment="center" />
android:importantForAutofill="no"
android:textAlignment="center"
tools:ignore="HardcodedText,TextFields,TouchTargetSizeCheck,TextContrastCheck" />
</LinearLayout>
@ -272,6 +286,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -285,6 +300,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -317,6 +333,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -330,6 +347,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -403,6 +421,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -416,6 +435,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -448,6 +468,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -461,6 +482,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -534,6 +556,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -547,6 +570,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -561,7 +585,8 @@
android:id="@+id/rb_hour_type_interval"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/interval" />
android:text="@string/interval"
tools:ignore="TooManyViews" />
<LinearLayout
android:layout_width="match_parent"
@ -579,6 +604,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -592,6 +618,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -665,6 +692,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -678,6 +706,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -710,6 +739,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -723,6 +753,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -755,8 +786,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="1-31"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
android:textAlignment="center"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
@ -846,6 +879,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -859,6 +893,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -891,6 +926,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -904,6 +940,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -977,6 +1014,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -990,6 +1028,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1016,6 +1055,7 @@
android:id="@+id/et_which_week_of_month"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1029,8 +1069,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="1-7"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
android:textAlignment="center"
tools:ignore="HardcodedText" />
</LinearLayout>
@ -1056,8 +1098,10 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="1-7"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
android:textAlignment="center"
tools:ignore="HardcodedText" />
<TextView
android:layout_width="wrap_content"
@ -1142,6 +1186,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1155,6 +1200,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/end"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1187,6 +1233,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/start"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1200,6 +1247,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="@string/interval"
android:importantForAutofill="no"
android:inputType="number"
android:textAlignment="center" />
@ -1244,7 +1292,7 @@
android:paddingStart="15dp"
android:text="@string/discard"
android:textSize="11sp"
tools:ignore="RtlSymmetry" />
tools:ignore="RtlSymmetry,TextContrastCheck,TouchTargetSizeCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_save"
@ -1254,7 +1302,7 @@
android:paddingStart="15dp"
android:text="@string/submit"
android:textSize="11sp"
tools:ignore="RtlSymmetry" />
tools:ignore="RtlSymmetry,TouchTargetSizeCheck,TextContrastCheck" />
<com.xuexiang.xui.widget.textview.supertextview.SuperButton
android:id="@+id/btn_test"
@ -1264,7 +1312,7 @@
android:paddingStart="15dp"
android:text="@string/test"
android:textSize="11sp"
tools:ignore="RtlSymmetry" />
tools:ignore="RtlSymmetry,TouchTargetSizeCheck,TextContrastCheck" />
</LinearLayout>

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save