Skip to content

Commit

Permalink
Merge pull request #46 from GuoXiCheng/dev
Browse files Browse the repository at this point in the history
Dev
  • Loading branch information
GuoXiCheng authored Oct 6, 2023
2 parents 586d22a + 4cff88b commit 545bc60
Show file tree
Hide file tree
Showing 10 changed files with 134 additions and 33 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ android {
}

dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.6.1'
implementation 'com.squareup.retrofit2:converter-gson:2.6.1'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'androidx.core:core-ktx:1.8.0'
implementation 'androidx.appcompat:appcompat:1.4.2'
Expand Down
3 changes: 2 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.android.skip">
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />
<!-- <uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" />-->
<uses-permission android:name="android.permission.INTERNET" />

<application
android:allowBackup="true"
Expand Down
75 changes: 62 additions & 13 deletions app/src/main/java/com/android/skip/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.provider.Settings
import android.widget.Toast
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.Image
Expand All @@ -29,24 +30,35 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.android.skip.dataclass.PackageInfo
import com.android.skip.manager.RectManager
import com.android.skip.manager.SkipConfigManager
import com.android.skip.service.SkipConfigService
import com.android.skip.ui.theme.OneClickTheme
import com.android.skip.ui.theme.green
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.coroutines.launch
import retrofit2.Call
import retrofit2.Callback
import retrofit2.Response
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import java.util.*
import kotlin.concurrent.thread

var accessibilityState by mutableStateOf(false)

var alertDialogPositiveButtonClickState by mutableStateOf(false)

// 无障碍服务启用停用按钮
var isAccessibilityBtnClicked by mutableStateOf(false)

// 后台任务管理
var isBackendTaskBtnClicked by mutableStateOf(false)

// 自启动管理
var isAutoStartBtnClicked by mutableStateOf(false)

// 省电策略按钮
var isPowerSavingBtnClicked by mutableStateOf(false)

Expand All @@ -69,19 +81,34 @@ class MainActivity : ComponentActivity() {
val manufacturer = Build.MANUFACTURER.lowercase(Locale.ENGLISH)
when {
manufacturer.contains("xiaomi") -> {
intent.component = ComponentName("com.miui.securitycenter", "com.miui.permcenter.autostart.AutoStartManagementActivity")
intent.component = ComponentName(
"com.miui.securitycenter",
"com.miui.permcenter.autostart.AutoStartManagementActivity"
)
}
manufacturer.contains("oppo") -> {
intent.component = ComponentName("com.coloros.safecenter", "com.coloros.safecenter.permission.startup.StartupAppListActivity")
intent.component = ComponentName(
"com.coloros.safecenter",
"com.coloros.safecenter.permission.startup.StartupAppListActivity"
)
}
manufacturer.contains("vivo") -> {
intent.component = ComponentName("com.vivo.permissionmanager", "com.vivo.permissionmanager.activity.BgStartUpManagerActivity")
intent.component = ComponentName(
"com.vivo.permissionmanager",
"com.vivo.permissionmanager.activity.BgStartUpManagerActivity"
)
}
manufacturer.contains("oneplus") -> {
intent.component = ComponentName("com.oneplus.security", "com.oneplus.security.chainlaunch.view.ChainLaunchAppListAct‌​ivity")
intent.component = ComponentName(
"com.oneplus.security",
"com.oneplus.security.chainlaunch.view.ChainLaunchAppListAct‌​ivity"
)
}
manufacturer.contains("huawei") -> {
intent.component = ComponentName("com.huawei.systemmanager", "com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity")
intent.component = ComponentName(
"com.huawei.systemmanager",
"com.huawei.systemmanager.startupmgr.ui.StartupNormalAppListActivity"
)
}
else -> {
openAppInfo()
Expand Down Expand Up @@ -169,13 +196,35 @@ class MainActivity : ComponentActivity() {
}

RectManager.setMaxRect(this)
val skipConfig = resources.openRawResource(R.raw.skip_config_v1).bufferedReader().use{it.readText()}
val skipConfig =
resources.openRawResource(R.raw.skip_config_v1).bufferedReader().use { it.readText() }
SkipConfigManager.setConfig(skipConfig)
}

override fun onResume() {
super.onResume()
accessibilityState = MyUtils.isAccessibilitySettingsOn(this)

thread {
val retrofit = Retrofit.Builder()
.baseUrl("https://raw.githubusercontent.com/GuoXiCheng/SKIP/main/app/src/main/res/raw/")
.addConverterFactory(GsonConverterFactory.create()).build()
val skipConfigService = retrofit.create(SkipConfigService::class.java)
skipConfigService.getPackageInfo().enqueue(object : Callback<List<PackageInfo>> {
override fun onResponse(
call: Call<List<PackageInfo>>,
response: Response<List<PackageInfo>>
) {
response.body()?.let { SkipConfigManager.setConfig(it) }
Toast.makeText(applicationContext, "更新配置成功", Toast.LENGTH_SHORT).show()
}

override fun onFailure(call: Call<List<PackageInfo>>, t: Throwable) {
Toast.makeText(applicationContext, "更新配置失败", Toast.LENGTH_SHORT).show()
}

})
}
}
}

Expand All @@ -194,7 +243,7 @@ fun MainSurface() {
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Box (modifier = Modifier.offset(y=(-50).dp)) {
Box(modifier = Modifier.offset(y = (-50).dp)) {
AccessibilityControlBtn()
}
}
Expand All @@ -203,7 +252,7 @@ fun MainSurface() {
modifier = Modifier.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Box (modifier = Modifier.offset(y=(90).dp)) {
Box(modifier = Modifier.offset(y = (90).dp)) {
AccessibilityTextBox()
}
}
Expand Down Expand Up @@ -243,8 +292,8 @@ fun PageHeader(title: String, subtitle: String) {

@Composable
fun AccessibilityTextBox() {
Row {
if(accessibilityState) {
Row {
if (accessibilityState) {
Text(text = "无障碍服务功能: 启用中", color = Color.White)
} else {
Text(text = "无障碍服务功能: 未启用", color = Color.White)
Expand Down Expand Up @@ -436,7 +485,7 @@ fun AlertDialog(
@Composable
fun ImageDialog() {
AlertDialog(
onDismissRequest = {isBackendTaskBtnClicked= false },
onDismissRequest = { isBackendTaskBtnClicked = false },
containerColor = Color.White,
text = {
Box(modifier = Modifier.fillMaxWidth()) {
Expand All @@ -448,10 +497,10 @@ fun ImageDialog() {
}
},
confirmButton = {
Row (
Row(
modifier = Modifier.fillMaxWidth(),
horizontalArrangement = Arrangement.Center
) {
) {
TextButton(
onClick = { isBackendTaskBtnClicked = false },
colors = ButtonDefaults.textButtonColors(contentColor = green)
Expand Down
4 changes: 3 additions & 1 deletion app/src/main/java/com/android/skip/dataclass/PackageInfo.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.android.skip.dataclass

import android.graphics.Rect

data class PackageInfo(
val package_name: String, val skip_text: String?,
val skip_id: String?, val start_page_node: Int?,
val skip_point: String?
val skip_points: List<String>?, var skip_rect_list: MutableList<Rect>
)
8 changes: 4 additions & 4 deletions app/src/main/java/com/android/skip/handler/PointHandler.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import com.android.skip.manager.SkipConfigManager

class PointHandler: AbstractHandler() {
override fun handle(node: AccessibilityNodeInfo): List<Rect> {
val skipPoint = SkipConfigManager.getSkipPoint(node.packageName.toString())
return if (skipPoint != null) {
listOf(skipPoint)
} else {
val skipRectList = SkipConfigManager.getSkipRectList(node.packageName.toString())
return if (skipRectList.isEmpty()) {
super.handle(node)
} else {
skipRectList
}
}
}
2 changes: 1 addition & 1 deletion app/src/main/java/com/android/skip/manager/RectManager.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ object RectManager {
val rect = Rect()
val actualX = (percentX * maxRectX).toInt()
val actualY = (percentY * maxRectY).toInt()
rect.set(actualX - 10, actualY - 10, actualX + 10, actualY + 10)
rect.set(actualX - 1, actualY - 1, actualX + 1, actualY + 1)
return rect
}
}
43 changes: 32 additions & 11 deletions app/src/main/java/com/android/skip/manager/SkipConfigManager.kt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
package com.android.skip.manager

import android.graphics.Rect
import com.android.skip.dataclass.PackageInfo
import com.google.gson.Gson
Expand All @@ -8,8 +9,36 @@ object SkipConfigManager {
private lateinit var appInfoMap: Map<String, PackageInfo>
fun setConfig(config: String) {
val gson = Gson()
val appInfoList: List<PackageInfo> = gson.fromJson(config, object : TypeToken<List<PackageInfo>>() {}.type)
val appInfoList: List<PackageInfo> =
gson.fromJson(config, object : TypeToken<List<PackageInfo>>() {}.type)
appInfoMap = appInfoList.associateBy { it.package_name }
handleConfig(appInfoList)
}

fun setConfig(appInfoList: List<PackageInfo>) {
handleConfig(appInfoList)
}

private fun handleConfig(appInfoList: List<PackageInfo>) {
val newAppInfoList = appInfoList.map { it->
if (it.skip_points is List && it.skip_points.isNotEmpty()) {
it.skip_rect_list = mutableListOf()
for (point in it.skip_points) {
val pointParts = point.split(",").map { it.toFloatOrNull() }
if (pointParts.size == 2 && isBetweenZeroAndOne(pointParts[0]) && isBetweenZeroAndOne(
pointParts[1]
)
) {
val (x, y) = pointParts
if (x is Float && y is Float) {
it.skip_rect_list.add(RectManager.getPointRect(x, y))
}
}
}
}
it
}
appInfoMap = newAppInfoList.associateBy { it.package_name }
}

fun getSkipText(packageName: String): String {
Expand All @@ -24,16 +53,8 @@ object SkipConfigManager {
return appInfoMap[packageName]?.start_page_node ?: 10
}

fun getSkipPoint(packageName: String): Rect? {
val skipPoint = appInfoMap[packageName]?.skip_point
val pointParts = skipPoint?.split(",")?.map { it.toFloatOrNull() }
if (pointParts?.size == 2 && isBetweenZeroAndOne(pointParts[0]) && isBetweenZeroAndOne(pointParts[1])) {
val (x, y) = pointParts
if (x is Float && y is Float) {
return RectManager.getPointRect(x, y)
}
}
return null
fun getSkipRectList(packageName: String): MutableList<Rect> {
return appInfoMap[packageName]?.skip_rect_list ?: mutableListOf()
}

private fun isBetweenZeroAndOne(value: Float?): Boolean {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ class MyAccessibilityService : AccessibilityService() {
countCallBack.cleanCount()
val currentNode = getCurrentRootNode()
recursionNodes(currentNode, countCallBack)
// Log.i("SKIPS", currentNode.packageName.toString() + " 节点数: " + countCallBack.getCount())
return countCallBack.getCount() < SkipConfigManager.getStartPageNodeCount(currentNode.packageName.toString())
}

Expand Down
11 changes: 11 additions & 0 deletions app/src/main/java/com/android/skip/service/SkipConfigService.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.android.skip.service

import com.android.skip.dataclass.PackageInfo
import retrofit2.Call
import retrofit2.http.GET

interface SkipConfigService {

@GET("skip_config_v1.json")
fun getPackageInfo(): Call<List<PackageInfo>>
}
18 changes: 16 additions & 2 deletions app/src/main/res/raw/skip_config_v1.json
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,30 @@
"package_name": "com.github.android",
"start_page_node": 0
},
{
"package_name": "com.eg.android.AlipayGphone",
"start_page_node": 0
},
{
"package_name": "com.qq.qcloud",
"skip_id": "com.qq.qcloud:id/gdt_ad_text"
"skip_id": "com.qq.qcloud:id/gdt_ad_text",
"skip_points": ["0.91,0.086"]
},
{
"package_name": "com.coolapk.market",
"skip_point": "0.9,0.07"
"skip_points": ["0.9,0.07"]
},
{
"package_name": "com.example.pptv",
"start_page_node": 25
},
{
"package_name": "com.miui.systemAdSolution",
"start_page_node": 20,
"skip_points": ["0.92,0.047"]
},
{
"package_name": "tv.danmaku.bili",
"start_page_node": 70
}
]

0 comments on commit 545bc60

Please sign in to comment.