diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a54139..e5c08a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ## 0.2.7 - 新增: 日志框隐藏 +- 新增: 应用列表按拼音排序 ## 0.2.6 diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 91fa0cc..a05112b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -56,8 +56,8 @@ android { applicationId = "io.github.miuzarte.scrcpyforandroid" minSdk = 26 targetSdk = 37 - versionCode = 22 - versionName = "0.2.6" + versionCode = 23 + versionName = "0.2.7" externalNativeBuild { cmake { @@ -151,6 +151,7 @@ dependencies { implementation(libs.androidx.compose.runtime) implementation(libs.androidx.biometric) implementation(libs.androidx.security.crypto) + implementation("com.github.promeg:tinypinyin:2.0.3") testImplementation(libs.junit) androidTestImplementation(platform(libs.androidx.compose.bom)) diff --git a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/scrcpy/Scrcpy.kt b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/scrcpy/Scrcpy.kt index ac705a3..ac4b2e7 100644 --- a/app/src/main/java/io/github/miuzarte/scrcpyforandroid/scrcpy/Scrcpy.kt +++ b/app/src/main/java/io/github/miuzarte/scrcpyforandroid/scrcpy/Scrcpy.kt @@ -6,6 +6,7 @@ import android.net.Uri import android.util.Log import android.view.KeyEvent import androidx.core.net.toUri +import com.github.promeg.pinyinhelper.Pinyin import io.github.miuzarte.scrcpyforandroid.NativeCoreFacade import io.github.miuzarte.scrcpyforandroid.constants.Defaults import io.github.miuzarte.scrcpyforandroid.nativecore.AdbSocketStream @@ -42,6 +43,7 @@ import java.io.EOFException import java.io.File import java.io.InputStreamReader import java.util.ArrayDeque +import java.util.Locale import kotlin.concurrent.thread import kotlin.math.roundToInt import kotlin.random.Random @@ -813,9 +815,55 @@ class Scrcpy( ) ) } - return apps.toList() + return apps.toList().sortedBy { appSortKey(it) } } + private fun appSortKey(app: AppInfo): String { + val label = app.label?.takeIf { it.isNotBlank() } ?: app.packageName + val tokens = label.map { char -> + when { + char.code <= 0x7F -> AppSortToken( + priority = 0, + value = char.lowercaseChar().toString(), + ) + + Pinyin.isChinese(char) -> AppSortToken( + priority = 1, + value = Pinyin.toPinyin(char).lowercase(Locale.ROOT), + ) + + else -> AppSortToken( + priority = 2, + value = char.lowercaseChar().toString(), + ) + } + } + val firstToken = tokens.firstOrNull { it.value.any(Char::isLetterOrDigit) } + ?: tokens.firstOrNull() + val firstLetter = firstToken + ?.value + ?.firstOrNull(Char::isLetterOrDigit) + ?: Char.MAX_VALUE + + return buildString { + append(firstLetter) + append('\u0000') + append(firstToken?.priority ?: 2) + append('\u0000') + tokens.forEach { token -> + append(token.value) + append('\u0000') + } + append('\u0001') + append(app.packageName.lowercase(Locale.ROOT)) + } + } + + private data class AppSortToken( + val priority: Int, + val value: String, + ) + private fun parseRecentTasks(output: String): List { val packages = LinkedHashSet() RECENT_TASK_PACKAGE_REGEX.findAll(output).forEach { match -> diff --git a/settings.gradle.kts b/settings.gradle.kts index ac5630b..c3189b0 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -18,6 +18,12 @@ dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() + maven { + url = uri("https://maven.aliyun.com/repository/public") + content { + includeGroup("com.github.promeg") + } + } mavenCentral() } }