Merge code

This commit is contained in:
2022-03-25 23:47:20 +08:00
parent 2fde4ae833
commit 9393a87c63
10 changed files with 192 additions and 122 deletions

View File

@@ -41,14 +41,20 @@ object Const {
const val MODULE_VERSION_CODE = BuildConfig.VERSION_CODE
/** 当前模块的版本校验 */
const val MODULE_VERSION_VERIFY = "${MODULE_VERSION_NAME}_${MODULE_VERSION_CODE}_202103240401"
const val MODULE_VERSION_VERIFY = "${MODULE_VERSION_NAME}_${MODULE_VERSION_CODE}_202203252250"
/** 当前模块的版本校验标签 */
const val MODULE_VERSION_VERIFY_TAG = "module_version_verify"
/** 发送通讯广播号标签 */
const val ACTION_MODULE_CHECKING_RECEIVER = "mnn_checking_action"
/** 发送通讯广播号标签 - 模块激活状态 */
const val ACTION_MODULE_CHECKING_RECEIVER = "mnn_module_checking_action"
/** 接收通讯广播号标签 */
const val ACTION_MODULE_HANDLER_RECEIVER = "mnn_handler_action"
/** 接收通讯广播号标签 - 模块激活状态 */
const val ACTION_MODULE_HANDLER_RECEIVER = "mnn_module_handler_action"
/** 发送通讯广播号标签 - 通知系统界面刷新 */
const val ACTION_REMIND_CHECKING_RECEIVER = "mnn_remind_checking_action"
/** 接收通讯广播号标签 - 通知系统界面刷新 */
const val ACTION_REMIND_HANDLER_RECEIVER = "mnn_remind_handler_action"
}

View File

@@ -20,7 +20,7 @@
*
* This file is Created by fankes on 2022/1/24.
*/
@file:Suppress("DEPRECATION", "SetWorldReadable")
@file:Suppress("SetWorldReadable")
package com.fankes.miui.notify.hook

View File

@@ -55,7 +55,6 @@ import com.fankes.miui.notify.utils.drawable.drawabletoolbox.DrawableBuilder
import com.fankes.miui.notify.utils.factory.*
import com.fankes.miui.notify.utils.tool.BitmapCompatTool
import com.fankes.miui.notify.utils.tool.IconAdaptationTool
import com.fankes.miui.notify.utils.tool.IconRuleManagerTool
import com.highcapable.yukihookapi.hook.bean.VariousClass
import com.highcapable.yukihookapi.hook.entity.YukiBaseHooker
import com.highcapable.yukihookapi.hook.factory.field
@@ -160,18 +159,39 @@ class SystemUIHooker : YukiBaseHooker() {
}
/** 模块广播接收器 */
private val moduleReceiver by lazy {
private val moduleCheckingReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
context?.sendBroadcast(Intent().apply {
action = Const.ACTION_MODULE_HANDLER_RECEIVER
putExtra("isAction", true)
putExtra("isValied", intent?.getStringExtra(Const.MODULE_VERSION_VERIFY_TAG) == Const.MODULE_VERSION_VERIFY)
putExtra("isRegular", true)
putExtra("isValied", intent?.isValiedModule)
})
}
}
}
/** 通知广播接收器 */
private val remindCheckingReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) = delayedRun(ms = 300) {
if (intent?.isValiedModule == true)
recachingPrefs(intent.getBooleanExtra("isRefreshCacheOnly", false))
context?.sendBroadcast(Intent().apply {
action = Const.ACTION_REMIND_HANDLER_RECEIVER
putExtra("isGrasp", true)
putExtra("isValied", intent?.isValiedModule)
})
}
}
}
/**
* 判断模块和宿主版本是否一致
* @return [Boolean]
*/
private val Intent.isValiedModule get() = getStringExtra(Const.MODULE_VERSION_VERIFY_TAG) == Const.MODULE_VERSION_VERIFY
/**
* 注册广播接收器
* @param context 实例
@@ -179,7 +199,8 @@ class SystemUIHooker : YukiBaseHooker() {
private fun registerReceiver(context: Context) {
if (isRegisterReceiver) return
context.registerReceiver(userPresentReceiver, IntentFilter().apply { addAction(Intent.ACTION_USER_PRESENT) })
context.registerReceiver(moduleReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_CHECKING_RECEIVER) })
context.registerReceiver(moduleCheckingReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_CHECKING_RECEIVER) })
context.registerReceiver(remindCheckingReceiver, IntentFilter().apply { addAction(Const.ACTION_REMIND_CHECKING_RECEIVER) })
isRegisterReceiver = true
}
@@ -558,11 +579,15 @@ class SystemUIHooker : YukiBaseHooker() {
}
}
/** 刷新缓存数据 */
private fun recachingPrefs() {
/**
* 刷新缓存数据
* @param isRefreshCacheOnly 仅刷新缓存不刷新图标和通知改变 - 默认:否
*/
private fun recachingPrefs(isRefreshCacheOnly: Boolean = false) {
isUsingCachingMethod = true
prefs.clearCache()
cachingIconDatas()
if (isRefreshCacheOnly) return
refreshStatusBarIcons()
refreshNotificationIcons()
}
@@ -609,10 +634,6 @@ class SystemUIHooker : YukiBaseHooker() {
expandedNf,
(result as Icon).loadDrawable(context)
) { icon, isReplace -> if (isReplace) result = Icon.createWithBitmap(icon.toBitmap()) }
/** 刷新缓存 */
if (expandedNf?.compatOpPkgName == Const.MODULE_PACKAGE_NAME &&
expandedNf.notification?.channelId == IconRuleManagerTool.NOTIFY_CHANNEL
) recachingPrefs()
}
}
}

View File

@@ -24,7 +24,8 @@
package com.fankes.miui.notify.ui.activity
import android.content.*
import android.content.ComponentName
import android.content.Intent
import android.content.pm.PackageManager
import androidx.core.view.isGone
import androidx.core.view.isVisible
@@ -63,8 +64,8 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
/** 警告对话框是否显示 */
private var isWarnDialogShowing = false
/** 模块是否激活 */
private var isModuleAction = false
/** 模块是否可用 */
private var isModuleRegular = false
/** 模块是否有效 */
private var isModuleValied = false
@@ -201,7 +202,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.notifyIconFixNotifySwitch.setOnCheckedChangeListener { btn, b ->
if (!btn.isPressed) return@setOnCheckedChangeListener
modulePrefs.putBoolean(ENABLE_NOTIFY_ICON_FIX_NOTIFY, b)
SystemUITool.refreshSystemUI(context = this)
SystemUITool.refreshSystemUI(context = this, isRefreshCacheOnly = true)
}
/** 通知图标优化名单按钮点击事件 */
binding.notifyIconFixButton.setOnClickListener { navigate<ConfigureActivity>() }
@@ -241,8 +242,6 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.linkWithFollowMe.setOnClickListener {
openBrowser(url = "https://www.coolapk.com/u/876977", packageName = "com.coolapk.market")
}
/** 注册广播检查模块激活状态 */
registerReceiver(hostReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_HANDLER_RECEIVER) })
}
/** 刷新模块状态 */
@@ -250,7 +249,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.mainLinStatus.setBackgroundResource(
when {
(isXposedModuleActive && isMiuiNotifyStyle) ||
(isXposedModuleActive && (!isModuleAction || !isModuleValied)) -> R.drawable.bg_yellow_round
(isXposedModuleActive && (!isModuleRegular || !isModuleValied)) -> R.drawable.bg_yellow_round
isXposedModuleActive -> R.drawable.bg_green_round
else -> R.drawable.bg_dark_round
}
@@ -264,9 +263,9 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
binding.mainTextStatus.text =
when {
isXposedModuleActive && isMiuiNotifyStyle -> "模块已激活,但未在工作"
isXposedModuleActive && !isModuleAction &&
isXposedModuleActive && !isModuleRegular &&
!modulePrefs.getBoolean(ENABLE_MODULE, default = true) -> "模块已停用"
isXposedModuleActive && !isModuleAction -> "模块已激活,请重启系统界面"
isXposedModuleActive && !isModuleRegular -> "模块已激活,请重启系统界面"
isXposedModuleActive && !isModuleValied -> "模块已更新,请重启系统界面"
isXposedModuleActive -> "模块已激活"
else -> "模块未激活"
@@ -280,10 +279,11 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
/** 刷新模块状态 */
refreshModuleStatus()
/** 发送广播检查模块激活状态 */
sendBroadcast(Intent().apply {
action = Const.ACTION_MODULE_CHECKING_RECEIVER
putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY)
})
SystemUITool.checkingActivated(context = this) { isRegular, isValied ->
isModuleRegular = isRegular
isModuleValied = isValied
refreshModuleStatus()
}
/** 经典样式启用后给出警告 */
if (!isWarnDialogShowing && isXposedModuleActive && isMiuiNotifyStyle)
showDialog {
@@ -308,21 +308,4 @@ class MainActivity : BaseActivity<ActivityMainBinding>() {
noCancelable()
}
}
override fun onDestroy() {
super.onDestroy()
/** 取消注册广播 */
unregisterReceiver(hostReceiver)
}
/** 宿主广播接收器 */
private val hostReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
isModuleAction = intent?.getBooleanExtra("isAction", false) ?: false
isModuleValied = intent?.getBooleanExtra("isValied", false) ?: false
refreshModuleStatus()
}
}
}
}

View File

@@ -29,6 +29,7 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.viewbinding.ViewBinding
import com.fankes.miui.notify.R
import com.fankes.miui.notify.utils.factory.isNotSystemInDarkMode
import com.fankes.miui.notify.utils.tool.SystemUITool
import com.gyf.immersionbar.ktx.immersionBar
import com.highcapable.yukihookapi.hook.factory.method
import com.highcapable.yukihookapi.hook.type.android.LayoutInflaterClass
@@ -61,10 +62,18 @@ abstract class BaseActivity<VB : ViewBinding> : AppCompatActivity() {
navigationBarDarkIcon(isNotSystemInDarkMode)
fitsSystemWindows(true)
}
/** 注册 */
SystemUITool.register(context = this)
/** 装载子类 */
onCreate()
}
/** 回调 [onCreate] 方法 */
abstract fun onCreate()
override fun onDestroy() {
super.onDestroy()
/** 解除注册 */
SystemUITool.unregister(context = this)
}
}

View File

@@ -38,6 +38,7 @@ import android.graphics.drawable.Drawable
import android.net.ConnectivityManager
import android.net.Uri
import android.os.Build
import android.os.Handler
import android.provider.Settings
import android.util.Base64
import android.widget.Toast
@@ -444,4 +445,11 @@ fun Context.copyToClipboard(content: String) = runInSafe {
if (it != content) snake(msg = "复制失败") else snake(msg = "已复制")
}
}
}
}
/**
* 延迟执行
* @param ms 毫秒 - 默认150
* @param it 方法体
*/
fun Any?.delayedRun(ms: Long = 150, it: () -> Unit) = runInSafe { Handler().postDelayed({ it() }, ms) }

View File

@@ -47,6 +47,9 @@ import com.fankes.miui.notify.utils.factory.runInSafe
*/
object IconAdaptationTool {
/** 推送通知的渠道名称 */
private const val NOTIFY_CHANNEL = "notifyRuleSupportId"
/**
* 使用的小图标
* @return [Bitmap]
@@ -116,11 +119,11 @@ object IconAdaptationTool {
context.getSystemService(NotificationManager::class.java)?.apply {
createNotificationChannel(
NotificationChannel(
IconRuleManagerTool.NOTIFY_CHANNEL, "通知图标优化适配",
NOTIFY_CHANNEL, "通知图标优化适配",
NotificationManager.IMPORTANCE_DEFAULT
).apply { enableLights(false) }
)
notify(packageName.hashCode(), Notification.Builder(context, IconRuleManagerTool.NOTIFY_CHANNEL).apply {
notify(packageName.hashCode(), Notification.Builder(context, NOTIFY_CHANNEL).apply {
setShowWhen(true)
setContentTitle("您已安装 ${context.findAppName(packageName)}")
setContentText("尚未适配此应用,点按打开在线规则。")

View File

@@ -20,7 +20,7 @@
*
* This file is Created by fankes on 2022/2/25.
*/
@file:Suppress("TrustAllX509TrustManager", "CustomX509TrustManager", "DEPRECATION", "IMPLICIT_CAST_TO_ANY")
@file:Suppress("TrustAllX509TrustManager", "CustomX509TrustManager", "IMPLICIT_CAST_TO_ANY")
package com.fankes.miui.notify.utils.tool
@@ -32,7 +32,6 @@ import android.content.Context
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Handler
import android.provider.Settings
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.NotificationCompat
@@ -40,7 +39,6 @@ import androidx.core.content.getSystemService
import androidx.core.view.isVisible
import androidx.core.widget.doOnTextChanged
import com.fankes.miui.notify.R
import com.fankes.miui.notify.application.MNNApplication.Companion.appContext
import com.fankes.miui.notify.databinding.DiaSourceFromBinding
import com.fankes.miui.notify.databinding.DiaSourceFromStringBinding
import com.fankes.miui.notify.hook.HookConst.SOURCE_SYNC_WAY
@@ -50,7 +48,9 @@ import com.fankes.miui.notify.hook.HookConst.TYPE_SOURCE_SYNC_WAY_2
import com.fankes.miui.notify.hook.HookConst.TYPE_SOURCE_SYNC_WAY_3
import com.fankes.miui.notify.params.IconPackParams
import com.fankes.miui.notify.ui.activity.ConfigureActivity
import com.fankes.miui.notify.utils.factory.*
import com.fankes.miui.notify.utils.factory.safeOfNull
import com.fankes.miui.notify.utils.factory.showDialog
import com.fankes.miui.notify.utils.factory.snake
import com.highcapable.yukihookapi.hook.factory.modulePrefs
import com.highcapable.yukihookapi.hook.log.loggerD
import okhttp3.*
@@ -65,7 +65,7 @@ import javax.net.ssl.*
object IconRuleManagerTool {
/** 推送通知的渠道名称 */
const val NOTIFY_CHANNEL = "notifyRuleUpdateId"
private const val NOTIFY_CHANNEL = "notifyRuleUpdateId"
/** 当前规则的系统名称 */
private const val OS_TAG = "MIUI"
@@ -139,7 +139,7 @@ object IconRuleManagerTool {
dataJson2 = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]"
)
)
pushAndNotifyRefresh(context)
notifyRefresh(context)
it()
}
else -> context.snake(msg = "请输入有效内容")
@@ -152,7 +152,7 @@ object IconRuleManagerTool {
jsonString.isNotBlank() && params.isNotVaildJson(jsonString) -> context.snake(msg = "不是有效的 JSON 数据")
jsonString.isNotBlank() -> {
params.save(dataJson = jsonString.takeIf { params.isJsonArray(it) } ?: "[$jsonString]")
pushAndNotifyRefresh(context)
notifyRefresh(context)
it()
}
else -> context.snake(msg = "请输入有效内容")
@@ -216,7 +216,7 @@ object IconRuleManagerTool {
params.isCompareDifferent(it) -> {
params.save(it)
pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看")
pushAndNotifyRefresh(context)
notifyRefresh(context)
it()
}
else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新"))
@@ -265,7 +265,7 @@ object IconRuleManagerTool {
params.isCompareDifferent(content) -> {
params.save(content)
pushNotify(context, title = "同步完成", msg = "已更新通知图标优化名单,点击查看")
pushAndNotifyRefresh(context)
notifyRefresh(context)
it()
}
else -> (if (context is AppCompatActivity) context.snake(msg = "列表数据已是最新"))
@@ -358,44 +358,13 @@ object IconRuleManagerTool {
})
}.onFailure { it(false, "URL 无效") }
/**
* 刷新系统界面状态栏与通知图标
* @param context 实例
*/
fun refreshSystemUI(context: Context) {
if (context !is AppCompatActivity) return
if (isNotNoificationEnabled)
context.showDialog {
title = "模块的通知权限已关闭"
msg = "请开启通知权限然后重启系统界面,否则无法动态刷新系统界面使更改生效。"
confirmButton { context.openNotifySetting() }
cancelButton()
noCancelable()
}
else
context.showDialog {
title = "请稍后"
progressContent = "正在刷新系统界面改变"
/** 发送通知提醒宿主更新图标缓存 */
pushNotify(appContext, title = "请稍后", msg = "正在等待系统界面响应", isAction = false)
/** 刷新成功后取消通知 */
Handler().postDelayed({
context.getSystemService<NotificationManager>()?.cancel(1)
cancel()
}, 1000)
noCancelable()
}
}
/**
* 推送通知图标更新通知
* @param context 实例
*/
private fun pushAndNotifyRefresh(context: Context) {
private fun notifyRefresh(context: Context) {
if (context !is AppCompatActivity) return
SystemUITool.showNeedUpdateApplySnake(context)
/** 刷新改变 */
refreshSystemUI(context)
SystemUITool.refreshSystemUI(context) { context.snake(msg = "通知图标优化名单已完成同步") }
}
/**
@@ -414,9 +383,8 @@ object IconRuleManagerTool {
* @param context 实例 - 类型为 [AppCompatActivity] 时将不会推送通知
* @param title 通知标题
* @param msg 通知消息
* @param isAction 是否增加点击跳转事件 - 默认:是
*/
private fun pushNotify(context: Context, title: String, msg: String, isAction: Boolean = true) {
private fun pushNotify(context: Context, title: String, msg: String) {
if (context !is AppCompatActivity)
context.getSystemService<NotificationManager>()?.apply {
createNotificationChannel(
@@ -425,15 +393,15 @@ object IconRuleManagerTool {
NotificationManager.IMPORTANCE_DEFAULT
)
)
notify(if (isAction) 0 else 1, NotificationCompat.Builder(context, NOTIFY_CHANNEL).apply {
notify(0, NotificationCompat.Builder(context, NOTIFY_CHANNEL).apply {
setContentTitle(title)
setContentText(msg)
color = OS_COLOR.toInt()
setAutoCancel(true)
setSmallIcon(if (isAction) R.drawable.ic_nf_icon_update else R.drawable.ic_nf_icon_refresh)
setSmallIcon(R.drawable.ic_nf_icon_update)
setSound(null)
setDefaults(NotificationCompat.DEFAULT_ALL)
if (isAction) setContentIntent(
setContentIntent(
PendingIntent.getActivity(
context, msg.hashCode(),
Intent(context, ConfigureActivity::class.java).apply { putExtra("isShowUpdDialog", false) },

View File

@@ -22,11 +22,12 @@
*/
package com.fankes.miui.notify.utils.tool
import android.content.BroadcastReceiver
import android.content.Context
import com.fankes.miui.notify.utils.factory.execShellSu
import com.fankes.miui.notify.utils.factory.showDialog
import com.fankes.miui.notify.utils.factory.snake
import com.fankes.miui.notify.utils.factory.toast
import android.content.Intent
import android.content.IntentFilter
import com.fankes.miui.notify.const.Const
import com.fankes.miui.notify.utils.factory.*
import com.google.android.material.snackbar.Snackbar
import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
@@ -35,6 +36,45 @@ import com.highcapable.yukihookapi.hook.factory.isXposedModuleActive
*/
object SystemUITool {
/** 宿主广播回调 */
private var moduleHandlerCallback: ((Boolean, Boolean) -> Unit)? = null
/** 通知广播回调 */
private var remindHandlerCallback: ((Boolean, Boolean) -> Unit)? = null
/**
* 注册广播
* @param context 实例
*/
fun register(context: Context) {
/** 注册广播检查模块激活状态 */
context.registerReceiver(moduleHandlerReceiver, IntentFilter().apply { addAction(Const.ACTION_MODULE_HANDLER_RECEIVER) })
/** 注册广播通知系统界面改变 */
context.registerReceiver(remindHandlerReceiver, IntentFilter().apply { addAction(Const.ACTION_REMIND_HANDLER_RECEIVER) })
}
/**
* 取消注册广播
* @param context 实例
*/
fun unregister(context: Context) {
context.unregisterReceiver(moduleHandlerReceiver)
context.unregisterReceiver(remindHandlerReceiver)
}
/**
* 检查模块是否激活
* @param context 实例
* @param it 成功后回调 - ([Boolean] 是否激活,[Boolean] 是否有效)
*/
fun checkingActivated(context: Context, it: (Boolean, Boolean) -> Unit) {
moduleHandlerCallback = it
context.sendBroadcast(Intent().apply {
action = Const.ACTION_MODULE_CHECKING_RECEIVER
putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY)
})
}
/**
* 重启系统界面
* @param context 实例
@@ -58,10 +98,40 @@ object SystemUITool {
/**
* 刷新系统界面状态栏与通知图标
* @param context 实例
* @param isRefreshCacheOnly 仅刷新缓存不刷新图标和通知改变 - 默认:否
* @param it 成功后回调
*/
fun refreshSystemUI(context: Context) =
fun refreshSystemUI(context: Context, isRefreshCacheOnly: Boolean = false, it: () -> Unit = {}) =
if (isXposedModuleActive)
IconRuleManagerTool.refreshSystemUI(context)
context.showDialog {
title = "请稍后"
progressContent = "正在等待系统界面刷新"
/** 是否等待成功 */
var isWaited = false
/** 设置等待延迟 */
delayedRun(ms = 5000) {
if (isWaited) return@delayedRun
remindHandlerCallback = null
cancel()
context.snake(msg = "预计响应超时,建议重启系统界面", actionText = "立即重启") { restartSystemUI(context) }
}
remindHandlerCallback = { isGrasp, isValied ->
remindHandlerCallback = null
cancel()
isWaited = true
when {
isGrasp && !isValied ->
context.snake(msg = "请重启系统界面以生效模块更新", actionText = "立即重启") { restartSystemUI(context) }
else -> it()
}
}
context.sendBroadcast(Intent().apply {
action = Const.ACTION_REMIND_CHECKING_RECEIVER
putExtra("isRefreshCacheOnly", isRefreshCacheOnly)
putExtra(Const.MODULE_VERSION_VERIFY_TAG, Const.MODULE_VERSION_VERIFY)
})
noCancelable()
}
else context.snake(msg = "模块没有激活,更改不会生效")
/**
@@ -73,11 +143,25 @@ object SystemUITool {
context.snake(msg = "设置需要重启系统界面才能生效", actionText = "立即重启") { restartSystemUI(context) }
else context.snake(msg = "模块没有激活,更改不会生效")
/**
* 显示更新数据后需要重启系统界面的 [Snackbar]
* @param context 实例
*/
fun showNeedUpdateApplySnake(context: Context) =
if (isXposedModuleActive) context.snake(msg = "通知图标优化名单已完成同步")
else context.snake(msg = "模块没有激活,更改不会生效")
/** 宿主广播接收器 */
private val moduleHandlerReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isRegular = intent?.getBooleanExtra("isRegular", false) ?: false
val isValied = intent?.getBooleanExtra("isValied", false) ?: false
moduleHandlerCallback?.invoke(isRegular, isValied)
}
}
}
/** 通知广播接收器 */
private val remindHandlerReceiver by lazy {
object : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
val isGrasp = intent?.getBooleanExtra("isGrasp", false) ?: false
val isValied = intent?.getBooleanExtra("isValied", false) ?: false
remindHandlerCallback?.invoke(isGrasp, isValied)
}
}
}
}

View File

@@ -1,12 +0,0 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:autoMirrored="true"
android:tint="@color/white"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M9.01,14H2v2h7.01v3L13,15l-3.99,-4V14zM14.99,13v-3H22V8h-7.01V5L11,9L14.99,13z" />
</vector>