mirror of
https://github.com/LittleTurtle2333/SimplicityTools.git
synced 2026-07-12 19:31:17 +08:00
Compare commits
23 Commits
6751097e93
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1401ddcc52 | ||
|
|
eb7779ea84 | ||
|
|
317340bf6f | ||
|
|
bc26ba512c | ||
|
|
cd28e662a1 | ||
|
|
f67d387020 | ||
|
|
f2354022aa | ||
|
|
d7a1af8846 | ||
|
|
8a1c8a85c3 | ||
|
|
12848808d3 | ||
|
|
7f23f07209 | ||
|
|
54b31ea478 | ||
|
|
44e6995da1 | ||
|
|
12e76869dd | ||
|
|
97212d74d3 | ||
|
|
e152a5ba74 | ||
|
|
efc77eb518 | ||
|
|
8cad8e371c | ||
|
|
990ea8ef7e | ||
|
|
4ce55d1fb3 | ||
|
|
1feb754385 | ||
|
|
a107f71986 | ||
|
|
2177850498 |
50
.github/workflows/dev.yml
vendored
Normal file
50
.github/workflows/dev.yml
vendored
Normal file
@@ -0,0 +1,50 @@
|
||||
name: Dev
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: set up JDK 11
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '11'
|
||||
distribution: 'temurin'
|
||||
cache: gradle
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
|
||||
- name: Clone UI
|
||||
run: |
|
||||
cd blockmiui
|
||||
git submodule init
|
||||
git submodule update
|
||||
|
||||
- name: Build with Gradle
|
||||
run: |
|
||||
bash ./gradlew assembleDebug
|
||||
|
||||
- name: Sign Debug APK
|
||||
if: success()
|
||||
id: sign_debug
|
||||
uses: r0adkll/sign-android-release@v1.0.4
|
||||
with:
|
||||
releaseDirectory: ./app/build/outputs/apk/debug
|
||||
signingKeyBase64: ${{ secrets.SIGNING_KEY }}
|
||||
alias: ${{ secrets.KEY_STORE_ALIAS }}
|
||||
keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }}
|
||||
keyPassword: ${{ secrets.KEY_STORE_PASSWORD }}
|
||||
|
||||
- name: Upload Debug APK
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: WooBox_Debug
|
||||
path: ${{ steps.sign_debug.outputs.signedReleaseFile }}
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Android CI
|
||||
name: PR Check
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
@@ -13,7 +13,9 @@
|
||||
|
||||
### 模块说明
|
||||
|
||||
开发者:[酷安@乌堆小透明](http://www.coolapk.com/u/883441)
|
||||
开发者:[酷安@乌堆小透明](http://www.coolapk.com/u/883441)
|
||||
|
||||
当前仅基于`Android13`进行开发,`Android12`几乎不再维护。也有基于`Android13`开发,但是能在`Android12`使用的情况,请广大社区使用`Android12`的开发者自行测试和修复后提交`Pull Request`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -11,6 +11,12 @@
|
||||
|
||||
---
|
||||
|
||||
### Module Description
|
||||
|
||||
Currently only developed based on `Android13`, `Android12` is almost no longer maintained. There are also cases where the development is based on `Android13`, but it can be used in `Android12`. Developers in the community who use `Android12` are requested to submit `Pull Request` after testing and repairing by themselves.
|
||||
|
||||
---
|
||||
|
||||
### Screenshot
|
||||
|
||||

|
||||
|
||||
@@ -11,8 +11,8 @@ android {
|
||||
applicationId = "com.lt2333.simplicitytools"
|
||||
minSdk = 31
|
||||
targetSdk = 33
|
||||
versionCode = 73
|
||||
versionName = "1.7.3"
|
||||
versionCode = 75
|
||||
versionName = "1.7.5"
|
||||
buildConfigField("String", "BUILD_TIME", "\"${System.currentTimeMillis()}\"")
|
||||
}
|
||||
|
||||
@@ -59,5 +59,4 @@ dependencies {
|
||||
val appCenterSdkVersion = "4.4.3"
|
||||
implementation("com.microsoft.appcenter:appcenter-analytics:${appCenterSdkVersion}")
|
||||
implementation("com.microsoft.appcenter:appcenter-crashes:${appCenterSdkVersion}")
|
||||
implementation("androidx.core:core-splashscreen:1.0.0")
|
||||
}
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.lt2333.simplicitytools.activity.pages.s
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import android.view.View
|
||||
import android.widget.Switch
|
||||
import android.widget.Toast
|
||||
@@ -11,11 +13,11 @@ import cn.fkj233.ui.activity.view.SwitchV
|
||||
import cn.fkj233.ui.activity.view.TextSummaryV
|
||||
import cn.fkj233.ui.activity.view.TextV
|
||||
import cn.fkj233.ui.dialog.MIUIDialog
|
||||
import cn.fkj233.ui.dialog.NewDialog
|
||||
import com.lt2333.simplicitytools.R
|
||||
import java.util.HashMap
|
||||
|
||||
|
||||
@BMPage("scope_systemui","System UI", hideMenu = false)
|
||||
@BMPage("scope_systemui", "System UI", hideMenu = false)
|
||||
class SystemUIPageForS : BasePage() {
|
||||
|
||||
override fun onCreate() {
|
||||
@@ -54,11 +56,10 @@ class SystemUIPageForS : BasePage() {
|
||||
}
|
||||
})
|
||||
|
||||
val layoutCompatibilityModeBinding = GetDataBinding({
|
||||
MIUIActivity.safeSP.getInt(
|
||||
"screen_hole_location",
|
||||
0
|
||||
) == 2
|
||||
val layoutCompatibilityBinding = GetDataBinding({
|
||||
MIUIActivity.safeSP.getBoolean(
|
||||
"layout_compatibility_mode", false
|
||||
)
|
||||
}) { view, flags, data ->
|
||||
when (flags) {
|
||||
1 -> (view as Switch).isEnabled = data as Boolean
|
||||
@@ -66,57 +67,23 @@ class SystemUIPageForS : BasePage() {
|
||||
}
|
||||
}
|
||||
|
||||
val screenHoleLocation: HashMap<Int, String> = hashMapOf<Int, String>().also {
|
||||
it[0] = getString(R.string.off)
|
||||
it[1] = getString(R.string.center)
|
||||
it[2] = getString(R.string.left_or_right)
|
||||
}
|
||||
TextSummaryWithSpinner(
|
||||
TextSummaryWithSwitch(
|
||||
TextSummaryV(
|
||||
textId = R.string.layout_compatibility_mode,
|
||||
tipsId = R.string.screen_hole_location
|
||||
),
|
||||
SpinnerV(
|
||||
screenHoleLocation[MIUIActivity.safeSP.getInt(
|
||||
"screen_hole_location",
|
||||
0
|
||||
)].toString()
|
||||
) {
|
||||
add(screenHoleLocation[0].toString()) {
|
||||
MIUIActivity.safeSP.putAny("screen_hole_location", 0)
|
||||
layoutCompatibilityModeBinding.binding.Send().send(false)
|
||||
}
|
||||
add(screenHoleLocation[1].toString()) {
|
||||
MIUIActivity.safeSP.putAny("screen_hole_location", 1)
|
||||
layoutCompatibilityModeBinding.binding.Send().send(false)
|
||||
}
|
||||
add(screenHoleLocation[2].toString()) {
|
||||
MIUIActivity.safeSP.putAny("screen_hole_location", 2)
|
||||
layoutCompatibilityModeBinding.binding.Send().send(true)
|
||||
}
|
||||
})
|
||||
textId = R.string.layout_compatibility_mode, tipsId = R.string.layout_compatibility_mode_summary
|
||||
), SwitchV("layout_compatibility_mode", dataBindingSend = layoutCompatibilityBinding.bindingSend)
|
||||
)
|
||||
|
||||
Text(
|
||||
textId = R.string.left_margin,
|
||||
dataBindingRecv = layoutCompatibilityModeBinding.binding.getRecv(2)
|
||||
textId = R.string.left_margin, dataBindingRecv = layoutCompatibilityBinding.binding.getRecv(2)
|
||||
)
|
||||
SeekBarWithText(
|
||||
"status_bar_left_margin",
|
||||
0,
|
||||
300,
|
||||
0,
|
||||
dataBindingRecv = layoutCompatibilityModeBinding.binding.getRecv(2)
|
||||
"status_bar_left_margin", 0, 300, 0, dataBindingRecv = layoutCompatibilityBinding.binding.getRecv(2)
|
||||
)
|
||||
Text(
|
||||
textId = R.string.right_margin,
|
||||
dataBindingRecv = layoutCompatibilityModeBinding.binding.getRecv(2)
|
||||
textId = R.string.right_margin, dataBindingRecv = layoutCompatibilityBinding.binding.getRecv(2)
|
||||
)
|
||||
SeekBarWithText(
|
||||
"status_bar_right_margin",
|
||||
0,
|
||||
300,
|
||||
0,
|
||||
dataBindingRecv = layoutCompatibilityModeBinding.binding.getRecv(2)
|
||||
"status_bar_right_margin", 0, 300, 0, dataBindingRecv = layoutCompatibilityBinding.binding.getRecv(2)
|
||||
)
|
||||
Line()
|
||||
TitleText(textId = R.string.status_bar_clock_format)
|
||||
@@ -246,23 +213,37 @@ class SystemUIPageForS : BasePage() {
|
||||
|
||||
//极客模式起始
|
||||
TextSummaryWithArrow(TextSummaryV(textId = R.string.custom_clock_format_geek) {
|
||||
MIUIDialog(activity) {
|
||||
NewDialog(activity) {
|
||||
setTitle(R.string.custom_clock_format_geek)
|
||||
setEditText(MIUIActivity.safeSP.getString("custom_clock_format_geek", "HH:mm:ss"), "", isSingleLine = false)
|
||||
setLButton(textId = R.string.cancel) {
|
||||
dismiss()
|
||||
setEditText(
|
||||
MIUIActivity.safeSP.getString("custom_clock_format_geek", "HH:mm:ss"), "", isSingleLine = false
|
||||
)
|
||||
Button(getString(R.string.click_to_view_use_cases)) {
|
||||
val locale = context.resources.configuration.locale
|
||||
val language = locale.language
|
||||
if (language.endsWith("zh")) {
|
||||
val uri = Uri.parse("https://zhuti.designer.xiaomi.com/docs/grammar/#%E6%97%B6%E9%97%B4%E6%97%A5%E6%9C%9F")
|
||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||
activity.startActivity(intent)
|
||||
} else {
|
||||
val uri = Uri.parse("https://docs.google.com/spreadsheets/d/1ghkT2iFbxB3bT4TKCiKAfmEdGt6kTVKFU3dm4Nz1or8/edit?usp=sharing")
|
||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||
activity.startActivity(intent)
|
||||
}
|
||||
}
|
||||
setRButton(textId = R.string.Done) {
|
||||
Button(getString(R.string.Done)) {
|
||||
if (getEditText().isNotEmpty()) {
|
||||
try {
|
||||
MIUIActivity.safeSP.putAny("custom_clock_format_geek", getEditText())
|
||||
dismiss()
|
||||
return@setRButton
|
||||
return@Button
|
||||
} catch (_: Throwable) {
|
||||
}
|
||||
}
|
||||
Toast.makeText(activity, R.string.input_error, Toast.LENGTH_SHORT)
|
||||
.show()
|
||||
Toast.makeText(activity, R.string.input_error, Toast.LENGTH_SHORT).show()
|
||||
}
|
||||
Button(getString(R.string.cancel), cancelStyle = true) {
|
||||
dismiss()
|
||||
}
|
||||
}.show()
|
||||
}, dataBindingRecv = customClockGeekBinding.binding.getRecv(2))
|
||||
|
||||
@@ -35,8 +35,7 @@ class OtherPageForT : BasePage() {
|
||||
textId = R.string.miuihome_recentwiew_wallpaper_darkening, tipsId = R.string.miuihome_recentwiew_wallpaper_darkening_summary
|
||||
), SwitchV("miuihome_recentwiew_wallpaper_darkening", false)
|
||||
)
|
||||
//TODO:未开发完成
|
||||
/*TextSummaryWithSwitch(
|
||||
TextSummaryWithSwitch(
|
||||
TextSummaryV(
|
||||
textId = R.string.miuihome_recentview_remove_card_animation, tipsId = R.string.miuihome_recentview_remove_card_animation_summary
|
||||
), SwitchV("miuihome_recentview_remove_card_animation", false)
|
||||
@@ -44,7 +43,7 @@ class OtherPageForT : BasePage() {
|
||||
TextSummaryWithSwitch(
|
||||
TextSummaryV(textId = R.string.miuihome_shortcut_add_small_window, tipsId = R.string.miuihome_shortcut_add_small_window_summary),
|
||||
SwitchV("miuihome_shortcut_add_small_window", false)
|
||||
)*/
|
||||
)
|
||||
TextSummaryWithSwitch(
|
||||
TextSummaryV(textId = R.string.miuihome_scroll_icon_name, tipsId = R.string.miuihome_scroll_icon_name_summary),
|
||||
SwitchV("miuihome_scroll_icon_name", false)
|
||||
|
||||
@@ -566,6 +566,13 @@ import com.lt2333.simplicitytools.R
|
||||
)
|
||||
Line()
|
||||
TitleText(textId = R.string.control_center)
|
||||
TextSummaryWithSwitch(
|
||||
TextSummaryV(
|
||||
textId = R.string.disable_bluetooth_temporarily_off
|
||||
), SwitchV(
|
||||
"disable_bluetooth_temporarily_off"
|
||||
)
|
||||
)
|
||||
val controlCenterWeatherBinding = GetDataBinding({
|
||||
MIUIActivity.safeSP.getBoolean(
|
||||
"control_center_weather", false
|
||||
|
||||
@@ -32,37 +32,7 @@ import com.lt2333.simplicitytools.hooks.rules.s.systemui.StatusBarLayoutForS
|
||||
import com.lt2333.simplicitytools.hooks.rules.s.systemui.StatusBarNetworkSpeedRefreshSpeedForS
|
||||
import com.lt2333.simplicitytools.hooks.rules.s.systemui.StatusBarTimeCustomizationForS
|
||||
import com.lt2333.simplicitytools.hooks.rules.s.systemui.WaveChargeForS
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.BatteryPercentageForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.CanNotificationSlideForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.ControlCenterWeatherForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.CustomMobileTypeTextForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.DoubleLineNetworkSpeedForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideBatteryIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideHDIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideMobileActivityIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideMobileTypeIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideNetworkSpeedSplitterForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideSimIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideStatusBarIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideStatusBarNetworkSpeedSecondForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.HideWifiActivityIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.LockScreenClockDisplaySecondsForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.LockScreenCurrentForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.LockScreenDoubleTapToSleepForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.MaximumNumberOfNotificationIconsForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.NewNotificationWeatherForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.NotificationWeatherForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.OldNotificationWeatherForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.OldQSCustomForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.RemoveLockScreenCameraForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.RemoveTheLeftSideOfTheLockScreenForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.ShowWifiStandardForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.StatusBarBigMobileTypeIconForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.StatusBarDoubleTapToSleepForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.StatusBarLayoutForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.StatusBarNetworkSpeedRefreshSpeedForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.StatusBarTimeCustomizationForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.WaveChargeForT
|
||||
import com.lt2333.simplicitytools.hooks.rules.t.systemui.*
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.AppRegister
|
||||
import de.robv.android.xposed.callbacks.XC_LoadPackage
|
||||
|
||||
@@ -105,6 +75,7 @@ object SystemUI : AppRegister() {
|
||||
CanNotificationSlideForT, //允许下滑通知打开小窗
|
||||
LockScreenClockDisplaySecondsForT, // 锁屏时钟显示秒
|
||||
ShowWifiStandardForT, // 显示 WIFI 角标
|
||||
DisableBluetoothTemporarilyOffForT, //禁用临时蓝牙关闭
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -1,53 +1,45 @@
|
||||
package com.lt2333.simplicitytools.hooks.rules.all.miuihome
|
||||
|
||||
import android.animation.ObjectAnimator
|
||||
import android.animation.TimeInterpolator
|
||||
import android.view.MotionEvent
|
||||
import android.view.View
|
||||
import com.github.kyuubiran.ezxhelper.utils.args
|
||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.getObject
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookReplace
|
||||
import com.github.kyuubiran.ezxhelper.utils.invokeMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.invokeStaticMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.loadClass
|
||||
import com.github.kyuubiran.ezxhelper.utils.putObject
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.*
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
import de.robv.android.xposed.XposedHelpers
|
||||
|
||||
|
||||
object ModifyRecentViewRemoveCardAnimForAll : HookRegister() {
|
||||
override fun init() = hasEnable("miuihome_recentview_remove_card_animation") {
|
||||
findMethod("com.miui.home.recents.views.SwipeHelperForRecents") {
|
||||
name == "onTouchEvent" && parameterCount == 1
|
||||
}.hookAfter {
|
||||
val mCurrView = it.thisObject.getObject("mCurrView") as View?
|
||||
"com.miui.home.recents.views.SwipeHelperForRecents".hookAfterMethod("onTouchEvent", MotionEvent::class.java) {
|
||||
val mCurrView = it.thisObject.getObjectField("mCurrView") as View?
|
||||
if (mCurrView != null) {
|
||||
mCurrView.alpha = 1f
|
||||
mCurrView.scaleX = 1f
|
||||
mCurrView.scaleY = 1f
|
||||
}
|
||||
}
|
||||
findMethod("com.miui.home.recents.TaskStackViewLayoutStyleHorizontal") {
|
||||
name == "createScaleDismissAnimation" && parameterCount == 2
|
||||
}.hookReplace {
|
||||
|
||||
"com.miui.home.recents.TaskStackViewLayoutStyleHorizontal".replaceMethod("createScaleDismissAnimation", View::class.java, Float::class.java) {
|
||||
val view = it.args[0] as View
|
||||
val getScreenHeight = loadClass("com.miui.home.launcher.DeviceConfig").invokeStaticMethod("getScreenHeight") as Int
|
||||
val getScreenHeight = "com.miui.home.launcher.DeviceConfig".findClass().callStaticMethod("getScreenHeight") as Int
|
||||
val ofFloat = ObjectAnimator.ofFloat(view, View.TRANSLATION_Y, view.translationY, -getScreenHeight * 1.1484375f)
|
||||
ofFloat.duration = 200
|
||||
return@hookReplace ofFloat
|
||||
val physicBasedInterpolator = XposedHelpers.newInstance("com.miui.home.launcher.anim.PhysicBasedInterpolator".findClass(), 0.9f, 0.78f)
|
||||
ofFloat.interpolator = physicBasedInterpolator as TimeInterpolator
|
||||
ofFloat.duration = 400
|
||||
return@replaceMethod ofFloat
|
||||
}
|
||||
findMethod("com.miui.home.recents.views.VerticalSwipe") {
|
||||
name == "calculate" && parameterCount == 1
|
||||
}.hookAfter {
|
||||
|
||||
"com.miui.home.recents.views.VerticalSwipe".hookAfterMethod("calculate", Float::class.java) {
|
||||
val f = it.args[0] as Float
|
||||
val asScreenHeightWhenDismiss = loadClass("com.miui.home.recents.views.VerticalSwipe").invokeStaticMethod("getAsScreenHeightWhenDismiss") as Int
|
||||
val asScreenHeightWhenDismiss = "com.miui.home.recents.views.VerticalSwipe".findClass().callStaticMethod("getAsScreenHeightWhenDismiss") as Int
|
||||
val f2 = f / asScreenHeightWhenDismiss
|
||||
val mTaskViewHeight = it.thisObject.getObject("mTaskViewHeight") as Float
|
||||
val mCurScale = it.thisObject.getObject("mCurScale") as Float
|
||||
val mTaskViewHeight = it.thisObject.getObjectField("mTaskViewHeight") as Float
|
||||
val mCurScale = it.thisObject.getObjectField("mCurScale") as Float
|
||||
val f3: Float = mTaskViewHeight * mCurScale
|
||||
val i = if (f2 > 0.0f) 1 else if (f2 == 0.0f) 0 else -1
|
||||
val afterFrictionValue: Float = it.thisObject.invokeMethod("afterFrictionValue", args(f, asScreenHeightWhenDismiss)) as Float
|
||||
if (i < 0) it.thisObject.putObject("mCurTransY", (mTaskViewHeight / 2.0f + afterFrictionValue * 2) - (f3 / 2.0f))
|
||||
val afterFrictionValue: Float = it.thisObject.callMethod("afterFrictionValue", f, asScreenHeightWhenDismiss) as Float
|
||||
if (i < 0) it.thisObject.setObjectField("mCurTransY", (mTaskViewHeight / 2.0f + afterFrictionValue * 2) - (f3 / 2.0f))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
package com.lt2333.simplicitytools.hooks.rules.all.miuihome
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.text.TextUtils
|
||||
import android.view.View
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import com.github.kyuubiran.ezxhelper.utils.Log
|
||||
import com.github.kyuubiran.ezxhelper.utils.args
|
||||
@@ -10,54 +12,57 @@ import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.getObject
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookAfter
|
||||
import com.github.kyuubiran.ezxhelper.utils.invokeMethod
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.*
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
|
||||
object ScrollIconNameForAll : HookRegister() {
|
||||
@SuppressLint("DiscouragedApi")
|
||||
override fun init() = hasEnable("miuihome_scroll_icon_name") {
|
||||
val launcherClass = "com.miui.home.launcher.Launcher".findClass()
|
||||
val shortcutInfoClass = "com.miui.home.launcher.ShortcutInfo".findClass()
|
||||
|
||||
try {
|
||||
findMethod("com.miui.home.launcher.ItemIcon") {
|
||||
name == "onFinishInflate"
|
||||
}.hookAfter {
|
||||
val mTitle = it.thisObject.getObject("mTitle") as TextView
|
||||
"com.miui.home.launcher.ItemIcon".hookAfterMethod(
|
||||
"onFinishInflate"
|
||||
) {
|
||||
val mTitle = it.thisObject.getObjectField("mTitle") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.maml.MaMlWidgetView") {
|
||||
name == "onFinishInflate"
|
||||
}.hookAfter {
|
||||
val mTitle = it.thisObject.getObject("mTitle") as TextView
|
||||
"com.miui.home.launcher.maml.MaMlWidgetView".hookAfterMethod(
|
||||
"onFinishInflate"
|
||||
) {
|
||||
val mTitle = it.thisObject.getObjectField("mTitleTextView") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.LauncherMtzGadgetView") {
|
||||
name == "onFinishInflate"
|
||||
}.hookAfter {
|
||||
val mTitle = it.thisObject.getObject("mTitle") as TextView
|
||||
"com.miui.home.launcher.LauncherMtzGadgetView".hookAfterMethod(
|
||||
"onFinishInflate"
|
||||
) {
|
||||
val mTitle = it.thisObject.getObjectField("mTitleTextView") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.LauncherWidgetView") {
|
||||
name == "onFinishInflate"
|
||||
}.hookAfter {
|
||||
val mTitle = it.thisObject.getObject("mTitle") as TextView
|
||||
"com.miui.home.launcher.LauncherWidgetView".hookAfterMethod(
|
||||
"onFinishInflate"
|
||||
) {
|
||||
val mTitle = it.thisObject.getObjectField("mTitleTextView") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.ShortcutIcon") {
|
||||
name == "fromXml" && parameterCount == 4
|
||||
}.hookAfter {
|
||||
val buddyIconView = it.args[3].invokeMethod("getBuddyIconView", args(it.args[2])) as View
|
||||
val mTitle = buddyIconView.getObject("mTitle") as TextView
|
||||
"com.miui.home.launcher.ShortcutIcon".hookAfterMethod(
|
||||
"fromXml", Int::class.javaPrimitiveType, launcherClass, ViewGroup::class.java, shortcutInfoClass
|
||||
) {
|
||||
val buddyIconView = it.args[3].callMethod("getBuddyIconView", it.args[2]) as View
|
||||
val mTitle = buddyIconView.getObjectField("mTitle") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.ShortcutIcon") {
|
||||
name == "createShortcutIcon" && parameterCount == 3
|
||||
}.hookAfter {
|
||||
"com.miui.home.launcher.ShortcutIcon".hookAfterMethod(
|
||||
"createShortcutIcon", Int::class.javaPrimitiveType, launcherClass, ViewGroup::class.java
|
||||
) {
|
||||
val buddyIcon = it.result as View
|
||||
val mTitle = buddyIcon.getObject("mTitle") as TextView
|
||||
val mTitle = buddyIcon.getObjectField("mTitle") as TextView
|
||||
mTitleScrolling(mTitle)
|
||||
}
|
||||
findMethod("com.miui.home.launcher.common.Utilities") {
|
||||
name == "adaptTitleStyleToWallpaper" && parameterCount == 4
|
||||
}.hookAfter {
|
||||
"com.miui.home.launcher.common.Utilities".hookAfterMethod(
|
||||
"adaptTitleStyleToWallpaper", Context::class.java, TextView::class.java, Int::class.javaPrimitiveType, Int::class.javaPrimitiveType
|
||||
) {
|
||||
val mTitle = it.args[1] as TextView
|
||||
if (mTitle.id == mTitle.resources.getIdentifier("icon_title", "id", "com.miui.home")) {
|
||||
mTitleScrolling(mTitle)
|
||||
|
||||
@@ -18,77 +18,71 @@ import com.github.kyuubiran.ezxhelper.utils.invokeStaticMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.loadClass
|
||||
import com.github.kyuubiran.ezxhelper.utils.putStaticObject
|
||||
import com.lt2333.simplicitytools.R
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.*
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
import de.robv.android.xposed.XposedHelpers
|
||||
|
||||
object ShortcutAddSmallWindowForAll : HookRegister() {
|
||||
override fun init() = hasEnable("miuihome_shortcut_add_small_window") {
|
||||
val mViewDarkModeHelper = loadClass("com.miui.home.launcher.util.ViewDarkModeHelper")
|
||||
val mSystemShortcutMenu = loadClass("com.miui.home.launcher.shortcuts.SystemShortcutMenu")
|
||||
val mSystemShortcutMenuItem = loadClass("com.miui.home.launcher.shortcuts.SystemShortcutMenuItem")
|
||||
val mAppShortcutMenu = loadClass("com.miui.home.launcher.shortcuts.AppShortcutMenu")
|
||||
val mShortcutMenuItem = loadClass("com.miui.home.launcher.shortcuts.ShortcutMenuItem")
|
||||
val mAppDetailsShortcutMenuItem = loadClass("com.miui.home.launcher.shortcuts.SystemShortcutMenuItem\$AppDetailsShortcutMenuItem")
|
||||
val mActivityUtilsCompat = loadClass("com.miui.launcher.utils.ActivityUtilsCompat")
|
||||
findAllMethods(mViewDarkModeHelper) {
|
||||
name == "onConfigurationChanged"
|
||||
}.hookAfter {
|
||||
mSystemShortcutMenuItem.invokeStaticMethod("createAllSystemShortcutMenuItems")
|
||||
val mViewDarkModeHelper = ("com.miui.home.launcher.util.ViewDarkModeHelper").findClass()
|
||||
val mSystemShortcutMenu = ("com.miui.home.launcher.shortcuts.SystemShortcutMenu").findClass()
|
||||
val mSystemShortcutMenuItem = ("com.miui.home.launcher.shortcuts.SystemShortcutMenuItem").findClass()
|
||||
val mAppShortcutMenu = ("com.miui.home.launcher.shortcuts.AppShortcutMenu").findClass()
|
||||
val mShortcutMenuItem = ("com.miui.home.launcher.shortcuts.ShortcutMenuItem").findClass()
|
||||
val mAppDetailsShortcutMenuItem = ("com.miui.home.launcher.shortcuts.SystemShortcutMenuItem\$AppDetailsShortcutMenuItem").findClass()
|
||||
val mActivityUtilsCompat = ("com.miui.launcher.utils.ActivityUtilsCompat").findClass()
|
||||
|
||||
mViewDarkModeHelper.hookAfterAllMethods("onConfigurationChanged") {
|
||||
mSystemShortcutMenuItem.callStaticMethod("createAllSystemShortcutMenuItems")
|
||||
}
|
||||
findAllMethods(mShortcutMenuItem) {
|
||||
name == "getShortTitle"
|
||||
}.hookAfter {
|
||||
|
||||
mShortcutMenuItem.hookAfterAllMethods("getShortTitle") {
|
||||
if (it.result == "应用信息") {
|
||||
it.result = "信息"
|
||||
}
|
||||
}
|
||||
findMethod(mAppDetailsShortcutMenuItem) {
|
||||
name == "lambda\$getOnClickListener$0" && parameterCount == 2
|
||||
}.hookBefore {
|
||||
|
||||
mAppDetailsShortcutMenuItem.hookBeforeMethod("lambda\$getOnClickListener$0", mAppDetailsShortcutMenuItem, View::class.java) {
|
||||
val obj = it.args[0]
|
||||
val view: View = it.args[1] as View
|
||||
val mShortTitle = obj.invokeMethod("getShortTitle") as CharSequence
|
||||
val mShortTitle = obj.callMethod("getShortTitle") as CharSequence
|
||||
if (mShortTitle == moduleRes.getString(R.string.miuihome_shortcut_add_small_window_title)) {
|
||||
it.result = null
|
||||
val intent = Intent()
|
||||
val mComponentName = obj.invokeMethod("getComponentName") as ComponentName
|
||||
val mComponentName = obj.callMethod("getComponentName") as ComponentName
|
||||
intent.action = "android.intent.action.MAIN"
|
||||
intent.addCategory("android.intent.category.LAUNCHER")
|
||||
intent.component = mComponentName
|
||||
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
|
||||
val callStaticMethod = mActivityUtilsCompat.invokeStaticMethod("makeFreeformActivityOptions", args(view.context, mComponentName.packageName))
|
||||
val callStaticMethod = mActivityUtilsCompat.callStaticMethod("makeFreeformActivityOptions", view.context, mComponentName.packageName)
|
||||
if (callStaticMethod != null) {
|
||||
view.context.startActivity(intent, callStaticMethod.invokeMethod("toBundle") as Bundle)
|
||||
view.context.startActivity(intent, callStaticMethod.callMethod("toBundle") as Bundle)
|
||||
}
|
||||
}
|
||||
}
|
||||
findAllMethods(mSystemShortcutMenu) {
|
||||
name == "getMaxShortcutItemCount"
|
||||
}.hookAfter {
|
||||
|
||||
mSystemShortcutMenu.hookAfterAllMethods("getMaxShortcutItemCount") {
|
||||
it.result = 5
|
||||
}
|
||||
findAllMethods(mAppShortcutMenu) {
|
||||
name == "getMaxShortcutItemCount"
|
||||
}.hookAfter {
|
||||
|
||||
mAppShortcutMenu.hookAfterAllMethods("getMaxShortcutItemCount") {
|
||||
it.result = 5
|
||||
}
|
||||
findAllMethods(mSystemShortcutMenuItem) {
|
||||
name == "createAllSystemShortcutMenuItems"
|
||||
}.hookAfter {
|
||||
|
||||
mSystemShortcutMenuItem.hookAfterAllMethods("createAllSystemShortcutMenuItems") {
|
||||
val isDarkMode =
|
||||
AndroidAppHelper.currentApplication().applicationContext.resources.configuration.uiMode and Configuration.UI_MODE_NIGHT_MASK == Configuration.UI_MODE_NIGHT_YES
|
||||
val mAllSystemShortcutMenuItems = mSystemShortcutMenuItem.getStaticObject("sAllSystemShortcutMenuItems") as Collection<Any>
|
||||
val mAllSystemShortcutMenuItems = mSystemShortcutMenuItem.getStaticObjectField("sAllSystemShortcutMenuItems") as Collection<Any>
|
||||
val mSmallWindowInstance = XposedHelpers.newInstance(mAppDetailsShortcutMenuItem)
|
||||
mSmallWindowInstance.invokeMethod("setShortTitle", args(moduleRes.getString(R.string.miuihome_shortcut_add_small_window_title)))
|
||||
mSmallWindowInstance.invokeMethod(
|
||||
mSmallWindowInstance.callMethod("setShortTitle", moduleRes.getString(R.string.miuihome_shortcut_add_small_window_title))
|
||||
mSmallWindowInstance.callMethod(
|
||||
"setIconDrawable",
|
||||
args(if (isDarkMode) moduleRes.getDrawable(R.drawable.ic_small_window_dark) else moduleRes.getDrawable(R.drawable.ic_small_window_light))
|
||||
if (isDarkMode) moduleRes.getDrawable(R.drawable.ic_small_window_dark) else moduleRes.getDrawable(R.drawable.ic_small_window_light)
|
||||
)
|
||||
val sAllSystemShortcutMenuItems = ArrayList<Any>()
|
||||
sAllSystemShortcutMenuItems.add(mSmallWindowInstance)
|
||||
sAllSystemShortcutMenuItems.addAll(mAllSystemShortcutMenuItems)
|
||||
mSystemShortcutMenuItem.putStaticObject("sAllSystemShortcutMenuItems", sAllSystemShortcutMenuItems)
|
||||
mSystemShortcutMenuItem.setStaticObjectField("sAllSystemShortcutMenuItems", sAllSystemShortcutMenuItems)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.lt2333.simplicitytools.hooks.rules.s.systemui
|
||||
|
||||
|
||||
import android.app.KeyguardManager
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
@@ -16,10 +17,11 @@ import com.lt2333.simplicitytools.utils.XSPUtils
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
|
||||
|
||||
object StatusBarLayoutForS : HookRegister() {
|
||||
|
||||
private val getMode = XSPUtils.getInt("status_bar_layout_mode", 0)
|
||||
private val getHoleLocation = XSPUtils.getInt("screen_hole_location", 0)
|
||||
private val isCompatibilityMode = XSPUtils.getBoolean("layout_compatibility_mode", false)
|
||||
|
||||
private var statusBarLeft = 0
|
||||
private var statusBarTop = 0
|
||||
@@ -32,23 +34,31 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
var mCenterLayout: LinearLayout?
|
||||
var statusBar: ViewGroup? = null
|
||||
|
||||
fun updateLayout(context: Context) {
|
||||
//判断屏幕方向
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, statusBarRight, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
} else {
|
||||
//横屏状态
|
||||
mLeftLayout!!.setPadding(175, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, 175, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
//判断屏幕状态更新布局 mode: 1正常布局 2居中布局
|
||||
fun updateLayout(context: Context,mode: Int) {
|
||||
when(mode){
|
||||
1->{
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { //横屏
|
||||
statusBar!!.setPadding(statusBarLeft, statusBarTop, statusBarRight, statusBarBottom)
|
||||
}
|
||||
}
|
||||
2->{
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { //横屏
|
||||
mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, statusBarRight, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
}else{ //竖屏
|
||||
mLeftLayout!!.setPadding(0, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, 0, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//判断是否开启居中挖孔兼容模式
|
||||
if (getHoleLocation == 1) {
|
||||
//判断是否开启挖孔兼容模式
|
||||
if (isCompatibilityMode) {
|
||||
findMethod("com.android.systemui.ScreenDecorations\$DisplayCutoutView") {
|
||||
name == "boundsFromDirection" && parameterCount == 3 && isStatic
|
||||
}.hookBefore {
|
||||
@@ -56,48 +66,83 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
}
|
||||
}
|
||||
|
||||
//修改对应布局
|
||||
when (getMode) {
|
||||
//默认
|
||||
0 -> return
|
||||
0 -> {
|
||||
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
|
||||
statusBarLeft = statusBar!!.paddingLeft
|
||||
statusBarTop = statusBar!!.paddingTop
|
||||
statusBarRight = statusBar!!.paddingRight
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
}
|
||||
|
||||
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//兼容模式
|
||||
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||
name == "updateLayoutForCutout"
|
||||
}.hookAfter {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
}
|
||||
//时钟居中
|
||||
1 -> {
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int =
|
||||
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||
val systemIconAreaId: Int =
|
||||
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int = res.getIdentifier(
|
||||
"status_bar_contents", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconAreaId: Int = res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val phoneStatusBarLeftContainerId: Int =
|
||||
res.getIdentifier(
|
||||
"phone_status_bar_left_container",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val notificationIconAreaInnerId: Int =
|
||||
res.getIdentifier(
|
||||
"notification_icon_area_inner",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val phoneStatusBarLeftContainerId: Int = res.getIdentifier(
|
||||
"phone_status_bar_left_container", "id", "com.android.systemui"
|
||||
)
|
||||
val notificationIconAreaInnerId: Int = res.getIdentifier(
|
||||
"notification_icon_area_inner", "id", "com.android.systemui"
|
||||
)
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
val statusBarContents: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
val statusBarContents: ViewGroup = miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||
val notificationIconAreaInner: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId)
|
||||
val systemIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
phoneStatusBarLeftContainerId
|
||||
)
|
||||
val notificationIconAreaInner: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
notificationIconAreaInnerId
|
||||
)
|
||||
val systemIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||
@@ -108,41 +153,39 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
)
|
||||
(systemIconArea.parent as ViewGroup).removeView(systemIconArea)
|
||||
|
||||
val mConstraintLayout =
|
||||
ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
val mConstraintLayout = ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
|
||||
mConstraintLayout.addView(notificationIconAreaInner)
|
||||
|
||||
val fullscreenNotificationIconAreaLp = LinearLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
|
||||
notificationIconAreaInner.layoutParams = fullscreenNotificationIconAreaLp
|
||||
|
||||
//增加一个左对齐布局
|
||||
mLeftLayout = LinearLayout(context)
|
||||
val leftLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val leftLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mLeftLayout!!.layoutParams = leftLp
|
||||
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个居中布局
|
||||
mCenterLayout = LinearLayout(context)
|
||||
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
mCenterLayout!!.layoutParams = centerLp
|
||||
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||
mRightLayout = LinearLayout(context)
|
||||
val rightLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val rightLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mRightLayout!!.layoutParams = rightLp
|
||||
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||
mLeftLayout!!.addView(phoneStatusBarLeftContainer)
|
||||
@@ -160,7 +203,7 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (getHoleLocation == 2) {
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
@@ -170,7 +213,7 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -179,7 +222,7 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
}.hookAfter {
|
||||
hasEnable("layout_compatibility_mode") {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -188,14 +231,12 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
|
||||
//组件ID
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val batteryId: Int = res.getIdentifier("battery", "id", "com.android.systemui")
|
||||
|
||||
@@ -207,8 +248,7 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
|
||||
//新建布局
|
||||
val rightLp = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.marginStart = dp2px(context, 5f)
|
||||
}
|
||||
@@ -220,6 +260,36 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
battery.addView(mRightLayout)
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
mRightLayout!!.addView(clock)
|
||||
|
||||
|
||||
statusBarLeft = statusBar!!.paddingLeft
|
||||
statusBarTop = statusBar!!.paddingTop
|
||||
statusBarRight = statusBar!!.paddingRight
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
}
|
||||
|
||||
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
|
||||
//兼容模式
|
||||
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||
name == "updateLayoutForCutout"
|
||||
}.hookAfter {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
}
|
||||
//时钟居中+图标居左
|
||||
@@ -227,65 +297,45 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int =
|
||||
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||
val systemIconAreaId: Int =
|
||||
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int = res.getIdentifier(
|
||||
"status_bar_contents", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconAreaId: Int = res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val phoneStatusBarLeftContainerId: Int =
|
||||
res.getIdentifier(
|
||||
"phone_status_bar_left_container",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val fullscreenNotificationIconAreaId: Int =
|
||||
res.getIdentifier(
|
||||
"fullscreen_notification_icon_area",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val statusIconsId: Int =
|
||||
res.getIdentifier(
|
||||
"statusIcons",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val systemIconsId: Int =
|
||||
res.getIdentifier(
|
||||
"system_icons",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val batteryId: Int =
|
||||
res.getIdentifier(
|
||||
"battery",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val phoneStatusBarLeftContainerId: Int = res.getIdentifier(
|
||||
"phone_status_bar_left_container", "id", "com.android.systemui"
|
||||
)
|
||||
val fullscreenNotificationIconAreaId: Int = res.getIdentifier(
|
||||
"fullscreen_notification_icon_area", "id", "com.android.systemui"
|
||||
)
|
||||
val statusIconsId: Int = res.getIdentifier(
|
||||
"statusIcons", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconsId: Int = res.getIdentifier(
|
||||
"system_icons", "id", "com.android.systemui"
|
||||
)
|
||||
val batteryId: Int = res.getIdentifier(
|
||||
"battery", "id", "com.android.systemui"
|
||||
)
|
||||
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
val statusBarContents: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
val statusBarContents: ViewGroup = miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||
val fullscreenNotificationIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(fullscreenNotificationIconAreaId)
|
||||
val systemIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val statusIcons: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusIconsId)
|
||||
val systemIcons: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconsId)
|
||||
val battery: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(batteryId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
phoneStatusBarLeftContainerId
|
||||
)
|
||||
val fullscreenNotificationIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
fullscreenNotificationIconAreaId
|
||||
)
|
||||
val systemIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val statusIcons: ViewGroup = miuiPhoneStatusBarView.findViewById(statusIconsId)
|
||||
val systemIcons: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconsId)
|
||||
val battery: ViewGroup = miuiPhoneStatusBarView.findViewById(batteryId)
|
||||
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||
@@ -299,29 +349,25 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
fullscreenNotificationIconArea
|
||||
)
|
||||
|
||||
val mConstraintLayout =
|
||||
ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
val mConstraintLayout = ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
|
||||
mConstraintLayout.addView(fullscreenNotificationIconArea)
|
||||
mConstraintLayout.addView(battery)
|
||||
|
||||
|
||||
battery.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.endToEnd = 0
|
||||
}
|
||||
|
||||
|
||||
fullscreenNotificationIconArea.layoutParams = ConstraintLayout.LayoutParams(
|
||||
0,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
0, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.startToEnd = batteryId
|
||||
it.endToEnd = 0
|
||||
@@ -331,24 +377,25 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
|
||||
//增加一个左对齐布局
|
||||
mLeftLayout = LinearLayout(context)
|
||||
val leftLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val leftLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mLeftLayout!!.layoutParams = leftLp
|
||||
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个居中布局
|
||||
mCenterLayout = LinearLayout(context)
|
||||
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
mCenterLayout!!.layoutParams = centerLp
|
||||
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个右布局
|
||||
mRightLayout = LinearLayout(context)
|
||||
val rightLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val rightLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mRightLayout!!.layoutParams = rightLp
|
||||
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||
|
||||
@@ -375,7 +422,7 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (getHoleLocation == 2) {
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
@@ -385,16 +432,16 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
//兼容模式
|
||||
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||
name == "updateLayoutForCutout"
|
||||
}.hookAfter {
|
||||
if (getHoleLocation == 2) {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -404,12 +451,10 @@ object StatusBarLayoutForS : HookRegister() {
|
||||
}.hookAfter {
|
||||
val miuiPhoneStatusBarView = it.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val res = miuiPhoneStatusBarView.resources
|
||||
val statusBarId =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarId = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBar1 = miuiPhoneStatusBarView.findViewById<ViewGroup>(statusBarId)
|
||||
//非锁屏下整个状态栏布局
|
||||
val keyguardMgr =
|
||||
statusBar1.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||
val keyguardMgr = statusBar1.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||
if (keyguardMgr.isKeyguardLocked) {
|
||||
statusBar1!!.visibility = View.GONE
|
||||
} else {
|
||||
|
||||
@@ -2,12 +2,10 @@ package com.lt2333.simplicitytools.hooks.rules.s.systemui
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.Context
|
||||
import android.content.res.Resources
|
||||
import android.os.Handler
|
||||
import android.provider.Settings
|
||||
import android.util.TypedValue
|
||||
import android.view.Gravity
|
||||
import android.view.ViewGroup
|
||||
import android.widget.TextView
|
||||
import com.github.kyuubiran.ezxhelper.utils.*
|
||||
import com.lt2333.simplicitytools.utils.XSPUtils
|
||||
@@ -16,6 +14,7 @@ import java.lang.reflect.Method
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.*
|
||||
|
||||
|
||||
object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
|
||||
private val getMode = XSPUtils.getInt("custom_clock_mode", 0)
|
||||
@@ -30,14 +29,12 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
private val isSecond = XSPUtils.getBoolean("status_bar_time_seconds", false)
|
||||
private val isDoubleHour = XSPUtils.getBoolean("status_bar_time_double_hour", false)
|
||||
private val isPeriod = XSPUtils.getBoolean("status_bar_time_period", true)
|
||||
private val isCenterAlign =
|
||||
XSPUtils.getBoolean("status_bar_time_double_line_center_align", false)
|
||||
private val isCenterAlign = XSPUtils.getBoolean("status_bar_time_double_line_center_align", false)
|
||||
|
||||
//极客模式
|
||||
private val getGeekClockSize = XSPUtils.getInt("status_bar_clock_size_geek", 0)
|
||||
private val getGeekFormat = XSPUtils.getString("custom_clock_format_geek", "HH:mm:ss")
|
||||
private val isGeekCenterAlign =
|
||||
XSPUtils.getBoolean("status_bar_time_center_align_geek", false)
|
||||
private val isGeekCenterAlign = XSPUtils.getBoolean("status_bar_time_center_align_geek", false)
|
||||
|
||||
private lateinit var nowTime: Date
|
||||
private var str = ""
|
||||
@@ -83,9 +80,7 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
}
|
||||
}
|
||||
Timer().scheduleAtFixedRate(
|
||||
T(),
|
||||
1000 - System.currentTimeMillis() % 1000,
|
||||
1000
|
||||
T(), 1000 - System.currentTimeMillis() % 1000, 1000
|
||||
)
|
||||
} catch (_: Exception) {
|
||||
}
|
||||
@@ -98,8 +93,7 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
val textV = it.thisObject as TextView
|
||||
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||
val t = Settings.System.getString(
|
||||
c!!.contentResolver,
|
||||
Settings.System.TIME_12_24
|
||||
c!!.contentResolver, Settings.System.TIME_12_24
|
||||
)
|
||||
val is24 = t == "24"
|
||||
nowTime = Calendar.getInstance().time
|
||||
@@ -110,15 +104,18 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
}
|
||||
|
||||
if (isCenterAlign) {
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
findConstructor("com.android.systemui.statusbar.views.MiuiClock") {
|
||||
paramCount == 3
|
||||
}.hookAfter {
|
||||
val miuiPhoneStatusBarView =
|
||||
it.thisObject.getObject("mStatusBar") as ViewGroup
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
clock.gravity = Gravity.CENTER
|
||||
try {
|
||||
val textV = it.thisObject as TextView
|
||||
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||
c = it.args[0] as Context
|
||||
val textV = it.thisObject as TextView
|
||||
textV.gravity = Gravity.CENTER
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -152,9 +149,7 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
}
|
||||
}
|
||||
Timer().scheduleAtFixedRate(
|
||||
T(),
|
||||
1000 - System.currentTimeMillis() % 1000,
|
||||
1000
|
||||
T(), 1000 - System.currentTimeMillis() % 1000, 1000
|
||||
)
|
||||
} catch (_: Exception) {
|
||||
}
|
||||
@@ -162,27 +157,38 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
|
||||
findMethod("com.android.systemui.statusbar.views.MiuiClock") {
|
||||
name == "updateTime"
|
||||
}.hookAfter {
|
||||
}.hookBefore {
|
||||
try {
|
||||
val textV = it.thisObject as TextView
|
||||
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||
nowTime = Calendar.getInstance().time
|
||||
textV.text = SimpleDateFormat(getGeekFormat).format(nowTime)
|
||||
val mMiuiStatusBarClockController = textV.getObject("mMiuiStatusBarClockController")
|
||||
val mCalendar = mMiuiStatusBarClockController.invokeMethodAuto("getCalendar")
|
||||
mCalendar?.invokeMethodAuto(
|
||||
"setTimeInMillis", System.currentTimeMillis()
|
||||
)
|
||||
val textSb = StringBuilder()
|
||||
val formatSb = StringBuilder(getGeekFormat.toString())
|
||||
mCalendar?.invokeMethodAuto("format", c, textSb, formatSb)
|
||||
textV.text = textSb.toString()
|
||||
it.result = null
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
}
|
||||
}
|
||||
|
||||
if (isGeekCenterAlign) {
|
||||
findMethod("com.android.systemui.statusbar.phone.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
findConstructor("com.android.systemui.statusbar.views.MiuiClock") {
|
||||
paramCount == 3
|
||||
}.hookAfter {
|
||||
val miuiPhoneStatusBarView =
|
||||
it.thisObject.getObject("mStatusBar") as ViewGroup
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
clock.gravity = Gravity.CENTER
|
||||
try {
|
||||
val textV = it.thisObject as TextView
|
||||
if (textV.resources.getResourceEntryName(textV.id) == "clock") {
|
||||
c = it.args[0] as Context
|
||||
val textV = it.thisObject as TextView
|
||||
textV.gravity = Gravity.CENTER
|
||||
}
|
||||
} catch (_: Exception) {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -197,7 +203,6 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
if (isYear) {
|
||||
if (isZh) {
|
||||
datePattern += "YY年"
|
||||
// if (!isHideSpace) datePattern = "$datePattern "
|
||||
} else {
|
||||
datePattern += "YY"
|
||||
if (isMonth || isDay) datePattern += "/"
|
||||
@@ -206,7 +211,6 @@ object StatusBarTimeCustomizationForS : HookRegister() {
|
||||
if (isMonth) {
|
||||
if (isZh) {
|
||||
datePattern += "M月"
|
||||
// if (!isHideSpace) datePattern = "$datePattern "
|
||||
} else {
|
||||
datePattern += "M"
|
||||
if (isDay) datePattern += "/"
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.lt2333.simplicitytools.hooks.rules.t.systemui
|
||||
|
||||
import com.github.kyuubiran.ezxhelper.utils.findMethod
|
||||
import com.github.kyuubiran.ezxhelper.utils.hookBefore
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
|
||||
object DisableBluetoothTemporarilyOffForT: HookRegister() {
|
||||
override fun init()= hasEnable("disable_bluetooth_temporarily_off") {
|
||||
findMethod("com.android.settingslib.bluetooth.LocalBluetoothAdapter"){
|
||||
name == "isSupportBluetoothRestrict" && parameterCount==1
|
||||
}.hookBefore {
|
||||
it.result = false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -16,42 +16,47 @@ import com.lt2333.simplicitytools.utils.XSPUtils
|
||||
import com.lt2333.simplicitytools.utils.hasEnable
|
||||
import com.lt2333.simplicitytools.utils.xposed.base.HookRegister
|
||||
|
||||
|
||||
object StatusBarLayoutForT : HookRegister() {
|
||||
|
||||
private val getMode = XSPUtils.getInt("status_bar_layout_mode", 0)
|
||||
private val isCompatibilityMode = XSPUtils.getBoolean("layout_compatibility_mode", false)
|
||||
|
||||
|
||||
private var statusBarLeft = 0
|
||||
private var statusBarTop = 0
|
||||
private var statusBarRight = 0
|
||||
private var statusBarBottom = 0
|
||||
|
||||
override fun init() {
|
||||
|
||||
// TODO: Android13状态栏布局不可用
|
||||
|
||||
var mLeftLayout: LinearLayout? = null
|
||||
var mRightLayout: LinearLayout? = null
|
||||
var mCenterLayout: LinearLayout?
|
||||
var statusBar: ViewGroup? = null
|
||||
|
||||
fun updateLayout(context: Context) {
|
||||
//判断屏幕方向
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) {
|
||||
mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, statusBarRight, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
} else {
|
||||
//横屏状态
|
||||
mLeftLayout!!.setPadding(175, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, 175, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
//判断屏幕状态更新布局 mode: 1正常布局 2居中布局
|
||||
fun updateLayout(context: Context,mode: Int) {
|
||||
when(mode){
|
||||
1->{
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { //横屏
|
||||
statusBar!!.setPadding(statusBarLeft, statusBarTop, statusBarRight, statusBarBottom)
|
||||
}
|
||||
}
|
||||
2->{
|
||||
val mConfiguration: Configuration = context.resources.configuration
|
||||
if (mConfiguration.orientation == Configuration.ORIENTATION_PORTRAIT) { //横屏
|
||||
mLeftLayout!!.setPadding(statusBarLeft, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, statusBarRight, 0)
|
||||
statusBar!!.setPadding(0, statusBarTop, 0, statusBarBottom)
|
||||
}else{ //竖屏
|
||||
mLeftLayout!!.setPadding(0, 0, 0, 0)
|
||||
mRightLayout!!.setPadding(0, 0, 0, 0)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//判断是否开启居中挖孔兼容模式
|
||||
//判断是否开启挖孔兼容模式
|
||||
if (isCompatibilityMode) {
|
||||
findMethod("com.android.systemui.ScreenDecorations") {
|
||||
name == "boundsFromDirection" && parameterCount == 3 && isStatic
|
||||
@@ -60,48 +65,83 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
}
|
||||
}
|
||||
|
||||
//修改对应布局
|
||||
when (getMode) {
|
||||
//默认
|
||||
0 -> return
|
||||
0 -> {
|
||||
|
||||
findMethod("com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
|
||||
statusBarLeft = statusBar!!.paddingLeft
|
||||
statusBarTop = statusBar!!.paddingTop
|
||||
statusBarRight = statusBar!!.paddingRight
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
}
|
||||
|
||||
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//兼容模式
|
||||
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||
name == "updateLayoutForCutout"
|
||||
}.hookAfter {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
}
|
||||
//时钟居中
|
||||
1 -> {
|
||||
findMethod("com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int =
|
||||
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||
val systemIconAreaId: Int =
|
||||
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int = res.getIdentifier(
|
||||
"status_bar_contents", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconAreaId: Int = res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val phoneStatusBarLeftContainerId: Int =
|
||||
res.getIdentifier(
|
||||
"phone_status_bar_left_container",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val notificationIconAreaInnerId: Int =
|
||||
res.getIdentifier(
|
||||
"notification_icon_area_inner",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val phoneStatusBarLeftContainerId: Int = res.getIdentifier(
|
||||
"phone_status_bar_left_container", "id", "com.android.systemui"
|
||||
)
|
||||
val notificationIconAreaInnerId: Int = res.getIdentifier(
|
||||
"notification_icon_area_inner", "id", "com.android.systemui"
|
||||
)
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
val statusBarContents: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
val statusBarContents: ViewGroup = miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||
val notificationIconAreaInner: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(notificationIconAreaInnerId)
|
||||
val systemIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
phoneStatusBarLeftContainerId
|
||||
)
|
||||
val notificationIconAreaInner: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
notificationIconAreaInnerId
|
||||
)
|
||||
val systemIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||
@@ -112,41 +152,39 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
)
|
||||
(systemIconArea.parent as ViewGroup).removeView(systemIconArea)
|
||||
|
||||
val mConstraintLayout =
|
||||
ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
val mConstraintLayout = ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
|
||||
mConstraintLayout.addView(notificationIconAreaInner)
|
||||
|
||||
val fullscreenNotificationIconAreaLp = LinearLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
|
||||
notificationIconAreaInner.layoutParams = fullscreenNotificationIconAreaLp
|
||||
|
||||
//增加一个左对齐布局
|
||||
mLeftLayout = LinearLayout(context)
|
||||
val leftLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val leftLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mLeftLayout!!.layoutParams = leftLp
|
||||
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个居中布局
|
||||
mCenterLayout = LinearLayout(context)
|
||||
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
mCenterLayout!!.layoutParams = centerLp
|
||||
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||
mRightLayout = LinearLayout(context)
|
||||
val rightLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val rightLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mRightLayout!!.layoutParams = rightLp
|
||||
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||
mLeftLayout!!.addView(phoneStatusBarLeftContainer)
|
||||
@@ -174,7 +212,7 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +221,7 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
}.hookAfter {
|
||||
hasEnable("layout_compatibility_mode") {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -192,14 +230,12 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
findMethod("com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
|
||||
//组件ID
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val batteryId: Int = res.getIdentifier("battery", "id", "com.android.systemui")
|
||||
|
||||
@@ -211,8 +247,7 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
|
||||
//新建布局
|
||||
val rightLp = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.marginStart = dp2px(context, 5f)
|
||||
}
|
||||
@@ -224,6 +259,36 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
battery.addView(mRightLayout)
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
mRightLayout!!.addView(clock)
|
||||
|
||||
|
||||
statusBarLeft = statusBar!!.paddingLeft
|
||||
statusBarTop = statusBar!!.paddingTop
|
||||
statusBarRight = statusBar!!.paddingRight
|
||||
statusBarBottom = statusBar!!.paddingBottom
|
||||
|
||||
|
||||
if (isCompatibilityMode) {
|
||||
val customLeftMargin = XSPUtils.getInt("status_bar_left_margin", 0)
|
||||
if (customLeftMargin != 0) {
|
||||
statusBarLeft = customLeftMargin
|
||||
}
|
||||
|
||||
val customRightMargin = XSPUtils.getInt("status_bar_right_margin", 0)
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
|
||||
//兼容模式
|
||||
findMethod("com.android.systemui.statusbar.phone.PhoneStatusBarView") {
|
||||
name == "updateLayoutForCutout"
|
||||
}.hookAfter {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context,1)
|
||||
}
|
||||
}
|
||||
}
|
||||
//时钟居中+图标居左
|
||||
@@ -231,65 +296,45 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
findMethod("com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment") {
|
||||
name == "onViewCreated" && parameterCount == 2
|
||||
}.hookAfter { param ->
|
||||
val miuiPhoneStatusBarView =
|
||||
param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val miuiPhoneStatusBarView = param.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val context: Context = miuiPhoneStatusBarView.context
|
||||
val res: Resources = miuiPhoneStatusBarView.resources
|
||||
val statusBarId: Int =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int =
|
||||
res.getIdentifier("status_bar_contents", "id", "com.android.systemui")
|
||||
val systemIconAreaId: Int =
|
||||
res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val statusBarId: Int = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarContentsId: Int = res.getIdentifier(
|
||||
"status_bar_contents", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconAreaId: Int = res.getIdentifier("system_icon_area", "id", "com.android.systemui")
|
||||
val clockId: Int = res.getIdentifier("clock", "id", "com.android.systemui")
|
||||
val phoneStatusBarLeftContainerId: Int =
|
||||
res.getIdentifier(
|
||||
"phone_status_bar_left_container",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val fullscreenNotificationIconAreaId: Int =
|
||||
res.getIdentifier(
|
||||
"fullscreen_notification_icon_area",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val statusIconsId: Int =
|
||||
res.getIdentifier(
|
||||
"statusIcons",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val systemIconsId: Int =
|
||||
res.getIdentifier(
|
||||
"system_icons",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val batteryId: Int =
|
||||
res.getIdentifier(
|
||||
"battery",
|
||||
"id",
|
||||
"com.android.systemui"
|
||||
)
|
||||
val phoneStatusBarLeftContainerId: Int = res.getIdentifier(
|
||||
"phone_status_bar_left_container", "id", "com.android.systemui"
|
||||
)
|
||||
val fullscreenNotificationIconAreaId: Int = res.getIdentifier(
|
||||
"fullscreen_notification_icon_area", "id", "com.android.systemui"
|
||||
)
|
||||
val statusIconsId: Int = res.getIdentifier(
|
||||
"statusIcons", "id", "com.android.systemui"
|
||||
)
|
||||
val systemIconsId: Int = res.getIdentifier(
|
||||
"system_icons", "id", "com.android.systemui"
|
||||
)
|
||||
val batteryId: Int = res.getIdentifier(
|
||||
"battery", "id", "com.android.systemui"
|
||||
)
|
||||
|
||||
statusBar = miuiPhoneStatusBarView.findViewById(statusBarId)
|
||||
val statusBarContents: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
val statusBarContents: ViewGroup = miuiPhoneStatusBarView.findViewById(statusBarContentsId)
|
||||
if (statusBar == null) return@hookAfter
|
||||
val clock: TextView = miuiPhoneStatusBarView.findViewById(clockId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(phoneStatusBarLeftContainerId)
|
||||
val fullscreenNotificationIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(fullscreenNotificationIconAreaId)
|
||||
val systemIconArea: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val statusIcons: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(statusIconsId)
|
||||
val systemIcons: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(systemIconsId)
|
||||
val battery: ViewGroup =
|
||||
miuiPhoneStatusBarView.findViewById(batteryId)
|
||||
val phoneStatusBarLeftContainer: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
phoneStatusBarLeftContainerId
|
||||
)
|
||||
val fullscreenNotificationIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(
|
||||
fullscreenNotificationIconAreaId
|
||||
)
|
||||
val systemIconArea: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconAreaId)
|
||||
val statusIcons: ViewGroup = miuiPhoneStatusBarView.findViewById(statusIconsId)
|
||||
val systemIcons: ViewGroup = miuiPhoneStatusBarView.findViewById(systemIconsId)
|
||||
val battery: ViewGroup = miuiPhoneStatusBarView.findViewById(batteryId)
|
||||
|
||||
(clock.parent as ViewGroup).removeView(clock)
|
||||
(phoneStatusBarLeftContainer.parent as ViewGroup).removeView(
|
||||
@@ -303,29 +348,25 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
fullscreenNotificationIconArea
|
||||
)
|
||||
|
||||
val mConstraintLayout =
|
||||
ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
val mConstraintLayout = ConstraintLayout(context).also {
|
||||
it.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
}
|
||||
|
||||
mConstraintLayout.addView(fullscreenNotificationIconArea)
|
||||
mConstraintLayout.addView(battery)
|
||||
|
||||
|
||||
battery.layoutParams = ConstraintLayout.LayoutParams(
|
||||
ConstraintLayout.LayoutParams.WRAP_CONTENT,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
ConstraintLayout.LayoutParams.WRAP_CONTENT, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.endToEnd = 0
|
||||
}
|
||||
|
||||
|
||||
fullscreenNotificationIconArea.layoutParams = ConstraintLayout.LayoutParams(
|
||||
0,
|
||||
ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
0, ConstraintLayout.LayoutParams.MATCH_PARENT
|
||||
).also {
|
||||
it.startToEnd = batteryId
|
||||
it.endToEnd = 0
|
||||
@@ -335,24 +376,25 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
|
||||
//增加一个左对齐布局
|
||||
mLeftLayout = LinearLayout(context)
|
||||
val leftLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val leftLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mLeftLayout!!.layoutParams = leftLp
|
||||
mLeftLayout!!.gravity = Gravity.START or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个居中布局
|
||||
mCenterLayout = LinearLayout(context)
|
||||
val centerLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
||||
LinearLayout.LayoutParams.MATCH_PARENT
|
||||
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT
|
||||
)
|
||||
mCenterLayout!!.layoutParams = centerLp
|
||||
mCenterLayout!!.gravity = Gravity.CENTER or Gravity.CENTER_VERTICAL
|
||||
|
||||
//增加一个右布局
|
||||
mRightLayout = LinearLayout(context)
|
||||
val rightLp: LinearLayout.LayoutParams =
|
||||
LinearLayout.LayoutParams(0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f)
|
||||
val rightLp: LinearLayout.LayoutParams = LinearLayout.LayoutParams(
|
||||
0, LinearLayout.LayoutParams.MATCH_PARENT, 1.0f
|
||||
)
|
||||
mRightLayout!!.layoutParams = rightLp
|
||||
mRightLayout!!.gravity = Gravity.END or Gravity.CENTER_VERTICAL
|
||||
|
||||
@@ -389,7 +431,7 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
if (customRightMargin != 0) {
|
||||
statusBarRight = customRightMargin
|
||||
}
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
//兼容模式
|
||||
@@ -398,7 +440,7 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
}.hookAfter {
|
||||
if (isCompatibilityMode) {
|
||||
val context = (it.thisObject as ViewGroup).context
|
||||
updateLayout(context)
|
||||
updateLayout(context,2)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -408,18 +450,24 @@ object StatusBarLayoutForT : HookRegister() {
|
||||
}.hookAfter {
|
||||
val miuiPhoneStatusBarView = it.thisObject.getObjectAs<ViewGroup>("mStatusBar")
|
||||
val res = miuiPhoneStatusBarView.resources
|
||||
val statusBarId =
|
||||
res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBarId = res.getIdentifier("status_bar", "id", "com.android.systemui")
|
||||
val statusBar1 = miuiPhoneStatusBarView.findViewById<ViewGroup>(statusBarId)
|
||||
//非锁屏下整个状态栏布局
|
||||
val keyguardMgr =
|
||||
statusBar1.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||
val keyguardMgr = statusBar1.context.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager
|
||||
if (keyguardMgr.isKeyguardLocked) {
|
||||
statusBar1!!.visibility = View.GONE
|
||||
} else {
|
||||
statusBar1!!.visibility = View.VISIBLE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//TODO: 修改图标的顺序
|
||||
/*findConstructor("com.android.systemui.statusbar.phone.StatusBarIconList") {
|
||||
parameterCount == 1
|
||||
}.hookBefore {
|
||||
|
||||
}*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,439 @@
|
||||
@file:Suppress("unused")
|
||||
|
||||
package com.lt2333.simplicitytools.utils
|
||||
|
||||
import android.annotation.SuppressLint
|
||||
import android.content.res.XResources
|
||||
import com.github.kyuubiran.ezxhelper.init.InitFields.ezXClassLoader
|
||||
import com.github.kyuubiran.ezxhelper.utils.Log
|
||||
import dalvik.system.BaseDexClassLoader
|
||||
import de.robv.android.xposed.XC_MethodHook
|
||||
import de.robv.android.xposed.XC_MethodHook.MethodHookParam
|
||||
import de.robv.android.xposed.XC_MethodReplacement
|
||||
import de.robv.android.xposed.XposedBridge.*
|
||||
import de.robv.android.xposed.XposedHelpers.*
|
||||
import de.robv.android.xposed.callbacks.XC_LayoutInflated
|
||||
import java.lang.reflect.Field
|
||||
import java.lang.reflect.Member
|
||||
import java.lang.reflect.Modifier
|
||||
import java.util.Enumeration
|
||||
|
||||
typealias MethodHookParam = MethodHookParam
|
||||
typealias Replacer = (MethodHookParam) -> Any?
|
||||
typealias Hooker = (MethodHookParam) -> Unit
|
||||
|
||||
fun Class<*>.hookMethod(method: String?, vararg args: Any?) = try {
|
||||
findAndHookMethod(this, method, *args)
|
||||
} catch (e: NoSuchMethodError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
fun Member.hookMethod(callback: XC_MethodHook) = try {
|
||||
hookMethod(this, callback)
|
||||
} catch (e: Throwable) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun MethodHookParam.callHooker(crossinline hooker: Hooker) = try {
|
||||
hooker(this)
|
||||
} catch (e: Throwable) {
|
||||
Log.e("Error occurred calling hooker on ${this.method}")
|
||||
Log.e(e)
|
||||
}
|
||||
|
||||
inline fun MethodHookParam.callReplacer(crossinline replacer: Replacer) = try {
|
||||
replacer(this)
|
||||
} catch (e: Throwable) {
|
||||
Log.e("Error occurred calling replacer on ${this.method}")
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun Member.replaceMethod(crossinline replacer: Replacer) = hookMethod(object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer)
|
||||
})
|
||||
|
||||
inline fun Member.hookAfterMethod(crossinline hooker: Hooker) = hookMethod(object : XC_MethodHook() {
|
||||
override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Member.hookBeforeMethod(crossinline hooker: (MethodHookParam) -> Unit) = hookMethod(object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.hookBeforeMethod(
|
||||
method: String?, vararg args: Any?, crossinline hooker: Hooker
|
||||
) = hookMethod(method, *args, object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.hookAfterMethod(
|
||||
method: String?, vararg args: Any?, crossinline hooker: Hooker
|
||||
) = hookMethod(method, *args, object : XC_MethodHook() {
|
||||
override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.replaceMethod(
|
||||
method: String?, vararg args: Any?, crossinline replacer: Replacer
|
||||
) = hookMethod(method, *args, object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer)
|
||||
})
|
||||
|
||||
fun Class<*>.hookAllMethods(methodName: String?, hooker: XC_MethodHook): Set<XC_MethodHook.Unhook> = try {
|
||||
hookAllMethods(this, methodName, hooker)
|
||||
} catch (e: NoSuchMethodError) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
}
|
||||
|
||||
inline fun Class<*>.hookBeforeAllMethods(methodName: String?, crossinline hooker: Hooker) = hookAllMethods(methodName, object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.hookAfterAllMethods(methodName: String?, crossinline hooker: Hooker) = hookAllMethods(methodName, object : XC_MethodHook() {
|
||||
override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
|
||||
})
|
||||
|
||||
inline fun Class<*>.replaceAllMethods(methodName: String?, crossinline replacer: Replacer) =
|
||||
hookAllMethods(methodName, object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(param: MethodHookParam) = param.callReplacer(replacer)
|
||||
})
|
||||
|
||||
fun Class<*>.hookConstructor(vararg args: Any?) = try {
|
||||
findAndHookConstructor(this, *args)
|
||||
} catch (e: NoSuchMethodError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun Class<*>.hookBeforeConstructor(vararg args: Any?, crossinline hooker: Hooker) = hookConstructor(*args, object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.hookAfterConstructor(vararg args: Any?, crossinline hooker: Hooker) = hookConstructor(*args, object : XC_MethodHook() {
|
||||
override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.replaceConstructor(vararg args: Any?, crossinline hooker: Hooker) = hookConstructor(*args, object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
fun Class<*>.hookAllConstructors(hooker: XC_MethodHook): Set<XC_MethodHook.Unhook> = try {
|
||||
hookAllConstructors(this, hooker)
|
||||
} catch (e: NoSuchMethodError) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
emptySet()
|
||||
}
|
||||
|
||||
inline fun Class<*>.hookAfterAllConstructors(crossinline hooker: Hooker) = hookAllConstructors(object : XC_MethodHook() {
|
||||
override fun afterHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.hookBeforeAllConstructors(crossinline hooker: Hooker) = hookAllConstructors(object : XC_MethodHook() {
|
||||
override fun beforeHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
inline fun Class<*>.replaceAllConstructors(crossinline hooker: Hooker) = hookAllConstructors(object : XC_MethodReplacement() {
|
||||
override fun replaceHookedMethod(param: MethodHookParam) = param.callHooker(hooker)
|
||||
})
|
||||
|
||||
fun String.hookMethod(
|
||||
method: String?, vararg args: Any?
|
||||
) = try {
|
||||
findClass().hookMethod(method, *args)
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun String.hookBeforeMethod(
|
||||
method: String?, vararg args: Any?, crossinline hooker: Hooker
|
||||
) = try {
|
||||
findClass().hookBeforeMethod(method, *args, hooker = hooker)
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun String.hookAfterMethod(
|
||||
method: String?, vararg args: Any?, crossinline hooker: Hooker
|
||||
) = try {
|
||||
findClass().hookAfterMethod(method, *args, hooker = hooker)
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
inline fun String.replaceMethod(
|
||||
method: String?, vararg args: Any?, crossinline replacer: Replacer
|
||||
) = try {
|
||||
findClass().replaceMethod(method, *args, replacer = replacer)
|
||||
} catch (e: ClassNotFoundError) {
|
||||
Log.e(e)
|
||||
null
|
||||
} catch (e: ClassNotFoundException) {
|
||||
Log.e(e)
|
||||
null
|
||||
}
|
||||
|
||||
fun MethodHookParam.invokeOriginalMethod(): Any? = invokeOriginalMethod(method, thisObject, args)
|
||||
|
||||
inline fun <T, R> T.runCatchingOrNull(func: T.() -> R?) = try {
|
||||
func()
|
||||
} catch (e: Throwable) {
|
||||
null
|
||||
}
|
||||
|
||||
fun Any.getObjectField(field: String?): Any? = getObjectField(this, field)
|
||||
|
||||
fun Any.getObjectFieldOrNull(field: String?): Any? = runCatchingOrNull {
|
||||
getObjectField(this, field)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.getObjectFieldAs(field: String?) = getObjectField(this, field) as T
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.getObjectFieldOrNullAs(field: String?) = runCatchingOrNull {
|
||||
getObjectField(this, field) as T
|
||||
}
|
||||
|
||||
fun Any.getIntField(field: String?) = getIntField(this, field)
|
||||
|
||||
fun Any.getIntFieldOrNull(field: String?) = runCatchingOrNull {
|
||||
getIntField(this, field)
|
||||
}
|
||||
|
||||
fun Any.getLongField(field: String?) = getLongField(this, field)
|
||||
|
||||
fun Any.getLongFieldOrNull(field: String?) = runCatchingOrNull {
|
||||
getLongField(this, field)
|
||||
}
|
||||
|
||||
fun Any.getBooleanField(field: String?) = getBooleanField(this, field)
|
||||
|
||||
fun Any.getBooleanFieldOrNull(field: String?) = runCatchingOrNull {
|
||||
getBooleanField(this, field)
|
||||
}
|
||||
|
||||
fun Any.callMethod(methodName: String?, vararg args: Any?): Any? = callMethod(this, methodName, *args)
|
||||
|
||||
fun Any.callMethodOrNull(methodName: String?, vararg args: Any?): Any? = runCatchingOrNull {
|
||||
callMethod(this, methodName, *args)
|
||||
}
|
||||
|
||||
fun Class<*>.callStaticMethod(methodName: String?, vararg args: Any?): Any? = callStaticMethod(this, methodName, *args)
|
||||
|
||||
fun Class<*>.callStaticMethodOrNull(methodName: String?, vararg args: Any?): Any? = runCatchingOrNull {
|
||||
callStaticMethod(this, methodName, *args)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Class<*>.callStaticMethodAs(methodName: String?, vararg args: Any?) = callStaticMethod(this, methodName, *args) as T
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Class<*>.callStaticMethodOrNullAs(methodName: String?, vararg args: Any?) = runCatchingOrNull {
|
||||
callStaticMethod(this, methodName, *args) as T
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Class<*>.getStaticObjectFieldAs(field: String?) = getStaticObjectField(this, field) as T
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Class<*>.getStaticObjectFieldOrNullAs(field: String?) = runCatchingOrNull {
|
||||
getStaticObjectField(this, field) as T
|
||||
}
|
||||
|
||||
fun Class<*>.getStaticObjectField(field: String?): Any? = getStaticObjectField(this, field)
|
||||
|
||||
fun Class<*>.getStaticObjectFieldOrNull(field: String?): Any? = runCatchingOrNull {
|
||||
getStaticObjectField(this, field)
|
||||
}
|
||||
|
||||
fun Class<*>.setStaticObjectField(field: String?, obj: Any?) = apply {
|
||||
setStaticObjectField(this, field, obj)
|
||||
}
|
||||
|
||||
fun Class<*>.setStaticObjectFieldIfExist(field: String?, obj: Any?) = apply {
|
||||
try {
|
||||
setStaticObjectField(this, field, obj)
|
||||
} catch (ignored: Throwable) {
|
||||
}
|
||||
}
|
||||
|
||||
inline fun <reified T> Class<*>.findFieldByExactType(): Field? = findFirstFieldByExactType(this, T::class.java)
|
||||
|
||||
fun Class<*>.findFieldByExactType(type: Class<*>): Field? = findFirstFieldByExactType(this, type)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.callMethodAs(methodName: String?, vararg args: Any?) = callMethod(this, methodName, *args) as T
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.callMethodOrNullAs(methodName: String?, vararg args: Any?) = runCatchingOrNull {
|
||||
callMethod(this, methodName, *args) as T
|
||||
}
|
||||
|
||||
fun Any.callMethod(methodName: String?, parameterTypes: Array<Class<*>>, vararg args: Any?): Any? =
|
||||
callMethod(this, methodName, parameterTypes, *args)
|
||||
|
||||
fun Any.callMethodOrNull(
|
||||
methodName: String?, parameterTypes: Array<Class<*>>, vararg args: Any?
|
||||
): Any? = runCatchingOrNull {
|
||||
callMethod(this, methodName, parameterTypes, *args)
|
||||
}
|
||||
|
||||
fun Class<*>.callStaticMethod(
|
||||
methodName: String?, parameterTypes: Array<Class<*>>, vararg args: Any?
|
||||
): Any? = callStaticMethod(this, methodName, parameterTypes, *args)
|
||||
|
||||
fun Class<*>.callStaticMethodOrNull(
|
||||
methodName: String?, parameterTypes: Array<Class<*>>, vararg args: Any?
|
||||
): Any? = runCatchingOrNull {
|
||||
callStaticMethod(this, methodName, parameterTypes, *args)
|
||||
}
|
||||
|
||||
fun String.findClass(): Class<*> = findClass(this, ezXClassLoader)
|
||||
|
||||
fun String.findClassOrNull(): Class<*>? = findClassIfExists(this, ezXClassLoader)
|
||||
|
||||
fun Class<*>.new(vararg args: Any?): Any = newInstance(this, *args)
|
||||
|
||||
fun Class<*>.new(parameterTypes: Array<Class<*>>, vararg args: Any?): Any = newInstance(this, parameterTypes, *args)
|
||||
|
||||
fun Class<*>.findField(field: String?): Field = findField(this, field)
|
||||
|
||||
fun Class<*>.findFieldOrNull(field: String?): Field? = findFieldIfExists(this, field)
|
||||
|
||||
fun <T> T.setIntField(field: String?, value: Int) = apply {
|
||||
setIntField(this, field, value)
|
||||
}
|
||||
|
||||
fun <T> T.setLongField(field: String?, value: Long) = apply {
|
||||
setLongField(this, field, value)
|
||||
}
|
||||
|
||||
fun <T> T.setFloatField(field: String?, value: Float) = apply {
|
||||
setFloatField(this, field, value)
|
||||
}
|
||||
|
||||
fun <T> T.setBooleanField(field: String?, value: Boolean) = apply {
|
||||
setBooleanField(this, field, value)
|
||||
}
|
||||
|
||||
fun <T> T.setObjectField(field: String?, value: Any?) = apply {
|
||||
setObjectField(this, field, value)
|
||||
}
|
||||
|
||||
inline fun XResources.hookLayout(
|
||||
id: Int, crossinline hooker: (XC_LayoutInflated.LayoutInflatedParam) -> Unit
|
||||
) {
|
||||
try {
|
||||
hookLayout(id, object : XC_LayoutInflated() {
|
||||
override fun handleLayoutInflated(liparam: LayoutInflatedParam) {
|
||||
try {
|
||||
hooker(liparam)
|
||||
} catch (e: Throwable) {
|
||||
Log.e(e)
|
||||
}
|
||||
}
|
||||
})
|
||||
} catch (e: Throwable) {
|
||||
Log.e(e)
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("DiscouragedApi")
|
||||
inline fun XResources.hookLayout(
|
||||
pkg: String, type: String, name: String, crossinline hooker: (XC_LayoutInflated.LayoutInflatedParam) -> Unit
|
||||
) {
|
||||
try {
|
||||
val id = getIdentifier(name, type, pkg)
|
||||
hookLayout(id, hooker)
|
||||
} catch (e: Throwable) {
|
||||
Log.e(e)
|
||||
}
|
||||
}
|
||||
|
||||
fun Class<*>.findFirstFieldByExactType(type: Class<*>): Field = findFirstFieldByExactType(this, type)
|
||||
|
||||
fun Class<*>.findFirstFieldByExactTypeOrNull(type: Class<*>?): Field? = runCatchingOrNull {
|
||||
findFirstFieldByExactType(this, type)
|
||||
}
|
||||
|
||||
fun Any.getFirstFieldByExactType(type: Class<*>): Any? = javaClass.findFirstFieldByExactType(type).get(this)
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.getFirstFieldByExactTypeAs(type: Class<*>) = javaClass.findFirstFieldByExactType(type).get(this) as? T
|
||||
|
||||
inline fun <reified T : Any> Any.getFirstFieldByExactType() = javaClass.findFirstFieldByExactType(T::class.java).get(this) as? T
|
||||
|
||||
fun Any.getFirstFieldByExactTypeOrNull(type: Class<*>?): Any? = runCatchingOrNull {
|
||||
javaClass.findFirstFieldByExactTypeOrNull(type)?.get(this)
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
fun <T> Any.getFirstFieldByExactTypeOrNullAs(type: Class<*>?) = getFirstFieldByExactTypeOrNull(type) as? T
|
||||
|
||||
inline fun <reified T> Any.getFirstFieldByExactTypeOrNull() = getFirstFieldByExactTypeOrNull(T::class.java) as? T
|
||||
|
||||
inline fun ClassLoader.findDexClassLoader(crossinline delegator: (BaseDexClassLoader) -> BaseDexClassLoader = { x -> x }): BaseDexClassLoader? {
|
||||
var classLoader = this
|
||||
while (classLoader !is BaseDexClassLoader) {
|
||||
if (classLoader.parent != null) classLoader = classLoader.parent
|
||||
else return null
|
||||
}
|
||||
return delegator(classLoader)
|
||||
}
|
||||
|
||||
inline fun ClassLoader.allClassesList(crossinline delegator: (BaseDexClassLoader) -> BaseDexClassLoader = { x -> x }): List<String> {
|
||||
return findDexClassLoader(delegator)?.getObjectField("pathList")?.getObjectFieldAs<Array<Any>>("dexElements")?.flatMap {
|
||||
it.getObjectField("dexFile")?.callMethodAs<Enumeration<String>>("entries")?.toList().orEmpty()
|
||||
}.orEmpty()
|
||||
}
|
||||
|
||||
val Member.isStatic: Boolean
|
||||
inline get() = Modifier.isStatic(modifiers)
|
||||
val Member.isFinal: Boolean
|
||||
inline get() = Modifier.isFinal(modifiers)
|
||||
val Member.isPublic: Boolean
|
||||
inline get() = Modifier.isPublic(modifiers)
|
||||
val Member.isNotStatic: Boolean
|
||||
inline get() = !isStatic
|
||||
val Class<*>.isAbstract: Boolean
|
||||
inline get() = !isPrimitive && Modifier.isAbstract(modifiers)
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="github_url">Vítejte více vývojářů, aby se podíleli na vývoji</string>
|
||||
<string name="issues">Zpětná vazba/návrh</string>
|
||||
<string name="issues_url">Kliknutím zobrazíte problémy GitHub</string>
|
||||
<string name="xposeddescription">Nástroj pro přizpůsobení MIUI13(Android 12)</string>
|
||||
<string name="statusbar">Stavová lišta</string>
|
||||
<string name="status_bar_time_seconds">Zobrazit vteřiny</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Obnovení rychlosti sítě v sekundách</string>
|
||||
|
||||
@@ -1,4 +1,282 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!--Status bar icons-->
|
||||
<string name="Done">OK</string>
|
||||
<string name="HideLauncherIcon">Launcher-Symbol ausblenden</string>
|
||||
<string name="Tips">Tipps</string>
|
||||
<string name="UsePreSig">Verwenden Sie installierte Signaturen</string>
|
||||
<string name="UsePreSig_summary">Verwenden Sie bei der Installation immer Signaturen von bereits installierten Apps.\nDas ist äußerst <b>gefährlich</b>.\nNur aktivieren, wenn es wirklich nötig ist!</string>
|
||||
<string name="abc_action_bar_home_description">Zur Startseite</string>
|
||||
<string name="abc_action_bar_up_description">Nach oben</string>
|
||||
<string name="abc_action_menu_overflow_description">Weitere Optionen</string>
|
||||
<string name="abc_action_mode_done">Fertig</string>
|
||||
<string name="abc_activity_chooser_view_see_all">Alle anzeigen</string>
|
||||
<string name="abc_activitychooserview_choose_application">App auswählen</string>
|
||||
<string name="abc_capital_off">AUS</string>
|
||||
<string name="abc_capital_on">AN</string>
|
||||
<string name="abc_menu_alt_shortcut_label">Alt +</string>
|
||||
<string name="abc_menu_ctrl_shortcut_label">Strg +</string>
|
||||
<string name="abc_menu_delete_shortcut_label">Löschen</string>
|
||||
<string name="abc_menu_enter_shortcut_label">Eingabetaste</string>
|
||||
<string name="abc_menu_function_shortcut_label">Funktionstaste +</string>
|
||||
<string name="abc_menu_meta_shortcut_label">Meta-Taste +</string>
|
||||
<string name="abc_menu_shift_shortcut_label">Umschalttaste +</string>
|
||||
<string name="abc_menu_space_shortcut_label">Leertaste</string>
|
||||
<string name="abc_menu_sym_shortcut_label">Sym-Taste +</string>
|
||||
<string name="abc_prepend_shortcut_label">Menütaste +</string>
|
||||
<string name="abc_search_hint">Suchen…</string>
|
||||
<string name="abc_searchview_description_clear">Suchanfrage löschen</string>
|
||||
<string name="abc_searchview_description_query">Suchanfrage</string>
|
||||
<string name="abc_searchview_description_search">Suche</string>
|
||||
<string name="abc_searchview_description_submit">Anfrage senden</string>
|
||||
<string name="abc_searchview_description_voice">Sprachsuche</string>
|
||||
<string name="abc_shareactionprovider_share_with">Teilen mit</string>
|
||||
<string name="abc_shareactionprovider_share_with_application">Mit %s teilen</string>
|
||||
<string name="abc_toolbar_collapse_description">Minimieren</string>
|
||||
<string name="about">Über</string>
|
||||
<string name="about_module">Über dieses Modul</string>
|
||||
<string name="about_module_summary">Modulbezogene Informationen anzeigen</string>
|
||||
<string name="allow_screenshots">Screenshot zulassen</string>
|
||||
<string name="allow_untrusted_touches">Lassen Sie nicht vertrauenswürdige Berührungen zu</string>
|
||||
<string name="app_coolapk_url">Kommen Sie und geben Sie uns eine Fünf-Sterne-Bewertung</string>
|
||||
<string name="app_coolapk_url_summary">Dies kann uns besser auffindbar machen</string>
|
||||
<string name="app_name">WooBox für MIUI</string>
|
||||
<string name="are_you_sure_reboot">Bist du sicher, dass du neu starten möchtest?</string>
|
||||
<string name="are_you_sure_reboot_scope">Sind Sie sicher, dass Sie alle Bereiche neu starten?</string>
|
||||
<string name="authcreak">Digest-Verifizierung deaktivieren</string>
|
||||
<string name="authcreak_summary">Ermöglicht die Installation von Apps nach dem Ändern der Datei in apk (Ignorieren des ungültigen Digest-Fehlers).</string>
|
||||
<string name="battery_life_function">Akkuseite zeigt die aktuelle Temperatur</string>
|
||||
<string name="battery_optimization">Akkuoptimierung</string>
|
||||
<string name="battery_optimization_summary">Das von MIUI ausgeblendete Akkuoptimierungsmenü schnell öffnen</string>
|
||||
<string name="battery_percentage_font_size">Schriftgröße des Akku in Prozent</string>
|
||||
<string name="big_mobile_type_icon">Großes Mobile-Typ-Symbol</string>
|
||||
<string name="big_mobile_type_icon_bold">Großes Mobile-Typ-Symbol fett</string>
|
||||
<string name="big_mobile_type_icon_left_and_right_margins">Großes mobiles Symbol am linken und rechten Rand</string>
|
||||
<string name="big_mobile_type_icon_size">Größe des Symbols für große mobile Typen</string>
|
||||
<string name="big_mobile_type_icon_up_and_down_position">Großes Symbol für mobile Typen nach oben und unten</string>
|
||||
<string name="big_mobile_type_location">Großes Symbol für mobile Typen</string>
|
||||
<string name="big_mobile_type_only_show_network_card">Großer Mobiltyp zeigt nur Netzwerkkarte</string>
|
||||
<string name="can_notification_slide">Die meisten Benachrichtigungen können in ein kleines Fenster verschoben werden</string>
|
||||
<string name="can_notification_slide_summary">Einige Benachrichtigungen über Mi Push werden möglicherweise nicht unterstützt.</string>
|
||||
<string name="cancel">Abbrechen</string>
|
||||
<string name="cast">Übertragen</string>
|
||||
<string name="center">Zentriert</string>
|
||||
<string name="click_to_view_use_cases">Tippen, um App-Fälle anzuzeigen</string>
|
||||
<string name="clock_center">Uhr zentriert</string>
|
||||
<string name="clock_center_and_icon_left">Uhr zentriert und Symbol links</string>
|
||||
<string name="clock_right">Uhr rechts</string>
|
||||
<string name="contributor_list">Liste der Open-Source-Repository-Mitwirkenden</string>
|
||||
<string name="control_center">Kontrollzentrum</string>
|
||||
<string name="control_center_weather_summary">Die MiSmart Hub Version wird derzeit nicht unterstützt</string>
|
||||
<string name="corepacth">Einschränkungen entfernen</string>
|
||||
<string name="corepacth_summary">Unterstützung für Downgrade/andere Signatur/unsignierte Installation</string>
|
||||
<string name="current">Aktuell:</string>
|
||||
<string name="current_current">Aktuell</string>
|
||||
<string name="custom_clock_format_geek">Uhrformat</string>
|
||||
<string name="custom_clock_mode">Benutzerdefinierter Uhrmodus</string>
|
||||
<string name="custom_clock_switch">Benutzerdefinierter Uhrschalter</string>
|
||||
<string name="custom_mobile_type_text">Benutzerdefinierter mobiler Text</string>
|
||||
<string name="custom_mobile_type_text_switch">Benutzerdefinierter mobiler Textschalter</string>
|
||||
<string name="def">"Standard: "</string>
|
||||
<string name="default1">Standard</string>
|
||||
<string name="delete_on_post_notification">Anzeige über Benachrichtigung entfernen</string>
|
||||
<string name="delete_on_post_notification_summary">Entfernen Sie die Benachrichtigung „Diese App wird über anderen Apps angezeigt“</string>
|
||||
<string name="dev_coolapk">Autor Coolapk</string>
|
||||
<string name="dev_coolapk_name">\@Udui Little Transparent</string>
|
||||
<string name="developer">Entwickler</string>
|
||||
<string name="digestCreak">Vergleichssignaturen deaktivieren</string>
|
||||
<string name="digestCreak_summary">Neuinstallation der App mit unterschiedlichen Signaturen zulassen.</string>
|
||||
<string name="disable_bluetooth_temporarily_off">Bluetooth vorübergehend deaktivieren</string>
|
||||
<string name="disable_flag_secure">Screenshot zulassen</string>
|
||||
<string name="disable_flag_secure_summary">Erlaube Screenshot in Software, die es nicht erlaubt\ndas Hinzufügen von Drop-down-Schnelleinstellungen im Kontrollzentrum für Sicherheit zu unterstützen</string>
|
||||
<string name="discussions">Diskussionen</string>
|
||||
<string name="do_not_clear_app">Verhindert das killen von Hintergrund-Apps</string>
|
||||
<string name="do_not_clear_app_summary">Kann zu erhöhtem Stromverbrauch führen, empfohlen mit \"Millet aggressiver machen\", NICHT empfohlen für die Verwendung mit Tombstones</string>
|
||||
<string name="double_tap_to_sleep">Doppeltippen zum Schlafen</string>
|
||||
<string name="downgr">Downgrade zulassen</string>
|
||||
<string name="downgr_summary">Downgrade von Apps zulassen.</string>
|
||||
<string name="enable_wave_charge_animation">Wellenladung-Animation aktivieren</string>
|
||||
<string name="enhancedMode">Erweiterter Modus</string>
|
||||
<string name="enhancedMode_summary">Führen Sie einige Validierungen in der App durch</string>
|
||||
<string name="failed_after_restart">Es wird nach dem Neustart des Systems wiederhergestellt</string>
|
||||
<string name="force_support_send_app">Erzwingen Sie das Öffnen aller unterstützten Apps auf einem anderen Gerät</string>
|
||||
<string name="geek">Aussenseiter</string>
|
||||
<string name="github_url">Mehr Entwickler zur Teilnahme an der Entwicklung einladen</string>
|
||||
<string name="hide_airplane_icon">Flugzeugmodus-Symbol ausblenden</string>
|
||||
<string name="hide_alarm_icon">Alarmsymbol ausblenden</string>
|
||||
<string name="hide_battery_charging_icon">Ladesymbol ausblenden</string>
|
||||
<string name="hide_battery_icon">Akkusymbol ausblenden</string>
|
||||
<string name="hide_battery_percentage_icon">Akku ausblenden (%)</string>
|
||||
<string name="hide_battery_percentage_icon_summary">Die Anzeigefunktion für den Akkuprozentsatz muss von Ihnen selbst aktiviert werden</string>
|
||||
<string name="hide_big_hd_icon">Große HD-Symbol ausblenden</string>
|
||||
<string name="hide_bluetooth_battery_icon">Bluetooth Akku-Symbol ausblenden</string>
|
||||
<string name="hide_bluetooth_icon">Bluetooth-Symbol ausblenden</string>
|
||||
<string name="hide_gps_icon">GPS-Symbol ausblenden</string>
|
||||
<string name="hide_hd_no_service_icon">HD-Kein-Dienst-Symbol ausblenden</string>
|
||||
<string name="hide_headset_icon">Kopfhörer-Symbol ausblenden</string>
|
||||
<string name="hide_hotspot_icon">Symbol für tragbaren Hotspot ausblenden</string>
|
||||
<string name="hide_icon">Symbol verbergen</string>
|
||||
<string name="hide_mobile_activity_icon">Symbol für mobile Aktivität ausblenden</string>
|
||||
<string name="hide_mobile_type_icon">Symbol für Mobil-Typ ausblenden</string>
|
||||
<string name="hide_network_speed_splitter">Netzwerk-Speed-Splitter ausblenden</string>
|
||||
<string name="hide_new_hd_icon">Neues HD-Symbol ausblenden</string>
|
||||
<string name="hide_nfc_icon">NFC-Symbol ausblenden</string>
|
||||
<string name="hide_no_sim_icon">Kein SIM-Symbol ausblenden</string>
|
||||
<string name="hide_sim_one_icon">SIM-Karte 1 ausblenden</string>
|
||||
<string name="hide_sim_two_icon">SIM-Karte 2 ausblenden</string>
|
||||
<string name="hide_slave_wifi_icon">Zweites WLAN-Symbol ausblenden</string>
|
||||
<string name="hide_small_hd_icon">Kleines HD-Symbol ausblenden</string>
|
||||
<string name="hide_status_bar_network_speed_second">Netzwerkgeschwindigkeit (/s) ausblenden</string>
|
||||
<string name="hide_status_bar_network_speed_second_summary">Blenden Sie die Einheiten (/s) der Netzwerkgeschwindigkeitskomponente der Statusleiste aus</string>
|
||||
<string name="hide_volume_icon">Lautstärkesymbol ausblenden</string>
|
||||
<string name="hide_volume_zen_icon">Ton- und DND-Symbol ausblenden</string>
|
||||
<string name="hide_vpn_icon">VPN-Symbol ausblenden</string>
|
||||
<string name="hide_wifi_activity_icon">WLAN-Aktivitätssymbol ausblenden</string>
|
||||
<string name="hide_wifi_icon">WLAN-Symbol ausblenden</string>
|
||||
<string name="hide_wifi_standard_icon">WLAN-Standardsymbol ausblenden</string>
|
||||
<string name="hide_zen_icon">ZEN-Symbol ausblenden</string>
|
||||
<string name="home">Hauptseite</string>
|
||||
<string name="home_double_tap_to_sleep_summary">Doppeltippen Sie auf das leere Feld, um zu schlafen</string>
|
||||
<string name="home_time">Startbildschirmuhr immer anzeigen</string>
|
||||
<string name="home_time_summary">Wenn aktiviert, wird die Uhr nicht in der Statusleiste ausgeblendet, auch wenn es ein Uhr-Widget gibt</string>
|
||||
<string name="input_error">Eingabe Fehler</string>
|
||||
<string name="issues">Feedback/Vorschlag</string>
|
||||
<string name="issues_url">Klicken Sie hier, um GitHub-Probleme anzuzeigen</string>
|
||||
<string name="layout_compatibility_mode">Kompatibilitätsmodus</string>
|
||||
<string name="layout_compatibility_mode_summary">Stellen Sie sicher, dass der Bildschirm für das linke und rechte Loch normal angezeigt werden kann</string>
|
||||
<string name="left">Links</string>
|
||||
<string name="left_margin">Linker Rand (0: Auto)</string>
|
||||
<string name="left_or_right">Links oder rechts</string>
|
||||
<string name="lock_max">Strombegrenzung sperren</string>
|
||||
<string name="lock_max_fps">Sperren Sie die aktuelle Obergrenze der Aktualisierungsrate</string>
|
||||
<string name="lock_max_fps_summary">Unterstützt das Hinzufügen von Drop-Down-Control-Center-Schnelleinstellungen für Echtzeit-Umschaltung</string>
|
||||
<string name="lock_one_hundred">Setzen Sie 100 Punkte in der Sicherheits-App</string>
|
||||
<string name="lock_one_hundred_summary">Setze die Punktzahl in der Sicherheits-App auf 100 Punkte und blockiere die Schaltfläche Optimieren</string>
|
||||
<string name="lock_screen">Sperrbildschirm</string>
|
||||
<string name="lock_screen_charging_current">Aktuelle Informationen während des Ladevorgangs anzeigen</string>
|
||||
<string name="lock_screen_clock_display_seconds">Uhranzeige Sekunden</string>
|
||||
<string name="main_switch">Hauptschalter des Moduls</string>
|
||||
<string name="make_millet_ignore_active">Erlauben Sie Millet, aktive Apps einzufrieren</string>
|
||||
<string name="make_millet_ignore_active_summary">Sehr aggressiv und kann die Ausführung der App beeinträchtigen</string>
|
||||
<string name="make_millet_more_aggressive">Millet aggressiver machen</string>
|
||||
<string name="make_millet_more_aggressive_summary">Ermöglicht Millet, Apps einzufrieren, während Hintergrund-Apps Benachrichtigungen, Dienste und Prozesse ausführen.\nApps, die nicht eingefroren werden möchten, können den Energiesparmodus auf Keine Einschränkung setzen\nBitte deinstallieren Sie Tombstone- und NoANR-bezogene Module, bevor Sie sie aktivieren.</string>
|
||||
<string name="matters_needing_attention">Funktion funktioniert nicht? </string>
|
||||
<string name="matters_needing_attention_context">Es wird empfohlen, das Telefon nach der ersten Aktivierung oder Aktualisierung neu zu starten\nDie meisten Änderungen erfordern einen Neustart in der rechten oberen Ecke um wirksam zu werden</string>
|
||||
<string name="max_wallpaper_scale">Maximale Hintergrundskalierung</string>
|
||||
<string name="maximum_number_of_notification_dots">Maximale Anzahl von Benachrichtigungspunkten</string>
|
||||
<string name="maximum_number_of_notification_icons">Maximale Anzahl von Benachrichtigungssymbolen</string>
|
||||
<string name="media_volume_steps_summary">Das Einschalten kann dazu führen, dass das Scrollen der Lautstärkeleiste einfriert oder die Bluetooth-Lautstärke anormal ist</string>
|
||||
<string name="media_volume_steps_switch">Schritte der Medienlautstärke</string>
|
||||
<string name="menu">Menü</string>
|
||||
<string name="miuihome_recentview_remove_card_animation">Animation der Kartenmarkierung ändern</string>
|
||||
<string name="miuihome_recentview_remove_card_animation_summary">Animationseffekt der Karte zum Entfernen der letzten Aufgabe ändern</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening">Hintergrundbild dimmen deaktivieren</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening_summary">Dadurch wird der Effekt deaktiviert, dass das Hintergrundbild allmählich heller wird, wenn man die aktuelle Aufgabe aufruft oder verlässt.</string>
|
||||
<string name="miuihome_scroll_icon_name">App-Name rollen</string>
|
||||
<string name="miuihome_scroll_icon_name_summary">Ein zu langer App-Name wird gerollt und ohne eine neue Zeile anzuzeigen</string>
|
||||
<string name="miuihome_shortcut_add_small_window">Kontextmenü-Fenster hinzufügen</string>
|
||||
<string name="miuihome_shortcut_add_small_window_summary">Desktop-Symbol gedrückt halten, um ein schnell zu öffnendes Fenster hinzuzufügen</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">Schmale Fenster</string>
|
||||
<string name="module_name">EzXHelper</string>
|
||||
<string name="none">Keiner</string>
|
||||
<string name="not_support">Sie scheinen eine veraltete Version von LSPosed zu verwenden oder LSPosed ist nicht aktiv. Bitte aktualisieren Sie LSPosed oder aktivieren Sie es und versuchen Sie es erneut.</string>
|
||||
<string name="notification_center">Mitteilungs-Center</string>
|
||||
<string name="off">Aus</string>
|
||||
<string name="old_qs_custom_switch">Benutzerdefinierte Zeilen und Spalten</string>
|
||||
<string name="old_quick_settings_panel">Altes Schnelleinstellungsfeld</string>
|
||||
<string name="only_official_default_themes_are_supported">Es werden nur offizielle Standarddesigns unterstützt</string>
|
||||
<string name="opensource">Open-Source-Repository</string>
|
||||
<string name="other">Sonstiges</string>
|
||||
<string name="participate_in_translation">Beteiligen Sie sich an der Übersetzung</string>
|
||||
<string name="participate_in_translation_summary">Helfen Sie uns, die App in Ihre Sprache zu übersetzen</string>
|
||||
<string name="performance">Leistung</string>
|
||||
<string name="pkg_installer">Paket-Installer</string>
|
||||
<string name="pkg_installer_summary">Zählprüfung der App-Installation deaktivieren</string>
|
||||
<string name="preset">Voreinstellung</string>
|
||||
<string name="prevent_recovery_of_battery_optimization_white_list">Verhindern Sie die Wiederherstellung der Whitelist für die Akkuoptimierung</string>
|
||||
<string name="qq_channel">Treten Sie dem offiziellen QQ-Kanal bei</string>
|
||||
<string name="qs_custom_columns">Spalten</string>
|
||||
<string name="qs_custom_columns_unexpanded">Spalten (nicht erweitert)</string>
|
||||
<string name="qs_custom_rows">Reihen</string>
|
||||
<string name="qs_custom_rows_horizontal">Zeilen (horizontal)</string>
|
||||
<string name="range">Bereich: </string>
|
||||
<string name="rear_display">Heckdisplay (11Ultra)</string>
|
||||
<string name="reboot">System neustarten</string>
|
||||
<string name="reboot_host">Starten Sie alle Bereiche neu</string>
|
||||
<string name="remove_ad">Werbung entfernen</string>
|
||||
<string name="remove_lock_screen_camera">Entfernen Sie die Sperrbildschirm-Kamerafunktion</string>
|
||||
<string name="remove_macro_blacklist">Entfernen Sie die schwarze Liste der Spielmakros</string>
|
||||
<string name="remove_open_app_confirmation_popup">Entfernen Sie das Popup der geöffneten App</string>
|
||||
<string name="remove_open_app_confirmation_popup_summary">Entfernen Sie das „Erlaube XXX, XXX zu öffnen“ Kettenstart-Popup</string>
|
||||
<string name="remove_ota_validate">* OTA-Validierung entfernen [LAB]</string>
|
||||
<string name="remove_ota_validate_summary">- Unterstützt nur die Verwendung von VAB-Serien, bitte öffnen Sie keine anderen Serien.\n- Keine interne Testqualifizierung erforderlich, um in das vollständige interne Testpaket zu flashen.\n- Personen mit interner Testberechtigung können keine internen Testaktualisierungen erhalten, und kann verwendet werden, um Systemaktualisierungen zu blockieren.\n- Nach einem Versionsübergreifenden Upgrade wird empfohlen, Daten zu löschen.\n- Inoffizielle ROM-Nutzung wird nicht unterstützt.</string>
|
||||
<string name="remove_small_window_restrictions">Kleine Fenster erzwingen</string>
|
||||
<string name="remove_small_window_restrictions_summary">Ignorieren Sie die System-Blacklist und das Software-Verbot kleiner Fenster</string>
|
||||
<string name="remove_the_left_side_of_the_lock_screen">Entfernen Sie die Seitenabdeckung des Sperrbildschirms</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons">Maximale Anzahl an Benachrichtigungssymbolen entfernen</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons_summary">Entfernen Sie das Limit von 3 Benachrichtigungen in der Statusleiste</string>
|
||||
<string name="remove_thememanager_ads">Entfernen Sie Anzeigen für den Themenmanager</string>
|
||||
<string name="right">Rechts</string>
|
||||
<string name="right_margin">Rechter Rand (0: Auto)</string>
|
||||
<string name="scope">Zielfernrohr</string>
|
||||
<string name="scope_android">Systemrahmen</string>
|
||||
<string name="scope_android_summary">Nachdem das Modul zum ersten Mal aktiviert oder das Modul aktualisiert wurde, wird die Funktion hier nach dem Neustart des Systems wirksam</string>
|
||||
<string name="scope_mediaeditor">Galerie-Editor</string>
|
||||
<string name="scope_miuihome">Startbildschirm</string>
|
||||
<string name="scope_other">Andere</string>
|
||||
<string name="scope_other_summary">Sicherheits-App, Galerie-Editor, Akku und Leistung usw.</string>
|
||||
<string name="scope_powerkeeper">Akku und Leistung</string>
|
||||
<string name="scope_securitycenter">Sicherheits-App</string>
|
||||
<string name="scope_systemui">SystemUI</string>
|
||||
<string name="scope_systemui_summary">Passen Sie die Systemschnittstelle, die Statusleiste, den Sperrbildschirm usw. an.</string>
|
||||
<string name="screen_hole_location">Position des Sieblochs</string>
|
||||
<string name="search_menu_title">Suche</string>
|
||||
<string name="settings">Einstellungen</string>
|
||||
<string name="show_city">Stadt anzeigen</string>
|
||||
<string name="show_notification_importance">Benachrichtigungswichtig anzeigen</string>
|
||||
<string name="show_notification_importance_summary">Wichtigkeitseinstellungen für Benachrichtigungen anzeigen, die in MIUI 12 und späteren Versionen ausgeblendet sind</string>
|
||||
<string name="show_weather_main_switch">Wetter anzeigen - Hauptschalter</string>
|
||||
<string name="show_wifi_standard">WLAN-Standard anzeigen</string>
|
||||
<string name="skip_waiting_time">5/10 Sekunden Warnzeit überspringen</string>
|
||||
<string name="skip_waiting_time_summary">Ignoriere die Wartezeit von MIUI bei USB-Debugging, unbekannten Quellen und Zugänglichkeit</string>
|
||||
<string name="sound">Klang</string>
|
||||
<string name="status_bar_clock_double_line_size">Zweireihige Größe (0: nicht ändern)</string>
|
||||
<string name="status_bar_clock_format">Uhrformat der Statusleiste</string>
|
||||
<string name="status_bar_clock_size">Uhrgröße (0: nicht ändern)</string>
|
||||
<string name="status_bar_dual_row_network_speed">Zweireihige Netzwerkgeschwindigkeit</string>
|
||||
<string name="status_bar_dual_row_network_speed_summary">Anzeige der Netzwerkgeschwindigkeit nach oben und unten</string>
|
||||
<string name="status_bar_icon">Statusleisten-Symbole</string>
|
||||
<string name="status_bar_layout">Layout der Statusleiste</string>
|
||||
<string name="status_bar_layout_mode">Statusleisten-Layoutmodus</string>
|
||||
<string name="status_bar_layout_summary">Weitere Statusleisten-Layouts sind in Entwicklung</string>
|
||||
<string name="status_bar_network_speed">Statusleiste Netzwerkgeschwindigkeit</string>
|
||||
<string name="status_bar_network_speed_dual_row_gravity">Zweireihige Ausrichtung</string>
|
||||
<string name="status_bar_network_speed_dual_row_icon">Zweireihiges Symbol</string>
|
||||
<string name="status_bar_network_speed_dual_row_size">Zweireihige Größe (0: nicht ändern)</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Netzwerkgeschwindigkeit in Sekunden aktualisieren</string>
|
||||
<string name="status_bar_network_speed_refresh_speed_summary">Ändern Sie die Aktualisierungsfrequenz der Netzwerkgeschwindigkeitskomponente der Statusleiste auf 1 Sek</string>
|
||||
<string name="status_bar_time_center">Zeitzentrum der Statusleiste</string>
|
||||
<string name="status_bar_time_day">Datum anzeigen</string>
|
||||
<string name="status_bar_time_double_hour">Zeigt chinesische zwölf Stunden an</string>
|
||||
<string name="status_bar_time_double_line">Zweireihig</string>
|
||||
<string name="status_bar_time_double_line_center_align">Zweireihige Mittelausrichtung</string>
|
||||
<string name="status_bar_time_hide_space">Leerzeichen ausblenden</string>
|
||||
<string name="status_bar_time_month">Monat anzeigen</string>
|
||||
<string name="status_bar_time_period">AM/PM anzeigen</string>
|
||||
<string name="status_bar_time_seconds">Sekunden anzeigen</string>
|
||||
<string name="status_bar_time_week">Tag anzeigen</string>
|
||||
<string name="status_bar_time_year">Jahr anzeigen</string>
|
||||
<string name="statusbar">Statusleiste</string>
|
||||
<string name="take_effect_after_reboot">Nach Neustart wirksam</string>
|
||||
<string name="tg_channel">Tritt dem offiziellen TG-Kanal bei</string>
|
||||
<string name="tg_channel_summary">Sie können die Chat-Gruppe auf der Kanalseite betreten</string>
|
||||
<string name="thank_list">Dankesliste</string>
|
||||
<string name="third_party_open_source_statement">Open-Source-Erklärung von Drittanbietern</string>
|
||||
<string name="ui">Schnittstelle</string>
|
||||
<string name="unlock_unlimited_cropping">Entfernen Sie die Einschränkung beim Zuschneiden von Bildern/Screenshots</string>
|
||||
<string name="unlock_unlimited_cropping_summary">Ignorieren Sie die Mindestgrenze für das Zuschneiden von Bildern durch MIUI</string>
|
||||
<string name="updater">Updater</string>
|
||||
<string name="verison">Version</string>
|
||||
<string name="xposeddescription">Anpassungstool für MIUI13 (Android 12)</string>
|
||||
<string name="zero_do_no_change">0: nicht ändern</string>
|
||||
</resources>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="github_url">Más desarrolladores están invitados a participar en el proyecto</string>
|
||||
<string name="issues">Comentarios/Sugerencias</string>
|
||||
<string name="issues_url">Clic para ver errores en GitHub</string>
|
||||
<string name="xposeddescription">Herramienta de personalización para MIUI13 (Android 12)</string>
|
||||
<string name="xposeddescription">Herramienta de personalización para MIUI13+(Android 12+)</string>
|
||||
<string name="statusbar">Barra de estado</string>
|
||||
<string name="status_bar_time_seconds">Mostrar segundos</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">La velocidad de red se actualiza en segundos</string>
|
||||
@@ -240,4 +240,11 @@
|
||||
<string name="miuihome_recentview_remove_card_animation">Modificar la animación de marcado de tarjetas</string>
|
||||
<string name="miuihome_recentview_remove_card_animation_summary">Modificar el efecto de animación al remover ventana de tareas recientes</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening">Deshabilitar atenuación de fondo de pantalla</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening_summary">Esto deshabilitará el efecto en el que el fondo de pantalla se ilumina gradualmente cuando se abre y se cierra una tarea reciente</string>
|
||||
<string name="miuihome_scroll_icon_name">Desplazar el nombre de la app</string>
|
||||
<string name="miuihome_scroll_icon_name_summary">Si el nombre de la aplicación es demasiado largo se mostrará con desplazamiento y sin ningúna línea nueva</string>
|
||||
<string name="miuihome_shortcut_add_small_window">Añadir ventana al menú de accesos directos</string>
|
||||
<string name="miuihome_shortcut_add_small_window_summary">Mantener presionando el icono del escritorio para añadir a una ventana de acceso rápido</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">Ventana pequeña </string>
|
||||
<string name="click_to_view_use_cases">Clic para ver casos de uso</string>
|
||||
</resources>
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
<string name="github_url">Bienvenue à d\'autres développeurs pour participer au développement</string>
|
||||
<string name="issues">Feed-back/Proposition</string>
|
||||
<string name="issues_url">Cliquez pour voir GitHub</string>
|
||||
<string name="xposeddescription">Outil de personnalisation pour MIUI13(Android 12)</string>
|
||||
<string name="statusbar">Barre d\'État</string>
|
||||
<string name="status_bar_time_seconds">Affichage des secondes</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Rafraichissement de la vitesse du réseau en secondes</string>
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
<string name="github_url">Szeretnénk, hogy több fejlesztő vegyen részt a fejlesztésben</string>
|
||||
<string name="issues">Visszajelzés/javaslat</string>
|
||||
<string name="issues_url">Kattintson a GitHub problémák megtekintéséhez</string>
|
||||
<string name="xposeddescription">Testreszabási eszköz a MIUI13(Android 12) számára</string>
|
||||
<string name="statusbar">Állapotsor</string>
|
||||
<string name="status_bar_time_seconds">Másodpercek kijelzése</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Hálózati sebesség frissítése másodpercekben</string>
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
<string name="github_url">Selamat datang lebih banyak developer untuk berpartisipasi dalam pengembangan</string>
|
||||
<string name="issues">Umpan Balik/Usulan</string>
|
||||
<string name="issues_url">Klik untuk melihat Masalah GitHub</string>
|
||||
<string name="xposeddescription">Alat perubahan untuk MIUI13 (Android 12)</string>
|
||||
<string name="status_bar_time_seconds">Tampilkan detik</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Perubahan kecepatan jaringan dalam detik</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons">Hapus jumlah maksimum ikon notifikasi</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="github_url">開発に参加できる開発者を歓迎します</string>
|
||||
<string name="issues">ご意見・ご提案</string>
|
||||
<string name="issues_url">クリックして GitHub Issues を表示する</string>
|
||||
<string name="xposeddescription">MIUI13 (Android 12) のカスタマイズツール</string>
|
||||
<string name="xposeddescription">MIUI13 (Android 12) 以降向けカスタマイズツール</string>
|
||||
<string name="statusbar">ステータスバー</string>
|
||||
<string name="status_bar_time_seconds">秒を表示する</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">ネットワーク速度を秒単位で更新</string>
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="github_url">개발에 참여하는 더 많은 개발자를 환영합니다</string>
|
||||
<string name="issues">피드백 및 제안</string>
|
||||
<string name="issues_url">클릭해 GitHub 이슈 보기</string>
|
||||
<string name="xposeddescription">MIUI 13(Android 12) 용 커스텀 도구</string>
|
||||
<string name="statusbar">상태 바</string>
|
||||
<string name="status_bar_time_seconds">화면 표시 시간</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">몇 초에 네트워크 속도 새로 고침</string>
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
<string name="github_url">Welkom meer ontwikkelaars om deel te nemen in de ontwikkeling</string>
|
||||
<string name="issues">Feedback/Voorstel</string>
|
||||
<string name="issues_url">Klik om GitHub Problemen te bekijken</string>
|
||||
<string name="xposeddescription">Aanpassingsgereedschap voor MIUI13(Android 12)</string>
|
||||
<string name="statusbar">Statusbalk</string>
|
||||
<string name="status_bar_time_seconds">Seconden weergeven</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Netwerksnelheid vernieuwen in seconden</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="github_url">Zachęcam do rozwijania projektu innych deweloperów</string>
|
||||
<string name="issues">Opinie/propozycje</string>
|
||||
<string name="issues_url">Kliknij, aby wyświetlić zgłoszenia na GitHubie</string>
|
||||
<string name="xposeddescription">Narzędzie do dostosowywania MIUI 13 (Android 12)</string>
|
||||
<string name="xposeddescription">Narzędzie do dostosowywania MIUI 13+ (Android 12+)</string>
|
||||
<string name="statusbar">Pasek statusu</string>
|
||||
<string name="status_bar_time_seconds">Wyświetlaj sekundy</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Odświeżenie prędkości sieci w sekundach</string>
|
||||
@@ -136,6 +136,7 @@
|
||||
<string name="layout_compatibility_mode">Tryb zgodności</string>
|
||||
<string name="left_margin">Lewy margines (0: autom.)</string>
|
||||
<string name="right_margin">Prawy margines (0: autom.)</string>
|
||||
<string name="layout_compatibility_mode_summary">Wymuś układ pełnoekranowy (obsługuje wszystkie ekrany o specjalnym kształcie)</string>
|
||||
<string name="remove_macro_blacklist">Usuń czarną listę gier, dla których wyłączono obsługę makr</string>
|
||||
<string name="hide_network_speed_splitter">Ukryj rozdzielacz prędkości sieci</string>
|
||||
<string name="updater">Aktualizacje</string>
|
||||
@@ -236,4 +237,14 @@
|
||||
<string name="pkg_installer_summary">Wyłącz sprawdzanie licznika instalacji aplikacji</string>
|
||||
<string name="big_mobile_type_only_show_network_card">Duża ikona typu sieci tylko dla aktywnej karty SIM</string>
|
||||
<string name="big_mobile_type_location">Pozycja dużej ikony typu sieci</string>
|
||||
<string name="miuihome_recentview_remove_card_animation">Zmodyfikuj animację oznaczania kart</string>
|
||||
<string name="miuihome_recentview_remove_card_animation_summary">Zmodyfikuj efekt animacji karty usunięcia ostatniego zadania</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening">Wyłącz przyciemnianie tapety</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening_summary">Spowoduje to wyłączenie efektu polegającego na tym, że tapeta stopniowo rozjaśnia się od przyciemnienia podczas wchodzenia i wychodzenia z ostatnich zadań</string>
|
||||
<string name="miuihome_scroll_icon_name">Przewiń nazwę aplikacji</string>
|
||||
<string name="miuihome_scroll_icon_name_summary">Zbyt długa nazwa aplikacji zostanie przewinięta i wyświetlona bez nowego wiersza</string>
|
||||
<string name="miuihome_shortcut_add_small_window">Dodaj widżet \"Menu skrótów\"</string>
|
||||
<string name="miuihome_shortcut_add_small_window_summary">Naciśnij i przytrzymaj ikonę na ekranie głównym, aby dodać okno szybkiego otwierania</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">Małe okno</string>
|
||||
<string name="click_to_view_use_cases">Kliknij, aby wyświetlić przypadki użycia</string>
|
||||
</resources>
|
||||
|
||||
@@ -38,7 +38,6 @@
|
||||
<string name="github_url">Sunt bineveniți mai mulți dezvoltatori să participe la dezvoltare</string>
|
||||
<string name="issues">Feedback/Propunere</string>
|
||||
<string name="issues_url">Clic pentru a vizualiza problemele pe GitHub</string>
|
||||
<string name="xposeddescription">Instrument de personalizare pentru MIUI13 (Android 12)</string>
|
||||
<string name="statusbar">Bară de stare</string>
|
||||
<string name="status_bar_time_seconds">Afișare secunde</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Reîmprospătare viteză rețea în secunde</string>
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
<string name="github_url">Приглашаем больше разработчиков принять участие в разработке</string>
|
||||
<string name="issues">Обратная связь</string>
|
||||
<string name="issues_url">Нажмите, чтобы просмотреть обсуждение на GitHub</string>
|
||||
<string name="xposeddescription">Инструмент настройки для MIUI13 (Android 12)</string>
|
||||
<string name="statusbar">Строка состояния</string>
|
||||
<string name="status_bar_time_seconds">Секунды</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Обновление скорости сети в секундах</string>
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
<string name="github_url">Geliştirmeye katılmak için daha fazla geliştiriciye hoş geldiniz</string>
|
||||
<string name="issues">Geribildirim/Teklif</string>
|
||||
<string name="issues_url">GitHub Sorunlarını görüntülemek için tıklayın</string>
|
||||
<string name="xposeddescription">MIUI13 (Android 12) için özelleştirme aracı</string>
|
||||
<string name="statusbar">Durum çubuğu</string>
|
||||
<string name="status_bar_time_seconds">Saniye göster</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Saniyeler içinde ağ hızı yenileme</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="github_url">Chào mừng các nhà phát triển tham gia vào quá trình phát triển</string>
|
||||
<string name="issues">Phản hồi/Đề xuất</string>
|
||||
<string name="issues_url">Ấn để xem GitHub Issues</string>
|
||||
<string name="xposeddescription">Công cụ tuỳ chỉnh hoá MIUI13(Android 12)</string>
|
||||
<string name="xposeddescription">Công cụ tuỳ chỉnh cho MIUI13+(Android 12+)</string>
|
||||
<string name="statusbar">Thanh trạng thái</string>
|
||||
<string name="status_bar_time_seconds">Hiển thị giây</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Làm mới tốc độ mạng trong vài giây</string>
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
<string name="github_url">欢迎更多开发者共同参与开发</string>
|
||||
<string name="issues">反馈/提议</string>
|
||||
<string name="issues_url">点击查看GitHub Issues</string>
|
||||
<string name="xposeddescription">基于 MIUI13(Android 12) 适配的自定义工具</string>
|
||||
<string name="xposeddescription">基于 MIUI13+(Android 12+) 适配的自定义工具</string>
|
||||
<string name="statusbar">状态栏</string>
|
||||
<string name="status_bar_time_seconds">显示秒数</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">网速秒刷新</string>
|
||||
@@ -247,4 +247,5 @@
|
||||
<string name="miuihome_shortcut_add_small_window_summary">桌面图标长按快捷菜单位置添加快速打开小窗</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">小窗</string>
|
||||
<string name="click_to_view_use_cases">点击查看用例</string>
|
||||
<string name="disable_bluetooth_temporarily_off" comment="This function is used to completely close Bluetooth">禁用临时关闭蓝牙</string>
|
||||
</resources>
|
||||
|
||||
@@ -39,7 +39,6 @@
|
||||
<string name="github_url">歡迎更多開發者共同參與開發</string>
|
||||
<string name="issues">反饋/提議</string>
|
||||
<string name="issues_url">點擊查看GitHub Issues</string>
|
||||
<string name="xposeddescription">基於 MIUI13(Android 12) 適配的自定義工具</string>
|
||||
<string name="statusbar">狀態欄</string>
|
||||
<string name="status_bar_time_seconds">顯示秒數</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">網速秒刷新</string>
|
||||
|
||||
@@ -1,225 +1,225 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string name="performance">效能</string>
|
||||
<string name="lock_max_fps">鎖定螢幕更新率上限</string>
|
||||
<string name="performance">性能</string>
|
||||
<string name="lock_max_fps">鎖定目前重新整理速率上限</string>
|
||||
<string name="ui">介面</string>
|
||||
<string name="delete_on_post_notification">移除上層顯示通知</string>
|
||||
<string name="delete_on_post_notification_summary">移除 \"此應用正顯示在螢幕上其他應用的上層\" 通知</string>
|
||||
<string name="delete_on_post_notification_summary">移除「此應用程式正顯示在螢幕上其他應用程式的上層」通知</string>
|
||||
<string name="other">其他</string>
|
||||
<string name="disable_flag_secure">允許截圖</string>
|
||||
<string name="disable_flag_secure_summary">開啟後允許在不允許截圖的軟體中截圖\n支援添加下拉控制中心快速開關,保障安全</string>
|
||||
<string name="disable_flag_secure">允許螢幕截圖</string>
|
||||
<string name="disable_flag_secure_summary">開啟後允許在不允許截圖的軟體中截圖\n支援新增下拉控制中心快速開關,保障安全</string>
|
||||
<string name="home">桌面</string>
|
||||
<string name="home_time">始終顯示桌面時鐘</string>
|
||||
<string name="reboot_host">重啟全部作用域</string>
|
||||
<string name="reboot_host">重啟所有作用範圍</string>
|
||||
<string name="reboot">重啟系統</string>
|
||||
<!--Status bar icons-->
|
||||
<string name="status_bar_icon">狀態欄圖示</string>
|
||||
<string name="hide_no_sim_icon">隱藏 無SIM卡 圖示</string>
|
||||
<string name="hide_sim_one_icon">隱藏 SIM卡一 圖示</string>
|
||||
<string name="hide_sim_two_icon">隱藏 SIM卡二 圖示</string>
|
||||
<string name="hide_vpn_icon">隱藏 VPN 圖示</string>
|
||||
<string name="hide_airplane_icon">隱藏 飛行模式 圖示</string>
|
||||
<string name="hide_wifi_icon">隱藏 WIFI 圖示</string>
|
||||
<string name="hide_bluetooth_icon">隱藏 藍牙 圖示</string>
|
||||
<string name="hide_volume_zen_icon">隱藏 聲音、勿擾 圖示</string>
|
||||
<string name="hide_alarm_icon">隱藏 鬧鐘 圖示</string>
|
||||
<string name="hide_hotspot_icon">隱藏 WIFI熱點 圖示</string>
|
||||
<string name="hide_headset_icon">隱藏 耳機 圖示</string>
|
||||
<string name="hide_bluetooth_battery_icon">隱藏 藍牙電量 圖示</string>
|
||||
<string name="hide_nfc_icon">隱藏 NFC 圖示</string>
|
||||
<string name="hide_big_hd_icon">隱藏 大HD 圖示</string>
|
||||
<string name="hide_small_hd_icon">隱藏 小HD 圖示</string>
|
||||
<string name="hide_new_hd_icon">隱藏 新HD 圖示</string>
|
||||
<string name="hide_hd_no_service_icon">隱藏 HD無服務 圖示</string>
|
||||
<string name="status_bar_icon">狀態列圖示</string>
|
||||
<string name="hide_no_sim_icon">隱藏「無 SIM 卡」圖示</string>
|
||||
<string name="hide_sim_one_icon">隱藏「SIM 卡 1」圖示</string>
|
||||
<string name="hide_sim_two_icon">隱藏「SIM 卡 2」圖示</string>
|
||||
<string name="hide_vpn_icon">隱藏「VPN」圖示</string>
|
||||
<string name="hide_airplane_icon">隱藏「飛航模式」圖示</string>
|
||||
<string name="hide_wifi_icon">隱藏「WIFI」圖示</string>
|
||||
<string name="hide_bluetooth_icon">隱藏「藍牙」圖示</string>
|
||||
<string name="hide_volume_zen_icon">隱藏「聲音、勿擾」圖示</string>
|
||||
<string name="hide_alarm_icon">隱藏「鬧鐘」圖示</string>
|
||||
<string name="hide_hotspot_icon">隱藏「WIFI 熱點」圖示</string>
|
||||
<string name="hide_headset_icon">隱藏「耳機」圖示</string>
|
||||
<string name="hide_bluetooth_battery_icon">隱藏「藍牙電量」圖示</string>
|
||||
<string name="hide_nfc_icon">隱藏「NFC」圖示</string>
|
||||
<string name="hide_big_hd_icon">隱藏「大型 HD」圖示</string>
|
||||
<string name="hide_small_hd_icon">隱藏「小型 HD」圖示</string>
|
||||
<string name="hide_new_hd_icon">隱藏「新 HD」圖示</string>
|
||||
<string name="hide_hd_no_service_icon">隱藏「HD 無服務」圖示</string>
|
||||
<string name="about">關於</string>
|
||||
<string name="about_module">關於模組</string>
|
||||
<string name="verison">版本</string>
|
||||
<string name="dev_coolapk">開發者酷安</string>
|
||||
<string name="opensource">開源倉庫</string>
|
||||
<string name="github_url">歡迎更多開發者共同參與開發</string>
|
||||
<string name="dev_coolapk">開發人員酷安</string>
|
||||
<string name="opensource">開放原始碼存放庫</string>
|
||||
<string name="github_url">歡迎更多開發人員共同參與開發</string>
|
||||
<string name="issues">回饋/提議</string>
|
||||
<string name="issues_url">點擊查看GitHub Issues</string>
|
||||
<string name="xposeddescription">基於 MIUI13(Android 12) 適配的自訂工具</string>
|
||||
<string name="statusbar">狀態欄</string>
|
||||
<string name="issues_url">按一下以檢視 GitHub 問題</string>
|
||||
<string name="xposeddescription">基於 MIUI13+(Android 12+) 的客製化工具</string>
|
||||
<string name="statusbar">狀態列</string>
|
||||
<string name="status_bar_time_seconds">顯示秒數</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">每秒更新即時網速</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons">解除通知圖示數量上限</string>
|
||||
<string name="main_switch">模組總開關</string>
|
||||
<string name="hide_gps_icon">隱藏 GPS 圖示</string>
|
||||
<string name="hide_status_bar_network_speed_second">隱藏網速(/s)單位</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">每秒更新即時網路速度</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons">移除通知圖示數量上限</string>
|
||||
<string name="main_switch">模組主開關</string>
|
||||
<string name="hide_gps_icon">隱藏「GPS」圖示</string>
|
||||
<string name="hide_status_bar_network_speed_second">隱藏網路速度 (/s) 單位</string>
|
||||
<string name="menu">選單</string>
|
||||
<string name="Tips">提示</string>
|
||||
<string name="skip_waiting_time">跳過 5/10 秒警告時間</string>
|
||||
<string name="unlock_unlimited_cropping">移除裁剪圖片/螢幕截圖的限制</string>
|
||||
<string name="hide_slave_wifi_icon">隱藏 WIFI輔助 圖示</string>
|
||||
<string name="HideLauncherIcon">隱藏桌面圖示</string>
|
||||
<string name="hide_battery_percentage_icon">隱藏電量(%)</string>
|
||||
<string name="hide_battery_icon">隱藏 電池 圖示</string>
|
||||
<string name="status_bar_clock_format">狀態欄時鐘格式</string>
|
||||
<string name="hide_slave_wifi_icon">隱藏「WIFI 次要」圖示</string>
|
||||
<string name="HideLauncherIcon">隱藏「桌面」圖示</string>
|
||||
<string name="hide_battery_percentage_icon">隱藏電量 (%)</string>
|
||||
<string name="hide_battery_icon">隱藏「電池」圖示</string>
|
||||
<string name="status_bar_clock_format">狀態列時鐘格式</string>
|
||||
<string name="status_bar_time_year">顯示年份</string>
|
||||
<string name="status_bar_time_month">顯示月份</string>
|
||||
<string name="status_bar_time_day">顯示日期</string>
|
||||
<string name="status_bar_time_week">顯示星期</string>
|
||||
<string name="status_bar_time_hide_space">隱藏間隔</string>
|
||||
<string name="allow_screenshots">允許截圖</string>
|
||||
<string name="lock_max">鎖定當前上限</string>
|
||||
<string name="lock_max">鎖定目前上限</string>
|
||||
<string name="status_bar_time_double_hour">顯示時辰</string>
|
||||
<string name="custom_clock_switch">自訂時鐘-總開關</string>
|
||||
<string name="custom_clock_switch">自訂時鐘 - 主開關</string>
|
||||
<string name="status_bar_time_period">顯示時段</string>
|
||||
<string name="status_bar_time_double_line">雙行顯示</string>
|
||||
<string name="status_bar_clock_size">時鐘大小(0:不更改)</string>
|
||||
<string name="status_bar_clock_double_line_size">雙行大小(0:不更改)</string>
|
||||
<string name="status_bar_time_double_line">雙列顯示</string>
|
||||
<string name="status_bar_clock_size">時鐘大小 (0:無變更)</string>
|
||||
<string name="status_bar_clock_double_line_size">雙列大小 (0:無變更)</string>
|
||||
<string name="matters_needing_attention">功能無法生效?</string>
|
||||
<string name="Done">確定</string>
|
||||
<string name="about_module_summary">查看模組相關訊息</string>
|
||||
<string name="contributor_list">開源倉庫貢獻者名單</string>
|
||||
<string name="developer">開發者</string>
|
||||
<string name="about_module_summary">檢視模組相關資訊</string>
|
||||
<string name="contributor_list">開放原始碼存放庫貢獻者名單</string>
|
||||
<string name="developer">開發人員</string>
|
||||
<string name="thank_list">感謝名單</string>
|
||||
<string name="third_party_open_source_statement">第三方開源聲明</string>
|
||||
<string name="corepacth">解除安裝限制</string>
|
||||
<string name="corepacth_summary">支持降級/不同簽名/無簽名安裝</string>
|
||||
<string name="prevent_recovery_of_battery_optimization_white_list">防止恢復電池最佳化白名單</string>
|
||||
<string name="third_party_open_source_statement">第三方開放原始碼聲明</string>
|
||||
<string name="corepacth">移除安裝限制</string>
|
||||
<string name="corepacth_summary">支援降級/不同簽章/無簽章安裝</string>
|
||||
<string name="prevent_recovery_of_battery_optimization_white_list">防止復原電池效能最佳化白名單</string>
|
||||
<string name="failed_after_restart">系統重啟後仍會還原</string>
|
||||
<string name="battery_optimization">電池最佳化</string>
|
||||
<string name="battery_optimization_summary">快速打開被MIUI隱藏的電池最佳化功能</string>
|
||||
<string name="battery_optimization">電池效能最佳化</string>
|
||||
<string name="battery_optimization_summary">快速開啟被 MIUI 隱藏的電池效能最佳化功能</string>
|
||||
<string name="remove_small_window_restrictions">強制使用小窗</string>
|
||||
<string name="app_coolapk_url">來酷安給我們五星好評</string>
|
||||
<string name="app_coolapk_url_summary">這可以使我們被更多的人發現</string>
|
||||
<string name="qq_channel">加入 官方QQ頻道</string>
|
||||
<string name="tg_channel">加入 官方TG頻道</string>
|
||||
<string name="tg_channel_summary">可在頻道資料頁進入交流群</string>
|
||||
<string name="qq_channel">加入官方 QQ 頻道</string>
|
||||
<string name="tg_channel">加入官方 TG 頻道</string>
|
||||
<string name="tg_channel_summary">可在頻道頁面進入聊天群組</string>
|
||||
<string name="discussions">討論</string>
|
||||
<string name="remove_small_window_restrictions_summary">忽略系統黑名單與軟體禁止小窗</string>
|
||||
<string name="remove_the_left_side_of_the_lock_screen">移除鎖定螢幕負一屏功能</string>
|
||||
<string name="remove_small_window_restrictions_summary">忽略系統黑名單與軟體小窗封鎖</string>
|
||||
<string name="remove_the_left_side_of_the_lock_screen">移除負一屏功能鎖定</string>
|
||||
<string name="remove_lock_screen_camera">移除鎖定螢幕相機功能</string>
|
||||
<string name="only_official_default_themes_are_supported">僅支援官方預設主題</string>
|
||||
<string name="lock_one_hundred">手機管家鎖定100分</string>
|
||||
<string name="scope">作用域</string>
|
||||
<string name="scope_android">系統框架</string>
|
||||
<string name="scope_systemui">系統介面</string>
|
||||
<string name="lock_one_hundred">手機管家鎖定 100 分</string>
|
||||
<string name="scope">作用範圍</string>
|
||||
<string name="scope_android">系統架構</string>
|
||||
<string name="scope_systemui">系統 UI</string>
|
||||
<string name="scope_miuihome">系統桌面</string>
|
||||
<string name="scope_other">其他</string>
|
||||
<string name="status_bar_network_speed_refresh_speed_summary">將狀態欄網速組件的更新頻率改成1s</string>
|
||||
<string name="status_bar_network_speed_refresh_speed_summary">將狀態列網路速度元件的更新間隔變更為 1s</string>
|
||||
<string name="hide_battery_percentage_icon_summary">需自行開啟電池百分比外顯功能</string>
|
||||
<string name="hide_status_bar_network_speed_second_summary">隱藏狀態欄網速組件的(/s)單位</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons_summary">解除狀態欄最多只能顯示3個通知的限制</string>
|
||||
<string name="scope_systemui_summary">自訂系統介面、狀態欄、鎖定螢幕等</string>
|
||||
<string name="scope_android_summary">首次啟動模組 或 模組更新後,\n此處的功能需重啟系統後才能生效</string>
|
||||
<string name="hide_status_bar_network_speed_second_summary">隱藏狀態列網路速度元件的 (/s) 單位</string>
|
||||
<string name="remove_the_maximum_number_of_notification_icons_summary">移除狀態列最多僅能顯示三條通知的限制</string>
|
||||
<string name="scope_systemui_summary">自訂系統介面、狀態列、鎖定螢幕等</string>
|
||||
<string name="scope_android_summary">首次啟動模組或模組更新後,\n此處的功能需重啟系統後才能生效</string>
|
||||
<string name="scope_other_summary">手機管家、相簿編輯、電量與性能等</string>
|
||||
<string name="scope_powerkeeper">電量與性能</string>
|
||||
<string name="scope_securitycenter">手機管家</string>
|
||||
<string name="scope_mediaeditor">相簿編輯</string>
|
||||
<string name="home_time_summary">開啟後即使存在時鐘小組件,\n也不會對狀態欄隱藏時鐘</string>
|
||||
<string name="skip_waiting_time_summary">開啟後可忽略MIUI在開啟USB偵錯、\n未知應用來源、無障礙時的凍結時間</string>
|
||||
<string name="lock_one_hundred_summary">鎖定手機管家100分並隱藏修復按鈕</string>
|
||||
<string name="unlock_unlimited_cropping_summary">無視MIUI對圖片裁切的最小限制</string>
|
||||
<string name="hide_wifi_activity_icon">隱藏 WIFI箭頭 圖示</string>
|
||||
<string name="hide_mobile_activity_icon">隱藏 移動網路箭頭 圖示</string>
|
||||
<string name="hide_mobile_type_icon">隱藏 行動網路類型 圖示</string>
|
||||
<string name="show_weather_main_switch">顯示天氣-總開關</string>
|
||||
<string name="scope_mediaeditor">相簿編輯器</string>
|
||||
<string name="home_time_summary">開啟後即使存在時鐘小工具,\n也不會隱藏狀態列時鐘</string>
|
||||
<string name="skip_waiting_time_summary">開啟後可忽略 MIUI 在開啟 USB 偵錯、\n未知應用程式來源、無障礙時的凍結時間</string>
|
||||
<string name="lock_one_hundred_summary">鎖定手機管家 100 分並封鎖修復按鈕</string>
|
||||
<string name="unlock_unlimited_cropping_summary">忽略 MIUI 對圖片裁切的最小限制</string>
|
||||
<string name="hide_wifi_activity_icon">隱藏「WIFI 活動」圖示</string>
|
||||
<string name="hide_mobile_activity_icon">隱藏「行動網路活動」圖示</string>
|
||||
<string name="hide_mobile_type_icon">隱藏「行動網路類型」圖示</string>
|
||||
<string name="show_weather_main_switch">顯示天氣 - 主開關</string>
|
||||
<string name="lock_screen">鎖定螢幕</string>
|
||||
<string name="notification_center">通知中心</string>
|
||||
<string name="show_city">顯示城市</string>
|
||||
<string name="lock_max_fps_summary">支援添加下拉控制中心快速開關,即時切換</string>
|
||||
<string name="lock_max_fps_summary">支援新增下拉控制中心快速開關,即時切換</string>
|
||||
<string name="control_center">控制中心</string>
|
||||
<string name="control_center_weather_summary">暫不支援妙享版控制中心</string>
|
||||
<string name="not_support">您似乎正在使用過時的 LSPosed 版本或 LSPosed 未啟動,請更新 LSPosed 或者啟動後再試。</string>
|
||||
<string name="matters_needing_attention_context">首次啟動或更新後建議重啟手機\n絕大部分功能更改後需要在右上角重啟作用域後生效</string>
|
||||
<string name="not_support">您似乎正在使用過時的 LSPosed 版本或 LSPosed 未啟用,請更新 LSPosed 或啟用後再試一次。</string>
|
||||
<string name="matters_needing_attention_context">首次啟動或更新後建議重啟手機\n絕大部分功能變更後需要在右上角重啟範圍後生效</string>
|
||||
<string name="are_you_sure_reboot">確定重啟系統?</string>
|
||||
<string name="cancel">取消</string>
|
||||
<string name="are_you_sure_reboot_scope">確定重啟全部作用域?</string>
|
||||
<string name="hide_battery_charging_icon">隱藏 充電 圖示</string>
|
||||
<string name="hide_wifi_standard_icon">隱藏 WIFI標準 圖示</string>
|
||||
<string name="status_bar_time_center">時間居中</string>
|
||||
<string name="status_bar_layout_summary">更多狀態欄布局等待開發中</string>
|
||||
<string name="status_bar_layout">狀態欄布局</string>
|
||||
<string name="layout_compatibility_mode">相容模式</string>
|
||||
<string name="left_margin">左邊距 (0: 自動)</string>
|
||||
<string name="right_margin">右邊距 (0: 自動)</string>
|
||||
<string name="are_you_sure_reboot_scope">確定要重啟所有作用範圍?</string>
|
||||
<string name="hide_battery_charging_icon">隱藏「充電」圖示</string>
|
||||
<string name="hide_wifi_standard_icon">隱藏「WIFI 標準」圖示</string>
|
||||
<string name="status_bar_time_center">時間置中</string>
|
||||
<string name="status_bar_layout_summary">更多狀態列版面配置等候開發中</string>
|
||||
<string name="status_bar_layout">狀態列版面配置</string>
|
||||
<string name="layout_compatibility_mode">相容性模式</string>
|
||||
<string name="left_margin">左邊距 (0:自動)</string>
|
||||
<string name="right_margin">右邊距 (0:自動)</string>
|
||||
<string name="layout_compatibility_mode_summary">強制全螢幕版面配置 (支援所有螢幕凹口或空缺)</string>
|
||||
<string name="remove_macro_blacklist">去除遊戲自動連招黑名單</string>
|
||||
<string name="hide_network_speed_splitter">隱藏網速分隔符</string>
|
||||
<string name="remove_macro_blacklist">移除遊戲自動連招黑名單</string>
|
||||
<string name="hide_network_speed_splitter">隱藏網路速度分割器</string>
|
||||
<string name="updater">系統更新</string>
|
||||
<string name="remove_ota_validate">*移除OTA驗證 [實驗性]</string>
|
||||
<string name="remove_ota_validate_summary">- 僅支援VAB系列使用,其餘系列請不要開啟。\n- 無需內測資格即可刷入完整內測包。\n- 擁有內測權限的使用者將無法接收內測更新\n可用於隱藏系統更新。\n- 跨版本類型升級後,建議清空數據。\n- 不支援非官方ROM使用。</string>
|
||||
<string name="remove_ota_validate">*移除 OTA 驗證 [實驗性]</string>
|
||||
<string name="remove_ota_validate_summary">- 僅支援 VAB 系列使用,其餘系列請不要開啟。\n- 無需內測資格即可刷入完整內測包。\n- 擁有內測權限的使用者將無法接收內測更新\n可用於隱藏系統更新。\n- 跨版本類型升級後,建議清除資料。\n- 不支援非官方 ROM 使用。</string>
|
||||
<string name="settings">設定</string>
|
||||
<string name="show_notification_importance">顯示通知重要程度</string>
|
||||
<string name="show_notification_importance_summary">顯示 MIUI 12 及之後版本被隱藏的通知重要程度設定</string>
|
||||
<string name="remove_ad">去廣告</string>
|
||||
<string name="remove_thememanager_ads">拿掉主題壁紙的廣告</string>
|
||||
<string name="battery_life_function">電池頁面展示目前溫度</string>
|
||||
<string name="enable_wave_charge_animation">啟用MIX Alpha充電動畫</string>
|
||||
<string name="remove_ad">移除廣告</string>
|
||||
<string name="remove_thememanager_ads">移除個性主題廣告</string>
|
||||
<string name="battery_life_function">電池頁面顯示目前溫度</string>
|
||||
<string name="enable_wave_charge_animation">啟用 MIX Alpha 充電動畫</string>
|
||||
<string name="max_wallpaper_scale">桌布縮放比例</string>
|
||||
<string name="def">"預設值: "</string>
|
||||
<string name="current">目前值:</string>
|
||||
<string name="participate_in_translation">參與翻譯</string>
|
||||
<string name="participate_in_translation_summary">幫助我們將這個APP翻譯成您的語言</string>
|
||||
<string name="participate_in_translation_summary">協助我們將這個應用程式翻譯為您的語言</string>
|
||||
<string name="lock_screen_charging_current">充電時顯示目前電流</string>
|
||||
<string name="current_current">目前電流</string>
|
||||
<string name="remove_open_app_confirmation_popup">移除打開應用彈出視窗</string>
|
||||
<string name="remove_open_app_confirmation_popup_summary">移除 \"XXX 想要打開 XXX\" 的彈出視窗 。</string>
|
||||
<string name="hide_volume_icon">隱藏 音量 圖示</string>
|
||||
<string name="hide_zen_icon">隱藏 勿擾 圖示</string>
|
||||
<string name="remove_open_app_confirmation_popup">移除「開啟應用程式」彈出式視窗</string>
|
||||
<string name="remove_open_app_confirmation_popup_summary">移除「XXX 想要開啟 XXX」的彈出式視窗</string>
|
||||
<string name="hide_volume_icon">隱藏「音量」圖示</string>
|
||||
<string name="hide_zen_icon">隱藏「勿擾」圖示</string>
|
||||
<string name="hide_icon">隱藏圖示</string>
|
||||
<string name="double_tap_to_sleep">雙擊鎖定螢幕</string>
|
||||
<string name="home_double_tap_to_sleep_summary">雙擊空白位置鎖定螢幕</string>
|
||||
<string name="old_quick_settings_panel">舊快速設定面板</string>
|
||||
<string name="old_qs_custom_switch">自定義行與列</string>
|
||||
<string name="qs_custom_columns_unexpanded">列 (未展開)</string>
|
||||
<string name="qs_custom_rows">行</string>
|
||||
<string name="qs_custom_columns">列</string>
|
||||
<string name="qs_custom_rows_horizontal">行 (橫向)</string>
|
||||
<string name="status_bar_dual_row_network_speed">雙行網路速度</string>
|
||||
<string name="status_bar_dual_row_network_speed_summary">上下行網路速度顯示</string>
|
||||
<string name="status_bar_network_speed">狀態欄網路速度</string>
|
||||
<string name="status_bar_network_speed_dual_row_size">雙行大小(0:不更改)</string>
|
||||
<string name="status_bar_network_speed_dual_row_icon">雙行圖示</string>
|
||||
<string name="double_tap_to_sleep">輕觸兩下鎖定螢幕</string>
|
||||
<string name="home_double_tap_to_sleep_summary">輕觸兩下空白位置鎖定螢幕</string>
|
||||
<string name="old_quick_settings_panel">舊版快速設定面板</string>
|
||||
<string name="old_qs_custom_switch">自訂行列</string>
|
||||
<string name="qs_custom_columns_unexpanded">行 (未展開)</string>
|
||||
<string name="qs_custom_rows">列</string>
|
||||
<string name="qs_custom_columns">行</string>
|
||||
<string name="qs_custom_rows_horizontal">列 (橫向)</string>
|
||||
<string name="status_bar_dual_row_network_speed">雙列網路速度</string>
|
||||
<string name="status_bar_dual_row_network_speed_summary">上下列網路速度顯示</string>
|
||||
<string name="status_bar_network_speed">狀態列網路速度</string>
|
||||
<string name="status_bar_network_speed_dual_row_size">雙列大小 (0:無變更)</string>
|
||||
<string name="status_bar_network_speed_dual_row_icon">雙列圖示</string>
|
||||
<string name="none">無</string>
|
||||
<string name="status_bar_network_speed_dual_row_gravity">雙行網速對齊</string>
|
||||
<string name="status_bar_network_speed_dual_row_gravity">雙列對齊</string>
|
||||
<string name="left">置左</string>
|
||||
<string name="right">置右</string>
|
||||
<string name="big_mobile_type_icon">大行動網路圖示</string>
|
||||
<string name="show_wifi_standard">顯示 Wifi 標準</string>
|
||||
<string name="can_notification_slide">強制允許全部通知可使用小窗</string>
|
||||
<string name="battery_percentage_font_size">電量百分比字體大小</string>
|
||||
<string name="zero_do_no_change">0:不修改</string>
|
||||
<string name="big_mobile_type_icon_size">大行動網路圖示大小</string>
|
||||
<string name="big_mobile_type_icon_bold">大行動網路圖示加粗</string>
|
||||
<string name="big_mobile_type_icon_up_and_down_position">大行動網路圖示上下位置</string>
|
||||
<string name="big_mobile_type_icon">大型行動網路圖示</string>
|
||||
<string name="show_wifi_standard">顯示 WiFi 標準</string>
|
||||
<string name="can_notification_slide">強制允許所有通知使用小窗</string>
|
||||
<string name="battery_percentage_font_size">電量百分比字型大小</string>
|
||||
<string name="zero_do_no_change">0:無變更</string>
|
||||
<string name="big_mobile_type_icon_size">大型行動網路圖示大小</string>
|
||||
<string name="big_mobile_type_icon_bold">大型行動網路圖示粗體</string>
|
||||
<string name="big_mobile_type_icon_up_and_down_position">大型行動網路圖示上下位置</string>
|
||||
<string name="input_error">輸入錯誤</string>
|
||||
<string name="range">範圍:</string>
|
||||
<string name="big_mobile_type_icon_left_and_right_margins">大行動網路圖示左右邊距</string>
|
||||
<string name="cast">接力</string>
|
||||
<string name="force_support_send_app">允許所有應用使用接力</string>
|
||||
<string name="status_bar_time_double_line_center_align">雙行居中對齊</string>
|
||||
<string name="big_mobile_type_icon_left_and_right_margins">大型行動網路圖示左右邊距</string>
|
||||
<string name="cast">投放</string>
|
||||
<string name="force_support_send_app">強制所有應用程式支援在其他裝置開啟</string>
|
||||
<string name="status_bar_time_double_line_center_align">雙列置中對齊</string>
|
||||
<string name="default1">預設值</string>
|
||||
<string name="clock_center">時鐘置中</string>
|
||||
<string name="clock_right">時鐘置右</string>
|
||||
<string name="status_bar_layout_mode">狀態欄布局模式</string>
|
||||
<string name="clock_center_and_icon_left">時間居中+圖示置左</string>
|
||||
<string name="status_bar_layout_mode">狀態列版面配置模式</string>
|
||||
<string name="clock_center_and_icon_left">時鐘置中 + 圖示置左</string>
|
||||
<string name="maximum_number_of_notification_icons">通知圖示最大數量</string>
|
||||
<string name="maximum_number_of_notification_dots">通知點點數量</string>
|
||||
<string name="maximum_number_of_notification_dots">通知圓點最大數量</string>
|
||||
<string name="custom_mobile_type_text">自訂行動網路類型文字</string>
|
||||
<string name="custom_mobile_type_text_switch">自訂行動網路類型文字開關</string>
|
||||
<string name="downgr">允許降級安裝應用</string>
|
||||
<string name="downgr_summary">允許在已安裝新版的情況下覆蓋安裝舊版本</string>
|
||||
<string name="authcreak">禁用應用安裝管理器簽名驗證</string>
|
||||
<string name="authcreak_summary">關閉安裝應用時的簽名驗證,可以安裝被修改的APK</string>
|
||||
<string name="digestCreak">禁用APK簽名驗證</string>
|
||||
<string name="digestCreak_summary">允許覆蓋安裝同包名不同簽名的應用</string>
|
||||
<string name="UsePreSig">安裝時始終使用已安裝應用的簽名</string>
|
||||
<string name="UsePreSig_summary">安裝時始終使用已安裝應用的簽名\n這非常<b>危險</b>\n僅在真正需要時啟用!</string>
|
||||
<string name="downgr">允許降級安裝應用程式</string>
|
||||
<string name="downgr_summary">允許在已安裝新版的情況下覆寫為舊版本</string>
|
||||
<string name="authcreak">停用安裝程式簽章驗證</string>
|
||||
<string name="authcreak_summary">關閉安裝應用程式時的簽名驗證,可以安裝被修改的 APK</string>
|
||||
<string name="digestCreak">停用 APK 簽章驗證</string>
|
||||
<string name="digestCreak_summary">允許安裝套件名稱相同但簽章不同的應用程式</string>
|
||||
<string name="UsePreSig">安裝時始終使用已安裝應用程式的簽章</string>
|
||||
<string name="UsePreSig_summary">安裝時始終使用已安裝應用程式的簽章\n這非常<b>危險</b>\n僅在真正需要時啟用!</string>
|
||||
<string name="enhancedMode">增強模式</string>
|
||||
<string name="enhancedMode_summary">可以解決一些應用內部的完整性較驗,一般不需要開啟</string>
|
||||
<string name="rear_display">後螢幕(11Ultra)</string>
|
||||
<string name="enhancedMode_summary">可以解決一些應用程式內部的完整性驗證,一般不需要開啟</string>
|
||||
<string name="rear_display">後方螢幕 (11 Ultra)</string>
|
||||
<string name="lock_screen_clock_display_seconds">時鐘顯示秒數</string>
|
||||
<string name="sound">聲音</string>
|
||||
<string name="media_volume_steps_switch">媒體音量階數</string>
|
||||
<string name="allow_untrusted_touches">允許不受信任的觸控</string>
|
||||
<string name="take_effect_after_reboot">重新開機後生效</string>
|
||||
<string name="media_volume_steps_summary">開啟後可能會導致音量條的滾動卡頓或藍牙音量異常</string>
|
||||
<string name="can_notification_slide_summary">可能無法支援一些使用小米推送(Mi Push)推播的通知</string>
|
||||
<string name="screen_hole_location">螢幕挖孔位置</string>
|
||||
<string name="media_volume_steps_summary">開啟後可能會導致音量列捲動卡頓或藍牙音量異常</string>
|
||||
<string name="can_notification_slide_summary">可能無法支援一些使用小米推送 (Mi Push) 推播的通知</string>
|
||||
<string name="screen_hole_location">螢幕凹口位置</string>
|
||||
<string name="custom_clock_mode">自訂時鐘模式</string>
|
||||
<string name="custom_clock_format_geek">時鐘格式</string>
|
||||
<string name="off">關閉</string>
|
||||
@@ -233,10 +233,10 @@
|
||||
<string name="make_millet_more_aggressive_summary">允許 Millet 在背景應用程式有通知、有服務執行、有處理程序執行的狀況下凍結應用程式。\n不希望被凍結的應用程式可將省電策略設為無限制\n啟用前請先解除安裝墓碑和 NoANR 相關模組。</string>
|
||||
<string name="make_millet_ignore_active">允許 Millet 凍結使用中的應用程式</string>
|
||||
<string name="make_millet_ignore_active_summary">非常積極,可能會影響應用程式執行</string>
|
||||
<string name="pkg_installer">應用包管理組件</string>
|
||||
<string name="pkg_installer_summary">禁用頻繁安裝應用檢查</string>
|
||||
<string name="big_mobile_type_only_show_network_card">大行動網路僅會顯示網路卡</string>
|
||||
<string name="big_mobile_type_location">大行動網路位置</string>
|
||||
<string name="pkg_installer">套件安裝程式</string>
|
||||
<string name="pkg_installer_summary">停用頻繁應用程式安裝檢查</string>
|
||||
<string name="big_mobile_type_only_show_network_card">大型行動網路僅會顯示網路卡</string>
|
||||
<string name="big_mobile_type_location">大型行動網路位置</string>
|
||||
<string name="miuihome_recentview_remove_card_animation">修改卡片動畫</string>
|
||||
<string name="miuihome_recentview_remove_card_animation_summary">修改在最近任務介面移除卡片的動畫效果</string>
|
||||
<string name="miuihome_recentwiew_wallpaper_darkening">停用桌布壓暗</string>
|
||||
@@ -246,5 +246,5 @@
|
||||
<string name="miuihome_shortcut_add_small_window">捷徑選單新增小窗</string>
|
||||
<string name="miuihome_shortcut_add_small_window_summary">長按桌面圖示以快速開啟小窗應用程式</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">小窗應用程式</string>
|
||||
<string name="click_to_view_use_cases">按一下以檢視用例</string>
|
||||
<string name="click_to_view_use_cases">按一下以檢視案例</string>
|
||||
</resources>
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
<string name="github_url">Welcome more developers to participate in the development</string>
|
||||
<string name="issues">Feedback/Proposal</string>
|
||||
<string name="issues_url">Click to view GitHub Issues</string>
|
||||
<string name="xposeddescription">Customization tool for MIUI13(Android 12)</string>
|
||||
<string name="xposeddescription">Customization tool for MIUI13+(Android 12+)</string>
|
||||
<string name="statusbar">Status bar</string>
|
||||
<string name="status_bar_time_seconds">Display seconds</string>
|
||||
<string name="status_bar_network_speed_refresh_speed">Network speed refresh in seconds</string>
|
||||
@@ -251,4 +251,5 @@
|
||||
<string name="miuihome_shortcut_add_small_window_summary">Press and hold the desktop icon to add a quick open window</string>
|
||||
<string name="miuihome_shortcut_add_small_window_title">Small window</string>
|
||||
<string name="click_to_view_use_cases">Click to view use cases</string>
|
||||
<string name="disable_bluetooth_temporarily_off">Disable bluetooth temporarily off</string>
|
||||
</resources>
|
||||
|
||||
Submodule blockmiui updated: c380bd47b3...2d85e22246
Reference in New Issue
Block a user