Skip to content

Commit

Permalink
Merge pull request #192 from GuoXiCheng/dev-c
Browse files Browse the repository at this point in the history
update AccessibilityState
  • Loading branch information
GuoXiCheng authored Aug 9, 2024
2 parents d300f0c + 3e6a9ce commit e3c3a60
Show file tree
Hide file tree
Showing 6 changed files with 103 additions and 39 deletions.
40 changes: 3 additions & 37 deletions app/src/main/java/com/android/skip/NewMainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.android.skip

import android.content.Context
import android.content.Intent
import android.os.Bundle
import android.provider.Settings
import android.text.TextUtils
import androidx.activity.viewModels
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
Expand Down Expand Up @@ -38,7 +35,7 @@ import com.android.skip.dataclass.PackageInfoV2
import com.android.skip.manager.HttpManager
import com.android.skip.manager.SkipConfigManagerV2
import com.android.skip.manager.WhitelistManager
import com.android.skip.service.MyAccessibilityService
import com.android.skip.utils.AccessibilityUtils
import com.android.skip.utils.DataStoreUtils
import com.android.skip.viewmodel.StartButtonViewModel
import org.yaml.snakeyaml.Yaml
Expand Down Expand Up @@ -147,7 +144,8 @@ class NewMainActivity : BaseActivity() {

override fun onResume() {
super.onResume()
startButtonViewModel.changeButtonState(isAccessibilitySettingsOn(this))
startButtonViewModel.changeButtonState(AccessibilityUtils.getAccessibilityState(this))

WhitelistManager.setWhitelist(lifecycleScope, applicationContext)

if (DataStoreUtils.getSyncData(SKIP_AUTO_SYNC_CONFIG, false)) {
Expand All @@ -168,35 +166,3 @@ class NewMainActivity : BaseActivity() {
}
}

/**
* 判断无障碍服务是否已经启用
*/
fun isAccessibilitySettingsOn(mContext: Context): Boolean {
var accessibilityEnabled = 0
val service = mContext.packageName + "/" + MyAccessibilityService::class.java.canonicalName
try {
accessibilityEnabled = Settings.Secure.getInt(
mContext.applicationContext.contentResolver,
android.provider.Settings.Secure.ACCESSIBILITY_ENABLED
)
} catch (e: Settings.SettingNotFoundException) {
e.printStackTrace()
}
val mStringColonSplitter = TextUtils.SimpleStringSplitter(':')
if (accessibilityEnabled == 1) {
val settingValue = Settings.Secure.getString(
mContext.applicationContext.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
)
if (settingValue != null) {
mStringColonSplitter.setString(settingValue)
while (mStringColonSplitter.hasNext()) {
val accessibilityService = mStringColonSplitter.next()
if (accessibilityService.equals(service, ignoreCase = true)) {
return true
}
}
}
}
return false
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.android.skip.enums

enum class AccessibilityState {
STARTED, STOPPED, FAULTED
}
77 changes: 77 additions & 0 deletions app/src/main/java/com/android/skip/utils/AccessibilityUtils.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package com.android.skip.utils

import android.accessibilityservice.AccessibilityService
import android.app.ActivityManager
import android.content.Context
import android.provider.Settings
import android.text.TextUtils
import com.android.skip.enums.AccessibilityState
import com.android.skip.service.MyAccessibilityService

object AccessibilityUtils {

/**
* 取得无障碍服务的状态
*/
fun getAccessibilityState(mContext: Context): AccessibilityState {
val isSettingsOn = isAccessibilitySettingsOn(mContext)
val isRunning = isAccessibilityServiceRunning(mContext, MyAccessibilityService::class.java)

return when {
isSettingsOn && isRunning -> AccessibilityState.STARTED
isSettingsOn && !isRunning -> AccessibilityState.FAULTED
else -> AccessibilityState.STOPPED
}
}

/**
* 判断无障碍服务是否已经启用
*/
private fun isAccessibilitySettingsOn(mContext: Context): Boolean {
var accessibilityEnabled = 0
val service = mContext.packageName + "/" + MyAccessibilityService::class.java.canonicalName
try {
accessibilityEnabled = Settings.Secure.getInt(
mContext.applicationContext.contentResolver,
android.provider.Settings.Secure.ACCESSIBILITY_ENABLED
)
} catch (e: Settings.SettingNotFoundException) {
e.printStackTrace()
}
val mStringColonSplitter = TextUtils.SimpleStringSplitter(':')
if (accessibilityEnabled == 1) {
val settingValue = Settings.Secure.getString(
mContext.applicationContext.contentResolver,
Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES
)
if (settingValue != null) {
mStringColonSplitter.setString(settingValue)
while (mStringColonSplitter.hasNext()) {
val accessibilityService = mStringColonSplitter.next()
if (accessibilityService.equals(service, ignoreCase = true)) {
return true
}
}
}
}
return false
}

/**
* 判断无障碍服务是否可用
*/
private fun isAccessibilityServiceRunning(
mContext: Context,
serviceClass: Class<out AccessibilityService>
): Boolean {
val am = mContext.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
val runningServices = am.getRunningServices(Integer.MAX_VALUE)

for (service in runningServices) {
if (serviceClass.name == service.service.className) {
return true
}
}
return false
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,24 @@ package com.android.skip.viewmodel
import androidx.compose.ui.graphics.Color
import androidx.lifecycle.ViewModel
import com.android.skip.R
import com.android.skip.enums.AccessibilityState
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow

class StartButtonViewModel: ViewModel() {
private val stopped = ButtonState(Color(0xFF808080), "已停止\n点此启动", R.drawable.block)
private val started = ButtonState(Color(0xFF1E4377), "运行中", R.drawable.check_circle)
private val faulted = ButtonState(Color(0xFF771E1E), "发生故障\n点此重新启动", R.drawable.error)

private val _buttonState = MutableStateFlow(stopped)
val buttonState = _buttonState.asStateFlow()

fun changeButtonState(isRunning: Boolean) {
_buttonState.value = if (isRunning) started else stopped
fun changeButtonState(isRunning: AccessibilityState) {
_buttonState.value = when (isRunning) {
AccessibilityState.STARTED -> started
AccessibilityState.STOPPED -> stopped
AccessibilityState.FAULTED -> faulted
}
}

data class ButtonState(val backgroundColor: Color, val buttonText: String, val iconResource: Int)
Expand Down
9 changes: 9 additions & 0 deletions app/src/main/res/drawable/error.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="960"
android:viewportHeight="960">
<path
android:pathData="M479.98,680q14.02,0 23.52,-9.48t9.5,-23.5q0,-14.02 -9.48,-23.52t-23.5,-9.5q-14.02,0 -23.52,9.48t-9.5,23.5q0,14.02 9.48,23.52t23.5,9.5ZM453,527h60v-253h-60v253ZM480.27,880q-82.74,0 -155.5,-31.5Q252,817 197.5,762.5t-86,-127.34Q80,562.32 80,479.5t31.5,-155.66Q143,251 197.5,197t127.34,-85.5Q397.68,80 480.5,80t155.66,31.5Q709,143 763,197t85.5,127Q880,397 880,479.73q0,82.74 -31.5,155.5Q817,708 763,762.32q-54,54.31 -127,86Q563,880 480.27,880ZM480.5,820Q622,820 721,720.5t99,-241Q820,338 721.19,239T480,140q-141,0 -240.5,98.81T140,480q0,141 99.5,240.5t241,99.5ZM480,480Z"
android:fillColor="#000000"/>
</vector>
1 change: 1 addition & 0 deletions gui/svg/error_24dp_000000_FILL0_wght0_GRAD0_opszNaN.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit e3c3a60

Please sign in to comment.