新增:自动任务·快捷指令 (开发中)
精简:界面调整 & 去除不常用资源 整理:code review
@ -1,25 +1,15 @@
|
|||||||
package com.idormy.sms.forwarder.adapter.spinner
|
package com.idormy.sms.forwarder.adapter.spinner
|
||||||
|
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import com.xuexiang.xutil.resource.ResUtils
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class AppListAdapterItem {
|
class AppListAdapterItem(
|
||||||
|
var name: String = "",
|
||||||
var name: String = ""
|
var icon: Drawable? = null,
|
||||||
var icon: Drawable? = null
|
|
||||||
var packageName: String? = null
|
var packageName: String? = null
|
||||||
|
) {
|
||||||
|
|
||||||
constructor(name: String, icon: Drawable?, packageName: String?) {
|
// 注意:自定义实体需要重写对象的 toString 方法
|
||||||
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方法
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return name
|
return name
|
||||||
}
|
}
|
||||||
@ -29,12 +19,8 @@ class AppListAdapterItem {
|
|||||||
return AppListAdapterItem(name)
|
return AppListAdapterItem(name)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun arrayof(title: Array<String>): Array<AppListAdapterItem?> {
|
fun arrayOf(vararg titles: String): Array<AppListAdapterItem> {
|
||||||
val array = arrayOfNulls<AppListAdapterItem>(title.size)
|
return titles.map { AppListAdapterItem(it) }.toTypedArray()
|
||||||
for (i in array.indices) {
|
|
||||||
array[i] = AppListAdapterItem(title[i])
|
|
||||||
}
|
|
||||||
return array
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,66 +1,14 @@
|
|||||||
package com.idormy.sms.forwarder.adapter.spinner
|
package com.idormy.sms.forwarder.adapter.spinner
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getDrawable
|
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
class SenderAdapterItem {
|
class SenderAdapterItem(
|
||||||
|
var title: CharSequence,
|
||||||
//标题内容
|
var icon: Drawable? = null,
|
||||||
var title: CharSequence
|
var id: Long? = 0L,
|
||||||
|
|
||||||
//图标
|
|
||||||
var icon: Drawable? = null
|
|
||||||
|
|
||||||
//ID
|
|
||||||
var id: Long? = 0L
|
|
||||||
|
|
||||||
//状态
|
|
||||||
var status: Int? = 1
|
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?) {
|
|
||||||
this.title = title
|
|
||||||
this.icon = icon
|
|
||||||
this.id = id
|
|
||||||
}
|
|
||||||
|
|
||||||
constructor(title: CharSequence, icon: Drawable?, id: Long?, status: Int?) {
|
|
||||||
this.title = title
|
|
||||||
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
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setId(id: Long): SenderAdapterItem {
|
|
||||||
this.id = id
|
|
||||||
return this
|
|
||||||
}
|
|
||||||
|
|
||||||
fun setTitle(title: CharSequence): SenderAdapterItem {
|
fun setTitle(title: CharSequence): SenderAdapterItem {
|
||||||
this.title = title
|
this.title = title
|
||||||
@ -72,22 +20,30 @@ class SenderAdapterItem {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
//注意:自定义实体需要重写对象的toString方法
|
fun setId(id: Long): SenderAdapterItem {
|
||||||
|
this.id = id
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setStatus(status: Int): SenderAdapterItem {
|
||||||
|
this.status = status
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
|
// 注意:自定义实体需要重写对象的 toString 方法
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
return title.toString()
|
return title.toString()
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
@JvmStatic
|
||||||
fun of(title: CharSequence): SenderAdapterItem {
|
fun of(title: CharSequence): SenderAdapterItem {
|
||||||
return SenderAdapterItem(title)
|
return SenderAdapterItem(title)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun arrayof(title: Array<CharSequence>): Array<SenderAdapterItem?> {
|
@JvmStatic
|
||||||
val array = arrayOfNulls<SenderAdapterItem>(title.size)
|
fun arrayOf(vararg titles: CharSequence): Array<SenderAdapterItem> {
|
||||||
for (i in array.indices) {
|
return titles.map { SenderAdapterItem(it) }.toTypedArray()
|
||||||
array[i] = SenderAdapterItem(title[i])
|
|
||||||
}
|
|
||||||
return array
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,13 @@
|
|||||||
package com.idormy.sms.forwarder.database.dao
|
package com.idormy.sms.forwarder.database.dao
|
||||||
|
|
||||||
import androidx.paging.PagingSource
|
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 androidx.sqlite.db.SupportSQLiteQuery
|
||||||
import com.idormy.sms.forwarder.database.entity.Rule
|
import com.idormy.sms.forwarder.database.entity.Rule
|
||||||
import io.reactivex.Completable
|
import io.reactivex.Completable
|
||||||
@ -45,4 +51,7 @@ interface RuleDao {
|
|||||||
@Transaction
|
@Transaction
|
||||||
@RawQuery(observedEntities = [Rule::class])
|
@RawQuery(observedEntities = [Rule::class])
|
||||||
fun getAllRaw(query: SupportSQLiteQuery): List<Rule>
|
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
|
package com.idormy.sms.forwarder.database.dao
|
||||||
|
|
||||||
import androidx.paging.PagingSource
|
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 androidx.sqlite.db.SupportSQLiteQuery
|
||||||
import com.idormy.sms.forwarder.database.entity.Sender
|
import com.idormy.sms.forwarder.database.entity.Sender
|
||||||
import io.reactivex.Completable
|
import io.reactivex.Completable
|
||||||
@ -29,6 +35,9 @@ interface SenderDao {
|
|||||||
@Query("SELECT * FROM Sender where id=:id")
|
@Query("SELECT * FROM Sender where id=:id")
|
||||||
fun getOne(id: Long): Sender
|
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")
|
@Query("SELECT count(*) FROM Sender where type=:type and status=:status")
|
||||||
fun count(type: String, status: Int): Single<Int>
|
fun count(type: String, status: Int): Single<Int>
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ interface TaskDao {
|
|||||||
fun get(id: Long): Single<Task>
|
fun get(id: Long): Single<Task>
|
||||||
|
|
||||||
@Query("SELECT * FROM Task where id=:id")
|
@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")
|
@Query("SELECT * FROM Task where type < 1000 ORDER BY id DESC")
|
||||||
fun pagingSourceFixed(): PagingSource<Int, Task>
|
fun pagingSourceFixed(): PagingSource<Int, Task>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
package com.idormy.sms.forwarder.database.entity
|
package com.idormy.sms.forwarder.database.entity
|
||||||
|
|
||||||
import android.os.Parcelable
|
import android.os.Parcelable
|
||||||
import com.idormy.sms.forwarder.utils.Log
|
|
||||||
import androidx.room.*
|
import androidx.room.*
|
||||||
import com.idormy.sms.forwarder.R
|
import com.idormy.sms.forwarder.R
|
||||||
import com.idormy.sms.forwarder.database.ext.ConvertersSenderList
|
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
|
val ruleMatch: String
|
||||||
get() {
|
get() {
|
||||||
val simStr = if ("app" == type) "" else SIM_SLOT_MAP[simSlot].toString() + getString(R.string.rule_card)
|
val simStr = if ("app" == type) "" else SIM_SLOT_MAP[simSlot].toString() + getString(R.string.rule_card)
|
||||||
|
@ -8,20 +8,11 @@ class ConvertersSenderList {
|
|||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun stringToObject(value: String): List<Sender> {
|
fun stringToObject(value: String): List<Sender> {
|
||||||
val senderList: MutableList<Sender> = mutableListOf()
|
return Core.sender.getByIds(value.split(",").map { it.trim().toLong() })
|
||||||
value.split(",").map { it.trim() }.forEach {
|
|
||||||
val sender = Core.sender.getOne(it.toLong())
|
|
||||||
senderList.add(sender)
|
|
||||||
}
|
|
||||||
return senderList
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@TypeConverter
|
@TypeConverter
|
||||||
fun objectToString(list: List<Sender>): String {
|
fun objectToString(list: List<Sender>): String {
|
||||||
val senderList = ArrayList<Long>()
|
return list.joinToString(",") { it.id.toString() }
|
||||||
list.forEach {
|
|
||||||
senderList += it.id
|
|
||||||
}
|
|
||||||
return senderList.joinToString(",")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,10 +1,10 @@
|
|||||||
package com.idormy.sms.forwarder.database.repository
|
package com.idormy.sms.forwarder.database.repository
|
||||||
|
|
||||||
import androidx.annotation.WorkerThread
|
import androidx.annotation.WorkerThread
|
||||||
|
import androidx.sqlite.db.SimpleSQLiteQuery
|
||||||
import com.idormy.sms.forwarder.database.dao.SenderDao
|
import com.idormy.sms.forwarder.database.dao.SenderDao
|
||||||
import com.idormy.sms.forwarder.database.entity.Sender
|
import com.idormy.sms.forwarder.database.entity.Sender
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import androidx.sqlite.db.SimpleSQLiteQuery
|
|
||||||
|
|
||||||
class SenderRepository(private val senderDao: SenderDao) {
|
class SenderRepository(private val senderDao: SenderDao) {
|
||||||
|
|
||||||
@ -23,6 +23,8 @@ class SenderRepository(private val senderDao: SenderDao) {
|
|||||||
|
|
||||||
fun getOne(id: Long) = senderDao.getOne(id)
|
fun getOne(id: Long) = senderDao.getOne(id)
|
||||||
|
|
||||||
|
fun getByIds(ids: List<Long>) = senderDao.getByIds(ids)
|
||||||
|
|
||||||
fun update(sender: Sender) = senderDao.update(sender)
|
fun update(sender: Sender) = senderDao.update(sender)
|
||||||
|
|
||||||
fun getAllNonCache(): List<Sender> {
|
fun getAllNonCache(): List<Sender> {
|
||||||
|
@ -10,7 +10,7 @@ class TaskRepository(private val taskDao: TaskDao) {
|
|||||||
@WorkerThread
|
@WorkerThread
|
||||||
fun insert(task: Task) = taskDao.insert(task)
|
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)
|
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>
|
senderListAll = senderList as MutableList<Sender>
|
||||||
for (sender in senderList) {
|
for (sender in senderList) {
|
||||||
val name = if (sender.name.length > 20) sender.name.substring(0, 19) else sender.name
|
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)
|
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
|
||||||
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
|
.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
|
layoutLocationSetting.visibility = if (SettingUtils.enableLocation) View.VISIBLE else View.GONE
|
||||||
switchEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
sbEnableLocation.setOnCheckedChangeListener { _: CompoundButton?, isChecked: Boolean ->
|
||||||
SettingUtils.enableLocation = isChecked
|
SettingUtils.enableLocation = isChecked
|
||||||
if (isChecked) {
|
if (isChecked) {
|
||||||
XXPermissions.with(this).permission(Permission.ACCESS_COARSE_LOCATION).permission(Permission.ACCESS_FINE_LOCATION).permission(Permission.ACCESS_BACKGROUND_LOCATION).request(object : OnPermissionCallback {
|
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)
|
XToastUtils.error(R.string.toast_denied)
|
||||||
}
|
}
|
||||||
SettingUtils.enableLocation = false
|
SettingUtils.enableLocation = false
|
||||||
switchEnableLocation.isChecked = false
|
sbEnableLocation.isChecked = false
|
||||||
restartLocationService("STOP")
|
restartLocationService("STOP")
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -155,7 +155,21 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
|
|||||||
"com.idormy.sms.forwarder.fragment.action.NotificationFragment",
|
"com.idormy.sms.forwarder.fragment.action.NotificationFragment",
|
||||||
"{\"\":\"\"}",
|
"{\"\":\"\"}",
|
||||||
CoreAnim.slide,
|
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(
|
PageInfo(
|
||||||
getString(R.string.task_frpc),
|
getString(R.string.task_frpc),
|
||||||
@ -172,11 +186,18 @@ class TasksEditFragment : BaseFragment<FragmentTasksEditBinding?>(), View.OnClic
|
|||||||
R.drawable.auto_task_icon_http_server
|
R.drawable.auto_task_icon_http_server
|
||||||
),
|
),
|
||||||
PageInfo(
|
PageInfo(
|
||||||
getString(R.string.task_cleaner),
|
getString(R.string.task_rule),
|
||||||
"com.idormy.sms.forwarder.fragment.action.CleanerFragment",
|
"com.idormy.sms.forwarder.fragment.action.RuleFragment",
|
||||||
"{\"\":\"\"}",
|
"{\"\":\"\"}",
|
||||||
CoreAnim.slide,
|
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()) {
|
if ((typeCondition == TASK_CONDITION_TO_ADDRESS || typeCondition == TASK_CONDITION_LEAVE_ADDRESS) && !App.LocationClient.isStarted()) {
|
||||||
MaterialDialog.Builder(requireContext())
|
MaterialDialog.Builder(requireContext())
|
||||||
.iconRes(R.drawable.auto_task_icon_location)
|
.iconRes(R.drawable.icon_location)
|
||||||
.title(R.string.enable_location)
|
.title(R.string.enable_location)
|
||||||
.content(R.string.enable_location_dialog)
|
.content(R.string.enable_location_dialog)
|
||||||
.cancelable(false)
|
.cancelable(false)
|
||||||
|
@ -37,8 +37,6 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
|
|||||||
@AutoWired(name = KEY_EVENT_DATA_ACTION)
|
@AutoWired(name = KEY_EVENT_DATA_ACTION)
|
||||||
var eventData: String? = null
|
var eventData: String? = null
|
||||||
|
|
||||||
private var description = "测试描述"
|
|
||||||
|
|
||||||
override fun initArgs() {
|
override fun initArgs() {
|
||||||
XRouter.getInstance().inject(this)
|
XRouter.getInstance().inject(this)
|
||||||
}
|
}
|
||||||
@ -139,7 +137,7 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
|
|||||||
R.id.btn_save -> {
|
R.id.btn_save -> {
|
||||||
val settingVo = checkSetting()
|
val settingVo = checkSetting()
|
||||||
val intent = Intent()
|
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))
|
intent.putExtra(KEY_BACK_DATA_ACTION, Gson().toJson(settingVo))
|
||||||
setFragmentResult(TASK_ACTION_FRPC, intent)
|
setFragmentResult(TASK_ACTION_FRPC, intent)
|
||||||
popToBack()
|
popToBack()
|
||||||
@ -158,6 +156,7 @@ class FrpcFragment : BaseFragment<FragmentTasksActionFrpcBinding?>(), View.OnCli
|
|||||||
private fun checkSetting(): FrpcSetting {
|
private fun checkSetting(): FrpcSetting {
|
||||||
val startUid = binding!!.etStartUid.text.toString().trim()
|
val startUid = binding!!.etStartUid.text.toString().trim()
|
||||||
val stopUid = binding!!.etStopUid.text.toString().trim()
|
val stopUid = binding!!.etStopUid.text.toString().trim()
|
||||||
|
val description: String
|
||||||
val action: String
|
val action: String
|
||||||
val uids: String
|
val uids: String
|
||||||
if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) {
|
if (binding!!.rgFrpcState.checkedRadioButtonId == R.id.rb_start_server) {
|
||||||
|
@ -5,7 +5,11 @@ import android.content.Intent
|
|||||||
import android.view.LayoutInflater
|
import android.view.LayoutInflater
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
|
import android.widget.CompoundButton
|
||||||
import com.google.gson.Gson
|
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.R
|
||||||
import com.idormy.sms.forwarder.core.BaseFragment
|
import com.idormy.sms.forwarder.core.BaseFragment
|
||||||
import com.idormy.sms.forwarder.databinding.FragmentTasksActionHttpServerBinding
|
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_EVENT_DATA_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
import com.idormy.sms.forwarder.utils.KEY_TEST_ACTION
|
||||||
import com.idormy.sms.forwarder.utils.Log
|
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.TASK_ACTION_HTTPSERVER
|
||||||
import com.idormy.sms.forwarder.utils.XToastUtils
|
import com.idormy.sms.forwarder.utils.XToastUtils
|
||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
@ -101,6 +106,34 @@ class HttpServerFragment : BaseFragment<FragmentTasksActionHttpServerBinding?>()
|
|||||||
XToastUtils.error(it, 30000)
|
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
|
@SingleClick
|
||||||
@ -195,4 +228,96 @@ class HttpServerFragment : BaseFragment<FragmentTasksActionHttpServerBinding?>()
|
|||||||
|
|
||||||
return HttpServerSetting(description.toString(), action, enableApiClone, enableApiSmsSend, enableApiSmsQuery, enableApiCallQuery, enableApiContactQuery, enableApiContactAdd, enableApiWol, enableApiLocation, enableApiBatteryQuery)
|
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>
|
senderListAll = senderList as MutableList<Sender>
|
||||||
for (sender in senderList) {
|
for (sender in senderList) {
|
||||||
val name = if (sender.name.length > 20) sender.name.substring(0, 19) else sender.name
|
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)
|
senderSpinnerAdapter = SenderSpinnerAdapter(senderSpinnerList)
|
||||||
.setIsFilterKey(true).setFilterColor("#EF5362").setBackgroundSelector(R.drawable.selector_custom_spinner_bg)
|
.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) {
|
when (v.id) {
|
||||||
R.id.btn_current_coordinates -> {
|
R.id.btn_current_coordinates -> {
|
||||||
if (!App.LocationClient.isStarted()) {
|
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
|
SettingUtils.enableLocation = true
|
||||||
val serviceIntent = Intent(requireContext(), LocationService::class.java)
|
val serviceIntent = Intent(requireContext(), LocationService::class.java)
|
||||||
serviceIntent.action = "START"
|
serviceIntent.action = "START"
|
||||||
|
@ -172,7 +172,7 @@ class ToAddressFragment : BaseFragment<FragmentTasksConditionToAddressBinding?>(
|
|||||||
when (v.id) {
|
when (v.id) {
|
||||||
R.id.btn_current_coordinates -> {
|
R.id.btn_current_coordinates -> {
|
||||||
if (!App.LocationClient.isStarted()) {
|
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
|
SettingUtils.enableLocation = true
|
||||||
val serviceIntent = Intent(requireContext(), LocationService::class.java)
|
val serviceIntent = Intent(requireContext(), LocationService::class.java)
|
||||||
serviceIntent.action = "START"
|
serviceIntent.action = "START"
|
||||||
|
@ -2,15 +2,13 @@ package com.idormy.sms.forwarder.utils
|
|||||||
|
|
||||||
object Worker {
|
object Worker {
|
||||||
const val sendMsgInfo = "send_msg_info"
|
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 updateLogs = "update_logs"
|
||||||
|
|
||||||
//const val ruleId = "rule_id"
|
|
||||||
const val rule = "rule"
|
const val rule = "rule"
|
||||||
const val senderIndex = "sender_index"
|
const val senderIndex = "sender_index"
|
||||||
const val msgId = "msg_id"
|
const val msgId = "msg_id"
|
||||||
|
//const val ruleId = "rule_id"
|
||||||
|
//const val sendLogId = "send_log_id"
|
||||||
|
//const val sendSbnId = "send_sbn_id"
|
||||||
}
|
}
|
||||||
|
|
||||||
object TaskWorker {
|
object TaskWorker {
|
||||||
@ -237,9 +235,12 @@ const val TASK_CONDITION_LOCK_SCREEN = 1007
|
|||||||
//注意:TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION,不可改变
|
//注意:TASK_ACTION_XXX 枚举值 等于 TASK_ACTION_FRAGMENT_LIST 索引加上 KEY_BACK_CODE_ACTION,不可改变
|
||||||
const val TASK_ACTION_SENDSMS = 2000
|
const val TASK_ACTION_SENDSMS = 2000
|
||||||
const val TASK_ACTION_NOTIFICATION = 2001
|
const val TASK_ACTION_NOTIFICATION = 2001
|
||||||
const val TASK_ACTION_FRPC = 2002
|
const val TASK_ACTION_CLEANER = 2002
|
||||||
const val TASK_ACTION_HTTPSERVER = 2003
|
const val TASK_ACTION_SETTINGS = 2003
|
||||||
const val TASK_ACTION_CLEANER = 2004
|
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_INFO = "battery_info"
|
||||||
const val SP_BATTERY_STATUS = "battery_status"
|
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_FRPC
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_HTTPSERVER
|
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_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_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_BATTERY
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CHARGE
|
||||||
import com.idormy.sms.forwarder.utils.TASK_CONDITION_CRON
|
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_CHARGE -> R.drawable.auto_task_icon_charge
|
||||||
TASK_CONDITION_LOCK_SCREEN -> R.drawable.auto_task_icon_lock_screen
|
TASK_CONDITION_LOCK_SCREEN -> R.drawable.auto_task_icon_lock_screen
|
||||||
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms
|
TASK_ACTION_SENDSMS -> R.drawable.auto_task_icon_sms
|
||||||
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender
|
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification
|
||||||
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc
|
|
||||||
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server
|
|
||||||
TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner
|
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
|
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_CHARGE -> R.drawable.auto_task_icon_charge_grey
|
||||||
TASK_CONDITION_LOCK_SCREEN -> R.drawable.auto_task_icon_lock_screen_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_SENDSMS -> R.drawable.auto_task_icon_sms_grey
|
||||||
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_sender_grey
|
TASK_ACTION_NOTIFICATION -> R.drawable.auto_task_icon_notification_grey
|
||||||
TASK_ACTION_FRPC -> R.drawable.auto_task_icon_frpc_grey
|
|
||||||
TASK_ACTION_HTTPSERVER -> R.drawable.auto_task_icon_http_server_grey
|
|
||||||
TASK_ACTION_CLEANER -> R.drawable.auto_task_icon_cleaner_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
|
else -> R.drawable.auto_task_icon_custom_time_grey
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ import android.content.Intent
|
|||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
import androidx.core.app.ActivityCompat
|
import androidx.core.app.ActivityCompat
|
||||||
import androidx.work.CoroutineWorker
|
import androidx.work.CoroutineWorker
|
||||||
|
import androidx.work.OneTimeWorkRequestBuilder
|
||||||
|
import androidx.work.WorkManager
|
||||||
import androidx.work.WorkerParameters
|
import androidx.work.WorkerParameters
|
||||||
import com.google.gson.Gson
|
import com.google.gson.Gson
|
||||||
import com.idormy.sms.forwarder.App
|
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.CleanerSetting
|
||||||
import com.idormy.sms.forwarder.entity.action.FrpcSetting
|
import com.idormy.sms.forwarder.entity.action.FrpcSetting
|
||||||
import com.idormy.sms.forwarder.entity.action.HttpServerSetting
|
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.entity.action.SmsSetting
|
||||||
import com.idormy.sms.forwarder.service.HttpServerService
|
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.CacheUtils
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
import com.idormy.sms.forwarder.utils.EVENT_TOAST_ERROR
|
||||||
import com.idormy.sms.forwarder.utils.EVENT_TOAST_INFO
|
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.Log
|
||||||
import com.idormy.sms.forwarder.utils.PhoneUtils
|
import com.idormy.sms.forwarder.utils.PhoneUtils
|
||||||
import com.idormy.sms.forwarder.utils.SendUtils
|
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_CLEANER
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_FRPC
|
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_HTTPSERVER
|
||||||
import com.idormy.sms.forwarder.utils.TASK_ACTION_NOTIFICATION
|
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_SENDSMS
|
||||||
|
import com.idormy.sms.forwarder.utils.TASK_ACTION_SETTINGS
|
||||||
import com.idormy.sms.forwarder.utils.TaskWorker
|
import com.idormy.sms.forwarder.utils.TaskWorker
|
||||||
import com.jeremyliao.liveeventbus.LiveEventBus
|
import com.jeremyliao.liveeventbus.LiveEventBus
|
||||||
import com.xuexiang.xrouter.utils.TextUtils
|
import com.xuexiang.xrouter.utils.TextUtils
|
||||||
|
import com.xuexiang.xutil.XUtil
|
||||||
import com.xuexiang.xutil.file.FileUtils
|
import com.xuexiang.xutil.file.FileUtils
|
||||||
import com.xuexiang.xutil.resource.ResUtils.getString
|
import com.xuexiang.xutil.resource.ResUtils.getString
|
||||||
import frpclib.Frpclib
|
import frpclib.Frpclib
|
||||||
@ -112,6 +119,73 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
writeLog("send notification success", "SUCCESS")
|
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 -> {
|
TASK_ACTION_FRPC -> {
|
||||||
if (!FileUtils.isFileExists(App.context.filesDir?.absolutePath + "/libs/libgojni.so")) {
|
if (!FileUtils.isFileExists(App.context.filesDir?.absolutePath + "/libs/libgojni.so")) {
|
||||||
writeLog("还未下载Frpc库")
|
writeLog("还未下载Frpc库")
|
||||||
@ -182,27 +256,6 @@ class ActionWorker(context: Context, params: WorkerParameters) : CoroutineWorker
|
|||||||
writeLog("httpServer success", "SUCCESS")
|
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 -> {
|
else -> {
|
||||||
writeLog("action.type is ${action.type}")
|
writeLog("action.type is ${action.type}")
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 414 B After Width: | Height: | Size: 414 B |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 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.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: 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"?>
|
<?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"
|
<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">
|
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" />
|
<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>
|
</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>
|
|