新增:自动任务·快捷指令 (开发中)

精简:界面调整 & 去除不常用资源
整理:code review
pull/408/head
pppscn 10 months ago
parent 81e1cd4729
commit be36ada07f

@ -1,25 +1,15 @@
package com.idormy.sms.forwarder.adapter.spinner
import android.graphics.drawable.Drawable
import com.xuexiang.xutil.resource.ResUtils
@Suppress("unused")
class AppListAdapterItem {
var name: String = ""
var icon: Drawable? = null
class AppListAdapterItem(
var name: String = "",
var icon: Drawable? = null,
var packageName: String? = null
) {
constructor(name: String, icon: Drawable?, packageName: String?) {
this.name = name
this.icon = icon
this.packageName = packageName
}
constructor(name: String) : this(name, null, null)
constructor(name: String, drawableId: Int, packageName: String) : this(name, ResUtils.getDrawable(drawableId), packageName)
//注意自定义实体需要重写对象的toString方法
// 注意:自定义实体需要重写对象的 toString 方法
override fun toString(): String {
return name
}
@ -29,12 +19,8 @@ class AppListAdapterItem {
return AppListAdapterItem(name)
}
fun arrayof(title: Array<String>): Array<AppListAdapterItem?> {
val array = arrayOfNulls<AppListAdapterItem>(title.size)
for (i in array.indices) {
array[i] = AppListAdapterItem(title[i])
}
return array
fun arrayOf(vararg titles: String): Array<AppListAdapterItem> {
return titles.map { AppListAdapterItem(it) }.toTypedArray()
}
}
}

@ -0,0 +1,47 @@
package com.idormy.sms.forwarder.adapter.spinner
import android.graphics.drawable.Drawable
@Suppress("unused")
class RuleAdapterItem(
var title: CharSequence,
var icon: Drawable? = null,
var id: Long? = 0L,
var status: Int? = 1
) {
fun setTitle(title: CharSequence): RuleAdapterItem {
this.title = title
return this
}
fun setIcon(icon: Drawable?): RuleAdapterItem {
this.icon = icon
return this
}
fun setId(id: Long): RuleAdapterItem {
this.id = id
return this
}
fun setStatus(status: Int): RuleAdapterItem {
this.status = status
return this
}
// 注意:自定义实体需要重写对象的 toString 方法
override fun toString(): String {
return title.toString()
}
companion object {
fun of(title: CharSequence): RuleAdapterItem {
return RuleAdapterItem(title)
}
fun arrayOf(vararg titles: CharSequence): Array<RuleAdapterItem> {
return titles.map { RuleAdapterItem(it) }.toTypedArray()
}
}
}

@ -0,0 +1,167 @@
package com.idormy.sms.forwarder.adapter.spinner
import android.annotation.SuppressLint
import android.os.Build
import android.text.Html
import android.text.TextUtils
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import androidx.annotation.ColorInt
import androidx.annotation.DrawableRes
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.xuexiang.xui.utils.CollectionUtils
import com.xuexiang.xui.widget.spinner.editspinner.BaseEditSpinnerAdapter
import com.xuexiang.xui.widget.spinner.editspinner.EditSpinnerFilter
import com.xuexiang.xutil.resource.ResUtils.getDrawable
@Suppress("unused", "NAME_SHADOWING", "DEPRECATION")
class RuleSpinnerAdapter<T> : BaseEditSpinnerAdapter<T>, EditSpinnerFilter {
/**
* 选项的文字颜色
*/
private var mTextColor = 0
/**
* 选项的文字大小
*/
private var mTextSize = 0f
/**
* 背景颜色
*/
private var mBackgroundSelector = 0
/**
* 过滤关键词的选中颜色
*/
private var mFilterColor = "#F15C58"
private var mIsFilterKey = false
/**
* 构造方法
*
* @param data 选项数据
*/
constructor(data: List<T>?) : super(data)
/**
* 构造方法
*
* @param data 选项数据
*/
constructor(data: Array<T>?) : super(data)
override fun getEditSpinnerFilter(): EditSpinnerFilter {
return this
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View? {
var convertView = convertView
val holder: ViewHolder
if (convertView == null) {
convertView = LayoutInflater.from(parent.context).inflate(R.layout.item_spinner_with_icon, parent, false)
holder = ViewHolder(convertView, mTextColor, mTextSize, mBackgroundSelector)
convertView.tag = holder
} else {
holder = convertView.tag as ViewHolder
}
val item = CollectionUtils.getListItem(mDataSource, mIndexs[position]) as RuleAdapterItem
holder.iconView.setImageDrawable(item.icon)
holder.statusView.setImageDrawable(
getDrawable(
when (item.status) {
STATUS_OFF -> R.drawable.ic_stop
else -> R.drawable.ic_start
}
)
)
//holder.titleView.text = Html.fromHtml(item.toString())
holder.titleView.text = Html.fromHtml(getItem(position))
return convertView
}
override fun onFilter(keyword: String): Boolean {
mDisplayData.clear()
Log.d("RuleSpinnerAdapter", "keyword = $keyword")
Log.d("RuleSpinnerAdapter", "mIndexs.indices = ${mIndexs.indices}")
if (TextUtils.isEmpty(keyword)) {
initDisplayData(mDataSource)
for (i in mIndexs.indices) {
mIndexs[i] = i
}
} else {
try {
for (i in mDataSource.indices) {
if (getDataSourceString(i).contains(keyword, ignoreCase = true)) {
mIndexs[mDisplayData.size] = i
if (mIsFilterKey) {
mDisplayData.add(getDataSourceString(i).replaceFirst(keyword.toRegex(), "<font color=\"$mFilterColor\">$keyword</font>"))
} else {
mDisplayData.add(getDataSourceString(i))
}
}
}
} catch (e: Exception) {
e.printStackTrace()
Log.e("RuleSpinnerAdapter", "onFilter error: ${e.message}")
}
}
Log.d("RuleSpinnerAdapter", "mDisplayData = $mDisplayData")
notifyDataSetChanged()
return mDisplayData.size > 0
}
fun setTextColor(@ColorInt textColor: Int): RuleSpinnerAdapter<*> {
mTextColor = textColor
return this
}
fun setTextSize(textSize: Float): RuleSpinnerAdapter<*> {
mTextSize = textSize
return this
}
fun setBackgroundSelector(@DrawableRes backgroundSelector: Int): RuleSpinnerAdapter<*> {
mBackgroundSelector = backgroundSelector
return this
}
fun setFilterColor(filterColor: String): RuleSpinnerAdapter<*> {
mFilterColor = filterColor
return this
}
fun setIsFilterKey(isFilterKey: Boolean): RuleSpinnerAdapter<*> {
mIsFilterKey = isFilterKey
return this
}
@SuppressLint("ObsoleteSdkInt")
private class ViewHolder(convertView: View, @ColorInt textColor: Int, textSize: Float, @DrawableRes backgroundSelector: Int) {
val iconView: ImageView = convertView.findViewById(R.id.iv_icon)
val statusView: ImageView = convertView.findViewById(R.id.iv_status)
val titleView: TextView = convertView.findViewById(R.id.tv_title)
init {
if (textColor > 0) titleView.setTextColor(textColor)
if (textSize > 0F) titleView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize)
if (backgroundSelector != 0) titleView.setBackgroundResource(backgroundSelector)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
val config = convertView.resources.configuration
if (config.layoutDirection == View.LAYOUT_DIRECTION_RTL) {
titleView.textDirection = View.TEXT_DIRECTION_RTL
}
}
}
}
fun getItemSource(position: Int): T {
return mDataSource[mIndexs[position]]
}
}

@ -1,59 +1,22 @@
package com.idormy.sms.forwarder.adapter.spinner
import android.content.Context
import android.graphics.drawable.Drawable
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import com.xuexiang.xutil.resource.ResUtils.getString
@Suppress("unused")
class SenderAdapterItem {
//标题内容
var title: CharSequence
//图标
var icon: Drawable? = null
//ID
var id: Long? = 0L
//状态
class SenderAdapterItem(
var title: CharSequence,
var icon: Drawable? = null,
var id: Long? = 0L,
var status: Int? = 1
) {
constructor(title: CharSequence) {
this.title = title
}
constructor(title: CharSequence, icon: Drawable?) {
this.title = title
this.icon = icon
}
constructor(title: CharSequence, icon: Drawable?, id: Long?) {
fun setTitle(title: CharSequence): SenderAdapterItem {
this.title = title
this.icon = icon
this.id = id
return this
}
constructor(title: CharSequence, icon: Drawable?, id: Long?, status: Int?) {
this.title = title
fun setIcon(icon: Drawable?): SenderAdapterItem {
this.icon = icon
this.id = id
this.status = status
}
constructor(title: CharSequence, drawableId: Int) : this(title, getDrawable(drawableId))
constructor(title: CharSequence, drawableId: Int, id: Long) : this(title, getDrawable(drawableId), id)
constructor(title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, getDrawable(drawableId), id, status)
constructor(context: Context?, titleId: Int, drawableId: Int) : this(getString(titleId), getDrawable(context, drawableId))
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long) : this(getString(titleId), getDrawable(context, drawableId), id)
constructor(context: Context?, titleId: Int, drawableId: Int, id: Long, status: Int) : this(getString(titleId), getDrawable(context, drawableId), id, status)
constructor(context: Context?, title: CharSequence, drawableId: Int) : this(title, getDrawable(context, drawableId))
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long) : this(title, getDrawable(context, drawableId), id)
constructor(context: Context?, title: CharSequence, drawableId: Int, id: Long, status: Int) : this(title, getDrawable(context, drawableId), id, status)
fun setStatus(status: Int): SenderAdapterItem {
this.status = status
return this
}
@ -62,32 +25,25 @@ class SenderAdapterItem {
return this
}
fun setTitle(title: CharSequence): SenderAdapterItem {
this.title = title
return this
}
fun setIcon(icon: Drawable?): SenderAdapterItem {
this.icon = icon
fun setStatus(status: Int): SenderAdapterItem {
this.status = status
return this
}
//注意自定义实体需要重写对象的toString方法
// 注意:自定义实体需要重写对象的 toString 方法
override fun toString(): String {
return title.toString()
}
companion object {
@JvmStatic
fun of(title: CharSequence): SenderAdapterItem {
return SenderAdapterItem(title)
}
fun arrayof(title: Array<CharSequence>): Array<SenderAdapterItem?> {
val array = arrayOfNulls<SenderAdapterItem>(title.size)
for (i in array.indices) {
array[i] = SenderAdapterItem(title[i])
}
return array
@JvmStatic
fun arrayOf(vararg titles: CharSequence): Array<SenderAdapterItem> {
return titles.map { SenderAdapterItem(it) }.toTypedArray()
}
}
}

@ -1,7 +1,13 @@
package com.idormy.sms.forwarder.database.dao
import androidx.paging.PagingSource
import androidx.room.*
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.RawQuery
import androidx.room.Transaction
import androidx.room.Update
import androidx.sqlite.db.SupportSQLiteQuery
import com.idormy.sms.forwarder.database.entity.Rule
import io.reactivex.Completable
@ -45,4 +51,7 @@ interface RuleDao {
@Transaction
@RawQuery(observedEntities = [Rule::class])
fun getAllRaw(query: SupportSQLiteQuery): List<Rule>
@Query("SELECT * FROM Rule ORDER BY id DESC")
fun getAll(): Single<List<Rule>>
}

@ -1,7 +1,13 @@
package com.idormy.sms.forwarder.database.dao
import androidx.paging.PagingSource
import androidx.room.*
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.Query
import androidx.room.RawQuery
import androidx.room.Transaction
import androidx.room.Update
import androidx.sqlite.db.SupportSQLiteQuery
import com.idormy.sms.forwarder.database.entity.Sender
import io.reactivex.Completable
@ -29,6 +35,9 @@ interface SenderDao {
@Query("SELECT * FROM Sender where id=:id")
fun getOne(id: Long): Sender
@Query("SELECT * FROM Sender WHERE id IN (:ids)")
fun getByIds(ids: List<Long>): List<Sender>
@Query("SELECT count(*) FROM Sender where type=:type and status=:status")
fun count(type: String, status: Int): Single<Int>

@ -19,7 +19,7 @@ interface TaskDao {
fun get(id: Long): Single<Task>
@Query("SELECT * FROM Task where id=:id")
fun getOne(id: Long): Task
suspend fun getOne(id: Long): Task?
@Query("SELECT * FROM Task where type < 1000 ORDER BY id DESC")
fun pagingSourceFixed(): PagingSource<Int, Task>

@ -1,7 +1,6 @@
package com.idormy.sms.forwarder.database.entity
import android.os.Parcelable
import com.idormy.sms.forwarder.utils.Log
import androidx.room.*
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.database.ext.ConvertersSenderList
@ -117,6 +116,23 @@ data class Rule(
}
val name: String
get() {
val sb = StringBuilder()
when (type) {
"app" -> sb.append("[").append(getString(R.string.type_param_app)).append("]")
"call" -> sb.append("[").append(getString(R.string.type_param_call)).append("]").append(SIM_SLOT_MAP[simSlot].toString()).append(getString(R.string.rule_card))
else -> sb.append("[").append(getString(R.string.type_param_sms)).append("]").append(SIM_SLOT_MAP[simSlot].toString()).append(getString(R.string.rule_card))
}
when (filed) {
FILED_TRANSPOND_ALL -> sb.append(getString(R.string.rule_all_fw_to))
FILED_CALL_TYPE -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + CALL_TYPE_MAP[value] + getString(R.string.rule_fw_to))
else -> sb.append(getString(R.string.rule_when) + FILED_MAP[filed] + CHECK_MAP[check] + value + getString(R.string.rule_fw_to))
}
sb.append(senderList.joinToString(",") { it.name })
return sb.toString()
}
val ruleMatch: String
get() {
val simStr = if ("app" == type) "" else SIM_SLOT_MAP[simSlot].toString() + getString(R.string.rule_card)

@ -8,20 +8,11 @@ class ConvertersSenderList {
@TypeConverter
fun stringToObject(value: String): List<Sender> {
val senderList: MutableList<Sender> = mutableListOf()
value.split(",").map { it.trim() }.forEach {
val sender = Core.sender.getOne(it.toLong())
senderList.add(sender)
}
return senderList
return Core.sender.getByIds(value.split(",").map { it.trim().toLong() })
}
@TypeConverter
fun objectToString(list: List<Sender>): String {
val senderList = ArrayList<Long>()
list.forEach {
senderList += it.id
}
return senderList.joinToString(",")
return list.joinToString(",") { it.id.toString() }
}
}

@ -1,10 +1,10 @@
package com.idormy.sms.forwarder.database.repository
import androidx.annotation.WorkerThread
import androidx.sqlite.db.SimpleSQLiteQuery
import com.idormy.sms.forwarder.database.dao.SenderDao
import com.idormy.sms.forwarder.database.entity.Sender
import kotlinx.coroutines.flow.Flow
import androidx.sqlite.db.SimpleSQLiteQuery
class SenderRepository(private val senderDao: SenderDao) {
@ -23,6 +23,8 @@ class SenderRepository(private val senderDao: SenderDao) {
fun getOne(id: Long) = senderDao.getOne(id)
fun getByIds(ids: List<Long>) = senderDao.getByIds(ids)
fun update(sender: Sender) = senderDao.update(sender)
fun getAllNonCache(): List<Sender> {

@ -10,7 +10,7 @@ class TaskRepository(private val taskDao: TaskDao) {
@WorkerThread
fun insert(task: Task) = taskDao.insert(task)
fun getOne(id: Long) = taskDao.getOne(id)
suspend fun getOne(id: Long) = taskDao.getOne(id)
fun update(task: Task) = taskDao.update(task)

@ -0,0 +1,10 @@
package com.idormy.sms.forwarder.entity.action
import com.idormy.sms.forwarder.database.entity.Rule
import java.io.Serializable
data class RuleSetting(
var description: String = "", //描述
var status: String = "enable", //状态: enable=启用disable=禁用
var ruleList: List<Rule>, //转发规则列表
) : Serializable

@ -0,0 +1,10 @@
package com.idormy.sms.forwarder.entity.action
import com.idormy.sms.forwarder.database.entity.Sender
import java.io.Serializable
data class SenderSetting(
var description: String = "", //描述
var status: String = "enable", //状态: enable=启用disable=禁用
var senderList: List<Sender>, //发送通道列表
) : Serializable

@ -0,0 +1,38 @@
package com.idormy.sms.forwarder.entity.action
import com.idormy.sms.forwarder.utils.SettingUtils
import java.io.Serializable
data class SettingsSetting(
var description: String = "", //描述
var enableSms: Boolean = SettingUtils.enableSms, //是否转发短信
var enablePhone: Boolean = SettingUtils.enablePhone, //是否转发通话
var enableCallType1: Boolean = SettingUtils.enableCallType1, //是否转发通话——来电挂机
var enableCallType2: Boolean = SettingUtils.enableCallType2, //是否转发通话——去电挂机
var enableCallType3: Boolean = SettingUtils.enableCallType3, //是否转发通话——未接来电
var enableCallType4: Boolean = SettingUtils.enableCallType4, //是否转发通话——来电提醒
var enableCallType5: Boolean = SettingUtils.enableCallType5, //是否转发通话——来电接通
var enableCallType6: Boolean = SettingUtils.enableCallType6, //是否转发通话——去电拨出
var enableAppNotify: Boolean = SettingUtils.enableAppNotify, //是否转发应用通知
var enableCancelAppNotify: Boolean = SettingUtils.enableCancelAppNotify, //是否转发应用通知——自动消除通知
var enableNotUserPresent: Boolean = SettingUtils.enableNotUserPresent, //是否转发应用通知——仅锁屏状态
var enableLocation: Boolean = SettingUtils.enableLocation, //是否启用定位功能
var locationAccuracy: Int = SettingUtils.locationAccuracy, //设置位置精度
var locationPowerRequirement: Int = SettingUtils.locationPowerRequirement, //设置电量消耗
var locationMinInterval: Long = SettingUtils.locationMinInterval, //设置最小更新间隔
var locationMinDistance: Int = SettingUtils.locationMinDistance, //设置最小更新距离
var enableSmsCommand: Boolean = SettingUtils.enableSmsCommand, //是否接受短信指令
var smsCommandSafePhone: String = SettingUtils.smsCommandSafePhone, //短信指令安全手机号
var enableLoadAppList: Boolean = SettingUtils.enableLoadAppList, //是否加载应用列表
var enableLoadUserAppList: Boolean = SettingUtils.enableLoadUserAppList, //是否加载应用列表——用户应用
var enableLoadSystemAppList: Boolean = SettingUtils.enableLoadSystemAppList, //是否加载应用列表——系统应用
var cancelExtraAppNotify: String = SettingUtils.cancelExtraAppNotify, //是否转发应用通知——自动消除额外APP通知
var duplicateMessagesLimits: Int = SettingUtils.duplicateMessagesLimits, //重复消息限制
) : Serializable

@ -422,7 +422,7 @@ class RulesEditFragment : BaseFragment<FragmentRulesEditBinding?>(), View.OnClic
senderListAll = senderList as MutableList<Sender>
for (sender in senderList) {
val name = if (sender.name.length > 20) sender.name.substring(0, 19) else sender.name
senderSpinnerList.add(SenderAdapterItem(name, sender.imageId, sender.id, sender.status))
senderSpinnerList.add(SenderAdapterItem(name, getDrawable(sender.imageId), sender.id, sender.status))
}
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)

@ -513,11 +513,11 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
}
//启用定位功能
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") switchEnableLocation: SwitchButton, layoutLocationSetting: LinearLayout, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, etMinInterval: EditText, etMinDistance: EditText) {
private fun switchEnableLocation(@SuppressLint("UseSwitchCompatOrMaterialCode") sbEnableLocation: SwitchButton, layoutLocationSetting: LinearLayout, rgAccuracy: RadioGroup, rgPowerRequirement: RadioGroup, etMinInterval: EditText, etMinDistance: EditText) {
//是否启用定位功能
switchEnableLocation.isChecked = SettingUtils.enableLocation
sbEnableLocation.isChecked = SettingUtils.enableLocation
layoutLocationSetting.visibility = if (SettingUtils.enableLocation) View.VISIBLE else View.GONE
switchEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
sbEnableLocation.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 {
@ -534,7 +534,7 @@ class SettingsFragment : BaseFragment<FragmentSettingsBinding?>(), View.OnClickL
XToastUtils.error(R.string.toast_denied)
}
SettingUtils.enableLocation = false
switchEnableLocation.isChecked = false
sbEnableLocation.isChecked = false
restartLocationService("STOP")
}
})

@ -155,7 +155,21 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
"com.idormy.sms.forwarder.fragment.action.NotificationFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sender,
R.drawable.auto_task_icon_notification,
),
PageInfo(
getString(R.string.task_cleaner),
"com.idormy.sms.forwarder.fragment.action.CleanerFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_cleaner
),
PageInfo(
getString(R.string.task_settings),
"com.idormy.sms.forwarder.fragment.action.SettingsFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_settings
),
PageInfo(
getString(R.string.task_frpc),
@ -172,11 +186,18 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
R.drawable.auto_task_icon_http_server
),
PageInfo(
getString(R.string.task_cleaner),
"com.idormy.sms.forwarder.fragment.action.CleanerFragment",
getString(R.string.task_rule),
"com.idormy.sms.forwarder.fragment.action.RuleFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_cleaner
R.drawable.auto_task_icon_rule
),
PageInfo(
getString(R.string.task_sender),
"com.idormy.sms.forwarder.fragment.action.SenderFragment",
"{\"\":\"\"}",
CoreAnim.slide,
R.drawable.auto_task_icon_sender
),
)
@ -469,7 +490,7 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
//必须开启定位服务,才能使用进入地点 或 离开地点 类型条件
if ((typeCondition == TASK_CONDITION_TO_ADDRESS || typeCondition == TASK_CONDITION_LEAVE_ADDRESS) && !App.LocationClient.isStarted()) {
MaterialDialog.Builder(requireContext())
.iconRes(R.drawable.auto_task_icon_location)
.iconRes(R.drawable.icon_location)
.title(R.string.enable_location)
.content(R.string.enable_location_dialog)
.cancelable(false)

@ -37,8 +37,6 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
@AutoWired(name = KEY_EVENT_DATA_ACTION)
var eventData: String? = null
private var description = "测试描述"
override fun initArgs() {
XRouter.getInstance().inject(this)
}
@ -139,7 +137,7 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, description)
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
setFragmentResult(TASK_ACTION_FRPC, intent)
popToBack()
@ -158,6 +156,7 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
private fun checkSetting(): FrpcSetting {
val startUid = binding!!.etStartUid.text.toString().trim()
val stopUid = binding!!.etStopUid.text.toString().trim()
val description: String
val action: String
val uids: String
if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) {

@ -5,7 +5,11 @@ import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.CompoundButton
import com.google.gson.Gson
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionHttpServerBinding
@ -15,6 +19,7 @@ import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER
import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus
@ -101,6 +106,34 @@ class HttpServerFragment : BaseFragment<FragmentTasksActionHttpServerBinding?>()
XToastUtils.error(it, 30000)
}
}
binding!!.sbApiSendSms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) checkSendSmsPermission()
}
binding!!.sbApiQuerySms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) checkReadSmsPermission()
}
binding!!.sbApiQueryCall.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) checkCallPermission()
}
binding!!.sbApiQueryContacts.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) checkContactsPermission()
}
binding!!.sbApiAddContacts.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) checkContactsPermission()
}
binding!!.sbApiLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked && !SettingUtils.enableLocation) {
XToastUtils.error(getString(R.string.api_location_permission_tips))
binding!!.sbApiLocation.isChecked = false
return@setOnCheckedChangeListener
}
}
}
@SingleClick
@ -195,4 +228,96 @@ class HttpServerFragment : BaseFragment<FragmentTasksActionHttpServerBinding?>()
return HttpServerSetting(description.toString(), action, enableApiClone, enableApiSmsSend, enableApiSmsQuery, enableApiCallQuery, enableApiContactQuery, enableApiContactAdd, enableApiWol, enableApiLocation, enableApiBatteryQuery)
}
//发送短信权限
private fun checkSendSmsPermission() {
XXPermissions.with(this)
// 发送短信
.permission(Permission.SEND_SMS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
}
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)
}
binding!!.sbApiSendSms.isChecked = false
}
})
}
//读取短信权限
private fun checkReadSmsPermission() {
XXPermissions.with(this)
// 接收短信
.permission(Permission.RECEIVE_SMS)
// 发送短信
.permission(Permission.SEND_SMS)
// 读取短信
.permission(Permission.READ_SMS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
}
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)
}
binding!!.sbApiQuerySms.isChecked = false
}
})
}
//电话权限
private fun checkCallPermission() {
XXPermissions.with(this)
// 读取电话状态
.permission(Permission.READ_PHONE_STATE)
// 读取手机号码
.permission(Permission.READ_PHONE_NUMBERS)
// 读取通话记录
.permission(Permission.READ_CALL_LOG).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
}
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)
}
binding!!.sbApiQueryCall.isChecked = false
}
})
}
//联系人权限
private fun checkContactsPermission() {
XXPermissions.with(this).permission(*Permission.Group.CONTACTS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
}
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)
}
binding!!.sbApiQueryContacts.isChecked = false
binding!!.sbApiAddContacts.isChecked = false
}
})
}
}

@ -315,7 +315,7 @@ class NotificationFragment : BaseFragment<FragmentTasksActionNotificationBinding
senderListAll = senderList as MutableList<Sender>
for (sender in senderList) {
val name = if (sender.name.length > 20) sender.name.substring(0, 19) else sender.name
senderSpinnerList.add(SenderAdapterItem(name, sender.imageId, sender.id, sender.status))
senderSpinnerList.add(SenderAdapterItem(name, getDrawable(sender.imageId), sender.id, sender.status))
}
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)

@ -0,0 +1,298 @@
package com.idormy.sms.forwarder.fragment.action
import android.annotation.SuppressLint
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.google.gson.Gson
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.adapter.spinner.RuleAdapterItem
import com.idormy.sms.forwarder.adapter.spinner.RuleSpinnerAdapter
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.database.AppDatabase
import com.idormy.sms.forwarder.database.entity.Rule
import com.idormy.sms.forwarder.databinding.FragmentTasksActionRuleBinding
import com.idormy.sms.forwarder.entity.action.RuleSetting
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER
import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
@Page(name = "Rule")
@Suppress("PrivatePropertyName")
class RuleFragment : BaseFragment<FragmentTasksActionRuleBinding?>(), View.OnClickListener {
private val TAG: String = RuleFragment::class.java.simpleName
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
//当前转发规则
private var ruleId = 0L
private var ruleListSelected: MutableList<Rule> = mutableListOf()
private var ruleItemMap = HashMap<Long, LinearLayout>(2)
//发送通道列表
private var ruleListAll: MutableList<Rule> = mutableListOf()
private val ruleSpinnerList = ArrayList<RuleAdapterItem>()
private lateinit var ruleSpinnerAdapter: RuleSpinnerAdapter<*>
@JvmField
@AutoWired(name = KEY_EVENT_DATA_ACTION)
var eventData: String? = null
override fun initArgs() {
XRouter.getInstance().inject(this)
}
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionRuleBinding {
return FragmentTasksActionRuleBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_rule)
return titleBar
}
/**
* 初始化控件
*/
override fun initViews() {
//测试按钮增加倒计时,避免重复点击
mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3)
mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener {
override fun onCountDown(time: Int) {
binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time)
}
override fun onFinished() {
binding!!.btnTest.text = getString(R.string.test)
}
})
Log.d(TAG, "initViews eventData:$eventData")
if (eventData != null) {
val settingVo = Gson().fromJson(eventData, RuleSetting::class.java)
binding!!.rgStatus.check(if (settingVo.status == "enable") R.id.rb_status_enable else R.id.rb_status_disable)
Log.d(TAG, settingVo.ruleList.toString())
settingVo.ruleList.forEach {
ruleId = it.id
ruleListSelected.add(it)
}
Log.d(TAG, "initViews settingVo:$settingVo")
}
//初始化发送通道下拉框
initRuleSpinner()
}
@SuppressLint("SetTextI18n")
override fun initListeners() {
binding!!.btnTest.setOnClickListener(this)
binding!!.btnDel.setOnClickListener(this)
binding!!.btnSave.setOnClickListener(this)
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).observe(this) {
mCountDownHelper?.finish()
if (it == "success") {
XToastUtils.success("测试通过", 30000)
} else {
XToastUtils.error(it, 30000)
}
}
}
@SingleClick
override fun onClick(v: View) {
try {
when (v.id) {
R.id.btn_test -> {
mCountDownHelper?.start()
Thread {
try {
val settingVo = checkSetting()
Log.d(TAG, settingVo.toString())
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post("success")
} catch (e: Exception) {
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(e.message.toString())
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}.start()
return
}
R.id.btn_del -> {
popToBack()
return
}
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
setFragmentResult(TASK_ACTION_SENDER, intent)
popToBack()
return
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString(), 30000)
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}
//初始化发送通道下拉框
@SuppressLint("SetTextI18n")
private fun initRuleSpinner() {
AppDatabase.getInstance(requireContext()).ruleDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver<List<Rule>> {
override fun onSubscribe(d: Disposable) {}
override fun onError(e: Throwable) {
e.printStackTrace()
Log.e(TAG, "initRuleSpinner error: ${e.message}")
}
override fun onSuccess(ruleList: List<Rule>) {
if (ruleList.isEmpty()) {
XToastUtils.error(R.string.add_rule_first)
return
}
ruleListAll = ruleList as MutableList<Rule>
for (rule in ruleList) {
val name = if (rule.name.length > 20) rule.name.substring(0, 19) else rule.name
ruleSpinnerList.add(RuleAdapterItem(name, getDrawable(rule.imageId), rule.id, rule.status))
}
ruleSpinnerAdapter = RuleSpinnerAdapter(ruleSpinnerList)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
binding!!.spRule.setAdapter(ruleSpinnerAdapter)
if (ruleListSelected.isNotEmpty()) {
for (rule in ruleListSelected) {
for (ruleItem in ruleSpinnerList) {
if (rule.id == ruleItem.id) {
addRuleItemLinearLayout(ruleItemMap, binding!!.layoutRules, ruleItem)
}
}
}
}
}
})
binding!!.spRule.setOnItemClickListener { _: AdapterView<*>, _: View, position: Int, _: Long ->
try {
val rule = ruleSpinnerAdapter.getItemSource(position) as RuleAdapterItem
ruleId = rule.id!!
if (ruleId > 0L) {
ruleListSelected.forEach {
if (ruleId == it.id) {
XToastUtils.warning(getString(R.string.rule_contains_tips))
return@setOnItemClickListener
}
}
ruleListAll.forEach {
if (ruleId == it.id) {
ruleListSelected.add(it)
addRuleItemLinearLayout(ruleItemMap, binding!!.layoutRules, rule)
}
}
if (STATUS_OFF == rule.status) {
XToastUtils.warning(getString(R.string.rule_disabled_tips))
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString())
}
}
}
/**
* 动态增删Rule
*
* @param ruleItemMap 管理item的map用于删除指定header
* @param layoutRules 需要挂载item的LinearLayout
* @param rule RuleAdapterItem
*/
@SuppressLint("SetTextI18n")
private fun addRuleItemLinearLayout(
ruleItemMap: MutableMap<Long, LinearLayout>, layoutRules: LinearLayout, rule: RuleAdapterItem
) {
val layoutRuleItem = View.inflate(requireContext(), R.layout.item_add_rule, null) as LinearLayout
val ivRemoveRule = layoutRuleItem.findViewById<ImageView>(R.id.iv_remove_rule)
val ivRuleImage = layoutRuleItem.findViewById<ImageView>(R.id.iv_rule_image)
val ivRuleStatus = layoutRuleItem.findViewById<ImageView>(R.id.iv_rule_status)
val tvRuleName = layoutRuleItem.findViewById<TextView>(R.id.tv_rule_name)
ivRuleImage.setImageDrawable(rule.icon)
ivRuleStatus.setImageDrawable(getDrawable(if (STATUS_OFF == rule.status) R.drawable.ic_stop else R.drawable.ic_start))
val ruleItemId = rule.id as Long
tvRuleName.text = "ID-$ruleItemId${rule.title}"
ivRemoveRule.tag = ruleItemId
ivRemoveRule.setOnClickListener { view2: View ->
val tagId = view2.tag as Long
layoutRules.removeView(ruleItemMap[tagId])
ruleItemMap.remove(tagId)
//ruleListSelected.removeIf { it.id == tagId }
for (it in ruleListSelected) {
if (it.id == tagId) {
ruleListSelected -= it
break
}
}
Log.d(TAG, ruleListSelected.count().toString())
Log.d(TAG, ruleListSelected.toString())
if (ruleListSelected.isEmpty()) ruleId = 0L
}
layoutRules.addView(layoutRuleItem)
ruleItemMap[ruleItemId] = layoutRuleItem
}
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): RuleSetting {
val description = StringBuilder()
val status: String
if (binding!!.rgStatus.checkedRadioButtonId == R.id.rb_status_enable) {
status = "enable"
description.append(getString(R.string.enable))
} else {
status = "disable"
description.append(getString(R.string.disable))
}
description.append(getString(R.string.menu_rules))
if (ruleListSelected.isNotEmpty()) {
description.append(", ").append(getString(R.string.specified_rule)).append(": ")
description.append(ruleListSelected.joinToString("/") { it.id.toString() })
}
return RuleSetting(description.toString(), status, ruleListSelected)
}
}

@ -0,0 +1,298 @@
package com.idormy.sms.forwarder.fragment.action
import android.annotation.SuppressLint
import android.content.Intent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.TextView
import com.google.gson.Gson
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.adapter.spinner.SenderAdapterItem
import com.idormy.sms.forwarder.adapter.spinner.SenderSpinnerAdapter
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.database.AppDatabase
import com.idormy.sms.forwarder.database.entity.Sender
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSenderBinding
import com.idormy.sms.forwarder.entity.action.SenderSetting
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.STATUS_OFF
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER
import com.idormy.sms.forwarder.utils.XToastUtils
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.resource.ResUtils.getDrawable
import io.reactivex.SingleObserver
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.Disposable
import io.reactivex.schedulers.Schedulers
@Page(name = "Sender")
@Suppress("PrivatePropertyName")
class SenderFragment : BaseFragment<FragmentTasksActionSenderBinding?>(), View.OnClickListener {
private val TAG: String = SenderFragment::class.java.simpleName
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
//当前发送通道
private var senderId = 0L
private var senderListSelected: MutableList<Sender> = mutableListOf()
private var senderItemMap = HashMap<Long, LinearLayout>(2)
//发送通道列表
private var senderListAll: MutableList<Sender> = mutableListOf()
private val senderSpinnerList = ArrayList<SenderAdapterItem>()
private lateinit var senderSpinnerAdapter: SenderSpinnerAdapter<*>
@JvmField
@AutoWired(name = KEY_EVENT_DATA_ACTION)
var eventData: String? = null
override fun initArgs() {
XRouter.getInstance().inject(this)
}
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionSenderBinding {
return FragmentTasksActionSenderBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_sender)
return titleBar
}
/**
* 初始化控件
*/
override fun initViews() {
//测试按钮增加倒计时,避免重复点击
mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3)
mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener {
override fun onCountDown(time: Int) {
binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time)
}
override fun onFinished() {
binding!!.btnTest.text = getString(R.string.test)
}
})
Log.d(TAG, "initViews eventData:$eventData")
if (eventData != null) {
val settingVo = Gson().fromJson(eventData, SenderSetting::class.java)
binding!!.rgStatus.check(if (settingVo.status == "enable") R.id.rb_status_enable else R.id.rb_status_disable)
Log.d(TAG, settingVo.senderList.toString())
settingVo.senderList.forEach {
senderId = it.id
senderListSelected.add(it)
}
Log.d(TAG, "initViews settingVo:$settingVo")
}
//初始化发送通道下拉框
initSenderSpinner()
}
@SuppressLint("SetTextI18n")
override fun initListeners() {
binding!!.btnTest.setOnClickListener(this)
binding!!.btnDel.setOnClickListener(this)
binding!!.btnSave.setOnClickListener(this)
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).observe(this) {
mCountDownHelper?.finish()
if (it == "success") {
XToastUtils.success("测试通过", 30000)
} else {
XToastUtils.error(it, 30000)
}
}
}
@SingleClick
override fun onClick(v: View) {
try {
when (v.id) {
R.id.btn_test -> {
mCountDownHelper?.start()
Thread {
try {
val settingVo = checkSetting()
Log.d(TAG, settingVo.toString())
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post("success")
} catch (e: Exception) {
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(e.message.toString())
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}.start()
return
}
R.id.btn_del -> {
popToBack()
return
}
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
setFragmentResult(TASK_ACTION_SENDER, intent)
popToBack()
return
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString(), 30000)
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}
//初始化发送通道下拉框
@SuppressLint("SetTextI18n")
private fun initSenderSpinner() {
AppDatabase.getInstance(requireContext()).senderDao().getAll().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(object : SingleObserver<List<Sender>> {
override fun onSubscribe(d: Disposable) {}
override fun onError(e: Throwable) {
e.printStackTrace()
Log.e(TAG, "initSenderSpinner error: ${e.message}")
}
override fun onSuccess(senderList: List<Sender>) {
if (senderList.isEmpty()) {
XToastUtils.error(R.string.add_sender_first)
return
}
senderListAll = senderList as MutableList<Sender>
for (sender in senderList) {
val name = if (sender.name.length > 20) sender.name.substring(0, 19) else sender.name
senderSpinnerList.add(SenderAdapterItem(name, getDrawable(sender.imageId), sender.id, sender.status))
}
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
binding!!.spSender.setAdapter(senderSpinnerAdapter)
if (senderListSelected.isNotEmpty()) {
for (sender in senderListSelected) {
for (senderItem in senderSpinnerList) {
if (sender.id == senderItem.id) {
addSenderItemLinearLayout(senderItemMap, binding!!.layoutSenders, senderItem)
}
}
}
}
}
})
binding!!.spSender.setOnItemClickListener { _: AdapterView<*>, _: View, position: Int, _: Long ->
try {
val sender = senderSpinnerAdapter.getItemSource(position) as SenderAdapterItem
senderId = sender.id!!
if (senderId > 0L) {
senderListSelected.forEach {
if (senderId == it.id) {
XToastUtils.warning(getString(R.string.sender_contains_tips))
return@setOnItemClickListener
}
}
senderListAll.forEach {
if (senderId == it.id) {
senderListSelected.add(it)
addSenderItemLinearLayout(senderItemMap, binding!!.layoutSenders, sender)
}
}
if (STATUS_OFF == sender.status) {
XToastUtils.warning(getString(R.string.sender_disabled_tips))
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString())
}
}
}
/**
* 动态增删Sender
*
* @param senderItemMap 管理item的map用于删除指定header
* @param layoutSenders 需要挂载item的LinearLayout
* @param sender SenderAdapterItem
*/
@SuppressLint("SetTextI18n")
private fun addSenderItemLinearLayout(
senderItemMap: MutableMap<Long, LinearLayout>, layoutSenders: LinearLayout, sender: SenderAdapterItem
) {
val layoutSenderItem = View.inflate(requireContext(), R.layout.item_add_sender, null) as LinearLayout
val ivRemoveSender = layoutSenderItem.findViewById<ImageView>(R.id.iv_remove_sender)
val ivSenderImage = layoutSenderItem.findViewById<ImageView>(R.id.iv_sender_image)
val ivSenderStatus = layoutSenderItem.findViewById<ImageView>(R.id.iv_sender_status)
val tvSenderName = layoutSenderItem.findViewById<TextView>(R.id.tv_sender_name)
ivSenderImage.setImageDrawable(sender.icon)
ivSenderStatus.setImageDrawable(getDrawable(if (STATUS_OFF == sender.status) R.drawable.ic_stop else R.drawable.ic_start))
val senderItemId = sender.id as Long
tvSenderName.text = "ID-$senderItemId${sender.title}"
ivRemoveSender.tag = senderItemId
ivRemoveSender.setOnClickListener { view2: View ->
val tagId = view2.tag as Long
layoutSenders.removeView(senderItemMap[tagId])
senderItemMap.remove(tagId)
//senderListSelected.removeIf { it.id == tagId }
for (it in senderListSelected) {
if (it.id == tagId) {
senderListSelected -= it
break
}
}
Log.d(TAG, senderListSelected.count().toString())
Log.d(TAG, senderListSelected.toString())
if (senderListSelected.isEmpty()) senderId = 0L
}
layoutSenders.addView(layoutSenderItem)
senderItemMap[senderItemId] = layoutSenderItem
}
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): SenderSetting {
val description = StringBuilder()
val status: String
if (binding!!.rgStatus.checkedRadioButtonId == R.id.rb_status_enable) {
status = "enable"
description.append(getString(R.string.enable))
} else {
status = "disable"
description.append(getString(R.string.disable))
}
description.append(getString(R.string.menu_senders))
if (senderListSelected.isNotEmpty()) {
description.append(", ").append(getString(R.string.specified_sender)).append(": ")
description.append(senderListSelected.joinToString("/") { it.name })
}
return SenderSetting(description.toString(), status, senderListSelected)
}
}

@ -0,0 +1,487 @@
package com.idormy.sms.forwarder.fragment.action
import android.annotation.SuppressLint
import android.content.Intent
import android.location.Criteria
import android.text.Editable
import android.text.TextUtils
import android.text.TextWatcher
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.CompoundButton
import androidx.lifecycle.Observer
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.google.gson.Gson
import com.hjq.permissions.OnPermissionCallback
import com.hjq.permissions.Permission
import com.hjq.permissions.XXPermissions
import com.idormy.sms.forwarder.App
import com.idormy.sms.forwarder.R
import com.idormy.sms.forwarder.adapter.spinner.AppListAdapterItem
import com.idormy.sms.forwarder.adapter.spinner.AppListSpinnerAdapter
import com.idormy.sms.forwarder.core.BaseFragment
import com.idormy.sms.forwarder.databinding.FragmentTasksActionSettingsBinding
import com.idormy.sms.forwarder.entity.action.SettingsSetting
import com.idormy.sms.forwarder.utils.CommonUtils
import com.idormy.sms.forwarder.utils.EVENT_LOAD_APP_LIST
import com.idormy.sms.forwarder.utils.KEY_BACK_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_BACK_DESCRIPTION_ACTION
import com.idormy.sms.forwarder.utils.KEY_EVENT_DATA_ACTION
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS
import com.idormy.sms.forwarder.utils.XToastUtils
import com.idormy.sms.forwarder.workers.LoadAppListWorker
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xaop.annotation.SingleClick
import com.xuexiang.xpage.annotation.Page
import com.xuexiang.xrouter.annotation.AutoWired
import com.xuexiang.xrouter.launcher.XRouter
import com.xuexiang.xui.utils.CountDownButtonHelper
import com.xuexiang.xui.widget.actionbar.TitleBar
import com.xuexiang.xutil.XUtil
@Page(name = "Settings")
@Suppress("PrivatePropertyName")
class SettingsFragment : BaseFragment<FragmentTasksActionSettingsBinding?>(), View.OnClickListener {
private val TAG: String = SettingsFragment::class.java.simpleName
private var titleBar: TitleBar? = null
private var mCountDownHelper: CountDownButtonHelper? = null
//已安装App信息列表
private val appListSpinnerList = ArrayList<AppListAdapterItem>()
private lateinit var appListSpinnerAdapter: AppListSpinnerAdapter<*>
private val appListObserver = Observer { it: String ->
Log.d(TAG, "EVENT_LOAD_APP_LIST: $it")
initAppSpinner()
}
@JvmField
@AutoWired(name = KEY_EVENT_DATA_ACTION)
var eventData: String? = null
override fun initArgs() {
XRouter.getInstance().inject(this)
}
override fun viewBindingInflate(
inflater: LayoutInflater,
container: ViewGroup,
): FragmentTasksActionSettingsBinding {
return FragmentTasksActionSettingsBinding.inflate(inflater, container, false)
}
override fun initTitle(): TitleBar? {
titleBar = super.initTitle()!!.setImmersive(false).setTitle(R.string.task_settings)
return titleBar
}
/**
* 初始化控件
*/
override fun initViews() {
//测试按钮增加倒计时,避免重复点击
mCountDownHelper = CountDownButtonHelper(binding!!.btnTest, 3)
mCountDownHelper!!.setOnCountDownListener(object : CountDownButtonHelper.OnCountDownListener {
override fun onCountDown(time: Int) {
binding!!.btnTest.text = String.format(getString(R.string.seconds_n), time)
}
override fun onFinished() {
binding!!.btnTest.text = getString(R.string.test)
}
})
Log.d(TAG, "initViews eventData:$eventData")
var settingVo = SettingsSetting(getString(R.string.task_settings_tips))
if (eventData != null) {
settingVo = Gson().fromJson(eventData, SettingsSetting::class.java)
Log.d(TAG, "initViews settingVo:$settingVo")
}
binding!!.sbEnableSms.isChecked = settingVo.enableSms
binding!!.sbEnablePhone.isChecked = settingVo.enablePhone
binding!!.scbCallType1.isChecked = settingVo.enableCallType1
binding!!.scbCallType2.isChecked = settingVo.enableCallType2
binding!!.scbCallType3.isChecked = settingVo.enableCallType3
binding!!.scbCallType4.isChecked = settingVo.enableCallType4
binding!!.scbCallType5.isChecked = settingVo.enableCallType5
binding!!.scbCallType6.isChecked = settingVo.enableCallType6
binding!!.sbEnableAppNotify.isChecked = settingVo.enableAppNotify
binding!!.scbCancelAppNotify.isChecked = settingVo.enableCancelAppNotify
binding!!.scbNotUserPresent.isChecked = settingVo.enableNotUserPresent
binding!!.sbEnableLocation.isChecked = settingVo.enableLocation
binding!!.rgAccuracy.check(
when (settingVo.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
}
)
binding!!.rgPowerRequirement.check(
when (settingVo.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
}
)
binding!!.etMinInterval.setText((settingVo.locationMinInterval / 1000).toString())
binding!!.etMinDistance.setText(settingVo.locationMinDistance.toString())
binding!!.sbEnableSmsCommand.isChecked = settingVo.enableSmsCommand
binding!!.etSafePhone.setText(settingVo.smsCommandSafePhone)
binding!!.sbEnableLoadAppList.isChecked = settingVo.enableLoadAppList
binding!!.scbLoadUserApp.isChecked = settingVo.enableLoadUserAppList
binding!!.scbLoadSystemApp.isChecked = settingVo.enableLoadSystemAppList
binding!!.etAppList.setText(settingVo.cancelExtraAppNotify)
binding!!.xsbDuplicateMessagesLimits.setDefaultValue(settingVo.duplicateMessagesLimits)
}
@SuppressLint("SetTextI18n")
override fun initListeners() {
binding!!.btnTest.setOnClickListener(this)
binding!!.btnDel.setOnClickListener(this)
binding!!.btnSave.setOnClickListener(this)
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).observe(this) {
mCountDownHelper?.finish()
if (it == "success") {
XToastUtils.success("测试通过", 30000)
} else {
XToastUtils.error(it, 30000)
}
}
//监听已安装App信息列表加载完成事件
LiveEventBus.get(EVENT_LOAD_APP_LIST, String::class.java).observeStickyForever(appListObserver)
binding!!.sbEnableSms.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) {
//检查权限是否获取
XXPermissions.with(this)
// 接收 WAP 推送消息
.permission(Permission.RECEIVE_WAP_PUSH)
// 接收彩信
.permission(Permission.RECEIVE_MMS)
// 接收短信
.permission(Permission.RECEIVE_SMS)
// 发送短信
//.permission(Permission.SEND_SMS)
// 读取短信
.permission(Permission.READ_SMS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
if (all) {
XToastUtils.info(R.string.toast_granted_all)
} else {
XToastUtils.info(R.string.toast_granted_part)
}
}
override fun onDenied(permissions: List<String>, never: Boolean) {
if (never) {
XToastUtils.info(R.string.toast_denied_never)
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(requireContext(), permissions)
} else {
XToastUtils.info(R.string.toast_denied)
}
binding!!.sbEnableSms.isChecked = false
}
})
}
}
binding!!.sbEnablePhone.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) {
//检查权限是否获取
XXPermissions.with(this)
// 读取电话状态
.permission(Permission.READ_PHONE_STATE)
// 读取手机号码
.permission(Permission.READ_PHONE_NUMBERS)
// 读取通话记录
.permission(Permission.READ_CALL_LOG)
// 读取联系人
.permission(Permission.READ_CONTACTS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
if (all) {
XToastUtils.info(R.string.toast_granted_all)
} else {
XToastUtils.info(R.string.toast_granted_part)
}
}
override fun onDenied(permissions: List<String>, never: Boolean) {
if (never) {
XToastUtils.info(R.string.toast_denied_never)
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(requireContext(), permissions)
} else {
XToastUtils.info(R.string.toast_denied)
}
binding!!.sbEnablePhone.isChecked = false
}
})
}
}
binding!!.sbEnableAppNotify.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) {
//检查权限是否获取
XXPermissions.with(this).permission(Permission.BIND_NOTIFICATION_LISTENER_SERVICE).request(OnPermissionCallback { _, allGranted ->
if (!allGranted) {
binding!!.sbEnableAppNotify.isChecked = false
XToastUtils.error(R.string.tips_notification_listener)
return@OnPermissionCallback
}
binding!!.sbEnableAppNotify.isChecked = true
CommonUtils.toggleNotificationListenerService(requireContext())
})
}
}
binding!!.sbEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
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) {
}
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)
}
binding!!.sbEnableLocation.isChecked = false
}
})
}
}
//设置位置更新最小时间间隔(单位:毫秒); 默认间隔10000毫秒最小间隔1000毫秒
binding!!.etMinInterval.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
val changedText = s.toString()
if (changedText.isEmpty() || changedText == "0") {
binding!!.etMinInterval.setText("1")
binding!!.etMinInterval.setSelection(binding!!.etMinInterval.text.length) // 将光标移至文本末尾
return
}
}
})
//设置位置更新最小距离单位默认距离0米
binding!!.etMinDistance.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence, start: Int, count: Int, after: Int) {}
override fun onTextChanged(s: CharSequence, start: Int, before: Int, count: Int) {}
override fun afterTextChanged(s: Editable) {
val changedText = s.toString()
if (changedText.isEmpty()) {
binding!!.etMinDistance.setText("0")
binding!!.etMinDistance.setSelection(binding!!.etMinInterval.text.length) // 将光标移至文本末尾
return
}
}
})
binding!!.sbEnableSmsCommand.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
if (isChecked) {
//检查权限是否获取
XXPermissions.with(this)
// 系统设置
.permission(Permission.WRITE_SETTINGS)
// 接收短信
.permission(Permission.RECEIVE_SMS)
// 发送短信
.permission(Permission.SEND_SMS)
// 读取短信
.permission(Permission.READ_SMS).request(object : OnPermissionCallback {
override fun onGranted(permissions: List<String>, all: Boolean) {
if (all) {
XToastUtils.info(R.string.toast_granted_all)
} else {
XToastUtils.info(R.string.toast_granted_part)
}
}
override fun onDenied(permissions: List<String>, never: Boolean) {
if (never) {
XToastUtils.info(R.string.toast_denied_never)
// 如果是被永久拒绝就跳转到应用权限系统设置页面
XXPermissions.startPermissionActivity(requireContext(), permissions)
} else {
XToastUtils.info(R.string.toast_denied)
}
binding!!.sbEnableSmsCommand.isChecked = false
}
})
}
}
}
@SingleClick
override fun onClick(v: View) {
try {
when (v.id) {
R.id.btn_test -> {
mCountDownHelper?.start()
Thread {
try {
val settingVo = checkSetting()
Log.d(TAG, settingVo.toString())
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post("success")
} catch (e: Exception) {
LiveEventBus.get(KEY_TEST_ACTION, String::class.java).post(e.message.toString())
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}.start()
return
}
R.id.btn_del -> {
popToBack()
return
}
R.id.btn_save -> {
val settingVo = checkSetting()
val intent = Intent()
intent.putExtra(KEY_BACK_DESCRIPTION_ACTION, settingVo.description)
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
setFragmentResult(TASK_ACTION_SETTINGS, intent)
popToBack()
return
}
}
} catch (e: Exception) {
XToastUtils.error(e.message.toString(), 30000)
e.printStackTrace()
Log.e(TAG, "onClick error: ${e.message}")
}
}
//初始化APP下拉列表
private fun initAppSpinner() {
//未开启异步获取已安装App信息开关时不显示已安装APP下拉框
if (!SettingUtils.enableLoadAppList) return
if (App.UserAppList.isEmpty() && App.SystemAppList.isEmpty()) {
//XToastUtils.info(getString(R.string.loading_app_list))
val request = OneTimeWorkRequestBuilder<LoadAppListWorker>().build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request)
return
}
appListSpinnerList.clear()
if (SettingUtils.enableLoadUserAppList) {
for (appInfo in App.UserAppList) {
if (TextUtils.isEmpty(appInfo.packageName)) continue
appListSpinnerList.add(AppListAdapterItem(appInfo.name, appInfo.icon, appInfo.packageName))
}
}
if (SettingUtils.enableLoadSystemAppList) {
for (appInfo in App.SystemAppList) {
if (TextUtils.isEmpty(appInfo.packageName)) continue
appListSpinnerList.add(AppListAdapterItem(appInfo.name, appInfo.icon, appInfo.packageName))
}
}
//列表为空也不显示下拉框
if (appListSpinnerList.isEmpty()) return
appListSpinnerAdapter = AppListSpinnerAdapter(appListSpinnerList).setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
binding!!.spApp.setAdapter(appListSpinnerAdapter)
binding!!.spApp.setOnItemClickListener { _: AdapterView<*>, _: View, position: Int, _: Long ->
try {
val appInfo = appListSpinnerAdapter.getItemSource(position) as AppListAdapterItem
CommonUtils.insertOrReplaceText2Cursor(binding!!.etAppList, appInfo.packageName.toString() + "\n")
} catch (e: Exception) {
XToastUtils.error(e.message.toString())
}
}
binding!!.layoutSpApp.visibility = View.VISIBLE
}
//检查设置
@SuppressLint("SetTextI18n")
private fun checkSetting(): SettingsSetting {
val enableList = mutableListOf<String>()
val disableList = mutableListOf<String>()
val enableSms = binding!!.sbEnableSms.isChecked
if (enableSms) enableList.add(getString(R.string.forward_sms)) else disableList.add(getString(R.string.forward_sms))
val enablePhone = binding!!.sbEnablePhone.isChecked
if (enablePhone) enableList.add(getString(R.string.forward_missed_calls)) else disableList.add(getString(R.string.forward_missed_calls))
val enableCallType1 = binding!!.scbCallType1.isChecked
val enableCallType2 = binding!!.scbCallType2.isChecked
val enableCallType3 = binding!!.scbCallType3.isChecked
val enableCallType4 = binding!!.scbCallType4.isChecked
val enableCallType5 = binding!!.scbCallType5.isChecked
val enableCallType6 = binding!!.scbCallType6.isChecked
if (enablePhone && !enableCallType1 && !enableCallType2 && !enableCallType3 && !enableCallType4 && !enableCallType5 && !enableCallType6) {
throw Exception(getString(R.string.enable_phone_fw_tips))
}
val enableAppNotify = binding!!.sbEnableAppNotify.isChecked
if (enableAppNotify) enableList.add(getString(R.string.forward_app_notify)) else disableList.add(getString(R.string.forward_app_notify))
val enableCancelAppNotify = binding!!.scbCancelAppNotify.isChecked
val enableNotUserPresent = binding!!.scbNotUserPresent.isChecked
val enableLocation = binding!!.sbEnableLocation.isChecked
if (enableLocation) enableList.add(getString(R.string.enable_location)) else disableList.add(getString(R.string.enable_location))
val locationAccuracy = when (binding!!.rgAccuracy.checkedRadioButtonId) {
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
}
val locationPowerRequirement = when (binding!!.rgPowerRequirement.checkedRadioButtonId) {
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
}
val locationMinInterval = (binding!!.etMinInterval.text.toString().toLongOrNull() ?: 1) * 1000
val locationMinDistance = binding!!.etMinDistance.text.toString().toIntOrNull() ?: 0
val enableSmsCommand = binding!!.sbEnableSmsCommand.isChecked
if (enableSmsCommand) enableList.add(getString(R.string.sms_command)) else disableList.add(getString(R.string.sms_command))
val smsCommandSafePhone = binding!!.etSafePhone.text.toString()
val enableLoadAppList = binding!!.sbEnableLoadAppList.isChecked
if (enableLoadAppList) enableList.add(getString(R.string.load_app_list)) else disableList.add(getString(R.string.load_app_list))
val enableLoadUserAppList = binding!!.scbLoadUserApp.isChecked
val enableLoadSystemAppList = binding!!.scbLoadSystemApp.isChecked
val cancelExtraAppNotify = binding!!.etAppList.text.toString()
if (cancelExtraAppNotify.isNotEmpty()) enableList.add(getString(R.string.extra_app)) else disableList.add(getString(R.string.extra_app))
val duplicateMessagesLimits = binding!!.xsbDuplicateMessagesLimits.selectedNumber
if (duplicateMessagesLimits > 0) enableList.add(getString(R.string.filtering_duplicate_messages)) else disableList.add(getString(R.string.filtering_duplicate_messages))
val description = StringBuilder()
if (enableList.isNotEmpty()) {
description.append(" ").append(getString(R.string.enable_function)).append(": ").append(enableList.joinToString("/"))
}
if (disableList.isNotEmpty()) {
description.append(" ").append(getString(R.string.disable_function)).append(": ").append(disableList.joinToString("/"))
}
return SettingsSetting(description.toString().trim(), enableSms, enablePhone, enableCallType1, enableCallType2, enableCallType3, enableCallType4, enableCallType5, enableCallType6, enableAppNotify, enableCancelAppNotify, enableNotUserPresent, enableLocation, locationAccuracy, locationPowerRequirement, locationMinInterval, locationMinDistance, enableSmsCommand, smsCommandSafePhone, enableLoadAppList, enableLoadUserAppList, enableLoadSystemAppList, cancelExtraAppNotify, duplicateMessagesLimits)
}
}

@ -172,7 +172,7 @@ class LeaveAddressFragment : BaseFragment<FragmentTasksConditionLeaveAddressBind
when (v.id) {
R.id.btn_current_coordinates -> {
if (!App.LocationClient.isStarted()) {
MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? ->
MaterialDialog.Builder(requireContext()).iconRes(R.drawable.icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? ->
SettingUtils.enableLocation = true
val serviceIntent = Intent(requireContext(), LocationService::class.java)
serviceIntent.action = "START"

@ -172,7 +172,7 @@ class ToAddressFragment : BaseFragment<FragmentTasksConditionToAddressBinding?>(
when (v.id) {
R.id.btn_current_coordinates -> {
if (!App.LocationClient.isStarted()) {
MaterialDialog.Builder(requireContext()).iconRes(R.drawable.auto_task_icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? ->
MaterialDialog.Builder(requireContext()).iconRes(R.drawable.icon_location).title(R.string.enable_location).content(R.string.enable_location_dialog).cancelable(false).positiveText(R.string.lab_yes).negativeText(R.string.lab_no).onPositive { _: MaterialDialog?, _: DialogAction? ->
SettingUtils.enableLocation = true
val serviceIntent = Intent(requireContext(), LocationService::class.java)
serviceIntent.action = "START"

@ -2,15 +2,13 @@ package com.idormy.sms.forwarder.utils
object Worker {
const val sendMsgInfo = "send_msg_info"
//const val sendLogId = "send_log_id"
//const val sendSbnId = "send_sbn_id"
const val updateLogs = "update_logs"
//const val ruleId = "rule_id"
const val rule = "rule"
const val senderIndex = "sender_index"
const val msgId = "msg_id"
//const val ruleId = "rule_id"
//const val sendLogId = "send_log_id"
//const val sendSbnId = "send_sbn_id"
}
object TaskWorker {
@ -237,9 +235,12 @@ const val TASK_CONDITION_LOCK_SCREEN = 1007
//注意TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION不可改变
const val TASK_ACTION_SENDSMS = 2000
const val TASK_ACTION_NOTIFICATION = 2001
const val TASK_ACTION_FRPC = 2002
const val TASK_ACTION_HTTPSERVER = 2003
const val TASK_ACTION_CLEANER = 2004
const val TASK_ACTION_CLEANER = 2002
const val TASK_ACTION_SETTINGS = 2003
const val TASK_ACTION_HTTPSERVER = 2004
const val TASK_ACTION_FRPC = 2005
const val TASK_ACTION_RULE = 2006
const val TASK_ACTION_SENDER = 2007
const val SP_BATTERY_INFO = "battery_info"
const val SP_BATTERY_STATUS = "battery_status"

@ -22,7 +22,10 @@ import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER
import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION
import com.idormy.sms.forwarder.utils.TASK_ACTION_RULE
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDER
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS
import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS
import com.idormy.sms.forwarder.utils.TASK_CONDITION_BATTERY
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON
@ -51,10 +54,13 @@ class TaskUtils private constructor() {
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge
TASK_CONDITION_LOCK_SCREEN -> R.drawable.auto_task_icon_lock_screen
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification
TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner
TASK_ACTION_SETTINGS -> R.drawable.auto_task_icon_settings
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule
TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender
else -> R.drawable.auto_task_icon_custom_time
}
}
@ -71,10 +77,13 @@ class TaskUtils private constructor() {
TASK_CONDITION_CHARGE -> R.drawable.auto_task_icon_charge_grey
TASK_CONDITION_LOCK_SCREEN -> R.drawable.auto_task_icon_lock_screen_grey
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms_grey
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender_grey
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification_grey
TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner_grey
TASK_ACTION_SETTINGS -> R.drawable.auto_task_icon_settings_grey
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey
TASK_ACTION_RULE -> R.drawable.auto_task_icon_rule_grey
TASK_ACTION_SENDER -> R.drawable.auto_task_icon_sender_grey
else -> R.drawable.auto_task_icon_custom_time_grey
}
}

@ -6,6 +6,8 @@ import android.content.Intent
import android.content.pm.PackageManager
import androidx.core.app.ActivityCompat
import androidx.work.CoroutineWorker
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import androidx.work.WorkerParameters
import com.google.gson.Gson
import com.idormy.sms.forwarder.App
@ -18,8 +20,10 @@ import com.idormy.sms.forwarder.entity.TaskSetting
import com.idormy.sms.forwarder.entity.action.CleanerSetting
import com.idormy.sms.forwarder.entity.action.FrpcSetting
import com.idormy.sms.forwarder.entity.action.HttpServerSetting
import com.idormy.sms.forwarder.entity.action.SettingsSetting
import com.idormy.sms.forwarder.entity.action.SmsSetting
import com.idormy.sms.forwarder.service.HttpServerService
import com.idormy.sms.forwarder.service.LocationService
import com.idormy.sms.forwarder.utils.CacheUtils
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
import com.idormy.sms.forwarder.utils.EVENT_TOAST_INFO
@ -30,14 +34,17 @@ import com.idormy.sms.forwarder.utils.HttpServerUtils
import com.idormy.sms.forwarder.utils.Log
import com.idormy.sms.forwarder.utils.PhoneUtils
import com.idormy.sms.forwarder.utils.SendUtils
import com.idormy.sms.forwarder.utils.SettingUtils
import com.idormy.sms.forwarder.utils.TASK_ACTION_CLEANER
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER
import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION
import com.idormy.sms.forwarder.utils.TASK_ACTION_SENDSMS
import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS
import com.idormy.sms.forwarder.utils.TaskWorker
import com.jeremyliao.liveeventbus.LiveEventBus
import com.xuexiang.xrouter.utils.TextUtils
import com.xuexiang.xutil.XUtil
import com.xuexiang.xutil.file.FileUtils
import com.xuexiang.xutil.resource.ResUtils.getString
import frpclib.Frpclib
@ -112,6 +119,73 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
writeLog("send notification success", "SUCCESS")
}
TASK_ACTION_CLEANER -> {
val cleanerSetting = Gson().fromJson(action.setting, CleanerSetting::class.java)
if (cleanerSetting == null) {
writeLog("cleanerSetting is null")
continue
}
if (cleanerSetting.days > 0) {
val cal = Calendar.getInstance()
cal.add(Calendar.DAY_OF_MONTH, 0 - cleanerSetting.days)
Core.msg.deleteTimeAgo(cal.timeInMillis)
} else {
Core.msg.deleteAll()
}
//清理缓存
HistoryUtils.clearPreference()
CacheUtils.clearAllCache(App.context)
successNum++
writeLog("cleaner success", "SUCCESS")
}
TASK_ACTION_SETTINGS -> {
val settingsSetting = Gson().fromJson(action.setting, SettingsSetting::class.java)
if (settingsSetting == null) {
writeLog("settingsSetting is null")
continue
}
SettingUtils.enableSms = settingsSetting.enableSms
SettingUtils.enablePhone = settingsSetting.enablePhone
SettingUtils.enableCallType1 = settingsSetting.enableCallType1
SettingUtils.enableCallType2 = settingsSetting.enableCallType2
SettingUtils.enableCallType3 = settingsSetting.enableCallType3
SettingUtils.enableCallType4 = settingsSetting.enableCallType4
SettingUtils.enableCallType5 = settingsSetting.enableCallType5
SettingUtils.enableCallType6 = settingsSetting.enableCallType6
SettingUtils.enableAppNotify = settingsSetting.enableAppNotify
SettingUtils.enableCancelAppNotify = settingsSetting.enableCancelAppNotify
SettingUtils.enableNotUserPresent = settingsSetting.enableNotUserPresent
SettingUtils.enableLocation = settingsSetting.enableLocation
SettingUtils.locationAccuracy = settingsSetting.locationAccuracy
SettingUtils.locationPowerRequirement = settingsSetting.locationPowerRequirement
SettingUtils.locationMinInterval = settingsSetting.locationMinInterval
SettingUtils.locationMinDistance = settingsSetting.locationMinDistance
SettingUtils.enableSmsCommand = settingsSetting.enableSmsCommand
SettingUtils.smsCommandSafePhone = settingsSetting.smsCommandSafePhone
SettingUtils.enableLoadAppList = settingsSetting.enableLoadAppList
SettingUtils.enableLoadUserAppList = settingsSetting.enableLoadUserAppList
SettingUtils.enableLoadSystemAppList = settingsSetting.enableLoadSystemAppList
SettingUtils.cancelExtraAppNotify = settingsSetting.cancelExtraAppNotify
SettingUtils.duplicateMessagesLimits = settingsSetting.duplicateMessagesLimits
if (settingsSetting.enableLocation) {
val serviceIntent = Intent(App.context, LocationService::class.java)
serviceIntent.action = "RESTART"
App.context.startService(serviceIntent)
}
if (settingsSetting.enableLoadAppList) {
val request = OneTimeWorkRequestBuilder<LoadAppListWorker>().build()
WorkManager.getInstance(XUtil.getContext()).enqueue(request)
}
successNum++
writeLog("send settings success", "SUCCESS")
}
TASK_ACTION_FRPC -> {
if (!FileUtils.isFileExists(App.context.filesDir?.absolutePath + "/libs/libgojni.so")) {
writeLog("还未下载Frpc库")
@ -182,27 +256,6 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
writeLog("httpServer success", "SUCCESS")
}
TASK_ACTION_CLEANER -> {
val cleanerSetting = Gson().fromJson(action.setting, CleanerSetting::class.java)
if (cleanerSetting == null) {
writeLog("cleanerSetting is null")
continue
}
if (cleanerSetting.days > 0) {
val cal = Calendar.getInstance()
cal.add(Calendar.DAY_OF_MONTH, 0 - cleanerSetting.days)
Core.msg.deleteTimeAgo(cal.timeInMillis)
} else {
Core.msg.deleteAll()
}
//清理缓存
HistoryUtils.clearPreference()
CacheUtils.clearAllCache(App.context)
successNum++
writeLog("cleaner success", "SUCCESS")
}
else -> {
writeLog("action.type is ${action.type}")
}

Before

Width:  |  Height:  |  Size: 414 B

After

Width:  |  Height:  |  Size: 414 B

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 2.9 KiB

After

Width:  |  Height:  |  Size: 2.9 KiB

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Before

Width:  |  Height:  |  Size: 2.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_64" android:width="@dimen/view_dimen_64" android:viewportWidth="64.0" android:viewportHeight="64.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/base_color_wb_bw" android:pathData="M8.7787,19.4678C11.885,14.5468 16.6222,10.7168 22.2573,8.7049C20.9458,6.7865 18.8447,5.4137 16.3947,5C12.3575,7.0142 8.8211,9.8173 6.0059,13.1987C6.0054,13.2166 6.0042,13.2344 6.0031,13.252L6.0031,13.2521C6.0015,13.2755 6,13.2989 6,13.3227C6,15.746 7.0712,17.9259 8.7787,19.4678ZM7.2998,34.848C7.2998,21.2303 18.3579,10.1911 31.9992,10.1911C45.6405,10.1911 56.6998,21.2303 56.6998,34.848C56.6998,48.4644 45.6405,59.5061 31.9992,59.5061C18.3579,59.5061 7.2998,48.4644 7.2998,34.848ZM33.2996,25.5038V33.549H39.583C41.1388,33.549 42.3996,34.7124 42.3996,36.1446C42.3996,37.5793 41.1388,38.7401 39.583,38.7401H30.9161C30.8828,38.7401 30.8495,38.7396 30.8164,38.7385C30.7779,38.74 30.7391,38.7408 30.7002,38.7408C29.2643,38.7408 28.0996,37.6938 28.0996,36.4046V36.1446V25.5038C28.0996,24.2135 29.2643,23.1676 30.7002,23.1676C32.1348,23.1676 33.2996,24.2135 33.2996,25.5038ZM58,13.3238C58,15.7472 56.9288,17.927 55.2213,19.4689C52.115,14.5479 47.3778,10.7179 41.7427,8.706C43.0542,6.7865 45.1565,5.4137 47.6088,5C51.6448,7.0142 55.1789,9.8162 57.9941,13.1942C57.9946,13.2132 57.9958,13.2317 57.9969,13.2501C57.9985,13.2745 58,13.2988 58,13.3238Z" android:fillAlpha="@integer/svg_fill_alpha_w03_d04" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_64" android:width="@dimen/view_dimen_64" android:viewportWidth="64.0" android:viewportHeight="64.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/base_color_wb_bw" android:pathData="M24.8577,56.1381C24.8577,55.5706 25.314,55.1105 25.8769,55.1105H38.6693C39.2322,55.1105 39.6885,55.5706 39.6885,56.1381C39.6885,58.9656 36.2949,61 32.2731,61C28.2512,61 24.8577,58.9656 24.8577,56.1381ZM7.9834,48.2465C8.0157,47.8727 8.1322,47.4954 8.3463,47.1388L15.6534,34.9708V22.121C15.6534,12.6593 23.3302,5 32.7867,5C37.9516,5 42.236,7.1894 45.0842,10.8424L49.3591,6.5325C50.4275,5.4555 52.1596,5.4555 53.228,6.5325C54.2964,7.6096 54.2964,9.356 53.228,10.4331L10.6702,53.3388C9.6018,54.4159 7.8696,54.4159 6.8013,53.3388C5.7329,52.2617 5.7329,50.5154 6.8013,49.4383L7.9834,48.2465ZM48.8869,22.3707C48.8908,22.5484 48.8927,22.727 48.8927,22.9065V34.8721L57.3806,46.9872C58.5727,48.6888 57.3657,51.0381 55.2994,51.0381H20.452L48.8869,22.3707Z" android:fillAlpha="@integer/svg_fill_alpha_w03_d04" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_64" android:width="@dimen/view_dimen_64" android:viewportWidth="64.0" android:viewportHeight="64.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/base_color_wb_bw" android:pathData="M47.7347,16.5837L34.8406,49.5422H6.8687C5.2343,49.5422 4.3904,47.5891 5.5106,46.3989L10.1446,41.4753C10.1814,41.431 10.2199,41.3875 10.2599,41.3449L16.1902,35.0399V18.8528C16.1902,10.0976 23.2878,3 32.0431,3C36.0817,3 39.7676,4.5102 42.5668,6.9967C45.3921,9.8214 47.1458,12.4748 47.7347,16.5837ZM25.005,53.2724C24.3142,53.2724 23.8118,54.0174 24.068,54.7037C25.3908,58.2356 28.6166,60.7326 32.3926,60.7326C36.1686,60.7326 39.3953,58.2356 40.7171,54.7037C40.9743,54.0174 40.4709,53.2724 39.7791,53.2724H25.005ZM57.917,49.5422H34.8406L47.7347,16.5837C47.8409,17.3248 47.8959,18.0824 47.8959,18.8528V34.3085L59.2751,46.3989C60.3953,47.5891 59.5514,49.5422 57.917,49.5422Z" android:fillAlpha="@integer/svg_fill_alpha_w03_d04" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_64" android:width="@dimen/view_dimen_64" android:viewportWidth="64.0" android:viewportHeight="64.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/base_color_wb_bw" android:pathData="M15,57C16.6642,57 18.2229,56.5483 19.5602,55.7608C20.0596,55.5887 20.5199,55.2825 20.883,54.8473L20.996,54.7119C21.0003,54.708 21.0047,54.7042 21.009,54.7003L22.6726,52.7069C22.6756,52.702 22.6786,52.697 22.6817,52.6921L47.4611,23H47.4643L56,12.7721V12.7682L59.7564,8.267C60.818,6.9949 60.6474,5.1031 59.3753,4.0415C58.1033,2.9799 56.2115,3.1505 55.1499,4.4226L53.5645,6.3223C52.7467,6 51.6535,6 49.64,6H24.36C22.1575,6 21.0563,6 20.2121,6.4218C19.4372,6.809 18.809,7.4372 18.4218,8.2121C18.0974,8.8613 18.0225,9.6626 18.0052,11H18V12.36V16.64V39.5121C17.0617,39.1805 16.0519,39 15,39C10.0294,39 6,43.0295 6,48C6,52.9706 10.0294,57 15,57ZM56,22.1364L50,29.3259V39.5121C49.0617,39.1805 48.0519,39 47,39C42.0294,39 38,43.0295 38,48C38,52.9706 42.0294,57 47,57C51.9706,57 56,52.9706 56,48V48V22.1364ZM39.6462,23L24,41.7481V22.9999L24.36,23H39.6462Z" android:fillAlpha="@integer/svg_fill_alpha_w03_d04" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="@dimen/view_dimen_64" android:width="@dimen/view_dimen_64" android:viewportWidth="64.0" android:viewportHeight="64.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/base_color_wb_bw" android:pathData="M17.4218,8.2121C17.0974,8.8613 17.0225,9.6626 17.0052,11H17V12.36V16.64V39.5121C16.0617,39.1805 15.0519,39 14,39C9.0294,39 5,43.0294 5,48C5,52.9706 9.0294,57 14,57C18.9706,57 23,52.9706 23,48V22.9999L23.36,23H48.64L49,22.9999V39.5121C48.0617,39.1805 47.0519,39 46,39C41.0294,39 37,43.0294 37,48C37,52.9706 41.0294,57 46,57C50.9706,57 55,52.9706 55,48V16.64V13V12.36C55,10.1575 55,9.0563 54.5782,8.2121C54.191,7.4372 53.5628,6.809 52.7879,6.4218C51.9437,6 50.8425,6 48.64,6H23.36C21.1575,6 20.0563,6 19.2121,6.4218C18.4372,6.809 17.809,7.4372 17.4218,8.2121Z" android:fillAlpha="@integer/svg_fill_alpha_w03_d04" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="#ffffffff" android:pathData="M15.101,6.158C16.635,5.272 18.438,5.274 19.916,6.004C19.709,7.552 18.811,8.991 17.353,9.833C16.001,10.614 14.444,10.72 13.073,10.257L13.389,15.319C13.401,15.51 13.56,15.659 13.751,15.659H16.973C18.112,15.659 19.035,16.583 19.035,17.722C19.035,18.861 18.112,19.784 16.973,19.784H8.348C7.209,19.784 6.285,18.861 6.285,17.722C6.285,16.583 7.209,15.659 8.348,15.659H11.569C11.761,15.659 11.92,15.51 11.931,15.319L12.247,10.271C11.286,10.605 10.19,10.535 9.24,9.986C8.159,9.363 7.521,8.268 7.435,7.111C8.48,6.608 9.747,6.613 10.827,7.237C11.767,7.779 12.372,8.678 12.57,9.664C12.589,9.661 12.607,9.659 12.626,9.659H12.633C12.893,8.239 13.752,6.937 15.101,6.158Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M15.101,6.158C16.635,5.272 18.438,5.274 19.916,6.004C19.709,7.552 18.811,8.991 17.353,9.833C16.001,10.614 14.444,10.72 13.073,10.257L13.389,15.319C13.401,15.51 13.56,15.659 13.751,15.659H16.973C18.112,15.659 19.035,16.583 19.035,17.722C19.035,18.861 18.112,19.784 16.973,19.784H8.348C7.209,19.784 6.285,18.861 6.285,17.722C6.285,16.583 7.209,15.659 8.348,15.659H11.569C11.761,15.659 11.92,15.51 11.931,15.319L12.247,10.271C11.286,10.605 10.19,10.535 9.24,9.986C8.159,9.363 7.521,8.268 7.435,7.111C8.48,6.608 9.747,6.613 10.827,7.237C11.767,7.779 12.372,8.678 12.57,9.664C12.589,9.661 12.607,9.659 12.626,9.659H12.633C12.893,8.239 13.752,6.937 15.101,6.158Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M15.101,6.158C16.635,5.272 18.438,5.274 19.916,6.004C19.709,7.552 18.811,8.991 17.353,9.833C16.001,10.614 14.444,10.72 13.073,10.257L13.389,15.319C13.401,15.51 13.56,15.659 13.751,15.659H16.973C18.112,15.659 19.035,16.583 19.035,17.722C19.035,18.861 18.112,19.784 16.973,19.784H8.348C7.209,19.784 6.285,18.861 6.285,17.722C6.285,16.583 7.209,15.659 8.348,15.659H11.569C11.761,15.659 11.92,15.51 11.931,15.319L12.247,10.271C11.286,10.605 10.19,10.535 9.24,9.986C8.159,9.363 7.521,8.268 7.435,7.111C8.48,6.608 9.747,6.613 10.827,7.237C11.767,7.779 12.372,8.678 12.57,9.664C12.589,9.661 12.607,9.659 12.626,9.659H12.633C12.893,8.239 13.752,6.937 15.101,6.158Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="#ffffffff" android:pathData="M12.952,4.64C13.083,4.754 13.159,4.922 13.159,5.1V18.9C13.159,19.231 12.9,19.5 12.58,19.5C12.409,19.5 12.247,19.422 12.137,19.288L9.131,15.612L6.494,15.613C6.014,15.613 5.625,15.21 5.625,14.713V9.314C5.625,8.817 6.014,8.415 6.494,8.415L9.138,8.414L12.135,4.714C12.341,4.461 12.707,4.427 12.952,4.64ZM15.701,6.64C17.32,7.837 18.375,9.798 18.375,12.014C18.375,14.265 17.286,16.252 15.623,17.443L14.75,16.244C16.063,15.328 16.926,13.775 16.926,12.014C16.926,10.287 16.097,8.761 14.828,7.839L15.701,6.64Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12.952,4.64C13.083,4.754 13.159,4.922 13.159,5.1V18.9C13.159,19.231 12.9,19.5 12.58,19.5C12.409,19.5 12.247,19.422 12.137,19.288L9.131,15.612L6.494,15.613C6.014,15.613 5.625,15.21 5.625,14.713V9.314C5.625,8.817 6.014,8.415 6.494,8.415L9.138,8.414L12.135,4.714C12.341,4.461 12.707,4.427 12.952,4.64ZM15.701,6.64C17.32,7.837 18.375,9.798 18.375,12.014C18.375,14.265 17.286,16.252 15.623,17.443L14.75,16.244C16.063,15.328 16.926,13.775 16.926,12.014C16.926,10.287 16.097,8.761 14.828,7.839L15.701,6.64Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M12.952,4.64C13.083,4.754 13.159,4.922 13.159,5.1V18.9C13.159,19.231 12.9,19.5 12.58,19.5C12.409,19.5 12.247,19.422 12.137,19.288L9.131,15.612L6.494,15.613C6.014,15.613 5.625,15.21 5.625,14.713V9.314C5.625,8.817 6.014,8.415 6.494,8.415L9.138,8.414L12.135,4.714C12.341,4.461 12.707,4.427 12.952,4.64ZM15.701,6.64C17.32,7.837 18.375,9.798 18.375,12.014C18.375,14.265 17.286,16.252 15.623,17.443L14.75,16.244C16.063,15.328 16.926,13.775 16.926,12.014C16.926,10.287 16.097,8.761 14.828,7.839L15.701,6.64Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="#ffffffff" android:pathData="M11.813,4.875C11.132,4.875 10.582,5.408 10.605,6.099L10.605,6.1L10.69,9.223L5.688,12.458C5.415,12.635 5.25,12.94 5.25,13.266V13.765C5.25,13.816 5.259,13.867 5.276,13.915C5.358,14.146 5.611,14.268 5.843,14.184L10.771,12.391L10.871,16.143C10.879,16.456 10.715,16.747 10.446,16.9L9.3,17.552C9.16,17.632 9.075,17.78 9.075,17.94V18.305C9.075,18.549 9.271,18.75 9.517,18.75H14.108C14.354,18.75 14.55,18.549 14.55,18.305V17.94C14.55,17.78 14.465,17.632 14.325,17.552L13.178,16.9C12.91,16.747 12.746,16.456 12.753,16.143L12.854,12.391L17.782,14.184C17.83,14.201 17.881,14.21 17.933,14.21C18.179,14.21 18.375,14.009 18.375,13.765V13.266C18.375,12.94 18.21,12.635 17.937,12.458L12.935,9.223L13.02,6.098L13.02,6.093C13.021,5.375 12.495,4.875 11.813,4.875Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M11.813,4.875C11.132,4.875 10.582,5.408 10.605,6.099L10.605,6.1L10.69,9.223L5.688,12.458C5.415,12.635 5.25,12.94 5.25,13.266V13.765C5.25,13.816 5.259,13.867 5.276,13.915C5.358,14.146 5.611,14.268 5.843,14.184L10.771,12.391L10.871,16.143C10.879,16.456 10.715,16.747 10.446,16.9L9.3,17.552C9.16,17.632 9.075,17.78 9.075,17.94V18.305C9.075,18.549 9.271,18.75 9.517,18.75H14.108C14.354,18.75 14.55,18.549 14.55,18.305V17.94C14.55,17.78 14.465,17.632 14.325,17.552L13.178,16.9C12.91,16.747 12.746,16.456 12.753,16.143L12.854,12.391L17.782,14.184C17.83,14.201 17.881,14.21 17.933,14.21C18.179,14.21 18.375,14.009 18.375,13.765V13.266C18.375,12.94 18.21,12.635 17.937,12.458L12.935,9.223L13.02,6.098L13.02,6.093C13.021,5.375 12.495,4.875 11.813,4.875Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M11.813,4.875C11.132,4.875 10.582,5.408 10.605,6.099L10.605,6.1L10.69,9.223L5.688,12.458C5.415,12.635 5.25,12.94 5.25,13.266V13.765C5.25,13.816 5.259,13.867 5.276,13.915C5.358,14.146 5.611,14.268 5.843,14.184L10.771,12.391L10.871,16.143C10.879,16.456 10.715,16.747 10.446,16.9L9.3,17.552C9.16,17.632 9.075,17.78 9.075,17.94V18.305C9.075,18.549 9.271,18.75 9.517,18.75H14.108C14.354,18.75 14.55,18.549 14.55,18.305V17.94C14.55,17.78 14.465,17.632 14.325,17.552L13.178,16.9C12.91,16.747 12.746,16.456 12.753,16.143L12.854,12.391L17.782,14.184C17.83,14.201 17.881,14.21 17.933,14.21C18.179,14.21 18.375,14.009 18.375,13.765V13.266C18.375,12.94 18.21,12.635 17.937,12.458L12.935,9.223L13.02,6.098L13.02,6.093C13.021,5.375 12.495,4.875 11.813,4.875Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="@color/color_orange_primary_default" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="#ffffffff" android:pathData="M6.109,7.924C5.306,7.924 4.656,8.575 4.656,9.377V15.189C4.656,15.992 5.306,16.642 6.109,16.642H15.553C16.356,16.642 17.006,15.992 17.006,15.189V9.377C17.006,8.575 16.356,7.924 15.553,7.924H6.109ZM19.367,10.104C18.865,10.104 18.459,10.511 18.459,11.012V13.555C18.459,14.057 18.865,14.463 19.367,14.463C19.868,14.463 20.275,14.057 20.275,13.555V11.012C20.275,10.511 19.868,10.104 19.367,10.104Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M6.109,7.924C5.306,7.924 4.656,8.575 4.656,9.377V15.189C4.656,15.992 5.306,16.642 6.109,16.642H15.553C16.356,16.642 17.006,15.992 17.006,15.189V9.377C17.006,8.575 16.356,7.924 15.553,7.924H6.109ZM19.367,10.104C18.865,10.104 18.459,10.511 18.459,11.012V13.555C18.459,14.057 18.865,14.463 19.367,14.463C19.868,14.463 20.275,14.057 20.275,13.555V11.012C20.275,10.511 19.868,10.104 19.367,10.104Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="#ffffffff" android:pathData="M13.285,5.328C12.461,4.618 11.189,5.207 11.189,6.298V8.095C11.189,8.1 11.188,8.105 11.188,8.11V10.365L7.469,8.362C7.035,8.11 6.48,8.26 6.23,8.696C5.979,9.133 6.128,9.691 6.562,9.942L10.845,12.284L6.563,14.625C6.128,14.876 5.979,15.434 6.23,15.871C6.48,16.307 7.035,16.457 7.469,16.205L11.188,14.202V18.269C11.188,19.36 12.461,19.949 13.285,19.239L17.651,15.773C18.317,15.2 18.219,14.137 17.459,13.696L14.697,12.283L17.46,10.871C18.219,10.43 18.317,9.367 17.652,8.794L13.285,5.328ZM13.003,16.472C13.003,16.467 13.003,16.462 13.003,16.457V13.523L15.887,14.891L13.003,17.079V16.472ZM15.887,9.676L13.003,11.044V7.488L15.887,9.676Z" android:fillType="evenOdd" />
</vector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="#ffffffff" android:pathData="M15.874,11.732C15.332,11.28 14.497,11.655 14.497,12.351V13.23C14.497,13.234 14.496,13.238 14.496,13.241V14.679L12.053,13.401C11.767,13.241 11.403,13.337 11.239,13.615C11.074,13.893 11.172,14.249 11.457,14.409L14.496,16.022V16.047L11.458,17.66C11.172,17.82 11.074,18.176 11.239,18.454C11.403,18.733 11.768,18.828 12.053,18.668L14.496,17.39V19.719C14.496,20.414 15.332,20.79 15.874,20.337L18.742,18.127C19.18,17.762 19.115,17.084 18.616,16.803L17.068,16.035L18.616,15.266C19.115,14.985 19.18,14.307 18.742,13.942L15.874,11.732ZM15.688,18.839C15.689,18.835 15.689,18.831 15.689,18.828V16.719L15.716,16.705L17.583,17.565L15.688,18.96V18.839ZM15.716,15.364L17.583,14.505L15.689,13.109V15.35L15.716,15.364Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M5.909,6.847C5.909,5.501 7,4.41 8.346,4.41H16.596C17.943,4.41 19.034,5.501 19.034,6.847V9.66C19.034,10.177 18.614,10.597 18.096,10.597C17.579,10.597 17.159,10.177 17.159,9.66V6.847C17.159,6.536 16.907,6.285 16.596,6.285H8.346C8.036,6.285 7.784,6.536 7.784,6.847V18.097C7.784,18.408 8.036,18.66 8.346,18.66H9.659C10.177,18.66 10.596,19.079 10.596,19.597C10.596,20.115 10.177,20.535 9.659,20.535H8.346C7,20.535 5.909,19.443 5.909,18.097V6.847Z" android:fillType="evenOdd" />
</vector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M15.874,11.732C15.332,11.28 14.497,11.655 14.497,12.351V13.23C14.497,13.234 14.496,13.238 14.496,13.241V14.679L12.053,13.401C11.767,13.241 11.403,13.337 11.239,13.615C11.074,13.893 11.172,14.249 11.457,14.409L14.496,16.022V16.047L11.458,17.66C11.172,17.82 11.074,18.176 11.239,18.454C11.403,18.733 11.768,18.828 12.053,18.668L14.496,17.39V19.719C14.496,20.414 15.332,20.79 15.874,20.337L18.742,18.127C19.18,17.762 19.115,17.084 18.616,16.803L17.068,16.035L18.616,15.266C19.115,14.985 19.18,14.307 18.742,13.942L15.874,11.732ZM15.688,18.839C15.689,18.835 15.689,18.831 15.689,18.828V16.719L15.716,16.705L17.583,17.565L15.688,18.96V18.839ZM15.716,15.364L17.583,14.505L15.689,13.109V15.35L15.716,15.364Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M5.909,6.847C5.909,5.501 7,4.41 8.346,4.41H16.596C17.943,4.41 19.034,5.501 19.034,6.847V9.66C19.034,10.177 18.614,10.597 18.096,10.597C17.579,10.597 17.159,10.177 17.159,9.66V6.847C17.159,6.536 16.907,6.285 16.596,6.285H8.346C8.036,6.285 7.784,6.536 7.784,6.847V18.097C7.784,18.408 8.036,18.66 8.346,18.66H9.659C10.177,18.66 10.596,19.079 10.596,19.597C10.596,20.115 10.177,20.535 9.659,20.535H8.346C7,20.535 5.909,19.443 5.909,18.097V6.847Z" android:fillType="evenOdd" />
</vector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M15.874,11.732C15.332,11.28 14.497,11.655 14.497,12.351V13.23C14.497,13.234 14.496,13.238 14.496,13.241V14.679L12.053,13.401C11.767,13.241 11.403,13.337 11.239,13.615C11.074,13.893 11.172,14.249 11.457,14.409L14.496,16.022V16.047L11.458,17.66C11.172,17.82 11.074,18.176 11.239,18.454C11.403,18.733 11.768,18.828 12.053,18.668L14.496,17.39V19.719C14.496,20.414 15.332,20.79 15.874,20.337L18.742,18.127C19.18,17.762 19.115,17.084 18.616,16.803L17.068,16.035L18.616,15.266C19.115,14.985 19.18,14.307 18.742,13.942L15.874,11.732ZM15.688,18.839C15.689,18.835 15.689,18.831 15.689,18.828V16.719L15.716,16.705L17.583,17.565L15.688,18.96V18.839ZM15.716,15.364L17.583,14.505L15.689,13.109V15.35L15.716,15.364Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M5.909,6.847C5.909,5.501 7,4.41 8.346,4.41H16.596C17.943,4.41 19.034,5.501 19.034,6.847V9.66C19.034,10.177 18.614,10.597 18.096,10.597C17.579,10.597 17.159,10.177 17.159,9.66V6.847C17.159,6.536 16.907,6.285 16.596,6.285H8.346C8.036,6.285 7.784,6.536 7.784,6.847V18.097C7.784,18.408 8.036,18.66 8.346,18.66H9.659C10.177,18.66 10.596,19.079 10.596,19.597C10.596,20.115 10.177,20.535 9.659,20.535H8.346C7,20.535 5.909,19.443 5.909,18.097V6.847Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M13.285,5.328C12.461,4.618 11.189,5.207 11.189,6.298V8.095C11.189,8.1 11.188,8.105 11.188,8.11V10.365L7.469,8.362C7.035,8.11 6.48,8.26 6.23,8.696C5.979,9.133 6.128,9.691 6.562,9.942L10.845,12.284L6.563,14.625C6.128,14.876 5.979,15.434 6.23,15.871C6.48,16.307 7.035,16.457 7.469,16.205L11.188,14.202V18.269C11.188,19.36 12.461,19.949 13.285,19.239L17.651,15.773C18.317,15.2 18.219,14.137 17.459,13.696L14.697,12.283L17.46,10.871C18.219,10.43 18.317,9.367 17.652,8.794L13.285,5.328ZM13.003,16.472C13.003,16.467 13.003,16.462 13.003,16.457V13.523L15.887,14.891L13.003,17.079V16.472ZM15.887,9.676L13.003,11.044V7.488L15.887,9.676Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M13.285,5.328C12.461,4.618 11.189,5.207 11.189,6.298V8.095C11.189,8.1 11.188,8.105 11.188,8.11V10.365L7.469,8.362C7.035,8.11 6.48,8.26 6.23,8.696C5.979,9.133 6.128,9.691 6.562,9.942L10.845,12.284L6.563,14.625C6.128,14.876 5.979,15.434 6.23,15.871C6.48,16.307 7.035,16.457 7.469,16.205L11.188,14.202V18.269C11.188,19.36 12.461,19.949 13.285,19.239L17.651,15.773C18.317,15.2 18.219,14.137 17.459,13.696L14.697,12.284L17.46,10.871C18.219,10.43 18.317,9.367 17.652,8.794L13.285,5.328ZM13.003,16.472C13.003,16.467 13.003,16.462 13.003,16.457V13.524L15.887,14.891L13.003,17.079V16.472ZM15.887,9.676L13.003,11.044V7.488L15.887,9.676Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="#ffffffff" android:pathData="M12.186,5.326C11.665,5.107 11.089,5.38 10.889,5.903L6.037,17.649L6.035,17.653C6.012,17.715 6,17.779 6,17.845C6,18.123 6.217,18.375 6.516,18.375H7.345C7.564,18.375 7.75,18.235 7.825,18.04L9.371,14.308H14.255L15.8,18.04C15.875,18.235 16.061,18.375 16.28,18.375H17.109C17.177,18.375 17.243,18.361 17.305,18.335C17.574,18.222 17.688,17.913 17.59,17.653L17.589,17.649L12.736,5.903C12.637,5.644 12.44,5.434 12.186,5.326ZM10.06,12.645L11.813,8.412L13.566,12.645H10.06Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12.186,5.326C11.665,5.107 11.089,5.38 10.889,5.903L6.037,17.649L6.035,17.653C6.012,17.715 6,17.779 6,17.845C6,18.123 6.217,18.375 6.516,18.375H7.345C7.564,18.375 7.75,18.235 7.825,18.04L9.371,14.308H14.255L15.8,18.04C15.875,18.235 16.061,18.375 16.28,18.375H17.109C17.177,18.375 17.243,18.361 17.305,18.335C17.574,18.222 17.688,17.913 17.59,17.653L17.589,17.649L12.736,5.903C12.637,5.644 12.44,5.434 12.186,5.326ZM10.06,12.645L11.813,8.412L13.566,12.645H10.06Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M12.186,5.326C11.665,5.107 11.089,5.38 10.889,5.903L6.037,17.649L6.035,17.653C6.012,17.715 6,17.779 6,17.845C6,18.123 6.217,18.375 6.516,18.375H7.345C7.564,18.375 7.75,18.235 7.825,18.04L9.371,14.308H14.255L15.8,18.04C15.875,18.235 16.061,18.375 16.28,18.375H17.109C17.177,18.375 17.243,18.361 17.305,18.335C17.574,18.222 17.688,17.913 17.59,17.653L17.589,17.649L12.736,5.903C12.637,5.644 12.44,5.434 12.186,5.326ZM10.06,12.645L11.813,8.412L13.566,12.645H10.06Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="25.0dip" android:width="25.0dip" android:autoMirrored="true" android:viewportWidth="25.0" android:viewportHeight="25.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M4.655,9.377C4.655,8.575 5.306,7.924 6.108,7.924H15.552C16.355,7.924 17.006,8.575 17.006,9.377V15.189C17.006,15.992 16.355,16.642 15.552,16.642H6.108C5.306,16.642 4.655,15.992 4.655,15.189V9.377ZM18.459,11.012C18.459,10.511 18.865,10.104 19.367,10.104C19.868,10.104 20.275,10.511 20.275,11.012V13.555C20.275,14.057 19.868,14.463 19.367,14.463C18.865,14.463 18.459,14.057 18.459,13.555V11.012ZM11.768,12.272C11.71,12.272 11.657,12.237 11.635,12.184C11.622,12.153 11.62,12.118 11.629,12.086L12.245,10.031C12.355,9.663 11.892,9.398 11.631,9.68L8.726,12.812C8.51,13.044 8.675,13.422 8.992,13.422H10.551C10.609,13.422 10.662,13.457 10.684,13.511C10.697,13.542 10.699,13.576 10.689,13.608L10.074,15.663C9.964,16.031 10.427,16.296 10.688,16.014L13.593,12.882C13.809,12.65 13.644,12.272 13.327,12.272H11.768Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="#ffffffff" android:pathData="M12,15.319C12.568,15.319 13.09,15.518 13.502,15.85C13.603,15.932 13.619,16.08 13.539,16.182C13.533,16.189 13.528,16.195 13.522,16.201L12.214,17.535C12.097,17.655 11.906,17.656 11.788,17.537C11.788,17.537 11.787,17.536 11.786,17.535L10.479,16.201C10.388,16.109 10.389,15.959 10.48,15.867C10.486,15.861 10.493,15.855 10.499,15.85C10.911,15.518 11.433,15.319 12,15.319Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,12.368C13.264,12.368 14.42,12.83 15.313,13.597C15.33,13.612 15.349,13.629 15.37,13.648L15.37,13.648C15.494,13.759 15.505,13.952 15.395,14.077C15.391,14.081 15.387,14.085 15.384,14.089L14.746,14.739C14.634,14.853 14.455,14.86 14.335,14.755C14.303,14.726 14.274,14.703 14.25,14.683C13.632,14.186 12.851,13.889 12,13.889C11.153,13.889 10.374,14.184 9.758,14.677C9.732,14.698 9.701,14.724 9.666,14.755C9.547,14.86 9.367,14.853 9.255,14.739L8.617,14.089C8.5,13.97 8.501,13.777 8.619,13.659C8.623,13.655 8.627,13.651 8.631,13.648C8.657,13.624 8.681,13.603 8.702,13.585C9.593,12.825 10.744,12.368 12,12.368Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,9.325C14.085,9.325 15.987,10.119 17.426,11.423C17.447,11.442 17.47,11.463 17.496,11.488L17.496,11.488C17.618,11.602 17.625,11.795 17.512,11.918C17.509,11.92 17.507,11.923 17.505,11.925L16.869,12.574C16.755,12.69 16.57,12.695 16.451,12.584C16.419,12.554 16.392,12.529 16.368,12.508C15.202,11.474 13.674,10.846 12,10.846C10.328,10.846 8.801,11.473 7.635,12.506C7.611,12.528 7.582,12.554 7.55,12.584L7.55,12.584C7.431,12.695 7.246,12.69 7.132,12.574L6.496,11.925C6.379,11.806 6.38,11.613 6.498,11.495C6.5,11.493 6.502,11.49 6.505,11.488C6.54,11.455 6.571,11.426 6.598,11.403C8.034,10.11 9.926,9.325 12,9.325Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,6.375C14.842,6.375 17.428,7.481 19.361,9.289C19.375,9.302 19.389,9.316 19.406,9.331L19.406,9.331C19.527,9.446 19.532,9.639 19.418,9.761C19.416,9.763 19.414,9.765 19.413,9.767L18.777,10.415C18.662,10.532 18.476,10.536 18.357,10.423C18.345,10.412 18.334,10.401 18.323,10.392C16.661,8.842 14.44,7.896 12,7.896C9.558,7.896 7.335,8.844 5.672,10.396C5.663,10.404 5.653,10.413 5.643,10.423L5.643,10.423C5.524,10.536 5.338,10.532 5.223,10.415L4.587,9.767C4.47,9.647 4.471,9.455 4.589,9.336C4.591,9.335 4.593,9.333 4.595,9.331C4.609,9.318 4.622,9.305 4.634,9.294C6.567,7.482 9.156,6.375 12,6.375Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M16.346,16.347L16.346,13.259C16.346,12.958 16.59,12.714 16.891,12.714C17.191,12.714 17.435,12.958 17.435,13.259L17.435,17.254C17.435,17.555 17.191,17.799 16.891,17.799C16.874,17.799 16.858,17.799 16.842,17.797C16.772,17.837 16.681,17.838 16.606,17.783L15.544,17.003C15.261,16.795 15.408,16.347 15.759,16.347L16.346,16.347Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M19.615,14.166L19.615,17.254C19.615,17.555 19.371,17.799 19.07,17.799C18.769,17.799 18.525,17.555 18.525,17.254L18.525,13.258C18.525,12.958 18.769,12.714 19.07,12.714C19.086,12.714 19.102,12.714 19.118,12.716C19.188,12.676 19.279,12.675 19.354,12.73L20.417,13.51C20.7,13.718 20.553,14.166 20.202,14.166L19.615,14.166Z" android:fillType="evenOdd" />
</vector>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,15.319C12.568,15.319 13.09,15.518 13.502,15.85C13.603,15.932 13.619,16.08 13.539,16.182C13.533,16.189 13.528,16.195 13.522,16.201L12.214,17.535C12.097,17.655 11.906,17.656 11.788,17.537C11.788,17.537 11.787,17.536 11.786,17.535L10.479,16.201C10.388,16.109 10.389,15.959 10.48,15.867C10.486,15.861 10.493,15.855 10.499,15.85C10.911,15.518 11.433,15.319 12,15.319Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,12.368C13.264,12.368 14.42,12.83 15.313,13.597C15.33,13.612 15.349,13.629 15.37,13.648L15.37,13.648C15.494,13.759 15.505,13.952 15.395,14.077C15.391,14.081 15.387,14.085 15.384,14.089L14.746,14.739C14.634,14.853 14.455,14.86 14.335,14.755C14.303,14.726 14.274,14.703 14.25,14.683C13.632,14.186 12.851,13.889 12,13.889C11.153,13.889 10.374,14.184 9.758,14.677C9.732,14.698 9.701,14.724 9.666,14.755C9.547,14.86 9.367,14.853 9.255,14.739L8.617,14.089C8.5,13.97 8.501,13.777 8.619,13.659C8.623,13.655 8.627,13.651 8.631,13.648C8.657,13.624 8.681,13.603 8.702,13.585C9.593,12.825 10.744,12.368 12,12.368Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,9.325C14.085,9.325 15.987,10.119 17.426,11.423C17.447,11.442 17.47,11.463 17.496,11.488L17.496,11.488C17.618,11.602 17.625,11.795 17.512,11.918C17.509,11.92 17.507,11.923 17.505,11.925L16.869,12.574C16.755,12.69 16.57,12.695 16.451,12.584C16.419,12.554 16.392,12.529 16.368,12.508C15.202,11.474 13.674,10.846 12,10.846C10.328,10.846 8.801,11.473 7.635,12.506C7.611,12.528 7.582,12.554 7.55,12.584L7.55,12.584C7.431,12.695 7.246,12.69 7.132,12.574L6.496,11.925C6.379,11.806 6.38,11.613 6.498,11.495C6.5,11.493 6.502,11.49 6.505,11.488C6.54,11.455 6.571,11.426 6.598,11.403C8.034,10.11 9.926,9.325 12,9.325Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,6.375C14.842,6.375 17.428,7.481 19.361,9.289C19.375,9.302 19.389,9.316 19.406,9.331L19.406,9.331C19.527,9.446 19.532,9.639 19.418,9.761C19.416,9.763 19.414,9.765 19.413,9.767L18.777,10.415C18.662,10.532 18.476,10.536 18.357,10.423C18.345,10.412 18.334,10.401 18.323,10.392C16.661,8.842 14.44,7.896 12,7.896C9.558,7.896 7.335,8.844 5.672,10.396C5.663,10.404 5.653,10.413 5.643,10.423L5.643,10.423C5.524,10.536 5.338,10.532 5.223,10.415L4.587,9.767C4.47,9.647 4.471,9.455 4.589,9.336C4.591,9.335 4.593,9.333 4.595,9.331C4.609,9.318 4.622,9.305 4.634,9.294C6.567,7.482 9.156,6.375 12,6.375Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M16.346,16.347L16.346,13.259C16.346,12.958 16.59,12.714 16.891,12.714C17.191,12.714 17.435,12.958 17.435,13.259L17.435,17.254C17.435,17.555 17.191,17.799 16.891,17.799C16.874,17.799 16.858,17.799 16.842,17.797C16.772,17.837 16.681,17.838 16.606,17.783L15.544,17.003C15.261,16.795 15.408,16.347 15.759,16.347L16.346,16.347Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M19.615,14.166L19.615,17.254C19.615,17.555 19.371,17.799 19.07,17.799C18.769,17.799 18.525,17.555 18.525,17.254L18.525,13.258C18.525,12.958 18.769,12.714 19.07,12.714C19.086,12.714 19.102,12.714 19.118,12.716C19.188,12.676 19.279,12.675 19.354,12.73L20.417,13.51C20.7,13.718 20.553,14.166 20.202,14.166L19.615,14.166Z" android:fillType="evenOdd" />
</vector>

@ -1,11 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_light_blue" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M12,15.319C12.568,15.319 13.09,15.518 13.502,15.85C13.603,15.932 13.619,16.08 13.539,16.182C13.533,16.189 13.528,16.195 13.522,16.201L12.214,17.535C12.097,17.655 11.906,17.656 11.788,17.537C11.788,17.537 11.787,17.536 11.786,17.535L10.479,16.201C10.388,16.109 10.389,15.959 10.48,15.867C10.486,15.861 10.493,15.855 10.499,15.85C10.911,15.518 11.433,15.319 12,15.319Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,12.368C13.264,12.368 14.42,12.83 15.313,13.597C15.33,13.612 15.349,13.629 15.37,13.648L15.37,13.648C15.494,13.759 15.505,13.952 15.395,14.077C15.391,14.081 15.387,14.085 15.384,14.089L14.746,14.739C14.634,14.853 14.455,14.86 14.335,14.755C14.303,14.726 14.274,14.703 14.25,14.683C13.632,14.186 12.851,13.889 12,13.889C11.153,13.889 10.374,14.184 9.758,14.677C9.732,14.698 9.701,14.724 9.666,14.755C9.547,14.86 9.367,14.853 9.255,14.739L8.617,14.089C8.5,13.97 8.501,13.777 8.619,13.659C8.623,13.655 8.627,13.651 8.631,13.648C8.657,13.624 8.681,13.603 8.702,13.585C9.593,12.825 10.744,12.368 12,12.368Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,9.325C14.085,9.325 15.987,10.119 17.426,11.423C17.447,11.442 17.47,11.463 17.496,11.488L17.496,11.488C17.618,11.602 17.625,11.795 17.512,11.918C17.509,11.92 17.507,11.923 17.505,11.925L16.869,12.574C16.755,12.69 16.57,12.695 16.451,12.584C16.419,12.554 16.392,12.529 16.368,12.508C15.202,11.474 13.674,10.846 12,10.846C10.328,10.846 8.801,11.473 7.635,12.506C7.611,12.528 7.582,12.554 7.55,12.584L7.55,12.584C7.431,12.695 7.246,12.69 7.132,12.574L6.496,11.925C6.379,11.806 6.38,11.613 6.498,11.495C6.5,11.493 6.502,11.49 6.505,11.488C6.54,11.455 6.571,11.426 6.598,11.403C8.034,10.11 9.926,9.325 12,9.325Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,6.375C14.842,6.375 17.428,7.481 19.361,9.289C19.375,9.302 19.389,9.316 19.406,9.331L19.406,9.331C19.527,9.446 19.532,9.639 19.418,9.761C19.416,9.763 19.414,9.765 19.413,9.767L18.777,10.415C18.662,10.532 18.476,10.536 18.357,10.423C18.345,10.412 18.334,10.401 18.323,10.392C16.661,8.842 14.44,7.896 12,7.896C9.558,7.896 7.335,8.844 5.672,10.396C5.663,10.404 5.653,10.413 5.643,10.423L5.643,10.423C5.524,10.536 5.338,10.532 5.223,10.415L4.587,9.767C4.47,9.647 4.471,9.455 4.589,9.336C4.591,9.335 4.593,9.333 4.595,9.331C4.609,9.318 4.622,9.305 4.634,9.294C6.567,7.482 9.156,6.375 12,6.375Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M16.346,16.347L16.346,13.259C16.346,12.958 16.59,12.714 16.891,12.714C17.191,12.714 17.435,12.958 17.435,13.259L17.435,17.254C17.435,17.555 17.191,17.799 16.891,17.799C16.874,17.799 16.858,17.799 16.842,17.797C16.772,17.837 16.681,17.838 16.606,17.783L15.544,17.003C15.261,16.795 15.408,16.347 15.759,16.347L16.346,16.347Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M19.615,14.166L19.615,17.254C19.615,17.555 19.371,17.799 19.07,17.799C18.769,17.799 18.525,17.555 18.525,17.254L18.525,13.258C18.525,12.958 18.769,12.714 19.07,12.714C19.086,12.714 19.102,12.714 19.118,12.716C19.188,12.676 19.279,12.675 19.354,12.73L20.417,13.51C20.7,13.718 20.553,14.166 20.202,14.166L19.615,14.166Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
</vector>

@ -1,19 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="25.0dip"
android:height="25.0dip"
android:autoMirrored="true"
android:viewportWidth="25.0"
android:viewportHeight="25.0">
<path
android:fillAlpha="0.3"
android:fillColor="@color/color_blue_primary_default"
android:pathData="M6.66,0.66L18.66,0.66A6,6 0,0 1,24.66 6.66L24.66,18.66A6,6 0,0 1,18.66 24.66L6.66,24.66A6,6 0,0 1,0.66 18.66L0.66,6.66A6,6 0,0 1,6.66 0.66z"
android:strokeAlpha="0.3" />
<path
android:fillAlpha="0.3"
android:fillColor="#ffffffff"
android:fillType="evenOdd"
android:pathData="M12.66,18.66C15.973,18.66 18.66,15.973 18.66,12.66C18.66,9.346 15.973,6.66 12.66,6.66C9.346,6.66 6.66,9.346 6.66,12.66C6.66,15.973 9.346,18.66 12.66,18.66ZM12.66,20.535C17.009,20.535 20.535,17.009 20.535,12.66C20.535,8.31 17.009,4.785 12.66,4.785C8.31,4.785 4.785,8.31 4.785,12.66C4.785,17.009 8.31,20.535 12.66,20.535ZM11.535,10.222C11.535,9.704 11.954,9.285 12.472,9.285C12.99,9.285 13.41,9.704 13.41,10.222V11.91H15.097C15.615,11.91 16.035,12.329 16.035,12.847C16.035,13.365 15.615,13.785 15.097,13.785H12.472C12.44,13.785 12.408,13.783 12.376,13.78C11.903,13.732 11.535,13.333 11.535,12.847V10.222Z"
android:strokeAlpha="0.3" />
</vector>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="#ffffffff" android:pathData="M12,18C15.314,18 18,15.314 18,12C18,8.686 15.314,6 12,6C8.686,6 6,8.686 6,12C6,15.314 8.686,18 12,18ZM12,19.875C16.349,19.875 19.875,16.349 19.875,12C19.875,7.651 16.349,4.125 12,4.125C7.651,4.125 4.125,7.651 4.125,12C4.125,16.349 7.651,19.875 12,19.875Z" android:fillType="evenOdd" />
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M15.399,12C15.399,13.877 13.877,15.399 12,15.399C10.123,15.399 8.601,13.877 8.601,12C8.601,10.123 10.123,8.601 12,8.601C13.877,8.601 15.399,10.123 15.399,12Z" android:strokeColor="#ffffffff" android:strokeWidth="1.453" />
<path android:fillColor="#ffffffff" android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.279 9.722,16.125 12,16.125V7.875Z" android:fillType="evenOdd" />
<group>
<clip-path android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.279 9.722,16.125 12,16.125V7.875Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,7.875H12.363V7.512H12V7.875ZM12,16.125V16.489H12.363V16.125H12ZM8.238,12C8.238,9.923 9.922,8.239 12,8.239V7.512C9.521,7.512 7.512,9.522 7.512,12H8.238ZM12,15.762C9.922,15.762 8.238,14.078 8.238,12H7.512C7.512,14.479 9.521,16.489 12,16.489V15.762ZM12.363,16.125V7.875H11.637V16.125H12.363Z" />
</group>
</vector>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,18C15.314,18 18,15.314 18,12C18,8.686 15.314,6 12,6C8.686,6 6,8.686 6,12C6,15.314 8.686,18 12,18ZM12,19.875C16.349,19.875 19.875,16.349 19.875,12C19.875,7.651 16.349,4.125 12,4.125C7.651,4.125 4.125,7.651 4.125,12C4.125,16.349 7.651,19.875 12,19.875Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey_bg" android:pathData="M15.399,12C15.399,13.877 13.877,15.399 12,15.399C10.123,15.399 8.601,13.877 8.601,12C8.601,10.123 10.123,8.601 12,8.601C13.877,8.601 15.399,10.123 15.399,12Z" android:strokeColor="@color/auto_task_icon_grey" android:strokeWidth="1.453" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.278 9.722,16.125 12,16.125V7.875Z" android:fillType="evenOdd" />
<group>
<clip-path android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.278 9.722,16.125 12,16.125V7.875Z" android:fillType="evenOdd" />
<path android:fillColor="@color/auto_task_icon_grey" android:pathData="M12,7.875H12.363V7.512H12V7.875ZM12,16.125V16.489H12.363V16.125H12ZM8.238,12C8.238,9.923 9.922,8.239 12,8.239V7.512C9.521,7.512 7.512,9.522 7.512,12H8.238ZM12,15.762C9.922,15.762 8.238,14.078 8.238,12H7.512C7.512,14.479 9.521,16.489 12,16.489V15.762ZM12.363,16.125V7.875H11.637V16.125H12.363Z" />
</group>
</vector>

@ -1,12 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M6,0L18,0A6,6 0,0 1,24 6L24,18A6,6 0,0 1,18 24L6,24A6,6 0,0 1,0 18L0,6A6,6 0,0 1,6 0z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M12,18C15.314,18 18,15.314 18,12C18,8.686 15.314,6 12,6C8.686,6 6,8.686 6,12C6,15.314 8.686,18 12,18ZM12,19.875C16.349,19.875 19.875,16.349 19.875,12C19.875,7.651 16.349,4.125 12,4.125C7.651,4.125 4.125,7.651 4.125,12C4.125,16.349 7.651,19.875 12,19.875Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M15.399,12C15.399,13.877 13.877,15.399 12,15.399C10.123,15.399 8.601,13.877 8.601,12C8.601,10.123 10.123,8.601 12,8.601C13.877,8.601 15.399,10.123 15.399,12Z" android:strokeColor="#ffffffff" android:strokeWidth="1.453" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
<path android:fillColor="#ffffffff" android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.278 9.722,16.125 12,16.125V7.875Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" android:fillType="evenOdd" />
<group>
<clip-path android:pathData="M12,7.875C9.722,7.875 7.875,9.722 7.875,12C7.875,14.278 9.722,16.125 12,16.125V7.875Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M12,7.875H12.363V7.512H12V7.875ZM12,16.125V16.489H12.363V16.125H12ZM8.238,12C8.238,9.923 9.922,8.239 12,8.239V7.512C9.521,7.512 7.512,9.522 7.512,12H8.238ZM12,15.762C9.922,15.762 8.238,14.078 8.238,12H7.512C7.512,14.479 9.521,16.489 12,16.489V15.762ZM12.363,16.125V7.875H11.637V16.125H12.363Z" android:strokeAlpha="0.3" android:fillAlpha="0.3" />
</group>
</vector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M8.179,4.4C7.122,4.4 6.17,5.042 5.774,6.022L3.788,10.936H20.128L18.142,6.022C17.746,5.042 16.795,4.4 15.737,4.4H8.179ZM7.911,5.67C7.496,5.67 7.128,5.933 6.992,6.324L6.279,8.372C6.06,9.005 6.529,9.665 7.198,9.665H16.717C17.386,9.665 17.856,9.005 17.636,8.372L16.924,6.324C16.788,5.933 16.419,5.67 16.005,5.67H7.911Z" android:fillType="evenOdd" />
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M3.351,9.643C2.743,9.643 2.25,10.136 2.25,10.745C2.25,11.353 2.743,11.846 3.351,11.846H4.861V9.643H3.351ZM20.608,9.643C21.216,9.643 21.709,10.136 21.709,10.745C21.709,11.353 21.216,11.846 20.608,11.846H19.099V9.643H20.608Z" android:fillType="evenOdd" />
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M5.445,9.974C4.46,9.974 3.628,10.71 3.537,11.691C3.491,12.191 3.449,12.722 3.429,13.164C3.405,13.686 3.401,14.46 3.405,15.182C3.405,15.246 3.408,15.309 3.415,15.372C3.407,15.429 3.403,15.489 3.403,15.549V18.048C3.403,18.791 4.006,19.393 4.749,19.393C5.492,19.393 6.095,18.791 6.095,18.048V17.087H17.821V18.048C17.821,18.791 18.424,19.393 19.167,19.393C19.91,19.393 20.513,18.791 20.513,18.048V15.741C20.513,15.651 20.504,15.564 20.487,15.479C20.503,15.383 20.511,15.283 20.512,15.182C20.515,14.46 20.511,13.686 20.488,13.164C20.468,12.722 20.425,12.191 20.379,11.691C20.288,10.71 19.457,9.974 18.472,9.974H5.445ZM7.44,14.396C8.077,14.396 8.594,13.88 8.594,13.243C8.594,12.606 8.077,12.09 7.44,12.09C6.803,12.09 6.287,12.606 6.287,13.243C6.287,13.88 6.803,14.396 7.44,14.396ZM17.629,13.243C17.629,13.88 17.113,14.396 16.476,14.396C15.839,14.396 15.322,13.88 15.322,13.243C15.322,12.606 15.839,12.09 16.476,12.09C17.113,12.09 17.629,12.606 17.629,13.243ZM10.6,13.437C10.255,13.437 9.976,13.716 9.976,14.061C9.976,14.405 10.255,14.684 10.6,14.684H13.509C13.854,14.684 14.133,14.405 14.133,14.061C14.133,13.716 13.854,13.437 13.509,13.437H10.6Z" android:fillType="evenOdd" />
</vector>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="62.0dip" android:width="62.0dip" android:autoMirrored="true" android:viewportWidth="62.0" android:viewportHeight="62.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M18,0L44,0A18,18 0,0 1,62 18L62,44A18,18 0,0 1,44 62L18,62A18,18 0,0 1,0 44L0,18A18,18 0,0 1,18 0z" />
<path android:fillColor="#ffffffff" android:pathData="M24.632,18.333C22.87,18.333 21.284,19.403 20.623,21.037L17.313,29.227H44.547L41.237,21.037C40.577,19.403 38.991,18.333 37.228,18.333H24.632ZM24.184,20.451C23.494,20.451 22.879,20.888 22.653,21.54L21.466,24.954C21.1,26.008 21.882,27.108 22.998,27.108H38.862C39.978,27.108 40.76,26.008 40.394,24.954L39.207,21.54C38.98,20.888 38.366,20.451 37.675,20.451H24.184Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M16.586,27.072C15.572,27.072 14.75,27.894 14.75,28.908C14.75,29.921 15.572,30.743 16.586,30.743H19.101V27.072H16.586ZM45.347,27.072C46.361,27.072 47.182,27.894 47.182,28.908C47.182,29.921 46.361,30.743 45.347,30.743H42.831V27.072H45.347Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M20.074,27.624C18.433,27.624 17.047,28.85 16.895,30.485C16.818,31.319 16.748,32.203 16.714,32.94C16.675,33.81 16.668,35.1 16.674,36.304C16.675,36.41 16.68,36.515 16.691,36.619C16.678,36.715 16.672,36.814 16.672,36.914V41.079C16.672,42.318 17.676,43.322 18.915,43.322C20.153,43.322 21.157,42.318 21.157,41.079V39.479H40.702V41.079C40.702,42.318 41.706,43.322 42.945,43.322C44.183,43.322 45.188,42.318 45.188,41.079V37.234C45.188,37.085 45.173,36.94 45.145,36.799C45.171,36.638 45.185,36.472 45.186,36.304C45.192,35.099 45.186,33.81 45.146,32.94C45.112,32.203 45.042,31.319 44.965,30.485C44.813,28.85 43.427,27.624 41.786,27.624H20.074ZM23.4,34.994C24.462,34.994 25.323,34.133 25.323,33.071C25.323,32.01 24.462,31.149 23.4,31.149C22.338,31.149 21.478,32.01 21.478,33.071C21.478,34.133 22.338,34.994 23.4,34.994ZM40.382,33.071C40.382,34.133 39.521,34.994 38.459,34.994C37.397,34.994 36.537,34.133 36.537,33.071C36.537,32.01 37.397,31.149 38.459,31.149C39.521,31.149 40.382,32.01 40.382,33.071ZM28.666,33.395C28.092,33.395 27.627,33.861 27.627,34.435C27.627,35.008 28.092,35.474 28.666,35.474H33.515C34.089,35.474 34.554,35.008 34.554,34.435C34.554,33.861 34.089,33.395 33.515,33.395H28.666Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_deep_orange_primary_default" android:pathData="M12,21.824C16.836,21.824 20.757,17.903 20.757,13.067C20.757,8.231 16.836,4.311 12,4.311C7.164,4.311 3.243,8.231 3.243,13.067C3.243,17.903 7.164,21.824 12,21.824ZM11.351,9.082C11.351,8.724 11.642,8.434 12,8.434C12.358,8.434 12.649,8.724 12.649,9.082V13.27L14.247,14.193C14.557,14.372 14.664,14.769 14.484,15.079C14.305,15.39 13.909,15.496 13.598,15.317L11.913,14.344C11.858,14.312 11.808,14.273 11.766,14.228C11.524,14.134 11.351,13.899 11.351,13.623V9.082Z" android:fillType="evenOdd" />
<path android:fillColor="@color/color_deep_orange_primary_default" android:pathData="M4.216,5.265C4.037,4.955 4.143,4.558 4.454,4.379L7.543,2.595C7.853,2.416 8.25,2.522 8.429,2.833C8.608,3.143 8.502,3.54 8.192,3.719L5.102,5.503C4.792,5.682 4.395,5.575 4.216,5.265ZM19.781,5.328C19.96,5.018 19.854,4.621 19.543,4.442L16.454,2.658C16.143,2.479 15.747,2.585 15.568,2.896C15.389,3.206 15.495,3.603 15.805,3.782L18.895,5.565C19.205,5.745 19.602,5.638 19.781,5.328Z" android:fillType="evenOdd" />
</vector>

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="62.0dip" android:width="62.0dip" android:autoMirrored="true" android:viewportWidth="62.0" android:viewportHeight="62.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_deep_orange_primary_default" android:pathData="M18,0L44,0A18,18 0,0 1,62 18L62,44A18,18 0,0 1,44 62L18,62A18,18 0,0 1,0 44L0,18A18,18 0,0 1,18 0z" />
<path android:fillColor="#ffffffff" android:pathData="M31,47.373C39.061,47.373 45.595,40.839 45.595,32.779C45.595,24.718 39.061,18.184 31,18.184C22.94,18.184 16.406,24.718 16.406,32.779C16.406,40.839 22.94,47.373 31,47.373ZM29.919,26.137C29.919,25.54 30.403,25.056 31,25.056C31.597,25.056 32.081,25.54 32.081,26.137V33.117L34.745,34.655C35.262,34.954 35.439,35.615 35.141,36.132C34.842,36.649 34.181,36.826 33.664,36.528L30.855,34.906C30.763,34.853 30.681,34.787 30.611,34.714C30.206,34.557 29.919,34.165 29.919,33.705V26.137Z" android:fillType="evenOdd" />
<path android:fillColor="#ffffffff" android:pathData="M18.027,19.775C17.729,19.258 17.906,18.597 18.423,18.298L23.572,15.325C24.089,15.027 24.75,15.204 25.049,15.721C25.348,16.238 25.17,16.899 24.653,17.198L19.504,20.171C18.987,20.469 18.326,20.292 18.027,19.775ZM43.968,19.88C44.267,19.363 44.089,18.702 43.572,18.403L38.423,15.43C37.906,15.132 37.245,15.309 36.946,15.826C36.648,16.343 36.825,17.004 37.342,17.303L42.491,20.276C43.008,20.574 43.669,20.397 43.968,19.88Z" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_deep_orange_primary_default" android:pathData="M12.735,0.895C15.488,1.958 19.289,4.085 20.41,6.106C21.355,7.808 21.532,10.147 19.39,13.657C20.809,8.479 17.496,6.976 15.654,6.644V16.138H15.653C15.653,19.72 12.749,22.624 9.167,22.624C5.585,22.624 2.681,19.72 2.681,16.138C2.681,12.555 5.585,9.651 9.167,9.651C10.485,9.651 11.711,10.044 12.735,10.719V6.638V3.165V0.895ZM9.167,19.056C10.779,19.056 12.086,17.749 12.086,16.137C12.086,14.525 10.779,13.218 9.167,13.218C7.555,13.218 6.248,14.525 6.248,16.137C6.248,17.749 7.555,19.056 9.167,19.056Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="62.0dip" android:width="62.0dip" android:autoMirrored="true" android:viewportWidth="62.0" android:viewportHeight="62.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_deep_orange_primary_default" android:pathData="M18,0L44,0A18,18 0,0 1,62 18L62,44A18,18 0,0 1,44 62L18,62A18,18 0,0 1,0 44L0,18A18,18 0,0 1,18 0z" />
<path android:fillColor="#ffffffff" android:pathData="M32.225,12.491C36.813,14.264 43.148,17.809 45.017,21.177C46.591,24.013 46.886,27.912 43.318,33.762C45.681,25.132 40.161,22.627 37.089,22.073V37.897H37.089C37.089,43.867 32.249,48.707 26.278,48.707C20.308,48.707 15.468,43.867 15.468,37.896C15.468,31.925 20.308,27.085 26.278,27.085C28.475,27.085 30.519,27.74 32.225,28.866V22.063V16.275V12.491ZM26.278,42.76C28.965,42.76 31.143,40.582 31.143,37.895C31.143,35.208 28.965,33.03 26.278,33.03C23.592,33.03 21.414,35.208 21.414,37.895C21.414,40.582 23.592,42.76 26.278,42.76Z" android:fillType="evenOdd" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M16.191,3.248C15.805,3.248 15.493,3.56 15.493,3.946V5.342H8.507V3.946C8.507,3.561 8.194,3.248 7.808,3.248C7.423,3.248 7.11,3.561 7.11,3.946V5.342C5.844,5.343 5.178,5.361 4.66,5.625C4.172,5.873 3.775,6.27 3.526,6.759C3.243,7.314 3.243,8.04 3.243,9.493V16.326C3.243,17.779 3.243,18.505 3.526,19.06C3.775,19.549 4.172,19.945 4.66,20.194C5.215,20.477 5.942,20.477 7.395,20.477H16.605C18.059,20.477 18.785,20.477 19.34,20.194C19.828,19.945 20.225,19.549 20.474,19.06C20.757,18.505 20.757,17.779 20.757,16.326V9.493C20.757,8.04 20.757,7.314 20.474,6.759C20.225,6.27 19.828,5.873 19.34,5.625C18.823,5.361 18.156,5.343 16.89,5.342V3.946C16.89,3.56 16.577,3.248 16.191,3.248ZM11.014,15.59C11.002,15.578 10.99,15.566 10.979,15.553L8.303,12.877C8.03,12.604 8.03,12.162 8.303,11.889C8.575,11.616 9.018,11.616 9.291,11.889L11.509,14.107L15.124,10.492C15.397,10.22 15.839,10.22 16.112,10.492C16.385,10.765 16.385,11.207 16.112,11.48L12.068,15.524C12.049,15.548 12.029,15.571 12.007,15.593C11.785,15.816 11.45,15.857 11.186,15.717C11.124,15.684 11.066,15.642 11.014,15.59Z" android:fillType="evenOdd" />
</vector>

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="62.0dip" android:width="62.0dip" android:autoMirrored="true" android:viewportWidth="62.0" android:viewportHeight="62.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_blue_primary_default" android:pathData="M18,0L44,0A18,18 0,0 1,62 18L62,44A18,18 0,0 1,44 62L18,62A18,18 0,0 1,0 44L0,18A18,18 0,0 1,18 0z" />
<path android:fillColor="#ffffffff" android:pathData="M37.985,16.412C37.342,16.412 36.821,16.934 36.821,17.576V19.903H25.178V17.577C25.178,16.934 24.657,16.413 24.014,16.413C23.371,16.413 22.85,16.934 22.85,17.577V19.903C20.74,19.905 19.629,19.935 18.767,20.374C17.953,20.789 17.292,21.451 16.877,22.264C16.406,23.189 16.406,24.4 16.406,26.822V38.209C16.406,40.631 16.406,41.842 16.877,42.767C17.292,43.581 17.953,44.242 18.767,44.657C19.692,45.128 20.903,45.128 23.325,45.128H38.676C41.098,45.128 42.309,45.128 43.234,44.657C44.047,44.242 44.709,43.581 45.124,42.767C45.595,41.842 45.595,40.631 45.595,38.209V26.822C45.595,24.4 45.595,23.189 45.124,22.264C44.709,21.451 44.047,20.789 43.234,20.374C42.371,19.935 41.26,19.905 39.15,19.903V17.576C39.15,16.934 38.628,16.412 37.985,16.412ZM29.357,36.984C29.336,36.964 29.316,36.943 29.298,36.921L24.838,32.461C24.383,32.007 24.383,31.269 24.838,30.815C25.293,30.36 26.03,30.36 26.484,30.815L30.182,34.512L36.207,28.487C36.662,28.033 37.399,28.033 37.853,28.487C38.308,28.942 38.308,29.679 37.853,30.134L31.113,36.875C31.082,36.914 31.049,36.953 31.012,36.989C30.644,37.357 30.091,37.427 29.653,37.2C29.546,37.145 29.446,37.074 29.357,36.984Z" android:fillType="evenOdd" />
</vector>

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="#00000000" android:pathData="M9.243,2.784C9.243,2.784 8.595,3.507 8.595,4.081C8.595,4.656 9.243,5.379 9.243,5.379C9.243,5.379 9.892,6.102 9.892,6.676C9.892,7.25 9.243,7.973 9.243,7.973" android:strokeColor="@color/color_yellow_primary_default" android:strokeWidth="1.2973" android:strokeLineCap="round" android:strokeLineJoin="round" />
<path android:fillColor="#00000000" android:pathData="M12.649,2.784C12.649,2.784 12,3.507 12,4.081C12,4.656 12.649,5.379 12.649,5.379C12.649,5.379 13.297,6.102 13.297,6.676C13.297,7.25 12.649,7.973 12.649,7.973" android:strokeColor="@color/color_yellow_primary_default" android:strokeWidth="1.2973" android:strokeLineCap="round" android:strokeLineJoin="round" />
<path android:fillColor="#00000000" android:pathData="M18,10.487H19.297C20.685,10.487 21.811,11.612 21.811,13C21.811,14.389 20.685,15.514 19.297,15.514H18V10.487Z" android:strokeColor="@color/color_yellow_primary_default" android:strokeWidth="1.2973" />
<path android:fillColor="@color/color_yellow_primary_default" android:pathData="M3,11.001C3,10.359 3.521,9.838 4.163,9.838H17.648C18.29,9.838 18.811,10.359 18.811,11.001V13.852C18.811,18.218 15.271,21.757 10.905,21.757C6.539,21.757 3,18.218 3,13.852V11.001Z" />
</vector>

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="62.0dip" android:width="62.0dip" android:autoMirrored="true" android:viewportWidth="62.0" android:viewportHeight="62.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_yellow_primary_default" android:pathData="M18,0L44,0A18,18 0,0 1,62 18L62,44A18,18 0,0 1,44 62L18,62A18,18 0,0 1,0 44L0,18A18,18 0,0 1,18 0z" />
<path android:fillColor="#00000000" android:pathData="M26.406,15.64C26.406,15.64 25.325,16.845 25.325,17.802C25.325,18.759 26.406,19.965 26.406,19.965C26.406,19.965 27.487,21.17 27.487,22.127C27.487,23.084 26.406,24.289 26.406,24.289" android:strokeColor="#ffffffff" android:strokeWidth="2.16216" android:strokeLineCap="round" android:strokeLineJoin="round" />
<path android:fillColor="#00000000" android:pathData="M32.081,15.64C32.081,15.64 31,16.845 31,17.802C31,18.759 32.081,19.965 32.081,19.965C32.081,19.965 33.162,21.17 33.162,22.127C33.162,23.084 32.081,24.289 32.081,24.289" android:strokeColor="#ffffffff" android:strokeWidth="2.16216" android:strokeLineCap="round" android:strokeLineJoin="round" />
<path android:fillColor="#00000000" android:pathData="M41,28.478H43.162C45.476,28.478 47.351,30.354 47.351,32.667C47.351,34.981 45.476,36.856 43.162,36.856H41V28.478Z" android:strokeColor="#ffffffff" android:strokeWidth="2.16216" />
<path android:fillColor="#ffffffff" android:pathData="M16,29.335C16,28.264 16.868,27.397 17.938,27.397H40.413C41.484,27.397 42.351,28.264 42.351,29.335V34.086C42.351,41.363 36.452,47.262 29.176,47.262C21.899,47.262 16,41.363 16,34.086V29.335Z" />
</vector>

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<vector android:height="24.0dip" android:width="24.0dip" android:autoMirrored="true" android:viewportWidth="24.0" android:viewportHeight="24.0"
xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/color_green_primary_default" android:pathData="M2.963,7.672C2.681,8.227 2.681,8.954 2.681,10.407V13.687C2.681,15.141 2.681,15.867 2.963,16.422C3.212,16.91 3.609,17.307 4.097,17.556C4.652,17.839 5.379,17.839 6.832,17.839H15.209C16.662,17.839 17.388,17.839 17.943,17.556C18.432,17.307 18.829,16.91 19.077,16.422C19.36,15.867 19.36,15.141 19.36,13.687V10.407C19.36,8.954 19.36,8.227 19.077,7.672C18.829,7.184 18.432,6.787 17.943,6.539C17.388,6.256 16.662,6.256 15.209,6.256H6.832C5.379,6.256 4.652,6.256 4.097,6.539C3.609,6.787 3.212,7.184 2.963,7.672ZM21.445,9.036C21.061,9.036 20.75,9.347 20.75,9.731V14.132C20.75,14.516 21.061,14.827 21.445,14.827C21.829,14.827 22.14,14.516 22.14,14.132V9.731C22.14,9.347 21.829,9.036 21.445,9.036Z" android:fillType="evenOdd" />
</vector>

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

Loading…
Cancel
Save