41 Commits

Author SHA1 Message Date
WenHao2130
fa060dca58 manager: Refactoring the get device name logic (#152)
* manager: Import `getDeviceInfo()` from bmax/APatch

Co-authored-by: GarfieldHan <2652609017@qq.com>
Signed-off-by: WenHao2130 <wenhao2130@outlook.com>

* manager: Use `getDeviceInfo()` instead `Build.DEVICE`

Signed-off-by: WenHao2130 <wenhao2130@outlook.com>

---------

Signed-off-by: WenHao2130 <wenhao2130@outlook.com>
Co-authored-by: GarfieldHan <2652609017@qq.com>
2025-06-08 15:47:48 +08:00
ShirkNeko
9c7ba5b998 [skip ci]: docs: Updating the README file to add a description of support for non-GKI device builds
完整正體中文本地化

對缺失內容的完整翻譯,對現有內容參考 SukiSU-Ultra 簡體中文優化

New Crowdin updates (#140)

Co-authored-by: HSSkyBoy <HSSkyBoy@outlook.com>
Co-authored-by: cvnertnc <148134890+cvnertnc@users.noreply.github.com>
Co-authored-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com>
Signed-off-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com>
2025-06-07 22:23:49 +08:00
ShirkNeko
061136900a [skip ci]: New Crowdin updates (#138)
* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Arabic)

* New translations strings.xml (Danish)

* New translations strings.xml (German)

* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Arabic)

* New translations strings.xml (Danish)

* New translations strings.xml (German)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Italian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Korean)

* New translations strings.xml (Lithuanian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Polish)

* New translations strings.xml (Russian)

* New translations strings.xml (Slovenian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Persian)

* New translations strings.xml (Marathi)

* New translations strings.xml (Thai)

* New translations strings.xml (Croatian)

* New translations strings.xml (Estonian)

* New translations strings.xml (Latvian)

* New translations strings.xml (Azerbaijani)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Filipino)

* New translations strings.xml (Chinese Traditional, Hong Kong)

* New translations strings.xml (Bosnian)

* New translations strings.xml (Kannada)
2025-06-03 17:16:15 +08:00
ShirkNeko
6375bf4b7c manager: Simplify state management of components for installation method selection
Remove unnecessary LKM upload logic
2025-06-03 16:57:41 +08:00
ShirkNeko
17288c086a manager: Simplify Home data initialization logic and remove unnecessary caching time 2025-06-03 16:29:41 +08:00
ShirkNeko
15747ceaa5 manager: Simplify KPM display judgment in Home messages 2025-06-03 15:48:21 +08:00
ShirkNeko
675bb20f52 manager: Modify the Show KPM function to hidden and update the related settings. 2025-06-03 15:26:03 +08:00
ShirkNeko
ec0b26a174 manager: Optimize slot selection dialog to remove unnecessary information 2025-06-03 15:15:48 +08:00
ShirkNeko
92f6f2f51e manager: Add card shadow effect control 2025-06-03 14:04:55 +08:00
5ec1cff
587e73b449 manager: persist show system app settings 2025-06-03 13:53:45 +08:00
ShirkNeko
07c9cce4b9 manager: Fixed flickering on activity refresh using a clever method.
- Add Activity lifecycle callback and method to refresh current Activity
2025-06-03 01:43:31 +08:00
ShirkNeko
1d34ea4995 Rename files and update package structure
Add tool classes related to displaying and refreshing data
2025-06-03 01:02:08 +08:00
5ec1cff
d58ec6952c throne_tracker: avoid cross fs access 2025-06-03 00:03:16 +08:00
ShirkNeko
50631aade6 Manager: Refactoring of hidden messages and display of KPM settings status management 2025-06-03 00:00:39 +08:00
ShirkNeko
6df8f6f5d4 refactor: simplify handling and add app restart utility 2025-06-02 22:47:30 +08:00
米凛MiRin
4aee26b48e manager: auto restart after Display KPM Function and Hide other info (#136) 2025-06-02 22:24:17 +08:00
ShirkNeko
3bbe415c7e Merge branch 'main' of https://github.com/SukiSU-Ultra/SukiSU-Ultra 2025-06-02 21:33:55 +08:00
ShirkNeko
892fa9040f docs: add troubleshooting section for KernelSU Manager uninstallation issues 2025-06-02 21:33:48 +08:00
ShirkNeko
cadc123eab [skip ci] New Crowdin updates (#135)
* New translations strings.xml (Romanian)

* New translations strings.xml (Romanian)

* New translations strings.xml (Russian)

* New translations strings.xml (Vietnamese)
2025-06-02 21:30:13 +08:00
ShirkNeko
3a27537648 [skip ci] strings: update the description of the hidden additional information 2025-06-02 21:06:08 +08:00
ShirkNeko
6fa1a5c8b8 Optimize the logic of badge display in the bottom navigation bar
Add support for settings to hide other information

README: add notice about stuck device solution (#134)

Co-authored-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com>
Co-authored-by: =?UTF-8?q?=E7=B1=B3=E5=87=9BMiRin?= <148533509+MiRinChan@users.noreply.github.com>

Signed-off-by: ShirkNeko <109797057+ShirkNeko@users.noreply.github.com>
2025-06-02 20:46:49 +08:00
ShirkNeko
b772c8ece1 manager: Refactoring data refresh management
New AppData object to optimize data fetching and state management.
2025-06-02 17:49:34 +08:00
ShirkNeko
c0e839dd8e manager: Implement module count refresh
- update count data periodically and optimize the bottom bar display
2025-06-02 17:24:34 +08:00
ShirkNeko
a6ed7befdc manager: Add count icon to bottom bar
- Remove count icon from Home
- Add put back button for more settings
2025-06-02 16:43:31 +08:00
米凛MiRin
c210b00d54 manager: accessibility optimization (#131)
manager: style optimization
2025-06-02 14:47:59 +08:00
ShirkNeko
13b5290598 [skip ci]New Crowdin updates (#133)
* New translations strings.xml (Romanian)

* New translations strings.xml (French)

* New translations strings.xml (Spanish)

* New translations strings.xml (Arabic)

* New translations strings.xml (Danish)

* New translations strings.xml (German)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Italian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Korean)

* New translations strings.xml (Lithuanian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Polish)

* New translations strings.xml (Russian)

* New translations strings.xml (Slovenian)

* New translations strings.xml (Turkish)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Portuguese, Brazilian)

* New translations strings.xml (Persian)

* New translations strings.xml (Marathi)

* New translations strings.xml (Thai)

* New translations strings.xml (Croatian)

* New translations strings.xml (Estonian)

* New translations strings.xml (Latvian)

* New translations strings.xml (Azerbaijani)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Filipino)

* New translations strings.xml (Bosnian)

* New translations strings.xml (Kannada)

* New translations strings.xml (Japanese)

* New translations strings.xml (Chinese Simplified)
2025-06-02 14:34:41 +08:00
ShirkNeko
b99516da69 [skip ci]: New Crowdin updates (#130)
* Update source file strings.xml

* New translations strings.xml (Romanian)

* New translations strings.xml (Danish)

* New translations strings.xml (Hungarian)

* New translations strings.xml (Italian)

* New translations strings.xml (Japanese)

* New translations strings.xml (Korean)

* New translations strings.xml (Lithuanian)

* New translations strings.xml (Dutch)

* New translations strings.xml (Polish)

* New translations strings.xml (Russian)

* New translations strings.xml (Slovenian)

* New translations strings.xml (Ukrainian)

* New translations strings.xml (Chinese Simplified)

* New translations strings.xml (Chinese Traditional)

* New translations strings.xml (Vietnamese)

* New translations strings.xml (Persian)

* New translations strings.xml (Marathi)

* New translations strings.xml (Thai)

* New translations strings.xml (Croatian)

* New translations strings.xml (Estonian)

* New translations strings.xml (Latvian)

* New translations strings.xml (Azerbaijani)

* New translations strings.xml (Hindi)

* New translations strings.xml (Malay)

* New translations strings.xml (Filipino)

* New translations strings.xml (Chinese Traditional, Hong Kong)

* New translations strings.xml (Bosnian)

* New translations strings.xml (Kannada)
2025-06-02 14:03:10 +08:00
lshwjgpt25
fe8b5f2135 [skip ci]: Align superuser app spacing with module spacing (#132) 2025-06-02 13:31:41 +08:00
ShirkNeko
04e1b9bf77 manager: Update back navigation logic in FlashScreen for module flashing 2025-06-02 04:10:41 +08:00
ShirkNeko
b8aaf918fe Merge branch 'main' of https://github.com/SukiSU-Ultra/SukiSU-Ultra 2025-06-02 02:11:40 +08:00
ShirkNeko
54925188e8 Optimize interface element spacing and styles 2025-06-02 02:09:46 +08:00
yycgit1
3443e48ef1 manager: Add alternate app icon toggle (#129)
Signed-off-by: WenHao2130 <wenhao2130@outlook.com>
Co-authored-by: MiRinChan <148533509+MiRinChan@users.noreply.github.com>
2025-06-01 22:43:08 +08:00
ShirkNeko
53b3e84890 Optimize button styles in SuperUser 2025-06-01 22:36:23 +08:00
ShirkNeko
a5b85bfdad manager: Update theme color display in MoreSettings screen and adjust title style 2025-06-01 21:56:56 +08:00
ShirkNeko
2817583e3c Optimize icon handling for settings cards
Allow icons to be optional and remove redundant group title displays
2025-06-01 21:24:21 +08:00
ShirkNeko
8a6116b4ec manager: Update surface colors to use cardAlpha for improved theme consistency 2025-06-01 20:58:28 +08:00
cvnertnc
6a4270787a [skip ci]Manager: update values-tr/strings.xml (#126) 2025-06-01 20:29:03 +08:00
ShirkNeko
5457a4772b manager: Refactor card elevation handling and improve theme support 2025-06-01 20:17:22 +08:00
ShirkNeko
ee4c3bb03b manager: Optimize color schemes for themes and module screens
- Remove unnecessary background color settings
2025-06-01 14:04:10 +08:00
ShirkNeko
dd1d17d2cf Optimize the display logic of reboot drop down menu items 2025-06-01 02:27:55 +08:00
WenHao2130
3c353e8f88 manager: Modify the display logic of safe_mode (#125)
Signed-off-by: WenHao2130 <wenhao2130@outlook.com>
2025-06-01 01:30:16 +08:00
80 changed files with 3891 additions and 3297 deletions

View File

@@ -24,7 +24,7 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
## How to use integrated susfs ## How to use integrated susfs
1. Use the susfs-dev branch directly without any patching 1. Use the susfs-dev branch directly without any patching (Support for non-GKI device builds)
``` ```
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev
@@ -110,11 +110,15 @@ Please **all** refer to https://kernelsu.org/zh_CN/guide/installation.html
5. More customization 5. More customization
6. Support for KPM kernel modules 6. Support for KPM kernel modules
## Troubleshooting
1. Uninstalling the KernelSU Manager device is stuck. → Uninstall the application with package name com.sony.playmemories.mobile.
## License ## License
- The file in the “kernel” directory is under [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) license. - The file in the “kernel” directory is under [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) license.
- The images of the files `ic_launcher*` with anime character emoticons are copyrighted by [五十根大虾仁](https://space.bilibili.com/370927), the Brand Intellectual Property in the images is owned by [明风OuO](https://space.bilibili.com/274939213), and the vectorization is done by @MiRinChan. Before using these files, in addition to complying with [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt), you also need to comply with the authorization of the two authors to use these artistic contents. - The images of the files `ic_launcher(?!.*alt.*).*` with anime character emoticons are copyrighted by [五十根大虾仁](https://space.bilibili.com/370927), the Brand Intellectual Property in the images is owned by [明风OuO](https://space.bilibili.com/274939213), and the vectorization is done by @MiRinChan. Before using these files, in addition to complying with [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt), you also need to comply with the authorization of the two authors to use these artistic contents.
- Except for the files or directories mentioned above, all other parts are under [GPL-3.0 or later](https://www.gnu.org/licenses/gpl-3.0.html) license. - Except for the files or directories mentioned above, all other parts are under [GPL-3.0 or later](https://www.gnu.org/licenses/gpl-3.0.html) license.
@@ -125,8 +129,8 @@ Please **all** refer to https://kernelsu.org/zh_CN/guide/installation.html
- [wswzgdg](https://github.com/wswzgdg) Many thanks for supporting this project - [wswzgdg](https://github.com/wswzgdg) Many thanks for supporting this project
- [yspbwx2010](https://github.com/yspbwx2010) Many thanks - [yspbwx2010](https://github.com/yspbwx2010) Many thanks
- [DARKWWEE](https://github.com/DARKWWEE) Thanks for the 100 USDT Lao - [DARKWWEE](https://github.com/DARKWWEE) Thanks for the 100 USDT Lao
- [Saksham Singla](https://github.com/TypeFlu) Website provision as well as maintenance
If the above list does not have your name, I will update it as soon as possible, and thanks again for your support! - [OukaroMF](https://github.com/OukaroMF) Donation of website domain name
## Contributions ## Contributions

View File

@@ -25,7 +25,7 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
## 統合された susfs の使い方 ## 統合された susfs の使い方
1. パッチを当てずに susfs-dev ブランチを直接使用してください 1. パッチを当てずに susfs-dev ブランチを直接使用してください (非GKIデバイスビルドをサポート)
``` ```
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev
``` ```
@@ -108,10 +108,14 @@ https://kernelsu.org/zh_CN/guide/installation.html をご参照ください。
5. その他のカスタマイズ 5. その他のカスタマイズ
6. KPM カーネルモジュールに対応 6. KPM カーネルモジュールに対応
## トラブルシューティング
1.KernelSU Managerのアンインストールができない。 →パッケージ名com.sony.playmemories.mobile.KernelSU Managerのアプリケーションをアンインストールする。
## ライセンス ## ライセンス
- `kernel` ディレクトリ以下のファイルは[GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)です。 - `kernel` ディレクトリ以下のファイルは[GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)です。
- アニメキャラクターの絵文字を含むファイル `ic_launcher*` の画像は[五十根大虾仁](https://space.bilibili.com/370927)が著作権を所有しており、画像内のブランド知的財産権は[明风OuO](https://space.bilibili.com/274939213)が所有しています。ベクトル化は @MiRinChan が行っています。これらのファイルを使用する前に、[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt)に準拠することに加えて、これらの芸術コンテンツを使用するには、2人の著者の許可にも従う必要があります。 - アニメキャラクターの絵文字を含むファイル `ic_launcher(?!.*alt.*).*` の画像は[五十根大虾仁](https://space.bilibili.com/370927)が著作権を所有しており、画像内のブランド知的財産権は[明风OuO](https://space.bilibili.com/274939213)が所有しています。ベクトル化は @MiRinChan が行っています。これらのファイルを使用する前に、[Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt)に準拠することに加えて、これらの芸術コンテンツを使用するには、2人の著者の許可にも従う必要があります。
- 上記のファイルまたはディレクトリを除き、その他のすべての部分は[GPL-3.0以降](https://www.gnu.org/licenses/gpl-3.0.html)です。 - 上記のファイルまたはディレクトリを除き、その他のすべての部分は[GPL-3.0以降](https://www.gnu.org/licenses/gpl-3.0.html)です。
## スポンサーシップの一覧 ## スポンサーシップの一覧
@@ -121,8 +125,8 @@ https://kernelsu.org/zh_CN/guide/installation.html をご参照ください。
- [wswzgdg](https://github.com/wswzgdg) このプロジェクトを支援していただき、ありがとうございます。 - [wswzgdg](https://github.com/wswzgdg) このプロジェクトを支援していただき、ありがとうございます。
- [yspbwx2010](https://github.com/yspbwx2010) どうもありがとう。 - [yspbwx2010](https://github.com/yspbwx2010) どうもありがとう。
- [DARKWWEE](https://github.com/DARKWWEE) ラオウ100USDTありがとう - [DARKWWEE](https://github.com/DARKWWEE) ラオウ100USDTありがとう
- [Saksham Singla](https://github.com/TypeFlu) ウェブサイトの提供およびメンテナンス
上記の一覧にあなたの名前がない場合は、できるだけ早急に更新しますので再度ご支援をお願いします。 - [OukaroMF](https://github.com/OukaroMF) ウェブサイトドメイン名の寄付
## 貢献者 ## 貢献者

View File

@@ -121,7 +121,7 @@ Lütfen **tümünü** https://kernelsu.org/zh_CN/guide/installation.html adresin
## Lisans ## Lisans
- `kernel` dizinindeki dosyalar [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) lisansı altındadır. - `kernel` dizinindeki dosyalar [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html) lisansı altındadır.
- Anime karakter ifadeleri içeren `ic_launcher*` dosyalarının görüntüleri [五十根大虾仁](https://space.bilibili.com/370927) tarafından telif hakkıyla korunmaktadır, görüntülerdeki Marka Fikri Mülkiyeti [明风 OuO](https://space.bilibili.com/274939213)'ye aittir ve vektörleştirme @MiRinChan tarafından yapılmıştır. Bu dosyaları kullanmadan önce, [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt) ile uyumlu olmanın yanı sıra, bu sanatsal içerikleri kullanmak için iki yazarın yetkilendirmesine de uymanız gerekir. - Anime karakter ifadeleri içeren `ic_launcher(?!.*alt.*).*` dosyalarının görüntüleri [五十根大虾仁](https://space.bilibili.com/370927) tarafından telif hakkıyla korunmaktadır, görüntülerdeki Marka Fikri Mülkiyeti [明风 OuO](https://space.bilibili.com/274939213)'ye aittir ve vektörleştirme @MiRinChan tarafından yapılmıştır. Bu dosyaları kullanmadan önce, [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt) ile uyumlu olmanın yanı sıra, bu sanatsal içerikleri kullanmak için iki yazarın yetkilendirmesine de uymanız gerekir.
- Yukarıda belirtilen dosyalar veya dizinler hariç, diğer tüm parçalar [GPL-3.0 veya üzeri](https://www.gnu.org/licenses/gpl-3.0.html)'dir. - Yukarıda belirtilen dosyalar veya dizinler hariç, diğer tüm parçalar [GPL-3.0 veya üzeri](https://www.gnu.org/licenses/gpl-3.0.html)'dir.
## Afdian Bağlantısı ## Afdian Bağlantısı
@@ -136,8 +136,6 @@ Lütfen **tümünü** https://kernelsu.org/zh_CN/guide/installation.html adresin
- [yspbwx2010](https://github.com/yspbwx2010) Çok teşekkür ederim - [yspbwx2010](https://github.com/yspbwx2010) Çok teşekkür ederim
- [DARKWWEE](https://github.com/DARKWWEE) 100 USDT için teşekkürler - [DARKWWEE](https://github.com/DARKWWEE) 100 USDT için teşekkürler
Eğer yukarıdaki listede adınız yoksa, zamanında güncelleyeceğim, herkese tekrar teşekkür ederim
## Katkıda Bulunanlar ## Katkıda Bulunanlar
- [KernelSU](https://github.com/tiann/KernelSU): Orijinal proje - [KernelSU](https://github.com/tiann/KernelSU): Orijinal proje

View File

@@ -28,7 +28,7 @@ curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kern
## 如何集成 susfs ## 如何集成 susfs
1. 直接使用 susfs-stable 或者 susfs-dev 分支,不需要再集成 susfs 1. 直接使用 susfs-stable 或者 susfs-dev 分支,不需要再集成 susfs (支持非 GKI 设备构建)
``` ```
curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev curl -LSs "https://raw.githubusercontent.com/SukiSU-Ultra/SukiSU-Ultra/main/kernel/setup.sh" | bash -s susfs-dev
@@ -120,10 +120,13 @@ KPM 模板地址: https://github.com/udochina/KPM-Build-Anywhere
5. 更多自定义功能 5. 更多自定义功能
6. 对 KPM 内核模块的支持 6. 对 KPM 内核模块的支持
## 疑难解答
1. 卸载 KernelSU 管理器设备卡死。→ 卸载包名为 com.sony.playmemories.mobile 的应用。
## 许可证 ## 许可证
- `kernel` 目录下的文件是 [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)。 - `kernel` 目录下的文件是 [GPL-2.0-only](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html)。
- 有动漫人物图片表情包的这些文件 `ic_launcher*` 的图像版权为[五十根大虾仁](https://space.bilibili.com/370927)所有,图像中的 Brand Intellectual Property 由[明风OuO](https://space.bilibili.com/274939213)所有,矢量化由 @MiRinChan 完成,在使用这些文件之前,除了必须遵守 [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt) 以外,还需要遵守向前两者索要使用这些艺术内容的授权。 - 有动漫人物图片表情包的这些文件 `ic_launcher(?!.*alt.*).*` 的图像版权为[五十根大虾仁](https://space.bilibili.com/370927)所有,图像中的 Brand Intellectual Property 由[明风OuO](https://space.bilibili.com/274939213)所有,矢量化由 @MiRinChan 完成,在使用这些文件之前,除了必须遵守 [Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International](https://creativecommons.org/licenses/by-nc-sa/4.0/legalcode.txt) 以外,还需要遵守向前两者索要使用这些艺术内容的授权。
- 除了以上所述的文件或目录外,所有其他部分均为 [GPL-3.0 或更高版本](https://www.gnu.org/licenses/gpl-3.0.html)。 - 除了以上所述的文件或目录外,所有其他部分均为 [GPL-3.0 或更高版本](https://www.gnu.org/licenses/gpl-3.0.html)。
## 爱发电链接 ## 爱发电链接
@@ -137,8 +140,8 @@ KPM 模板地址: https://github.com/udochina/KPM-Build-Anywhere
- [wswzgdg](https://github.com/wswzgdg) 非常感谢对此项目的支持 - [wswzgdg](https://github.com/wswzgdg) 非常感谢对此项目的支持
- [yspbwx2010](https://github.com/yspbwx2010) 非常感谢 - [yspbwx2010](https://github.com/yspbwx2010) 非常感谢
- [DARKWWEE](https://github.com/DARKWWEE) 感谢老哥的 100 USDT - [DARKWWEE](https://github.com/DARKWWEE) 感谢老哥的 100 USDT
- [Saksham Singla](https://github.com/TypeFlu) 网站的提供以及维护
如果以上名单没有你的名称,我会及时更新,再次感谢大家的支持 - [OukaroMF](https://github.com/OukaroMF) 网站域名捐赠
## 贡献 ## 贡献

View File

@@ -5,6 +5,7 @@
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/version.h> #include <linux/version.h>
#include <linux/namei.h>
#include "allowlist.h" #include "allowlist.h"
#include "klog.h" // IWYU pragma: keep #include "klog.h" // IWYU pragma: keep
@@ -115,6 +116,7 @@ struct my_dir_context {
void *private_data; void *private_data;
int depth; int depth;
int *stop; int *stop;
struct super_block* root_sb;
}; };
// https://docs.kernel.org/filesystems/porting.html // https://docs.kernel.org/filesystems/porting.html
// filldir_t (readdir callbacks) calling conventions have changed. Instead of returning 0 or -E... it returns bool now. false means "no more" (as -E... used to) and true - "keep going" (as 0 in old calling conventions). Rationale: callers never looked at specific -E... values anyway. -> iterate_shared() instances require no changes at all, all filldir_t ones in the tree converted. // filldir_t (readdir callbacks) calling conventions have changed. Instead of returning 0 or -E... it returns bool now. false means "no more" (as -E... used to) and true - "keep going" (as 0 in old calling conventions). Rationale: callers never looked at specific -E... values anyway. -> iterate_shared() instances require no changes at all, all filldir_t ones in the tree converted.
@@ -135,6 +137,8 @@ FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name,
struct my_dir_context *my_ctx = struct my_dir_context *my_ctx =
container_of(ctx, struct my_dir_context, ctx); container_of(ctx, struct my_dir_context, ctx);
char dirpath[DATA_PATH_LEN]; char dirpath[DATA_PATH_LEN];
int err;
struct path path;
if (!my_ctx) { if (!my_ctx) {
pr_err("Invalid context\n"); pr_err("Invalid context\n");
@@ -162,6 +166,18 @@ FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name,
return FILLDIR_ACTOR_CONTINUE; return FILLDIR_ACTOR_CONTINUE;
} }
err = kern_path(dirpath, 0, &path);
if (err) {
pr_err("get dirpath %s err: %d\n", dirpath, err);
return FILLDIR_ACTOR_CONTINUE;
}
if (my_ctx->root_sb != path.dentry->d_inode->i_sb) {
pr_info("skip cross fs: %s", dirpath);
return FILLDIR_ACTOR_CONTINUE;
}
if (d_type == DT_DIR && my_ctx->depth > 0 && if (d_type == DT_DIR && my_ctx->depth > 0 &&
(my_ctx->stop && !*my_ctx->stop)) { (my_ctx->stop && !*my_ctx->stop)) {
struct data_path *data = kmalloc(sizeof(struct data_path), GFP_ATOMIC); struct data_path *data = kmalloc(sizeof(struct data_path), GFP_ATOMIC);
@@ -211,10 +227,19 @@ FILLDIR_RETURN_TYPE my_actor(struct dir_context *ctx, const char *name,
void search_manager(const char *path, int depth, struct list_head *uid_data) void search_manager(const char *path, int depth, struct list_head *uid_data)
{ {
int i, stop = 0; int i, stop = 0, err;
struct list_head data_path_list; struct list_head data_path_list;
struct path kpath;
struct super_block* root_sb;
INIT_LIST_HEAD(&data_path_list); INIT_LIST_HEAD(&data_path_list);
err = kern_path(path, 0, &kpath);
if (err) {
pr_err("get search root %s err: %d\n", path, err);
return;
}
// Initialize APK cache list // Initialize APK cache list
struct apk_path_hash *pos, *n; struct apk_path_hash *pos, *n;
list_for_each_entry(pos, &apk_path_hash_list, list) { list_for_each_entry(pos, &apk_path_hash_list, list) {
@@ -227,6 +252,8 @@ void search_manager(const char *path, int depth, struct list_head *uid_data)
data.depth = depth; data.depth = depth;
list_add_tail(&data.list, &data_path_list); list_add_tail(&data.list, &data_path_list);
root_sb = kpath.dentry->d_inode->i_sb;
for (i = depth; i >= 0; i--) { for (i = depth; i >= 0; i--) {
struct data_path *pos, *n; struct data_path *pos, *n;
@@ -236,7 +263,8 @@ void search_manager(const char *path, int depth, struct list_head *uid_data)
.parent_dir = pos->dirpath, .parent_dir = pos->dirpath,
.private_data = uid_data, .private_data = uid_data,
.depth = pos->depth, .depth = pos->depth,
.stop = &stop }; .stop = &stop,
.root_sb = root_sb };
struct file *file; struct file *file;
if (!stop) { if (!stop) {

View File

@@ -32,6 +32,19 @@
</intent-filter> </intent-filter>
</activity> </activity>
<activity-alias
android:name=".ui.MainActivityAlias"
android:exported="true"
android:enabled="false"
android:icon="@mipmap/ic_launcher_alt"
android:roundIcon="@mipmap/ic_launcher_alt_round"
android:targetActivity=".ui.MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity <activity
android:name=".ui.webui.WebUIActivity" android:name=".ui.webui.WebUIActivity"
android:autoRemoveFromRecents="true" android:autoRemoveFromRecents="true"

View File

@@ -1,11 +1,14 @@
package com.sukisu.ultra package com.sukisu.ultra
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.app.Activity
import android.app.ActivityOptions
import android.app.Application import android.app.Application
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.content.res.Resources import android.content.res.Resources
import android.os.Build import android.os.Build
import android.os.Bundle
import coil.Coil import coil.Coil
import coil.ImageLoader import coil.ImageLoader
import com.dergoogler.mmrl.platform.Platform import com.dergoogler.mmrl.platform.Platform
@@ -14,9 +17,31 @@ import me.zhanghai.android.appiconloader.coil.AppIconKeyer
import java.io.File import java.io.File
import java.util.Locale import java.util.Locale
@SuppressLint("StaticFieldLeak")
lateinit var ksuApp: KernelSUApplication lateinit var ksuApp: KernelSUApplication
class KernelSUApplication : Application() { class KernelSUApplication : Application() {
private var currentActivity: Activity? = null
private val activityLifecycleCallbacks = object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
currentActivity = activity
}
override fun onActivityStarted(activity: Activity) {
currentActivity = activity
}
override fun onActivityResumed(activity: Activity) {
currentActivity = activity
}
override fun onActivityPaused(activity: Activity) {}
override fun onActivityStopped(activity: Activity) {}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
override fun onActivityDestroyed(activity: Activity) {
if (currentActivity == activity) {
currentActivity = null
}
}
}
override fun attachBaseContext(base: Context) { override fun attachBaseContext(base: Context) {
val prefs = base.getSharedPreferences("settings", MODE_PRIVATE) val prefs = base.getSharedPreferences("settings", MODE_PRIVATE)
@@ -62,6 +87,9 @@ class KernelSUApplication : Application() {
super.onCreate() super.onCreate()
ksuApp = this ksuApp = this
// 注册Activity生命周期回调
registerActivityLifecycleCallbacks(activityLifecycleCallbacks)
Platform.setHiddenApiExemptions() Platform.setHiddenApiExemptions()
val context = this val context = this
@@ -107,4 +135,17 @@ class KernelSUApplication : Application() {
} }
} }
} }
// 添加刷新当前Activity的方法
fun refreshCurrentActivity() {
currentActivity?.let { activity ->
val intent = activity.intent
activity.finish()
val options = ActivityOptions.makeCustomAnimation(
activity, android.R.anim.fade_in, android.R.anim.fade_out
)
activity.startActivity(intent, options.toBundle())
}
}
} }

View File

@@ -1,114 +1,64 @@
package com.sukisu.ultra.ui package com.sukisu.ultra.ui
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.database.ContentObserver
import android.os.Build import android.os.Build
import android.os.Bundle import android.os.Bundle
import android.os.Handler
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.animation.*
import androidx.compose.animation.core.tween
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.material3.* import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext import androidx.lifecycle.lifecycleScope
import androidx.compose.ui.res.stringResource import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.NavBackStackEntry
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.ramcosta.composedestinations.DestinationsNavHost import com.ramcosta.composedestinations.DestinationsNavHost
import com.ramcosta.composedestinations.animations.NavHostAnimatedDestinationStyle
import com.ramcosta.composedestinations.generated.NavGraphs import com.ramcosta.composedestinations.generated.NavGraphs
import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination import com.ramcosta.composedestinations.generated.destinations.ExecuteModuleActionScreenDestination
import com.ramcosta.composedestinations.spec.NavHostGraphSpec import com.ramcosta.composedestinations.spec.NavHostGraphSpec
import com.ramcosta.composedestinations.spec.RouteOrDirection
import com.ramcosta.composedestinations.utils.isRouteOnBackStackAsState
import com.ramcosta.composedestinations.utils.rememberDestinationsNavigator
import io.sukisu.ultra.UltraToolInstall import io.sukisu.ultra.UltraToolInstall
import com.sukisu.ultra.Natives
import com.sukisu.ultra.ksuApp import com.sukisu.ultra.ksuApp
import com.sukisu.ultra.ui.screen.BottomBarDestination import zako.zako.zako.zakoui.activity.util.AppData
import com.sukisu.ultra.ui.theme.* import com.sukisu.ultra.ui.theme.*
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha import zako.zako.zako.zakoui.activity.util.*
import com.sukisu.ultra.ui.util.* import zako.zako.zako.zakoui.activity.component.BottomBar
import androidx.core.content.edit import com.sukisu.ultra.ui.util.LocalSnackbarHost
import com.sukisu.ultra.ui.theme.CardConfig.cardElevation import com.sukisu.ultra.ui.util.install
import com.sukisu.ultra.ui.webui.initPlatform
import java.util.Locale
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.lifecycle.lifecycleScope
import com.sukisu.ultra.ui.viewmodel.HomeViewModel import com.sukisu.ultra.ui.viewmodel.HomeViewModel
import com.sukisu.ultra.ui.viewmodel.SuperUserViewModel import com.sukisu.ultra.ui.viewmodel.SuperUserViewModel
import com.sukisu.ultra.ui.webui.initPlatform
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
private lateinit var superUserViewModel: SuperUserViewModel private lateinit var superUserViewModel: SuperUserViewModel
private lateinit var homeViewModel: HomeViewModel private lateinit var homeViewModel: HomeViewModel
internal val settingsStateFlow = MutableStateFlow(SettingsState())
private inner class ThemeChangeContentObserver( data class SettingsState(
handler: Handler, val isHideOtherInfo: Boolean = false,
private val onThemeChanged: () -> Unit val showKpmInfo: Boolean = false
) : ContentObserver(handler) { )
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
onThemeChanged()
}
}
// 应用保存的语言设置 private lateinit var themeChangeObserver: ThemeChangeContentObserver
@SuppressLint("ObsoleteSdkInt")
private fun applyLanguageSetting() {
val prefs = getSharedPreferences("settings", MODE_PRIVATE)
val languageCode = prefs.getString("app_language", "") ?: ""
if (languageCode.isNotEmpty()) { // 添加标记避免重复初始化
val locale = Locale.forLanguageTag(languageCode) private var isInitialized = false
Locale.setDefault(locale)
val resources = resources
val config = Configuration(resources.configuration)
config.setLocale(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
createConfigurationContext(config)
} else {
@Suppress("DEPRECATION")
resources.updateConfiguration(config, resources.displayMetrics)
}
}
}
override fun attachBaseContext(newBase: Context) { override fun attachBaseContext(newBase: Context) {
val prefs = newBase.getSharedPreferences("settings", MODE_PRIVATE) val context = LocaleUtils.applyLocale(newBase)
val languageCode = prefs.getString("app_language", "") ?: ""
var context = newBase
if (languageCode.isNotEmpty()) {
val locale = Locale.forLanguageTag(languageCode)
Locale.setDefault(locale)
val config = Configuration(newBase.resources.configuration)
config.setLocale(locale)
context = newBase.createConfigurationContext(config)
}
super.attachBaseContext(context) super.attachBaseContext(context)
} }
@SuppressLint("RestrictedApi")
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
try {
// 确保应用正确的语言设置 // 确保应用正确的语言设置
applyLanguageSetting() LocaleUtils.applyLanguageSetting(this)
// 应用自定义 DPI // 应用自定义 DPI
applyCustomDpi() DisplayUtils.applyCustomDpi(this)
// Enable edge to edge // Enable edge to edge
enableEdgeToEdge() enableEdgeToEdge()
@@ -119,62 +69,11 @@ class MainActivity : ComponentActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
// 初始化 SuperUserViewModel // 使用标记控制初始化流程
superUserViewModel = SuperUserViewModel() if (!isInitialized) {
initializeViewModels()
lifecycleScope.launch { initializeData()
superUserViewModel.fetchAppList() isInitialized = true
}
// 初始化 HomeViewModel
homeViewModel = HomeViewModel()
// 预加载数据
lifecycleScope.launch {
homeViewModel.initializeData()
}
val prefs = getSharedPreferences("settings", MODE_PRIVATE)
val isFirstRun = prefs.getBoolean("is_first_run", true)
if (isFirstRun) {
ThemeConfig.preventBackgroundRefresh = false
getSharedPreferences("theme_prefs", MODE_PRIVATE).edit {
putBoolean("prevent_background_refresh", false)
}
prefs.edit { putBoolean("is_first_run", false) }
}
// 加载保存的背景设置
loadThemeMode()
loadThemeColors()
loadDynamicColorState()
CardConfig.load(applicationContext)
val contentObserver = ThemeChangeContentObserver(Handler(mainLooper)) {
runOnUiThread {
if (!ThemeConfig.preventBackgroundRefresh) {
ThemeConfig.backgroundImageLoaded = false
loadCustomBackground()
}
}
}
contentResolver.registerContentObserver(
android.provider.Settings.System.getUriFor("ui_night_mode"),
false,
contentObserver
)
val destroyListeners = mutableListOf<() -> Unit>()
destroyListeners.add {
contentResolver.unregisterContentObserver(contentObserver)
}
val isManager = Natives.becomeManager(ksuApp.packageName)
if (isManager) {
install()
UltraToolInstall.tryToInstall()
} }
setContent { setContent {
@@ -184,60 +83,101 @@ class MainActivity : ComponentActivity() {
val currentDestination = navController.currentBackStackEntryAsState().value?.destination val currentDestination = navController.currentBackStackEntryAsState().value?.destination
val showBottomBar = when (currentDestination?.route) { val showBottomBar = when (currentDestination?.route) {
ExecuteModuleActionScreenDestination.route -> false // Hide for ExecuteModuleActionScreen ExecuteModuleActionScreenDestination.route -> false
else -> true else -> true
} }
// pre-init platform to faster start WebUI X activities
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
initPlatform() initPlatform()
} }
Scaffold(
bottomBar = {
AnimatedVisibility(
visible = showBottomBar,
enter = slideInVertically(initialOffsetY = { it }) + fadeIn(),
exit = slideOutVertically(targetOffsetY = { it }) + fadeOut()
) {
BottomBar(navController)
}
},
contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { innerPadding ->
CompositionLocalProvider( CompositionLocalProvider(
LocalSnackbarHost provides snackBarHostState LocalSnackbarHost provides snackBarHostState
) { ) {
Scaffold(
bottomBar = {
AnimatedBottomBar.AnimatedBottomBarWrapper(
showBottomBar = showBottomBar,
content = { BottomBar(navController) }
)
},
contentWindowInsets = WindowInsets(0, 0, 0, 0)
) { innerPadding ->
DestinationsNavHost( DestinationsNavHost(
modifier = Modifier.padding(innerPadding), modifier = Modifier.padding(innerPadding),
navGraph = NavGraphs.root as NavHostGraphSpec, navGraph = NavGraphs.root as NavHostGraphSpec,
navController = navController, navController = navController,
defaultTransitions = object : NavHostAnimatedDestinationStyle() { defaultTransitions = NavigationUtils.defaultTransitions()
override val enterTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition
get() = { fadeIn(animationSpec = tween(340)) }
override val exitTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition
get() = { fadeOut(animationSpec = tween(340)) }
}
) )
} }
} }
} }
} }
} catch (e: Exception) {
e.printStackTrace()
}
} }
// 应用自定义DPI设置 private fun initializeViewModels() {
private fun applyCustomDpi() { superUserViewModel = SuperUserViewModel()
val prefs = getSharedPreferences("settings", MODE_PRIVATE) homeViewModel = HomeViewModel()
val customDpi = prefs.getInt("app_dpi", 0)
if (customDpi > 0) { // 设置主题变化监听器
themeChangeObserver = ThemeUtils.registerThemeChangeObserver(this)
}
private fun initializeData() {
lifecycleScope.launch {
try { try {
val resources = resources superUserViewModel.fetchAppList()
val metrics = resources.displayMetrics } catch (e: Exception) {
metrics.density = customDpi / 160f e.printStackTrace()
@Suppress("DEPRECATION") }
metrics.scaledDensity = customDpi / 160f }
metrics.densityDpi = customDpi
lifecycleScope.launch {
try {
homeViewModel.initializeData()
} catch (e: Exception) {
e.printStackTrace()
}
}
// 数据刷新协程
DataRefreshUtils.startDataRefreshCoroutine(lifecycleScope)
DataRefreshUtils.startSettingsMonitorCoroutine(lifecycleScope, this, settingsStateFlow)
// 初始化主题相关设置
ThemeUtils.initializeThemeSettings(this, settingsStateFlow)
val isManager = AppData.isManager(ksuApp.packageName)
if (isManager) {
install()
UltraToolInstall.tryToInstall()
}
}
override fun onResume() {
try {
super.onResume()
LocaleUtils.applyLanguageSetting(this)
ThemeUtils.onActivityResume()
// 仅在需要时刷新数据
if (isInitialized) {
refreshData()
}
} catch (e: Exception) {
e.printStackTrace()
}
}
private fun refreshData() {
lifecycleScope.launch {
try {
superUserViewModel.fetchAppList()
homeViewModel.initializeData()
DataRefreshUtils.refreshData(lifecycleScope)
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
@@ -245,125 +185,29 @@ class MainActivity : ComponentActivity() {
} }
override fun onPause() { override fun onPause() {
try {
super.onPause() super.onPause()
CardConfig.save(applicationContext) ThemeUtils.onActivityPause(this)
getSharedPreferences("theme_prefs", MODE_PRIVATE).edit { } catch (e: Exception) {
putBoolean("prevent_background_refresh", true) e.printStackTrace()
}
ThemeConfig.preventBackgroundRefresh = true
}
override fun onResume() {
super.onResume()
applyLanguageSetting()
if (!ThemeConfig.backgroundImageLoaded && !ThemeConfig.preventBackgroundRefresh) {
loadCustomBackground()
}
lifecycleScope.launch {
superUserViewModel.fetchAppList()
}
lifecycleScope.launch {
homeViewModel.initializeData()
} }
} }
private val destroyListeners = mutableListOf<() -> Unit>()
override fun onDestroy() { override fun onDestroy() {
destroyListeners.forEach { it() } try {
ThemeUtils.unregisterThemeChangeObserver(this, themeChangeObserver)
super.onDestroy() super.onDestroy()
} catch (e: Exception) {
e.printStackTrace()
}
} }
override fun onConfigurationChanged(newConfig: Configuration) { override fun onConfigurationChanged(newConfig: Configuration) {
try {
super.onConfigurationChanged(newConfig) super.onConfigurationChanged(newConfig)
applyLanguageSetting() LocaleUtils.applyLanguageSetting(this)
} } catch (e: Exception) {
} e.printStackTrace()
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun BottomBar(navController: NavHostController) {
val navigator = navController.rememberDestinationsNavigator()
val isManager = Natives.becomeManager(ksuApp.packageName)
val fullFeatured = isManager && !Natives.requireNewKernel() && rootAvailable()
val kpmVersion = getKpmVersion()
val cardColor = MaterialTheme.colorScheme.surfaceContainer
// 检查是否显示KPM
val showKpmInfo = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("show_kpm_info", true)
NavigationBar(
modifier = Modifier.windowInsetsPadding(
WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal)
),
containerColor = TopAppBarDefaults.topAppBarColors(
containerColor = cardColor.copy(alpha = cardAlpha),
scrolledContainerColor = cardColor.copy(alpha = cardAlpha)
).containerColor,
tonalElevation = cardElevation
) {
BottomBarDestination.entries.forEach { destination ->
if (destination == BottomBarDestination.Kpm) {
if (kpmVersion.isNotEmpty() && !kpmVersion.startsWith("Error") && showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
if (!fullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (!isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root as RouteOrDirection) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
}
} else {
if (!fullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
}
} }
} }
} }

View File

@@ -20,7 +20,6 @@ import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.Dialog
@@ -138,7 +137,7 @@ fun ImageEditorDialog(
0f 0f
} }
updateTransformation(newScale, newOffsetX, newOffsetY) updateTransformation(newScale, newOffsetX, newOffsetY)
} catch (e: Exception) { } catch (_: Exception) {
updateTransformation(lastScale, lastOffsetX, lastOffsetY) updateTransformation(lastScale, lastOffsetX, lastOffsetY)
} }
} }
@@ -186,7 +185,7 @@ fun ImageEditorDialog(
val transformation = BackgroundTransformation(scale, offsetX, offsetY) val transformation = BackgroundTransformation(scale, offsetX, offsetY)
val savedUri = context.saveTransformedBackground(imageUri, transformation) val savedUri = context.saveTransformedBackground(imageUri, transformation)
savedUri?.let { onConfirm(it) } savedUri?.let { onConfirm(it) }
} catch (e: Exception) { } catch (_: Exception) {
"" ""
} }
} }

View File

@@ -63,7 +63,12 @@ fun SearchAppBar(
var onSearch by remember { mutableStateOf(false) } var onSearch by remember { mutableStateOf(false) }
// 获取卡片颜色和透明度 // 获取卡片颜色和透明度
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = CardConfig.cardAlpha val cardAlpha = CardConfig.cardAlpha
if (onSearch) { if (onSearch) {

View File

@@ -6,16 +6,19 @@ import androidx.compose.foundation.selection.toggleable
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.RadioButton
import androidx.compose.material3.Switch import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.semantics.Role import androidx.compose.ui.semantics.Role
import com.dergoogler.mmrl.ui.component.LabelItem import com.dergoogler.mmrl.ui.component.LabelItem
import com.dergoogler.mmrl.ui.component.text.TextRow import com.dergoogler.mmrl.ui.component.text.TextRow
import com.sukisu.ultra.ui.theme.CardConfig
@Composable @Composable
fun SwitchItem( fun SwitchItem(
@@ -25,11 +28,16 @@ fun SwitchItem(
checked: Boolean, checked: Boolean,
enabled: Boolean = true, enabled: Boolean = true,
beta: Boolean = false, beta: Boolean = false,
onCheckedChange: (Boolean) -> Unit, onCheckedChange: (Boolean) -> Unit
) { ) {
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) } val stateAlpha = remember(checked, enabled) { Modifier.alpha(if (enabled) 1f else 0.5f) }
MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy(
surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
)
) {
ListItem( ListItem(
modifier = Modifier modifier = Modifier
.toggleable( .toggleable(
@@ -62,8 +70,7 @@ fun SwitchItem(
Icon( Icon(
modifier = Modifier.then(stateAlpha), modifier = Modifier.then(stateAlpha),
imageVector = icon, imageVector = icon,
contentDescription = title, contentDescription = title
tint = MaterialTheme.colorScheme.primary
) )
} }
}, },
@@ -84,4 +91,21 @@ fun SwitchItem(
} }
} }
) )
}
}
@Composable
fun RadioItem(
title: String,
selected: Boolean,
onClick: () -> Unit,
) {
ListItem(
headlineContent = {
Text(title)
},
leadingContent = {
RadioButton(selected = selected, onClick = onClick)
}
)
} }

View File

@@ -1,6 +1,5 @@
package com.sukisu.ultra.ui.component package com.sukisu.ultra.ui.component
import android.content.Context
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.horizontalScroll
@@ -10,12 +9,10 @@ import androidx.compose.material3.*
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.sukisu.ultra.R import com.sukisu.ultra.R
import com.sukisu.ultra.ui.theme.ThemeConfig
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.SdStorage import androidx.compose.material.icons.filled.SdStorage
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@@ -32,13 +29,19 @@ fun SlotSelectionDialog(
onDismiss: () -> Unit, onDismiss: () -> Unit,
onSlotSelected: (String) -> Unit onSlotSelected: (String) -> Unit
) { ) {
val context = LocalContext.current
var currentSlot by remember { mutableStateOf<String?>(null) } var currentSlot by remember { mutableStateOf<String?>(null) }
var errorMessage by remember { mutableStateOf<String?>(null) } var errorMessage by remember { mutableStateOf<String?>(null) }
var selectedSlot by remember { mutableStateOf<String?>(null) }
LaunchedEffect(Unit) { LaunchedEffect(Unit) {
try { try {
currentSlot = getCurrentSlot(context) currentSlot = getCurrentSlot()
// 设置默认选择为当前槽位
selectedSlot = when (currentSlot) {
"a" -> "a"
"b" -> "b"
else -> null
}
errorMessage = null errorMessage = null
} catch (e: Exception) { } catch (e: Exception) {
errorMessage = e.message errorMessage = e.message
@@ -103,12 +106,12 @@ fun SlotSelectionDialog(
val slotOptions = listOf( val slotOptions = listOf(
ListOption( ListOption(
titleText = stringResource(id = R.string.slot_a), titleText = stringResource(id = R.string.slot_a),
subtitleText = if (currentSlot == "a" || currentSlot == "_a") stringResource(id = R.string.currently_selected) else null, subtitleText = null,
icon = Icons.Filled.SdStorage icon = Icons.Filled.SdStorage
), ),
ListOption( ListOption(
titleText = stringResource(id = R.string.slot_b), titleText = stringResource(id = R.string.slot_b),
subtitleText = if (currentSlot == "b" || currentSlot == "_b") stringResource(id = R.string.currently_selected) else null, subtitleText = null,
icon = Icons.Filled.SdStorage icon = Icons.Filled.SdStorage
) )
) )
@@ -124,19 +127,20 @@ fun SlotSelectionDialog(
.fillMaxWidth() .fillMaxWidth()
.clip(MaterialTheme.shapes.medium) .clip(MaterialTheme.shapes.medium)
.background( .background(
color = if (option.subtitleText != null) { color = if (selectedSlot == when(index) {
0 -> "a"
else -> "b"
}) {
MaterialTheme.colorScheme.primary.copy(alpha = 0.9f) MaterialTheme.colorScheme.primary.copy(alpha = 0.9f)
} else { } else {
MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.3f) MaterialTheme.colorScheme.primaryContainer.copy(alpha = 0.3f)
} }
) )
.clickable { .clickable {
onSlotSelected( selectedSlot = when(index) {
when (index) {
0 -> "a" 0 -> "a"
else -> "b" else -> "b"
} }
)
} }
.padding(vertical = 12.dp, horizontal = 16.dp), .padding(vertical = 12.dp, horizontal = 16.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
@@ -144,7 +148,10 @@ fun SlotSelectionDialog(
Icon( Icon(
imageVector = option.icon, imageVector = option.icon,
contentDescription = null, contentDescription = null,
tint = if (option.subtitleText != null) { tint = if (selectedSlot == when(index) {
0 -> "a"
else -> "b"
}) {
MaterialTheme.colorScheme.onPrimary MaterialTheme.colorScheme.onPrimary
} else { } else {
MaterialTheme.colorScheme.primary MaterialTheme.colorScheme.primary
@@ -159,7 +166,10 @@ fun SlotSelectionDialog(
Text( Text(
text = option.titleText, text = option.titleText,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = if (option.subtitleText != null) { color = if (selectedSlot == when(index) {
0 -> "a"
else -> "b"
}) {
MaterialTheme.colorScheme.onPrimary MaterialTheme.colorScheme.onPrimary
} else { } else {
MaterialTheme.colorScheme.primary MaterialTheme.colorScheme.primary
@@ -169,7 +179,10 @@ fun SlotSelectionDialog(
Text( Text(
text = it, text = it,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = if (true) { color = if (selectedSlot == when(index) {
0 -> "a"
else -> "b"
}) {
MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.8f) MaterialTheme.colorScheme.onPrimary.copy(alpha = 0.8f)
} else { } else {
MaterialTheme.colorScheme.onSurfaceVariant MaterialTheme.colorScheme.onSurfaceVariant
@@ -186,9 +199,10 @@ fun SlotSelectionDialog(
confirmButton = { confirmButton = {
TextButton( TextButton(
onClick = { onClick = {
currentSlot?.let { onSlotSelected(it) } selectedSlot?.let { onSlotSelected(it) }
onDismiss() onDismiss()
} },
enabled = selectedSlot != null
) { ) {
Text( Text(
text = stringResource(android.R.string.ok), text = stringResource(android.R.string.ok),
@@ -221,7 +235,7 @@ data class ListOption(
) )
// Utility function to get current slot // Utility function to get current slot
private fun getCurrentSlot(context: Context): String? { private fun getCurrentSlot(): String? {
return runCommandGetOutput(true, "getprop ro.boot.slot_suffix")?.let { return runCommandGetOutput(true, "getprop ro.boot.slot_suffix")?.let {
if (it.startsWith("_")) it.substring(1) else it if (it.startsWith("_")) it.substring(1) else it
} }

View File

@@ -1,101 +0,0 @@
package com.sukisu.ultra.ui.component
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material3.Icon
import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Switch
import androidx.compose.material3.SwitchDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
@Composable
fun SwitchItem(
icon: ImageVector,
title: String,
summary: String? = null,
checked: Boolean,
enabled: Boolean = true,
onCheckedChange: (Boolean) -> Unit
) {
// 颜色动画
val iconTint by animateColorAsState(
targetValue = if (checked) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface.copy(alpha = 0.6f),
animationSpec = tween(300),
label = "iconTint"
)
// 开关颜色
val switchColors = SwitchDefaults.colors(
checkedThumbColor = MaterialTheme.colorScheme.primary,
checkedTrackColor = MaterialTheme.colorScheme.primaryContainer,
checkedBorderColor = MaterialTheme.colorScheme.primary,
checkedIconColor = MaterialTheme.colorScheme.onPrimary,
uncheckedThumbColor = MaterialTheme.colorScheme.outline,
uncheckedTrackColor = MaterialTheme.colorScheme.surfaceVariant,
uncheckedBorderColor = MaterialTheme.colorScheme.outline,
uncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant,
disabledCheckedThumbColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
disabledCheckedTrackColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
disabledCheckedBorderColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
disabledCheckedIconColor = MaterialTheme.colorScheme.surfaceVariant,
disabledUncheckedThumbColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.38f),
disabledUncheckedTrackColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
disabledUncheckedBorderColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.12f),
disabledUncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant
)
ListItem(
headlineContent = {
Text(
text = title,
style = MaterialTheme.typography.titleMedium,
maxLines = Int.MAX_VALUE,
overflow = TextOverflow.Ellipsis
)
},
supportingContent = summary?.let {
{
Text(
text = it,
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant,
maxLines = Int.MAX_VALUE,
overflow = TextOverflow.Ellipsis
)
}
},
leadingContent = {
Icon(
imageVector = icon,
contentDescription = null,
modifier = Modifier.size(24.dp),
tint = iconTint
)
},
trailingContent = {
Switch(
checked = checked,
onCheckedChange = null,
enabled = enabled,
colors = switchColors
)
},
modifier = Modifier
.fillMaxWidth()
.clickable(enabled = enabled) {
onCheckedChange(!checked)
}
.padding(vertical = 4.dp)
)
}

View File

@@ -31,7 +31,6 @@ fun AppProfileConfig(
onValueChange = { onProfileChange(profile.copy(name = it)) } onValueChange = { onProfileChange(profile.copy(name = it)) }
) )
} }
SwitchItem( SwitchItem(
title = stringResource(R.string.profile_umount_modules), title = stringResource(R.string.profile_umount_modules),
summary = stringResource(R.string.profile_umount_modules_summary), summary = stringResource(R.string.profile_umount_modules_summary),

View File

@@ -24,6 +24,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalSoftwareKeyboardController
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.ImeAction
@@ -47,6 +48,8 @@ import com.sukisu.ultra.R
import com.sukisu.ultra.profile.Capabilities import com.sukisu.ultra.profile.Capabilities
import com.sukisu.ultra.profile.Groups import com.sukisu.ultra.profile.Groups
import com.sukisu.ultra.ui.component.rememberCustomDialog import com.sukisu.ultra.ui.component.rememberCustomDialog
import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
import com.sukisu.ultra.ui.util.isSepolicyValid import com.sukisu.ultra.ui.util.isSepolicyValid
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@@ -206,7 +209,7 @@ fun GroupsPanel(selected: List<Groups>, closeSelection: (selection: Set<Groups>)
} }
val selection = HashSet(selected) val selection = HashSet(selected)
val backgroundColor = MaterialTheme.colorScheme.surfaceContainerHighest val backgroundColor = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
MaterialTheme( MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy( colorScheme = MaterialTheme.colorScheme.copy(
@@ -286,7 +289,7 @@ fun CapsPanel(
} }
val selection = HashSet(selected) val selection = HashSet(selected)
val backgroundColor = MaterialTheme.colorScheme.surfaceContainerHighest val backgroundColor = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
MaterialTheme( MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy( colorScheme = MaterialTheme.colorScheme.copy(
@@ -441,7 +444,7 @@ private fun SELinuxPanel(
) )
) )
val backgroundColor = MaterialTheme.colorScheme.surfaceContainerHighest val backgroundColor = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
MaterialTheme( MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy( colorScheme = MaterialTheme.colorScheme.copy(

View File

@@ -37,7 +37,6 @@ import androidx.compose.material3.FilterChip
import androidx.compose.material3.HorizontalDivider import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.IconButtonDefaults
import androidx.compose.material3.ListItem import androidx.compose.material3.ListItem
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
@@ -60,6 +59,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
@@ -84,6 +84,9 @@ import com.sukisu.ultra.ui.component.profile.AppProfileConfig
import com.sukisu.ultra.ui.component.profile.RootProfileConfig import com.sukisu.ultra.ui.component.profile.RootProfileConfig
import com.sukisu.ultra.ui.component.profile.TemplateConfig import com.sukisu.ultra.ui.component.profile.TemplateConfig
import com.sukisu.ultra.ui.theme.CardConfig import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
import com.sukisu.ultra.ui.theme.getCardColors
import com.sukisu.ultra.ui.theme.getCardElevation
import com.sukisu.ultra.ui.util.LocalSnackbarHost import com.sukisu.ultra.ui.util.LocalSnackbarHost
import com.sukisu.ultra.ui.util.forceStopApp import com.sukisu.ultra.ui.util.forceStopApp
import com.sukisu.ultra.ui.util.getSepolicy import com.sukisu.ultra.ui.util.getSepolicy
@@ -122,7 +125,12 @@ fun AppProfileScreen(
mutableStateOf(initialProfile) mutableStateOf(initialProfile)
} }
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = CardConfig.cardAlpha val cardAlpha = CardConfig.cardAlpha
Scaffold( Scaffold(
@@ -203,13 +211,21 @@ private fun AppProfileInner(
onProfileChange: (Natives.Profile) -> Unit, onProfileChange: (Natives.Profile) -> Unit,
) { ) {
val isRootGranted = profile.allowSu val isRootGranted = profile.allowSu
val cardColors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh)
MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy(
surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
)
) {
Column(modifier = modifier) { Column(modifier = modifier) {
ElevatedCard( ElevatedCard(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
AppMenuBox(packageName) { AppMenuBox(packageName) {
ListItem( ListItem(
@@ -235,7 +251,9 @@ private fun AppProfileInner(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
SwitchItem( SwitchItem(
icon = Icons.Filled.Security, icon = Icons.Filled.Security,
@@ -268,7 +286,9 @@ private fun AppProfileInner(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
ProfileBox(mode, true) { ProfileBox(mode, true) {
// template mode shouldn't change profile here! // template mode shouldn't change profile here!
@@ -288,10 +308,15 @@ private fun AppProfileInner(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
Column(modifier = Modifier.padding(vertical = 8.dp)) { Column(modifier = Modifier.padding(vertical = 8.dp)) {
Crossfade(targetState = mode, label = "ProfileMode") { currentMode -> Crossfade(
targetState = mode,
label = "ProfileMode"
) { currentMode ->
when (currentMode) { when (currentMode) {
Mode.Template -> { Mode.Template -> {
TemplateConfig( TemplateConfig(
@@ -301,6 +326,7 @@ private fun AppProfileInner(
onProfileChange = onProfileChange onProfileChange = onProfileChange
) )
} }
Mode.Custom -> { Mode.Custom -> {
RootProfileConfig( RootProfileConfig(
fixedName = true, fixedName = true,
@@ -308,6 +334,7 @@ private fun AppProfileInner(
onProfileChange = onProfileChange onProfileChange = onProfileChange
) )
} }
else -> {} else -> {}
} }
} }
@@ -321,7 +348,9 @@ private fun AppProfileInner(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
ProfileBox(mode, false) { ProfileBox(mode, false) {
onProfileChange(profile.copy(nonRootUseDefault = (it == Mode.Default))) onProfileChange(profile.copy(nonRootUseDefault = (it == Mode.Default)))
@@ -337,7 +366,9 @@ private fun AppProfileInner(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp), .padding(horizontal = 16.dp, vertical = 8.dp),
shape = MaterialTheme.shapes.medium shape = MaterialTheme.shapes.medium,
colors = cardColors,
elevation = getCardElevation(),
) { ) {
Column(modifier = Modifier.padding(vertical = 8.dp)) { Column(modifier = Modifier.padding(vertical = 8.dp)) {
AppProfileConfig( AppProfileConfig(
@@ -353,6 +384,7 @@ private fun AppProfileInner(
} }
} }
} }
}
} }
private enum class Mode(@StringRes private val res: Int) { private enum class Mode(@StringRes private val res: Int) {
@@ -377,12 +409,10 @@ private fun TopBar(
Text( Text(
text = title, text = title,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurface
) )
Text( Text(
text = packageName, text = packageName,
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier.alpha(0.8f) modifier = Modifier.alpha(0.8f)
) )
} }
@@ -391,9 +421,6 @@ private fun TopBar(
navigationIcon = { navigationIcon = {
IconButton( IconButton(
onClick = onBack, onClick = onBack,
colors = IconButtonDefaults.iconButtonColors(
contentColor = MaterialTheme.colorScheme.onSurface
)
) { ) {
Icon( Icon(
imageVector = Icons.AutoMirrored.Filled.ArrowBack, imageVector = Icons.AutoMirrored.Filled.ArrowBack,
@@ -408,7 +435,6 @@ private fun TopBar(
modifier = Modifier.shadow( modifier = Modifier.shadow(
elevation = if ((scrollBehavior?.state?.overlappedFraction ?: 0f) > 0.01f) elevation = if ((scrollBehavior?.state?.overlappedFraction ?: 0f) > 0.01f)
4.dp else 0.dp, 4.dp else 0.dp,
spotColor = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.1f)
) )
) )
} }
@@ -431,7 +457,6 @@ private fun ProfileBox(
Text( Text(
text = mode.text, text = mode.text,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
}, },
leadingContent = { leadingContent = {
@@ -444,7 +469,6 @@ private fun ProfileBox(
HorizontalDivider( HorizontalDivider(
thickness = Dp.Hairline, thickness = Dp.Hairline,
color = MaterialTheme.colorScheme.outlineVariant
) )
ListItem( ListItem(
@@ -574,6 +598,11 @@ private fun AppMenuOption(text: String, onClick: () -> Unit) {
@Composable @Composable
private fun AppProfilePreview() { private fun AppProfilePreview() {
var profile by remember { mutableStateOf(Natives.Profile("")) } var profile by remember { mutableStateOf(Natives.Profile("")) }
MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy(
surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceContainerHigh
)
) {
Surface { Surface {
AppProfileInner( AppProfileInner(
packageName = "icu.nullptr.test", packageName = "icu.nullptr.test",
@@ -590,4 +619,5 @@ private fun AppProfilePreview() {
}, },
) )
} }
}
} }

View File

@@ -201,13 +201,14 @@ fun FlashScreen(navigator: DestinationsNavigator, flashIt: FlashIt) {
val onBack: () -> Unit = { val onBack: () -> Unit = {
if (currentFlashingStatus.value != FlashingStatus.FLASHING) { if (currentFlashingStatus.value != FlashingStatus.FLASHING) {
if (flashIt is FlashIt.FlashBoot) { if (flashIt is FlashIt.FlashModules) {
navigator.popBackStack() viewModel.markNeedRefresh()
viewModel.fetchModuleList()
navigator.navigate(ModuleScreenDestination)
} else { } else {
viewModel.markNeedRefresh() viewModel.markNeedRefresh()
viewModel.fetchModuleList() viewModel.fetchModuleList()
navigator.navigate(ModuleScreenDestination) { navigator.popBackStack()
}
} }
} }
} }
@@ -439,7 +440,12 @@ private fun TopBar(
onSave: () -> Unit = {}, onSave: () -> Unit = {},
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
) { ) {
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = CardConfig.cardAlpha val cardAlpha = CardConfig.cardAlpha
val statusColor = when(status) { val statusColor = when(status) {

View File

@@ -1,6 +1,5 @@
package com.sukisu.ultra.ui.screen package com.sukisu.ultra.ui.screen
import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.os.PowerManager import android.os.PowerManager
@@ -29,21 +28,12 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeDrawing import androidx.compose.foundation.layout.safeDrawing
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ExperimentalMaterialApi
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Android import androidx.compose.material.icons.filled.*
import androidx.compose.material.icons.filled.Archive
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.Memory
import androidx.compose.material.icons.filled.PhoneAndroid
import androidx.compose.material.icons.filled.Refresh
import androidx.compose.material.icons.filled.Security
import androidx.compose.material.icons.filled.SettingsSuggest
import androidx.compose.material.icons.filled.Storage
import androidx.compose.material.icons.outlined.Block import androidx.compose.material.icons.outlined.Block
import androidx.compose.material.icons.outlined.TaskAlt import androidx.compose.material.icons.outlined.TaskAlt
import androidx.compose.material.icons.outlined.Warning import androidx.compose.material.icons.outlined.Warning
@@ -63,7 +53,6 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.material3.TopAppBarScrollBehavior import androidx.compose.material3.TopAppBarScrollBehavior
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.material3.rememberTopAppBarState import androidx.compose.material3.rememberTopAppBarState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
@@ -75,12 +64,8 @@ import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalUriHandler import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -98,13 +83,11 @@ import com.sukisu.ultra.R
import com.sukisu.ultra.ui.component.KsuIsValid import com.sukisu.ultra.ui.component.KsuIsValid
import com.sukisu.ultra.ui.component.rememberConfirmDialog import com.sukisu.ultra.ui.component.rememberConfirmDialog
import com.sukisu.ultra.ui.theme.CardConfig import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
import com.sukisu.ultra.ui.theme.CardConfig.cardElevation import com.sukisu.ultra.ui.theme.CardConfig.cardElevation
import com.sukisu.ultra.ui.theme.getCardColors import com.sukisu.ultra.ui.theme.getCardColors
import com.sukisu.ultra.ui.theme.getCardElevation
import com.sukisu.ultra.ui.util.checkNewVersion import com.sukisu.ultra.ui.util.checkNewVersion
import com.sukisu.ultra.ui.util.getKpmModuleCount
import com.sukisu.ultra.ui.util.getKpmVersion
import com.sukisu.ultra.ui.util.getModuleCount
import com.sukisu.ultra.ui.util.getSuperuserCount
import com.sukisu.ultra.ui.util.module.LatestVersionInfo import com.sukisu.ultra.ui.util.module.LatestVersionInfo
import com.sukisu.ultra.ui.util.reboot import com.sukisu.ultra.ui.util.reboot
import com.sukisu.ultra.ui.viewmodel.HomeViewModel import com.sukisu.ultra.ui.viewmodel.HomeViewModel
@@ -143,8 +126,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
Scaffold( Scaffold(
topBar = { topBar = {
TopBar( TopBar(
kernelVersion = viewModel.systemStatus.kernelVersion,
onInstallClick = { navigator.navigate(InstallScreenDestination) },
scrollBehavior = scrollBehavior scrollBehavior = scrollBehavior
) )
}, },
@@ -205,8 +186,6 @@ fun HomeScreen(navigator: DestinationsNavigator) {
InfoCard( InfoCard(
systemInfo = viewModel.systemInfo, systemInfo = viewModel.systemInfo,
isSimpleMode = viewModel.isSimpleMode, isSimpleMode = viewModel.isSimpleMode,
isHideVersion = viewModel.isHideVersion,
isHideOtherInfo = viewModel.isHideOtherInfo,
isHideSusfsStatus = viewModel.isHideSusfsStatus, isHideSusfsStatus = viewModel.isHideSusfsStatus,
showKpmInfo = viewModel.showKpmInfo, showKpmInfo = viewModel.showKpmInfo,
lkmMode = viewModel.systemStatus.lkmMode, lkmMode = viewModel.systemStatus.lkmMode,
@@ -257,7 +236,7 @@ fun UpdateCard() {
val updateDialog = rememberConfirmDialog(onConfirm = { uriHandler.openUri(newVersionUrl) }) val updateDialog = rememberConfirmDialog(onConfirm = { uriHandler.openUri(newVersionUrl) })
WarningCard( WarningCard(
message = stringResource(id = R.string.new_version_available).format(newVersionCode), message = stringResource(id = R.string.new_version_available).format(newVersionCode),
color = MaterialTheme.colorScheme.surfaceVariant, color = MaterialTheme.colorScheme.outlineVariant,
onClick = { onClick = {
if (changelog.isEmpty()) { if (changelog.isEmpty()) {
uriHandler.openUri(newVersionUrl) uriHandler.openUri(newVersionUrl)
@@ -277,26 +256,21 @@ fun UpdateCard() {
@Composable @Composable
fun RebootDropdownItem(@StringRes id: Int, reason: String = "") { fun RebootDropdownItem(@StringRes id: Int, reason: String = "") {
DropdownMenuItem( DropdownMenuItem(
text = { Text(stringResource(id)) }, text = {Text(stringResource(id))},
onClick = { reboot(reason) }, onClick = {reboot(reason)})
leadingIcon = {
Icon(
imageVector = Icons.Filled.Refresh,
contentDescription = null,
)
} }
)
}
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun TopBar( private fun TopBar(
kernelVersion: KernelVersion,
onInstallClick: () -> Unit,
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
) { ) {
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardAlpha = CardConfig.cardAlpha val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
TopAppBar( TopAppBar(
title = { title = {
@@ -316,7 +290,7 @@ private fun TopBar(
showDropdown = true showDropdown = true
}) { }) {
Icon( Icon(
imageVector = Icons.Filled.Refresh, imageVector = Icons.Filled.PowerSettingsNew,
contentDescription = stringResource(id = R.string.reboot) contentDescription = stringResource(id = R.string.reboot)
) )
@@ -349,16 +323,9 @@ private fun StatusCard(
onClickInstall: () -> Unit = {} onClickInstall: () -> Unit = {}
) { ) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.secondaryContainer), colors = getCardColors( if (systemStatus.ksuVersion != null)MaterialTheme.colorScheme.secondaryContainer
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), else MaterialTheme.colorScheme.errorContainer),
modifier = Modifier elevation = getCardElevation(),
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.surface.copy(alpha = 0.1f)
)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@@ -375,9 +342,14 @@ private fun StatusCard(
systemStatus.ksuVersion != null -> { systemStatus.ksuVersion != null -> {
val workingModeText = when { val workingModeText = when {
Natives.isSafeMode == true -> stringResource(id = R.string.safe_mode)
else -> stringResource(id = R.string.home_working)
}
val workingModeSurfaceText = when {
systemStatus.lkmMode == true -> "LKM" systemStatus.lkmMode == true -> "LKM"
systemStatus.lkmMode == null && systemStatus.kernelVersion.isGKI1() -> "GKI-1.0" systemStatus.lkmMode == null && systemStatus.kernelVersion.isGKI1() -> "GKI 1.0"
systemStatus.lkmMode == false || systemStatus.kernelVersion.isGKI() -> "GKI-2.0" systemStatus.lkmMode == false || systemStatus.kernelVersion.isGKI() -> "GKI 2.0"
else -> "N-GKI" else -> "N-GKI"
} }
@@ -385,7 +357,11 @@ private fun StatusCard(
Icons.Outlined.TaskAlt, Icons.Outlined.TaskAlt,
contentDescription = stringResource(R.string.home_working), contentDescription = stringResource(R.string.home_working),
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
modifier = Modifier.size(24.dp) modifier = Modifier
.size(28.dp)
.padding(
horizontal = 4.dp
),
) )
Column(Modifier.padding(start = 20.dp)) { Column(Modifier.padding(start = 20.dp)) {
@@ -394,9 +370,9 @@ private fun StatusCard(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
) { ) {
Text( Text(
text = stringResource(id = R.string.home_working), text = workingModeText,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurface color = MaterialTheme.colorScheme.primary,
) )
Spacer(Modifier.width(8.dp)) Spacer(Modifier.width(8.dp))
@@ -408,79 +384,46 @@ private fun StatusCard(
modifier = Modifier modifier = Modifier
) { ) {
Text( Text(
text = workingModeText, text = workingModeSurfaceText,
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSecondary, modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp),
modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp) color = MaterialTheme.colorScheme.onPrimary
) )
} }
Spacer(Modifier.width(6.dp)) Spacer(Modifier.width(6.dp))
// 机器架构标签或者安全模式标签 // 架构标签
val labelText = if (Natives.isSafeMode) { if (Os.uname().machine != "aarch64") {
stringResource(id = R.string.safe_mode)
} else {
Os.uname().machine
}
Surface( Surface(
shape = RoundedCornerShape(4.dp), shape = RoundedCornerShape(4.dp),
color = MaterialTheme.colorScheme.primary, color = MaterialTheme.colorScheme.primary,
modifier = Modifier modifier = Modifier
) { ) {
Text( Text(
text = labelText, text = Os.uname().machine,
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.onSecondary, modifier = Modifier.padding(
modifier = Modifier.padding(horizontal = 6.dp, vertical = 2.dp) horizontal = 6.dp,
vertical = 2.dp
),
color = MaterialTheme.colorScheme.onPrimary
) )
} }
} }
}
val isHideVersion = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE) val isHideVersion = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("is_hide_version", false) .getBoolean("is_hide_version", false)
val isHideOtherInfo = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("is_hide_other_info", false)
val showKpmInfo = LocalContext.current.getSharedPreferences("settings", Context.MODE_PRIVATE)
.getBoolean("show_kpm_info", true)
if (!isHideVersion) { if (!isHideVersion) {
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
Text( Text(
text = stringResource(R.string.home_working_version, systemStatus.ksuVersion), text = stringResource(R.string.home_working_version, systemStatus.ksuVersion),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.secondary,
) )
} }
if (!isHideOtherInfo) {
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_superuser_count, getSuperuserCount()),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_module_count, getModuleCount()),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
val kpmVersion = getKpmVersion()
if (kpmVersion.isNotEmpty() && !kpmVersion.startsWith("Error") && showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
Spacer(Modifier.height(4.dp))
Text(
text = stringResource(R.string.home_kpm_module, getKpmModuleCount()),
style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
)
}
}
} }
} }
@@ -489,7 +432,11 @@ private fun StatusCard(
Icons.Outlined.Warning, Icons.Outlined.Warning,
contentDescription = stringResource(R.string.home_not_installed), contentDescription = stringResource(R.string.home_not_installed),
tint = MaterialTheme.colorScheme.error, tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(24.dp) modifier = Modifier
.size(28.dp)
.padding(
horizontal = 4.dp
),
) )
Column(Modifier.padding(start = 20.dp)) { Column(Modifier.padding(start = 20.dp)) {
@@ -503,7 +450,7 @@ private fun StatusCard(
Text( Text(
text = stringResource(R.string.home_click_to_install), text = stringResource(R.string.home_click_to_install),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onErrorContainer
) )
} }
} }
@@ -513,7 +460,11 @@ private fun StatusCard(
Icons.Outlined.Block, Icons.Outlined.Block,
contentDescription = stringResource(R.string.home_unsupported), contentDescription = stringResource(R.string.home_unsupported),
tint = MaterialTheme.colorScheme.error, tint = MaterialTheme.colorScheme.error,
modifier = Modifier.size(24.dp) modifier = Modifier
.size(28.dp)
.padding(
horizontal = 4.dp
),
) )
Column(Modifier.padding(start = 20.dp)) { Column(Modifier.padding(start = 20.dp)) {
@@ -527,7 +478,7 @@ private fun StatusCard(
Text( Text(
text = stringResource(R.string.home_unsupported_reason), text = stringResource(R.string.home_unsupported_reason),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant color = MaterialTheme.colorScheme.onErrorContainer
) )
} }
} }
@@ -544,14 +495,7 @@ fun WarningCard(
) { ) {
ElevatedCard( ElevatedCard(
colors = getCardColors(color), colors = getCardColors(color),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@@ -563,7 +507,6 @@ fun WarningCard(
Text( Text(
text = message, text = message,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onErrorContainer
) )
} }
} }
@@ -576,16 +519,7 @@ fun ContributionCard() {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier
.fillMaxWidth()
.wrapContentHeight()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.tertiary.copy(alpha = 0.1f)
)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@@ -601,14 +535,12 @@ fun ContributionCard() {
Text( Text(
text = stringResource(R.string.home_ContributionCard_kernelsu), text = stringResource(R.string.home_ContributionCard_kernelsu),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
Text( Text(
text = stringResource(R.string.home_click_to_ContributionCard_kernelsu), text = stringResource(R.string.home_click_to_ContributionCard_kernelsu),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f)
) )
} }
} }
@@ -622,15 +554,7 @@ fun LearnMoreCard() {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = CardDefaults.cardElevation(defaultElevation = cardElevation)
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)
)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@@ -645,14 +569,12 @@ fun LearnMoreCard() {
Text( Text(
text = stringResource(R.string.home_learn_kernelsu), text = stringResource(R.string.home_learn_kernelsu),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
Text( Text(
text = stringResource(R.string.home_click_to_learn_kernelsu), text = stringResource(R.string.home_click_to_learn_kernelsu),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f)
) )
} }
} }
@@ -665,15 +587,7 @@ fun DonateCard() {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.secondary.copy(alpha = 0.1f)
)
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
@@ -688,14 +602,12 @@ fun DonateCard() {
Text( Text(
text = stringResource(R.string.home_support_title), text = stringResource(R.string.home_support_title),
style = MaterialTheme.typography.titleSmall, style = MaterialTheme.typography.titleSmall,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(Modifier.height(4.dp)) Spacer(Modifier.height(4.dp))
Text( Text(
text = stringResource(R.string.home_support_content), text = stringResource(R.string.home_support_content),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface.copy(alpha = 0.8f)
) )
} }
} }
@@ -706,23 +618,13 @@ fun DonateCard() {
private fun InfoCard( private fun InfoCard(
systemInfo: HomeViewModel.SystemInfo, systemInfo: HomeViewModel.SystemInfo,
isSimpleMode: Boolean, isSimpleMode: Boolean,
isHideVersion: Boolean,
isHideOtherInfo: Boolean,
isHideSusfsStatus: Boolean, isHideSusfsStatus: Boolean,
showKpmInfo: Boolean, showKpmInfo: Boolean,
lkmMode: Boolean? lkmMode: Boolean?
) { ) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainer),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.05f)
)
) { ) {
Column( Column(
modifier = Modifier modifier = Modifier
@@ -733,20 +635,23 @@ private fun InfoCard(
fun InfoCardItem( fun InfoCardItem(
label: String, label: String,
content: String, content: String,
icon: ImageVector = Icons.Default.Info icon: ImageVector? = null,
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.Top,
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(vertical = 8.dp) .padding(vertical = 8.dp)
) { ) {
if (icon != null) {
Icon( Icon(
imageVector = icon, imageVector = icon,
contentDescription = label, contentDescription = label,
modifier = Modifier.size(24.dp), modifier = Modifier
tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.7f), .size(28.dp)
.padding(vertical = 4.dp),
) )
}
Spacer(modifier = Modifier.width(16.dp)) Spacer(modifier = Modifier.width(16.dp))
Column( Column(
modifier = Modifier modifier = Modifier
@@ -756,12 +661,10 @@ private fun InfoCard(
Text( Text(
text = label, text = label,
style = MaterialTheme.typography.labelLarge, style = MaterialTheme.typography.labelLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Text( Text(
text = content, text = content,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurface,
softWrap = true softWrap = true
) )
} }
@@ -801,9 +704,8 @@ private fun InfoCard(
) )
if (!isSimpleMode) { if (!isSimpleMode) {
if (lkmMode != true) {
// 根据showKpmInfo决定是否显示KPM信息 // 根据showKpmInfo决定是否显示KPM信息
if (showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) { if (lkmMode != true && !showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
val displayVersion = if (systemInfo.kpmVersion.isEmpty() || systemInfo.kpmVersion.startsWith("Error")) { val displayVersion = if (systemInfo.kpmVersion.isEmpty() || systemInfo.kpmVersion.startsWith("Error")) {
val statusText = if (Natives.isKPMEnabled()) { val statusText = if (Natives.isKPMEnabled()) {
stringResource(R.string.kernel_patched) stringResource(R.string.kernel_patched)
@@ -822,7 +724,6 @@ private fun InfoCard(
) )
} }
} }
}
if ((!isSimpleMode) && (!isHideSusfsStatus)) { if ((!isSimpleMode) && (!isHideSusfsStatus)) {
if (systemInfo.suSFSStatus == "Supported") { if (systemInfo.suSFSStatus == "Supported") {
@@ -913,12 +814,3 @@ private fun WarningCardPreview() {
onClick = {}) onClick = {})
} }
} }
@SuppressLint("UnnecessaryComposedModifier")
fun Modifier.disableOverscroll(): Modifier = composed {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
this
} else {
this
}
}

View File

@@ -33,7 +33,6 @@ import androidx.compose.material.icons.filled.FileUpload
import androidx.compose.material3.AlertDialog import androidx.compose.material3.AlertDialog
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ButtonDefaults
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ElevatedCard import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@@ -60,6 +59,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -92,6 +92,8 @@ import com.sukisu.ultra.ui.util.isAbDevice
import com.sukisu.ultra.ui.util.isInitBoot import com.sukisu.ultra.ui.util.isInitBoot
import com.sukisu.ultra.ui.util.rootAvailable import com.sukisu.ultra.ui.util.rootAvailable
import com.sukisu.ultra.getKernelVersion import com.sukisu.ultra.getKernelVersion
import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.getCardElevation
/** /**
* @author ShirkNeko * @author ShirkNeko
@@ -191,21 +193,6 @@ fun InstallScreen(navigator: DestinationsNavigator) {
} }
} }
val selectLkmLauncher = rememberLauncherForActivityResult(
contract = ActivityResultContracts.StartActivityForResult()
) {
if (it.resultCode == Activity.RESULT_OK) {
it.data?.data?.let { uri ->
lkmSelection = LkmSelection.LkmUri(uri)
}
}
}
val onLkmUpload = {
selectLkmLauncher.launch(Intent(Intent.ACTION_GET_CONTENT).apply {
type = "application/octet-stream"
})
}
val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState()) val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
@@ -213,7 +200,6 @@ fun InstallScreen(navigator: DestinationsNavigator) {
topBar = { topBar = {
TopBar( TopBar(
onBack = { navigator.popBackStack() }, onBack = { navigator.popBackStack() },
onLkmUpload = onLkmUpload,
scrollBehavior = scrollBehavior scrollBehavior = scrollBehavior
) )
}, },
@@ -230,7 +216,6 @@ fun InstallScreen(navigator: DestinationsNavigator) {
) { ) {
SelectInstallMethod( SelectInstallMethod(
isGKI = isGKI, isGKI = isGKI,
isAbDevice = isAbDevice,
onSelected = { method -> onSelected = { method ->
if (method is InstallMethod.HorizonKernel && method.uri != null) { if (method is InstallMethod.HorizonKernel && method.uri != null) {
if (isAbDevice) { if (isAbDevice) {
@@ -253,7 +238,7 @@ fun InstallScreen(navigator: DestinationsNavigator) {
(lkmSelection as? LkmSelection.LkmUri)?.let { (lkmSelection as? LkmSelection.LkmUri)?.let {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant), colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 12.dp) .padding(bottom = 12.dp)
@@ -279,7 +264,7 @@ fun InstallScreen(navigator: DestinationsNavigator) {
if (method.slot != null) { if (method.slot != null) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant), colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 12.dp) .padding(bottom = 12.dp)
@@ -381,7 +366,6 @@ sealed class InstallMethod {
@Composable @Composable
private fun SelectInstallMethod( private fun SelectInstallMethod(
isGKI: Boolean = false, isGKI: Boolean = false,
isAbDevice: Boolean = false,
onSelected: (InstallMethod) -> Unit = {} onSelected: (InstallMethod) -> Unit = {}
) { ) {
val rootAvailable = rootAvailable() val rootAvailable = rootAvailable()
@@ -468,8 +452,8 @@ private fun SelectInstallMethod(
} }
} }
var LKMExpanded by remember { mutableStateOf(false) } var lkmExpanded by remember { mutableStateOf(false) }
var GKIExpanded by remember { mutableStateOf(false) } var gkiExpanded by remember { mutableStateOf(false) }
Column( Column(
modifier = Modifier.padding(horizontal = 16.dp) modifier = Modifier.padding(horizontal = 16.dp)
@@ -478,15 +462,15 @@ private fun SelectInstallMethod(
if (isGKI) { if (isGKI) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant), colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 12.dp) .padding(bottom = 16.dp)
.clip(MaterialTheme.shapes.large) .clip(MaterialTheme.shapes.large)
.shadow( ) {
elevation = cardElevation, MaterialTheme(
shape = MaterialTheme.shapes.large, colorScheme = MaterialTheme.colorScheme.copy(
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f) surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceVariant
) )
) { ) {
ListItem( ListItem(
@@ -504,12 +488,13 @@ private fun SelectInstallMethod(
) )
}, },
modifier = Modifier.clickable { modifier = Modifier.clickable {
LKMExpanded = !LKMExpanded lkmExpanded = !lkmExpanded
} }
) )
}
AnimatedVisibility( AnimatedVisibility(
visible = LKMExpanded, visible = lkmExpanded,
enter = fadeIn() + expandVertically(), enter = fadeIn() + expandVertically(),
exit = shrinkVertically() + fadeOut() exit = shrinkVertically() + fadeOut()
) { ) {
@@ -584,15 +569,15 @@ private fun SelectInstallMethod(
if (rootAvailable) { if (rootAvailable) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant), colors = getCardColors(MaterialTheme.colorScheme.surfaceVariant),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(bottom = 12.dp) .padding(bottom = 12.dp)
.clip(MaterialTheme.shapes.large) .clip(MaterialTheme.shapes.large)
.shadow( ) {
elevation = cardElevation, MaterialTheme(
shape = MaterialTheme.shapes.large, colorScheme = MaterialTheme.colorScheme.copy(
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f) surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else MaterialTheme.colorScheme.surfaceVariant
) )
) { ) {
ListItem( ListItem(
@@ -610,12 +595,13 @@ private fun SelectInstallMethod(
) )
}, },
modifier = Modifier.clickable { modifier = Modifier.clickable {
GKIExpanded = !GKIExpanded gkiExpanded = !gkiExpanded
} }
) )
}
AnimatedVisibility( AnimatedVisibility(
visible = GKIExpanded, visible = gkiExpanded,
enter = fadeIn() + expandVertically(), enter = fadeIn() + expandVertically(),
exit = shrinkVertically() + fadeOut() exit = shrinkVertically() + fadeOut()
) { ) {
@@ -702,7 +688,7 @@ fun rememberSelectKmiDialog(onSelected: (String?) -> Unit): DialogHandle {
} }
var selection by remember { mutableStateOf<String?>(null) } var selection by remember { mutableStateOf<String?>(null) }
val backgroundColor = MaterialTheme.colorScheme.surfaceContainerHighest val backgroundColor = MaterialTheme.colorScheme.surfaceContainerHigh
MaterialTheme( MaterialTheme(
colorScheme = MaterialTheme.colorScheme.copy( colorScheme = MaterialTheme.colorScheme.copy(
@@ -729,10 +715,14 @@ fun rememberSelectKmiDialog(onSelected: (String?) -> Unit): DialogHandle {
@Composable @Composable
private fun TopBar( private fun TopBar(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
onLkmUpload: () -> Unit = {},
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
) { ) {
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = cardAlpha val cardAlpha = cardAlpha
TopAppBar( TopAppBar(

View File

@@ -112,7 +112,6 @@ fun KpmScreen(
Text( Text(
text = kpmInstallMode, text = kpmInstallMode,
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onSurface
) )
}, },
text = { text = {
@@ -121,7 +120,6 @@ fun KpmScreen(
Text( Text(
text = stringResource(R.string.kpm_install_mode_description, it), text = stringResource(R.string.kpm_install_mode_description, it),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
@@ -146,9 +144,6 @@ fun KpmScreen(
} }
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary
)
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Download, imageVector = Icons.Filled.Download,
@@ -176,9 +171,6 @@ fun KpmScreen(
} }
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.secondary
)
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Inventory, imageVector = Icons.Filled.Inventory,
@@ -209,7 +201,6 @@ fun KpmScreen(
} }
} }
}, },
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
shape = MaterialTheme.shapes.extraLarge shape = MaterialTheme.shapes.extraLarge
) )
} }
@@ -309,10 +300,8 @@ fun KpmScreen(
text = { text = {
Text( Text(
text = stringResource(R.string.kpm_install), text = stringResource(R.string.kpm_install),
color = MaterialTheme.colorScheme.onPrimaryContainer
) )
}, },
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
expanded = true, expanded = true,
) )
}, },
@@ -321,9 +310,6 @@ fun KpmScreen(
Column(modifier = Modifier.padding(padding)) { Column(modifier = Modifier.padding(padding)) {
if (!isNoticeClosed) { if (!isNoticeClosed) {
Card( Card(
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.secondaryContainer
),
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.padding(16.dp) .padding(16.dp)
@@ -348,7 +334,6 @@ fun KpmScreen(
text = stringResource(R.string.kernel_module_notice), text = stringResource(R.string.kernel_module_notice),
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSecondaryContainer
) )
IconButton( IconButton(
@@ -357,9 +342,6 @@ fun KpmScreen(
sharedPreferences.edit { putBoolean("is_notice_closed", true) } sharedPreferences.edit { putBoolean("is_notice_closed", true) }
}, },
modifier = Modifier.size(24.dp), modifier = Modifier.size(24.dp),
colors = IconButtonDefaults.iconButtonColors(
contentColor = MaterialTheme.colorScheme.onSecondaryContainer
)
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Close, imageVector = Icons.Filled.Close,
@@ -391,7 +373,6 @@ fun KpmScreen(
stringResource(R.string.kpm_empty), stringResource(R.string.kpm_empty),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -585,7 +566,6 @@ private fun KpmModuleItem(
Text( Text(
text = stringResource(R.string.kpm_control), text = stringResource(R.string.kpm_control),
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onSurface
) )
}, },
text = { text = {
@@ -595,20 +575,14 @@ private fun KpmModuleItem(
label = { label = {
Text( Text(
text = stringResource(R.string.kpm_args), text = stringResource(R.string.kpm_args),
color = MaterialTheme.colorScheme.primary
) )
}, },
placeholder = { placeholder = {
Text( Text(
text = module.args, text = module.args,
color = MaterialTheme.colorScheme.onSurfaceVariant.copy(alpha = 0.6f)
) )
}, },
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
colors = OutlinedTextFieldDefaults.colors(
focusedBorderColor = MaterialTheme.colorScheme.primary,
unfocusedBorderColor = MaterialTheme.colorScheme.outline
)
) )
}, },
confirmButton = { confirmButton = {
@@ -627,7 +601,6 @@ private fun KpmModuleItem(
) { ) {
Text( Text(
text = stringResource(R.string.confirm), text = stringResource(R.string.confirm),
color = MaterialTheme.colorScheme.primary
) )
} }
}, },
@@ -635,26 +608,16 @@ private fun KpmModuleItem(
TextButton(onClick = { viewModel.hideInputDialog() }) { TextButton(onClick = { viewModel.hideInputDialog() }) {
Text( Text(
text = stringResource(R.string.cancel), text = stringResource(R.string.cancel),
color = MaterialTheme.colorScheme.primary
) )
} }
}, },
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
shape = MaterialTheme.shapes.extraLarge shape = MaterialTheme.shapes.extraLarge
) )
} }
Card( Card(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation()
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)
)
) { ) {
Column( Column(
modifier = Modifier.padding(20.dp) modifier = Modifier.padding(20.dp)
@@ -668,7 +631,6 @@ private fun KpmModuleItem(
Text( Text(
text = module.name, text = module.name,
style = MaterialTheme.typography.titleLarge, style = MaterialTheme.typography.titleLarge,
color = MaterialTheme.colorScheme.onSurface
) )
Spacer(modifier = Modifier.height(4.dp)) Spacer(modifier = Modifier.height(4.dp))
@@ -676,19 +638,16 @@ private fun KpmModuleItem(
Text( Text(
text = "${stringResource(R.string.kpm_version)}: ${module.version}", text = "${stringResource(R.string.kpm_version)}: ${module.version}",
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Text( Text(
text = "${stringResource(R.string.kpm_author)}: ${module.author}", text = "${stringResource(R.string.kpm_author)}: ${module.author}",
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Text( Text(
text = "${stringResource(R.string.kpm_args)}: ${module.args}", text = "${stringResource(R.string.kpm_args)}: ${module.args}",
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -698,7 +657,6 @@ private fun KpmModuleItem(
Text( Text(
text = module.description, text = module.description,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(modifier = Modifier.height(20.dp)) Spacer(modifier = Modifier.height(20.dp))
@@ -711,10 +669,6 @@ private fun KpmModuleItem(
onClick = { viewModel.showInputDialog(module.id) }, onClick = { viewModel.showInputDialog(module.id) },
enabled = module.hasAction, enabled = module.hasAction,
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary,
disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant
)
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Settings, imageVector = Icons.Filled.Settings,

View File

@@ -23,9 +23,7 @@ import androidx.compose.material3.pulltorefresh.PullToRefreshBox
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.rotate import androidx.compose.ui.draw.rotate
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.* import androidx.compose.ui.platform.*
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@@ -74,6 +72,7 @@ import com.dergoogler.mmrl.platform.Platform
import androidx.core.net.toUri import androidx.core.net.toUri
import com.dergoogler.mmrl.platform.model.ModuleConfig import com.dergoogler.mmrl.platform.model.ModuleConfig
import com.dergoogler.mmrl.platform.model.ModuleConfig.Companion.asModuleConfig import com.dergoogler.mmrl.platform.model.ModuleConfig.Companion.asModuleConfig
import com.sukisu.ultra.ui.theme.getCardElevation
/** /**
* @author ShirkNeko * @author ShirkNeko
@@ -230,10 +229,6 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
Checkbox( Checkbox(
checked = viewModel.sortActionFirst, checked = viewModel.sortActionFirst,
onCheckedChange = null, onCheckedChange = null,
colors = CheckboxDefaults.colors(
checkedColor = MaterialTheme.colorScheme.primary,
uncheckedColor = MaterialTheme.colorScheme.outline
)
) )
}, },
onClick = { onClick = {
@@ -255,10 +250,6 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
Checkbox( Checkbox(
checked = viewModel.sortEnabledFirst, checked = viewModel.sortEnabledFirst,
onCheckedChange = null, onCheckedChange = null,
colors = CheckboxDefaults.colors(
checkedColor = MaterialTheme.colorScheme.primary,
uncheckedColor = MaterialTheme.colorScheme.outline
)
) )
}, },
onClick = { onClick = {
@@ -276,7 +267,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
text = { Text(stringResource(R.string.backup_modules)) }, text = { Text(stringResource(R.string.backup_modules)) },
leadingIcon = { leadingIcon = {
Icon( Icon(
imageVector = Icons.Outlined.Download, imageVector = Icons.Outlined.Save,
contentDescription = stringResource(R.string.backup), contentDescription = stringResource(R.string.backup),
) )
}, },
@@ -289,7 +280,7 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
text = { Text(stringResource(R.string.restore_modules)) }, text = { Text(stringResource(R.string.restore_modules)) },
leadingIcon = { leadingIcon = {
Icon( Icon(
imageVector = Icons.Outlined.Refresh, imageVector = Icons.Outlined.RestoreFromTrash,
contentDescription = stringResource(R.string.restore), contentDescription = stringResource(R.string.restore),
) )
}, },
@@ -325,10 +316,8 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
text = { text = {
Text( Text(
text = moduleInstall, text = moduleInstall,
color = MaterialTheme.colorScheme.onPrimaryContainer
) )
}, },
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
expanded = true, expanded = true,
) )
} }
@@ -353,7 +342,6 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
Icon( Icon(
imageVector = Icons.Outlined.Warning, imageVector = Icons.Outlined.Warning,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.error,
modifier = Modifier modifier = Modifier
.size(64.dp) .size(64.dp)
.padding(bottom = 16.dp) .padding(bottom = 16.dp)
@@ -362,7 +350,6 @@ fun ModuleScreen(navigator: DestinationsNavigator) {
stringResource(R.string.module_magisk_conflict), stringResource(R.string.module_magisk_conflict),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -640,7 +627,6 @@ private fun ModuleList(
text = stringResource(R.string.module_empty), text = stringResource(R.string.module_empty),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -726,15 +712,7 @@ fun ModuleItem(
) { ) {
ElevatedCard( ElevatedCard(
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh),
elevation = CardDefaults.cardElevation(defaultElevation = cardElevation), elevation = getCardElevation(),
modifier = Modifier
.fillMaxWidth()
.clip(MaterialTheme.shapes.large)
.shadow(
elevation = cardElevation,
shape = MaterialTheme.shapes.large,
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)
)
) { ) {
val textDecoration = if (!module.remove) null else TextDecoration.LineThrough val textDecoration = if (!module.remove) null else TextDecoration.LineThrough
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
@@ -777,7 +755,6 @@ fun ModuleItem(
lineHeight = MaterialTheme.typography.bodySmall.lineHeight, lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.titleMedium.fontFamily, fontFamily = MaterialTheme.typography.titleMedium.fontFamily,
textDecoration = textDecoration, textDecoration = textDecoration,
color = MaterialTheme.colorScheme.onSurface
) )
Text( Text(
@@ -786,7 +763,6 @@ fun ModuleItem(
lineHeight = MaterialTheme.typography.bodySmall.lineHeight, lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily, fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration, textDecoration = textDecoration,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Text( Text(
@@ -795,7 +771,6 @@ fun ModuleItem(
lineHeight = MaterialTheme.typography.bodySmall.lineHeight, lineHeight = MaterialTheme.typography.bodySmall.lineHeight,
fontFamily = MaterialTheme.typography.bodySmall.fontFamily, fontFamily = MaterialTheme.typography.bodySmall.fontFamily,
textDecoration = textDecoration, textDecoration = textDecoration,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
@@ -810,14 +785,6 @@ fun ModuleItem(
checked = module.enabled, checked = module.enabled,
onCheckedChange = onCheckChanged, onCheckedChange = onCheckChanged,
interactionSource = if (!module.hasWebUi) interactionSource else null, interactionSource = if (!module.hasWebUi) interactionSource else null,
colors = SwitchDefaults.colors(
checkedThumbColor = MaterialTheme.colorScheme.onPrimary,
checkedTrackColor = MaterialTheme.colorScheme.primary,
checkedIconColor = MaterialTheme.colorScheme.primary,
uncheckedThumbColor = MaterialTheme.colorScheme.outline,
uncheckedTrackColor = MaterialTheme.colorScheme.surfaceVariant,
uncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant
)
) )
} }
} }
@@ -833,7 +800,6 @@ fun ModuleItem(
overflow = TextOverflow.Ellipsis, overflow = TextOverflow.Ellipsis,
maxLines = 4, maxLines = 4,
textDecoration = textDecoration, textDecoration = textDecoration,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(16.dp))
@@ -855,7 +821,6 @@ fun ModuleItem(
viewModel.markNeedRefresh() viewModel.markNeedRefresh()
}, },
contentPadding = ButtonDefaults.TextButtonContentPadding, contentPadding = ButtonDefaults.TextButtonContentPadding,
colors = ButtonDefaults.filledTonalButtonColors()
) { ) {
Icon( Icon(
modifier = Modifier.size(20.dp), modifier = Modifier.size(20.dp),
@@ -872,7 +837,6 @@ fun ModuleItem(
onClick = { onClick(module) }, onClick = { onClick(module) },
interactionSource = interactionSource, interactionSource = interactionSource,
contentPadding = ButtonDefaults.TextButtonContentPadding, contentPadding = ButtonDefaults.TextButtonContentPadding,
colors = ButtonDefaults.filledTonalButtonColors()
) { ) {
Icon( Icon(
@@ -892,7 +856,6 @@ fun ModuleItem(
onClick = { onUpdate(module) }, onClick = { onUpdate(module) },
shape = ButtonDefaults.textShape, shape = ButtonDefaults.textShape,
contentPadding = ButtonDefaults.TextButtonContentPadding, contentPadding = ButtonDefaults.TextButtonContentPadding,
colors = ButtonDefaults.filledTonalButtonColors()
) { ) {
Icon( Icon(
modifier = Modifier.size(20.dp), modifier = Modifier.size(20.dp),
@@ -906,8 +869,6 @@ fun ModuleItem(
modifier = Modifier.defaultMinSize(minWidth = 52.dp, minHeight = 32.dp), modifier = Modifier.defaultMinSize(minWidth = 52.dp, minHeight = 32.dp),
onClick = { onUninstallClicked(module) }, onClick = { onUninstallClicked(module) },
contentPadding = ButtonDefaults.TextButtonContentPadding, contentPadding = ButtonDefaults.TextButtonContentPadding,
colors = ButtonDefaults.filledTonalButtonColors(
containerColor = if (!module.remove) MaterialTheme.colorScheme.secondaryContainer else MaterialTheme.colorScheme.errorContainer)
) { ) {
if (!module.remove) { if (!module.remove) {
Icon( Icon(

View File

@@ -12,9 +12,7 @@ import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.animation.shrinkVertically import androidx.compose.animation.shrinkVertically
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
@@ -55,7 +53,6 @@ import kotlinx.coroutines.withContext
import com.sukisu.ultra.BuildConfig import com.sukisu.ultra.BuildConfig
import com.sukisu.ultra.Natives import com.sukisu.ultra.Natives
import com.sukisu.ultra.R import com.sukisu.ultra.R
import com.sukisu.ultra.*
import com.sukisu.ultra.ui.component.* import com.sukisu.ultra.ui.component.*
import com.sukisu.ultra.ui.theme.* import com.sukisu.ultra.ui.theme.*
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
@@ -69,6 +66,10 @@ import com.sukisu.ultra.ui.component.KsuIsValid
* @author ShirkNeko * @author ShirkNeko
* @date 2025/5/31. * @date 2025/5/31.
*/ */
private val SPACING_SMALL = 3.dp
private val SPACING_MEDIUM = 8.dp
private val SPACING_LARGE = 16.dp
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Destination<RootGraph> @Destination<RootGraph>
@Composable @Composable
@@ -84,10 +85,9 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
Scaffold( Scaffold(
// containerColor = MaterialTheme.colorScheme.surfaceBright,
topBar = { topBar = {
TopBar( TopBar(scrollBehavior = scrollBehavior)
scrollBehavior = scrollBehavior
)
}, },
snackbarHost = { SnackbarHost(snackBarHost) }, snackbarHost = { SnackbarHost(snackBarHost) },
contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal) contentWindowInsets = WindowInsets.safeDrawing.only(WindowInsetsSides.Top + WindowInsetsSides.Horizontal)
@@ -121,31 +121,16 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
// 配置 // 配置卡片
Card( SettingsGroupCard(
modifier = Modifier title = stringResource(R.string.configuration),
.fillMaxWidth() content = {
.padding(horizontal = 16.dp, vertical = 8.dp),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh.copy(alpha = cardAlpha)
),
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
) {
Column(modifier = Modifier.padding(vertical = 8.dp)) {
Text(
text = stringResource(R.string.configuration),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
)
// 配置文件模板入口 // 配置文件模板入口
val profileTemplate = stringResource(id = R.string.settings_profile_template)
KsuIsValid { KsuIsValid {
SettingItem( SettingItem(
icon = Icons.Filled.Fence, icon = Icons.Filled.Fence,
title = profileTemplate, title = stringResource(R.string.settings_profile_template),
summary = stringResource(id = R.string.settings_profile_template_summary), summary = stringResource(R.string.settings_profile_template_summary),
onClick = { onClick = {
navigator.navigate(AppProfileTemplateScreenDestination) navigator.navigate(AppProfileTemplateScreenDestination)
} }
@@ -160,17 +145,18 @@ fun SettingScreen(navigator: DestinationsNavigator) {
KsuIsValid { KsuIsValid {
SwitchItem( SwitchItem(
icon = Icons.Filled.FolderDelete, icon = Icons.Filled.FolderDelete,
title = stringResource(id = R.string.settings_umount_modules_default), title = stringResource(R.string.settings_umount_modules_default),
summary = stringResource(id = R.string.settings_umount_modules_default_summary), summary = stringResource(R.string.settings_umount_modules_default_summary),
checked = umountChecked checked = umountChecked,
) { enabled -> onCheckedChange = { enabled ->
if (Natives.setDefaultUmountModules(enabled)) { if (Natives.setDefaultUmountModules(enabled)) {
umountChecked = enabled umountChecked = enabled
} }
} }
)
} }
// SU 禁用开关(仅在兼容版本显示) // SU 禁用开关
KsuIsValid { KsuIsValid {
if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) { if (Natives.version >= Natives.MINIMAL_SUPPORTED_SU_COMPAT) {
var isSuDisabled by rememberSaveable { var isSuDisabled by rememberSaveable {
@@ -178,138 +164,70 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
SwitchItem( SwitchItem(
icon = Icons.Filled.RemoveModerator, icon = Icons.Filled.RemoveModerator,
title = stringResource(id = R.string.settings_disable_su), title = stringResource(R.string.settings_disable_su),
summary = stringResource(id = R.string.settings_disable_su_summary), summary = stringResource(R.string.settings_disable_su_summary),
checked = isSuDisabled checked = isSuDisabled,
) { enabled -> onCheckedChange = { enabled ->
val shouldEnable = !enabled val shouldEnable = !enabled
if (Natives.setSuEnabled(shouldEnable)) { if (Natives.setSuEnabled(shouldEnable)) {
isSuDisabled = enabled isSuDisabled = enabled
} }
} }
)
} }
} }
} }
}
// 应用设置
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh.copy(alpha = cardAlpha)
),
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
) {
Column(modifier = Modifier.padding(vertical = 8.dp)) {
Text(
text = stringResource(R.string.app_settings),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
) )
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE) // 应用设置卡片
SettingsGroupCard(
title = stringResource(R.string.app_settings),
content = {
// 更新检查开关 // 更新检查开关
var checkUpdate by rememberSaveable { var checkUpdate by rememberSaveable {
mutableStateOf( mutableStateOf(prefs.getBoolean("check_update", true))
prefs.getBoolean("check_update", true)
)
} }
SwitchItem( SwitchItem(
icon = Icons.Filled.Update, icon = Icons.Filled.Update,
title = stringResource(id = R.string.settings_check_update), title = stringResource(R.string.settings_check_update),
summary = stringResource(id = R.string.settings_check_update_summary), summary = stringResource(R.string.settings_check_update_summary),
checked = checkUpdate checked = checkUpdate,
) { enabled -> onCheckedChange = { enabled ->
prefs.edit { putBoolean("check_update", enabled) } prefs.edit { putBoolean("check_update", enabled) }
checkUpdate = enabled checkUpdate = enabled
} }
)
// WebUI引擎选择 // WebUI引擎选择
KsuIsValid { KsuIsValid {
val engineOptions = listOf( WebUIEngineSelector(
"default" to stringResource(id = R.string.engine_auto_select), selectedEngine = selectedEngine,
"wx" to stringResource(id = R.string.engine_force_webuix), onEngineSelected = { engine ->
"ksu" to stringResource(id = R.string.engine_force_ksu) selectedEngine = engine
) prefs.edit { putString("webui_engine", engine) }
var showEngineDialog by remember { mutableStateOf(false) }
SettingItem(
icon = Icons.Filled.WebAsset,
title = stringResource(id = R.string.use_webuix),
summary = engineOptions.find { it.first == selectedEngine }?.second
?: stringResource(id = R.string.engine_auto_select),
onClick = {
showEngineDialog = true
} }
) )
if (showEngineDialog) {
AlertDialog(
onDismissRequest = { showEngineDialog = false },
title = { Text(stringResource(id = R.string.use_webuix)) },
text = {
Column {
engineOptions.forEach { (value, label) ->
Row(
modifier = Modifier
.fillMaxWidth()
.clickable {
selectedEngine = value
prefs.edit {
putString("webui_engine", value)
}
showEngineDialog = false
}
.padding(vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = selectedEngine == value,
onClick = null
)
Spacer(modifier = Modifier.width(8.dp))
Text(text = label)
}
}
}
},
confirmButton = {
TextButton(
onClick = { showEngineDialog = false }
) {
Text(stringResource(id = R.string.cancel))
}
}
)
}
} }
// Web调试和Web X Eruda 开关 // Web调试和Web X Eruda 开关
var enableWebDebugging by rememberSaveable { var enableWebDebugging by rememberSaveable {
mutableStateOf( mutableStateOf(prefs.getBoolean("enable_web_debugging", false))
prefs.getBoolean("enable_web_debugging", false)
)
} }
var useWebUIXEruda by rememberSaveable { var useWebUIXEruda by rememberSaveable {
mutableStateOf( mutableStateOf(prefs.getBoolean("use_webuix_eruda", false))
prefs.getBoolean("use_webuix_eruda", false)
)
} }
KsuIsValid { KsuIsValid {
SwitchItem( SwitchItem(
icon = Icons.Filled.DeveloperMode, icon = Icons.Filled.DeveloperMode,
title = stringResource(id = R.string.enable_web_debugging), title = stringResource(R.string.enable_web_debugging),
summary = stringResource(id = R.string.enable_web_debugging_summary), summary = stringResource(R.string.enable_web_debugging_summary),
checked = enableWebDebugging checked = enableWebDebugging,
) { enabled -> onCheckedChange = { enabled ->
prefs.edit { putBoolean("enable_web_debugging", enabled) } prefs.edit { putBoolean("enable_web_debugging", enabled) }
enableWebDebugging = enabled enableWebDebugging = enabled
} }
)
AnimatedVisibility( AnimatedVisibility(
visible = enableWebDebugging && selectedEngine == "wx", visible = enableWebDebugging && selectedEngine == "wx",
@@ -318,82 +236,53 @@ fun SettingScreen(navigator: DestinationsNavigator) {
) { ) {
SwitchItem( SwitchItem(
icon = Icons.Filled.FormatListNumbered, icon = Icons.Filled.FormatListNumbered,
title = stringResource(id = R.string.use_webuix_eruda), title = stringResource(R.string.use_webuix_eruda),
summary = stringResource(id = R.string.use_webuix_eruda_summary), summary = stringResource(R.string.use_webuix_eruda_summary),
checked = useWebUIXEruda checked = useWebUIXEruda,
) { enabled -> onCheckedChange = { enabled ->
prefs.edit { putBoolean("use_webuix_eruda", enabled) } prefs.edit { putBoolean("use_webuix_eruda", enabled) }
useWebUIXEruda = enabled useWebUIXEruda = enabled
} }
)
} }
} }
// 更多设置 // 更多设置
SettingItem( SettingItem(
icon = Icons.Filled.Settings, icon = Icons.Filled.Settings,
title = stringResource(id = R.string.more_settings), title = stringResource(R.string.more_settings),
summary = stringResource(id = R.string.more_settings), summary = stringResource(R.string.more_settings),
onClick = { onClick = {
navigator.navigate(MoreSettingsScreenDestination) navigator.navigate(MoreSettingsScreenDestination)
} }
) )
} }
}
// 工具
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh.copy(alpha = cardAlpha)
),
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
) {
Column(modifier = Modifier.padding(vertical = 8.dp)) {
Text(
text = stringResource(R.string.tools),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
) )
// 工具卡片
SettingsGroupCard(
title = stringResource(R.string.tools),
content = {
var showBottomsheet by remember { mutableStateOf(false) } var showBottomsheet by remember { mutableStateOf(false) }
SettingItem( SettingItem(
icon = Icons.Filled.BugReport, icon = Icons.Filled.BugReport,
title = stringResource(id = R.string.send_log), title = stringResource(R.string.send_log),
onClick = { onClick = {
showBottomsheet = true showBottomsheet = true
} }
) )
if (showBottomsheet) { if (showBottomsheet) {
ModalBottomSheet( LogBottomSheet(
onDismissRequest = { showBottomsheet = false }, onDismiss = { showBottomsheet = false },
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh, onSaveLog = {
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(16.dp),
horizontalArrangement = Arrangement.SpaceEvenly
) {
LogActionButton(
icon = Icons.Filled.Save,
text = stringResource(R.string.save_log),
onClick = {
val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm") val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH_mm")
val current = LocalDateTime.now().format(formatter) val current = LocalDateTime.now().format(formatter)
exportBugreportLauncher.launch("KernelSU_bugreport_${current}.tar.gz") exportBugreportLauncher.launch("KernelSU_bugreport_${current}.tar.gz")
showBottomsheet = false showBottomsheet = false
} },
) onShareLog = {
LogActionButton(
icon = Icons.Filled.Share,
text = stringResource(R.string.send_log),
onClick = {
scope.launch { scope.launch {
val bugreport = loadingDialog.withLoading { val bugreport = loadingDialog.withLoading {
withContext(Dispatchers.IO) { withContext(Dispatchers.IO) {
@@ -401,8 +290,7 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
val uri: Uri = val uri = FileProvider.getUriForFile(
FileProvider.getUriForFile(
context, context,
"${BuildConfig.APPLICATION_ID}.fileprovider", "${BuildConfig.APPLICATION_ID}.fileprovider",
bugreport bugreport
@@ -426,9 +314,6 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
) )
} }
Spacer(modifier = Modifier.height(16.dp))
}
}
val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode val lkmMode = Natives.version >= Natives.MINIMAL_SUPPORTED_KERNEL_LKM && Natives.isLkmMode
if (lkmMode) { if (lkmMode) {
@@ -437,26 +322,12 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
} }
} }
}
// 关于
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 16.dp, vertical = 8.dp),
colors = CardDefaults.cardColors(
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh.copy(alpha = cardAlpha)
),
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp)
) {
Column(modifier = Modifier.padding(vertical = 8.dp)) {
Text(
text = stringResource(R.string.about),
style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.primary,
modifier = Modifier.padding(horizontal = 16.dp, vertical = 8.dp)
) )
// 关于卡片
SettingsGroupCard(
title = stringResource(R.string.about),
content = {
SettingItem( SettingItem(
icon = Icons.Filled.Info, icon = Icons.Filled.Info,
title = stringResource(R.string.about), title = stringResource(R.string.about),
@@ -465,13 +336,128 @@ fun SettingScreen(navigator: DestinationsNavigator) {
} }
) )
} }
} )
Spacer(modifier = Modifier.height(16.dp)) Spacer(modifier = Modifier.height(SPACING_LARGE))
} }
} }
} }
@Composable
private fun SettingsGroupCard(
title: String,
content: @Composable ColumnScope.() -> Unit
) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(horizontal = SPACING_LARGE, vertical = SPACING_MEDIUM),
colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerLow),
elevation = getCardElevation()
) {
Column(
modifier = Modifier.padding(vertical = SPACING_MEDIUM)
) {
Text(
text = title,
style = MaterialTheme.typography.titleMedium,
modifier = Modifier.padding(horizontal = SPACING_LARGE, vertical = SPACING_MEDIUM),
color = MaterialTheme.colorScheme.primary
)
content()
}
}
}
@Composable
private fun WebUIEngineSelector(
selectedEngine: String,
onEngineSelected: (String) -> Unit
) {
var showDialog by remember { mutableStateOf(false) }
val engineOptions = listOf(
"default" to stringResource(R.string.engine_auto_select),
"wx" to stringResource(R.string.engine_force_webuix),
"ksu" to stringResource(R.string.engine_force_ksu)
)
SettingItem(
icon = Icons.Filled.WebAsset,
title = stringResource(R.string.use_webuix),
summary = engineOptions.find { it.first == selectedEngine }?.second
?: stringResource(R.string.engine_auto_select),
onClick = { showDialog = true }
)
if (showDialog) {
AlertDialog(
onDismissRequest = { showDialog = false },
title = { Text(stringResource(R.string.use_webuix)) },
text = {
Column {
engineOptions.forEach { (value, label) ->
Row(
modifier = Modifier
.fillMaxWidth()
.clickable {
onEngineSelected(value)
showDialog = false
}
.padding(vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically
) {
RadioButton(
selected = selectedEngine == value,
onClick = null
)
Spacer(modifier = Modifier.width(SPACING_MEDIUM))
Text(text = label)
}
}
}
},
confirmButton = {
TextButton(onClick = { showDialog = false }) {
Text(stringResource(R.string.cancel))
}
}
)
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
private fun LogBottomSheet(
onDismiss: () -> Unit,
onSaveLog: () -> Unit,
onShareLog: () -> Unit
) {
ModalBottomSheet(
onDismissRequest = onDismiss,
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
) {
Row(
modifier = Modifier
.fillMaxWidth()
.padding(SPACING_LARGE),
horizontalArrangement = Arrangement.SpaceEvenly
) {
LogActionButton(
icon = Icons.Filled.Save,
text = stringResource(R.string.save_log),
onClick = onSaveLog
)
LogActionButton(
icon = Icons.Filled.Share,
text = stringResource(R.string.send_log),
onClick = onShareLog
)
}
Spacer(modifier = Modifier.height(SPACING_LARGE))
}
}
@Composable @Composable
fun LogActionButton( fun LogActionButton(
icon: ImageVector, icon: ImageVector,
@@ -482,7 +468,7 @@ fun LogActionButton(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier modifier = Modifier
.clickable(onClick = onClick) .clickable(onClick = onClick)
.padding(8.dp) .padding(SPACING_MEDIUM)
) { ) {
Box( Box(
contentAlignment = Alignment.Center, contentAlignment = Alignment.Center,
@@ -498,11 +484,10 @@ fun LogActionButton(
modifier = Modifier.size(24.dp) modifier = Modifier.size(24.dp)
) )
} }
Spacer(modifier = Modifier.height(8.dp)) Spacer(modifier = Modifier.height(SPACING_MEDIUM))
Text( Text(
text = text, text = text,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium
color = MaterialTheme.colorScheme.onSurface
) )
} }
} }
@@ -518,29 +503,28 @@ fun SettingItem(
modifier = Modifier modifier = Modifier
.fillMaxWidth() .fillMaxWidth()
.clickable(onClick = onClick) .clickable(onClick = onClick)
.padding(horizontal = 16.dp, vertical = 12.dp), .padding(horizontal = SPACING_LARGE, vertical = 12.dp),
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.Top
) { ) {
Icon( Icon(
imageVector = icon, imageVector = icon,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.primary, tint = MaterialTheme.colorScheme.primary,
modifier = Modifier modifier = Modifier
.padding(end = 16.dp) .padding(end = SPACING_LARGE)
.size(24.dp) .size(24.dp)
) )
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Text( Text(
text = title, text = title,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium
color = MaterialTheme.colorScheme.onSurface
) )
if (summary != null) { if (summary != null) {
Spacer(modifier = Modifier.height(SPACING_SMALL))
Text( Text(
text = summary, text = summary,
style = MaterialTheme.typography.bodyMedium, style = MaterialTheme.typography.bodyMedium
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -553,6 +537,50 @@ fun SettingItem(
} }
} }
@Composable
fun SwitchItem(
icon: ImageVector,
title: String,
summary: String? = null,
checked: Boolean,
onCheckedChange: (Boolean) -> Unit
) {
Row(
modifier = Modifier
.fillMaxWidth()
.clickable { onCheckedChange(!checked) }
.padding(horizontal = SPACING_LARGE, vertical = 12.dp),
verticalAlignment = Alignment.Top
) {
Icon(
imageVector = icon,
contentDescription = null,
tint = if (checked) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurfaceVariant,
modifier = Modifier
.padding(end = SPACING_LARGE)
.size(24.dp)
)
Column(modifier = Modifier.weight(1f)) {
Text(
text = title,
style = MaterialTheme.typography.titleMedium
)
if (summary != null) {
Spacer(modifier = Modifier.height(SPACING_SMALL))
Text(
text = summary,
style = MaterialTheme.typography.bodyMedium
)
}
}
Switch(
checked = checked,
onCheckedChange = onCheckedChange
)
}
}
@Composable @Composable
fun UninstallItem( fun UninstallItem(
navigator: DestinationsNavigator, navigator: DestinationsNavigator,
@@ -642,7 +670,6 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
Text( Text(
text = stringResource(R.string.settings_uninstall), text = stringResource(R.string.settings_uninstall),
style = MaterialTheme.typography.headlineSmall, style = MaterialTheme.typography.headlineSmall,
color = MaterialTheme.colorScheme.onSurface
) )
}, },
text = { text = {
@@ -656,10 +683,6 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
MaterialTheme.colorScheme.primaryContainer MaterialTheme.colorScheme.primaryContainer
else else
Color.Transparent Color.Transparent
val borderColor = if (isSelected)
MaterialTheme.colorScheme.primary
else
Color.Transparent
val contentColor = if (isSelected) val contentColor = if (isSelected)
MaterialTheme.colorScheme.onPrimaryContainer MaterialTheme.colorScheme.onPrimaryContainer
else else
@@ -670,11 +693,6 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
.fillMaxWidth() .fillMaxWidth()
.clip(MaterialTheme.shapes.medium) .clip(MaterialTheme.shapes.medium)
.background(backgroundColor) .background(backgroundColor)
.border(
width = 1.dp,
color = borderColor,
shape = MaterialTheme.shapes.medium
)
.clickable { .clickable {
selectedOption = option selectedOption = option
} }
@@ -684,10 +702,7 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
Icon( Icon(
imageVector = option.icon, imageVector = option.icon,
contentDescription = null, contentDescription = null,
tint = if (isSelected) tint = MaterialTheme.colorScheme.primary,
MaterialTheme.colorScheme.primary
else
MaterialTheme.colorScheme.primary,
modifier = Modifier modifier = Modifier
.padding(end = 16.dp) .padding(end = 16.dp)
.size(24.dp) .size(24.dp)
@@ -698,7 +713,6 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
Text( Text(
text = listOptions[index].titleText, text = listOptions[index].titleText,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = contentColor
) )
listOptions[index].subtitleText?.let { listOptions[index].subtitleText?.let {
Text( Text(
@@ -737,12 +751,6 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
dismiss() dismiss()
}, },
enabled = selectedOption != null, enabled = selectedOption != null,
colors = ButtonDefaults.buttonColors(
containerColor = MaterialTheme.colorScheme.primary,
contentColor = MaterialTheme.colorScheme.onPrimary,
disabledContainerColor = MaterialTheme.colorScheme.surfaceVariant,
disabledContentColor = MaterialTheme.colorScheme.onSurfaceVariant
)
) { ) {
Text( Text(
text = stringResource(android.R.string.ok) text = stringResource(android.R.string.ok)
@@ -757,11 +765,9 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
) { ) {
Text( Text(
text = stringResource(android.R.string.cancel), text = stringResource(android.R.string.cancel),
color = MaterialTheme.colorScheme.primary
) )
} }
}, },
containerColor = MaterialTheme.colorScheme.secondaryContainer,
shape = MaterialTheme.shapes.extraLarge, shape = MaterialTheme.shapes.extraLarge,
tonalElevation = 4.dp tonalElevation = 4.dp
) )
@@ -773,14 +779,12 @@ fun rememberUninstallDialog(onSelected: (UninstallType) -> Unit): DialogHandle {
private fun TopBar( private fun TopBar(
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
) { ) {
val systemIsDark = isSystemInDarkTheme() val colorScheme = MaterialTheme.colorScheme
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
val cardAlpha = if (ThemeConfig.customBackgroundUri != null) { colorScheme.surfaceContainerLow
cardAlpha
} else { } else {
if (systemIsDark) 0.8f else 1f colorScheme.background
} }
TopAppBar( TopAppBar(
title = { title = {
Text( Text(

View File

@@ -3,7 +3,6 @@ package com.sukisu.ultra.ui.screen
import androidx.compose.animation.* import androidx.compose.animation.*
import androidx.compose.animation.core.* import androidx.compose.animation.core.*
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.border
import androidx.compose.foundation.gestures.detectTapGestures import androidx.compose.foundation.gestures.detectTapGestures
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.interaction.collectIsPressedAsState import androidx.compose.foundation.interaction.collectIsPressedAsState
@@ -22,14 +21,12 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
import androidx.compose.ui.draw.shadow
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
@@ -44,11 +41,12 @@ import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import com.sukisu.ultra.Natives import com.sukisu.ultra.Natives
import com.sukisu.ultra.ui.component.SearchAppBar import com.sukisu.ultra.ui.component.SearchAppBar
import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.util.ModuleModify import com.sukisu.ultra.ui.util.ModuleModify
import com.sukisu.ultra.ui.viewmodel.SuperUserViewModel import com.sukisu.ultra.ui.viewmodel.SuperUserViewModel
import com.dergoogler.mmrl.ui.component.LabelItem import com.dergoogler.mmrl.ui.component.LabelItem
import com.dergoogler.mmrl.ui.component.LabelItemDefaults import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.getCardColors
import com.sukisu.ultra.ui.theme.getCardElevation
/** /**
* @author ShirkNeko * @author ShirkNeko
@@ -137,7 +135,7 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
) )
}, },
onClick = { onClick = {
viewModel.showSystemApps = !viewModel.showSystemApps viewModel.updateShowSystemApps(!viewModel.showSystemApps)
showDropdown = false showDropdown = false
} }
) )
@@ -195,11 +193,10 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
viewModel.showBatchActions = false viewModel.showBatchActions = false
}, },
modifier = Modifier.size(if (isCancelPressed) 56.dp else 40.dp), modifier = Modifier.size(if (isCancelPressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.surfaceContainerHigh,
contentColor = MaterialTheme.colorScheme.onSurfaceVariant,
shape = CircleShape, shape = CircleShape,
interactionSource = cancelInteractionSource, interactionSource = cancelInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp),
containerColor = Color.Gray
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -235,11 +232,10 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isUnauthorizePressed) 56.dp else 40.dp), modifier = Modifier.size(if (isUnauthorizePressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.errorContainer,
contentColor = MaterialTheme.colorScheme.onErrorContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = unauthorizeInteractionSource, interactionSource = unauthorizeInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp),
containerColor = MaterialTheme.colorScheme.error
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -275,8 +271,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isAuthorizePressed) 56.dp else 40.dp), modifier = Modifier.size(if (isAuthorizePressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.primaryContainer,
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = authorizeInteractionSource, interactionSource = authorizeInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp)
@@ -325,8 +319,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isUmountEnablePressed) 56.dp else 40.dp), modifier = Modifier.size(if (isUmountEnablePressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.tertiaryContainer,
contentColor = MaterialTheme.colorScheme.onTertiaryContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = umountEnableInteractionSource, interactionSource = umountEnableInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp)
@@ -368,11 +360,10 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isUmountDisablePressed) 56.dp else 40.dp), modifier = Modifier.size(if (isUmountDisablePressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.tertiaryContainer,
contentColor = MaterialTheme.colorScheme.onTertiaryContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = umountDisableInteractionSource, interactionSource = umountDisableInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp),
containerColor = MaterialTheme.colorScheme.error
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
@@ -411,8 +402,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isTopBtnPressed) 56.dp else 40.dp), modifier = Modifier.size(if (isTopBtnPressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.primaryContainer.copy(alpha = 1f),
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = topBtnInteractionSource, interactionSource = topBtnInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp)
@@ -454,8 +443,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
}, },
modifier = Modifier.size(if (isBottomBtnPressed) 56.dp else 40.dp), modifier = Modifier.size(if (isBottomBtnPressed) 56.dp else 40.dp),
containerColor = MaterialTheme.colorScheme.primaryContainer.copy(alpha = 1f),
contentColor = MaterialTheme.colorScheme.onPrimaryContainer,
shape = CircleShape, shape = CircleShape,
interactionSource = bottomBtnInteractionSource, interactionSource = bottomBtnInteractionSource,
elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp) elevation = FloatingActionButtonDefaults.elevation(4.dp, 6.dp)
@@ -498,9 +485,12 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
.fillMaxSize() .fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection), .nestedScroll(scrollBehavior.nestedScrollConnection),
contentPadding = PaddingValues( contentPadding = PaddingValues(
top = 8.dp, start = 16.dp,
end = 16.dp,
top = 16.dp,
bottom = 16.dp bottom = 16.dp
) ),
verticalArrangement = Arrangement.spacedBy(16.dp)
) { ) {
// 获取分组后的应用列表 // 获取分组后的应用列表
val rootApps = viewModel.appList.filter { it.allowSu } val rootApps = viewModel.appList.filter { it.allowSu }
@@ -509,10 +499,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
// 显示ROOT权限应用组 // 显示ROOT权限应用组
if (rootApps.isNotEmpty()) { if (rootApps.isNotEmpty()) {
item {
GroupHeader(title = stringResource(R.string.apps_with_root))
}
items(rootApps, key = { "root_" + it.packageName + it.uid }) { app -> items(rootApps, key = { "root_" + it.packageName + it.uid }) { app ->
AppItem( AppItem(
app = app, app = app,
@@ -548,10 +534,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
// 显示自定义配置应用组 // 显示自定义配置应用组
if (customApps.isNotEmpty()) { if (customApps.isNotEmpty()) {
item {
GroupHeader(title = stringResource(R.string.apps_with_custom_profile))
}
items(customApps, key = { "custom_" + it.packageName + it.uid }) { app -> items(customApps, key = { "custom_" + it.packageName + it.uid }) { app ->
AppItem( AppItem(
app = app, app = app,
@@ -587,10 +569,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
// 显示其他应用组 // 显示其他应用组
if (otherApps.isNotEmpty()) { if (otherApps.isNotEmpty()) {
item {
GroupHeader(title = stringResource(R.string.other_apps))
}
items(otherApps, key = { "other_" + it.packageName + it.uid }) { app -> items(otherApps, key = { "other_" + it.packageName + it.uid }) { app ->
AppItem( AppItem(
app = app, app = app,
@@ -638,7 +616,7 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
verticalArrangement = Arrangement.Center verticalArrangement = Arrangement.Center
) { ) {
Icon( Icon(
imageVector = Icons.Filled.Apps, imageVector = Icons.Filled.Archive,
contentDescription = null, contentDescription = null,
tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.6f), tint = MaterialTheme.colorScheme.primary.copy(alpha = 0.6f),
modifier = Modifier modifier = Modifier
@@ -649,7 +627,6 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
text = stringResource(R.string.no_apps_found), text = stringResource(R.string.no_apps_found),
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = MaterialTheme.typography.bodyLarge, style = MaterialTheme.typography.bodyLarge,
color = MaterialTheme.colorScheme.onSurfaceVariant
) )
} }
} }
@@ -660,26 +637,7 @@ fun SuperUserScreen(navigator: DestinationsNavigator) {
} }
} }
@Composable @OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class)
fun GroupHeader(title: String) {
Box(
modifier = Modifier
.fillMaxWidth()
.background(MaterialTheme.colorScheme.surfaceContainerHighest.copy(alpha = 0.7f))
.padding(horizontal = 16.dp, vertical = 8.dp)
) {
Text(
text = title,
style = TextStyle(
fontSize = 14.sp,
fontWeight = FontWeight.Bold,
color = MaterialTheme.colorScheme.primary
)
)
}
}
@OptIn(ExperimentalLayoutApi::class)
@Composable @Composable
private fun AppItem( private fun AppItem(
app: SuperUserViewModel.AppInfo, app: SuperUserViewModel.AppInfo,
@@ -690,37 +648,10 @@ private fun AppItem(
onLongClick: () -> Unit, onLongClick: () -> Unit,
viewModel: SuperUserViewModel viewModel: SuperUserViewModel
) { ) {
val cardAlpha = CardConfig.cardAlpha
val cardColor = if (app.allowSu)
MaterialTheme.colorScheme.surfaceVariant.copy(alpha = cardAlpha)
else if (app.hasCustomProfile)
MaterialTheme.colorScheme.secondaryContainer.copy(alpha = cardAlpha)
else
MaterialTheme.colorScheme.tertiaryContainer.copy(alpha = cardAlpha)
Card( Card(
colors = CardDefaults.cardColors(containerColor = cardColor), colors = getCardColors(MaterialTheme.colorScheme.surfaceContainerHigh),
elevation = CardDefaults.cardElevation(defaultElevation = 0.dp), elevation = getCardElevation(),
modifier = Modifier modifier = Modifier
.fillMaxWidth()
.padding(horizontal = 8.dp, vertical = 4.dp)
.clip(MaterialTheme.shapes.medium)
.shadow(
elevation = 0.dp,
shape = MaterialTheme.shapes.medium,
spotColor = MaterialTheme.colorScheme.primary.copy(alpha = 0.1f)
)
.then(
if (isSelected)
Modifier.border(
width = 2.dp,
color = MaterialTheme.colorScheme.primary,
shape = MaterialTheme.shapes.medium
)
else
Modifier
)
.pointerInput(Unit) { .pointerInput(Unit) {
detectTapGestures( detectTapGestures(
onLongPress = { onLongClick() }, onLongPress = { onLongClick() },
@@ -754,17 +685,13 @@ private fun AppItem(
Text( Text(
text = app.label, text = app.label,
style = MaterialTheme.typography.titleMedium, style = MaterialTheme.typography.titleMedium,
color = MaterialTheme.colorScheme.onSurface,
maxLines = 1, maxLines = 1,
overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis
) )
Text( Text(
text = app.packageName, text = app.packageName,
style = MaterialTheme.typography.bodySmall, style = MaterialTheme.typography.bodySmall,
color = MaterialTheme.colorScheme.onSurfaceVariant,
maxLines = 1, maxLines = 1,
overflow = androidx.compose.ui.text.style.TextOverflow.Ellipsis
) )
FlowRow( FlowRow(
@@ -772,21 +699,13 @@ private fun AppItem(
horizontalArrangement = Arrangement.spacedBy(4.dp) horizontalArrangement = Arrangement.spacedBy(4.dp)
) { ) {
if (app.allowSu) { if (app.allowSu) {
LabelItem(text = "ROOT",) LabelItem(text = "ROOT")
} }
if (Natives.uidShouldUmount(app.uid)) { if (Natives.uidShouldUmount(app.uid)) {
LabelItem(text = "UNMOUNT", style = LabelItemDefaults.style.copy( LabelItem(text = "UNMOUNT")
containerColor = MaterialTheme.colorScheme.secondaryContainer,
contentColor = MaterialTheme.colorScheme.onSecondaryContainer
)
)
} }
if (app.hasCustomProfile) { if (app.hasCustomProfile) {
LabelItem(text = "CUSTOM", style = LabelItemDefaults.style.copy( LabelItem(text = "CUSTOM")
containerColor = MaterialTheme.colorScheme.onTertiary,
contentColor = MaterialTheme.colorScheme.onTertiaryContainer,
)
)
} }
} }
} }
@@ -808,7 +727,6 @@ private fun AppItem(
Text( Text(
text = if (app.allowSu) stringResource(R.string.authorized) else stringResource(R.string.unauthorized), text = if (app.allowSu) stringResource(R.string.authorized) else stringResource(R.string.unauthorized),
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = if (app.allowSu) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outline,
modifier = Modifier.padding(end = 4.dp) modifier = Modifier.padding(end = 4.dp)
) )
} }
@@ -817,18 +735,9 @@ private fun AppItem(
checked = app.allowSu, checked = app.allowSu,
onCheckedChange = onSwitchChange, onCheckedChange = onSwitchChange,
interactionSource = switchInteractionSource, interactionSource = switchInteractionSource,
colors = SwitchDefaults.colors(
checkedThumbColor = MaterialTheme.colorScheme.onPrimary,
checkedTrackColor = MaterialTheme.colorScheme.primary,
checkedIconColor = MaterialTheme.colorScheme.primary,
uncheckedThumbColor = MaterialTheme.colorScheme.outline,
uncheckedTrackColor = MaterialTheme.colorScheme.surfaceVariant,
uncheckedIconColor = MaterialTheme.colorScheme.surfaceVariant
)
) )
} }
} else { } else {
// 复选框交互源
val checkboxInteractionSource = remember { MutableInteractionSource() } val checkboxInteractionSource = remember { MutableInteractionSource() }
val isCheckboxPressed by checkboxInteractionSource.collectIsPressedAsState() val isCheckboxPressed by checkboxInteractionSource.collectIsPressedAsState()
@@ -844,19 +753,13 @@ private fun AppItem(
Text( Text(
text = if (isSelected) stringResource(R.string.selected) else stringResource(R.string.select), text = if (isSelected) stringResource(R.string.selected) else stringResource(R.string.select),
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outline,
modifier = Modifier.padding(end = 4.dp) modifier = Modifier.padding(end = 4.dp)
) )
} }
Checkbox( Checkbox(
checked = isSelected, checked = isSelected,
onCheckedChange = { onToggleSelection() }, onCheckedChange = { onToggleSelection() },
interactionSource = checkboxInteractionSource, interactionSource = checkboxInteractionSource,
colors = CheckboxDefaults.colors(
checkedColor = MaterialTheme.colorScheme.primary,
uncheckedColor = MaterialTheme.colorScheme.outline
)
) )
} }
} }
@@ -865,12 +768,12 @@ private fun AppItem(
} }
@Composable @Composable
fun LabelText(label: String, backgroundColor: Color) { fun LabelText(label: String) {
Box( Box(
modifier = Modifier modifier = Modifier
.padding(top = 2.dp, end = 2.dp) .padding(top = 2.dp, end = 2.dp)
.background( .background(
backgroundColor, Color.Black,
shape = RoundedCornerShape(4.dp) shape = RoundedCornerShape(4.dp)
) )
.clip(RoundedCornerShape(4.dp)) .clip(RoundedCornerShape(4.dp))
@@ -879,9 +782,8 @@ fun LabelText(label: String, backgroundColor: Color) {
text = label, text = label,
modifier = Modifier.padding(vertical = 2.dp, horizontal = 6.dp), modifier = Modifier.padding(vertical = 2.dp, horizontal = 6.dp),
style = TextStyle( style = TextStyle(
fontSize = 10.sp, fontSize = 8.sp,
color = Color.White, color = Color.White,
fontWeight = FontWeight.Medium
) )
) )
} }

View File

@@ -207,13 +207,13 @@ private fun TemplateItem(
) )
Text(template.description) Text(template.description)
FlowRow { FlowRow {
LabelText(label = "UID: ${template.uid}", backgroundColor = MaterialTheme.colorScheme.surface) LabelText(label = "UID: ${template.uid}")
LabelText(label = "GID: ${template.gid}", backgroundColor = MaterialTheme.colorScheme.surface) LabelText(label = "GID: ${template.gid}")
LabelText(label = template.context, backgroundColor = MaterialTheme.colorScheme.surface) LabelText(label = template.context,)
if (template.local) { if (template.local) {
LabelText(label = "local", backgroundColor = MaterialTheme.colorScheme.surface) LabelText(label = "local")
} else { } else {
LabelText(label = "remote", backgroundColor = MaterialTheme.colorScheme.surface) LabelText(label = "remote")
} }
} }
} }
@@ -231,7 +231,12 @@ private fun TopBar(
colors: TopAppBarColors, colors: TopAppBarColors,
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
) { ) {
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = CardConfig.cardAlpha val cardAlpha = CardConfig.cardAlpha
TopAppBar( TopAppBar(

View File

@@ -10,19 +10,15 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.luminance import androidx.compose.ui.graphics.luminance
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
object CardConfig { object CardConfig {
val settingElevation: Dp = 4.dp
val customBackgroundElevation: Dp = 0.dp
// 卡片透明度 // 卡片透明度
var cardAlpha by mutableFloatStateOf(1f) var cardAlpha by mutableFloatStateOf(1f)
// 卡片亮度 // 卡片亮度
var cardDim by mutableFloatStateOf(0f) var cardDim by mutableFloatStateOf(0f)
// 卡片阴影 // 卡片阴影
var cardElevation by mutableStateOf(settingElevation) var cardElevation by mutableStateOf(0.dp)
var isShadowEnabled by mutableStateOf(true) var isShadowEnabled by mutableStateOf(true)
var isCustomAlphaSet by mutableStateOf(false) var isCustomAlphaSet by mutableStateOf(false)
var isCustomDimSet by mutableStateOf(false) var isCustomDimSet by mutableStateOf(false)
@@ -69,37 +65,18 @@ object CardConfig {
*/ */
fun updateShadowEnabled(enabled: Boolean) { fun updateShadowEnabled(enabled: Boolean) {
isShadowEnabled = enabled isShadowEnabled = enabled
cardElevation = if (isCustomBackgroundEnabled && cardAlpha != 1f) { cardElevation = 0.dp
customBackgroundElevation
} else if (enabled) {
settingElevation
} else {
customBackgroundElevation
}
} }
/** /**
* 设置深色模式默认值 * 设置主题模式默认值
*/ */
fun setDarkModeDefaults() { fun setThemeDefaults(isDarkMode: Boolean) {
if (!isCustomAlphaSet) { if (!isCustomAlphaSet) {
cardAlpha = 1f cardAlpha = 1f
} }
if (!isCustomDimSet) { if (!isCustomDimSet) {
cardDim = 0.5f cardDim = if (isDarkMode) 0.5f else 0f
}
updateShadowEnabled(isShadowEnabled)
}
/**
* 设置浅色模式默认值
*/
fun setLightModeDefaults() {
if (!isCustomAlphaSet) {
cardAlpha = 1f
}
if (!isCustomDimSet) {
cardDim = 0f
} }
updateShadowEnabled(isShadowEnabled) updateShadowEnabled(isShadowEnabled)
} }
@@ -114,6 +91,19 @@ fun getCardColors(originalColor: Color) = CardDefaults.cardColors(
contentColor = determineContentColor(originalColor) contentColor = determineContentColor(originalColor)
) )
/**
* 获取卡片阴影配置
*/
@Composable
fun getCardElevation() = CardDefaults.cardElevation(
defaultElevation = CardConfig.cardElevation,
pressedElevation = CardConfig.cardElevation,
focusedElevation = CardConfig.cardElevation,
hoveredElevation = CardConfig.cardElevation,
draggedElevation = CardConfig.cardElevation,
disabledElevation = CardConfig.cardElevation
)
/** /**
* 根据背景颜色、主题模式和用户设置确定内容颜色 * 根据背景颜色、主题模式和用户设置确定内容颜色
*/ */

View File

@@ -47,6 +47,7 @@ import com.sukisu.ultra.ui.util.saveTransformedBackground
import androidx.activity.SystemBarStyle import androidx.activity.SystemBarStyle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.material3.ColorScheme
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
@@ -150,9 +151,9 @@ fun KernelSUTheme(
// 根据暗色模式和自定义背景调整卡片配置 // 根据暗色模式和自定义背景调整卡片配置
val isDarkModeWithCustomBackground = darkTheme && ThemeConfig.customBackgroundUri != null val isDarkModeWithCustomBackground = darkTheme && ThemeConfig.customBackgroundUri != null
if (darkTheme && !dynamicColor) { if (darkTheme && !dynamicColor) {
CardConfig.setDarkModeDefaults() CardConfig.setThemeDefaults(true)
} else if (!darkTheme && !dynamicColor) { } else if (!darkTheme && !dynamicColor) {
CardConfig.setLightModeDefaults() CardConfig.setThemeDefaults(false)
} }
CardConfig.updateShadowEnabled(!isDarkModeWithCustomBackground) CardConfig.updateShadowEnabled(!isDarkModeWithCustomBackground)
@@ -216,7 +217,8 @@ fun KernelSUTheme(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.zIndex(-2f) .zIndex(-2f)
.background(if (darkTheme) MaterialTheme.colorScheme.surfaceContainerLow else MaterialTheme.colorScheme.surfaceContainerLow) .background(if (darkTheme) if (CardConfig.isCustomBackgroundEnabled) { colorScheme.surfaceContainerLow } else { colorScheme.background }
else if (CardConfig.isCustomBackgroundEnabled) { colorScheme.surfaceContainerLow } else { colorScheme.background })
) )
// 自定义背景层 // 自定义背景层
@@ -287,24 +289,32 @@ fun KernelSUTheme(
*/ */
@RequiresApi(Build.VERSION_CODES.S) @RequiresApi(Build.VERSION_CODES.S)
@Composable @Composable
private fun createDynamicDarkColorScheme(context: Context) = private fun createDynamicDarkColorScheme(context: Context): ColorScheme {
dynamicDarkColorScheme(context).copy( val scheme = dynamicDarkColorScheme(context)
background = Color.Transparent, return scheme.copy(
surface = Color.Transparent, background = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else scheme.background,
onBackground = Color.White, surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else scheme.surface,
onSurface = Color.White onBackground = scheme.onBackground,
onSurface = scheme.onSurface
) )
}
/** /**
* 创建动态浅色颜色方案 * 创建动态浅色颜色方案
*/ */
@RequiresApi(Build.VERSION_CODES.S) @RequiresApi(Build.VERSION_CODES.S)
@Composable @Composable
private fun createDynamicLightColorScheme(context: Context) = private fun createDynamicLightColorScheme(context: Context): ColorScheme {
dynamicLightColorScheme(context).copy( val scheme = dynamicLightColorScheme(context)
background = Color.Transparent, return scheme.copy(
surface = Color.Transparent background = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else scheme.background,
surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else scheme.surface,
onBackground = scheme.onBackground,
onSurface = scheme.onSurface
) )
}
/** /**
* 创建深色颜色方案 * 创建深色颜色方案
@@ -327,9 +337,9 @@ private fun createDarkColorScheme() = darkColorScheme(
onError = ThemeConfig.currentTheme.onErrorDark, onError = ThemeConfig.currentTheme.onErrorDark,
errorContainer = ThemeConfig.currentTheme.errorContainerDark, errorContainer = ThemeConfig.currentTheme.errorContainerDark,
onErrorContainer = ThemeConfig.currentTheme.onErrorContainerDark, onErrorContainer = ThemeConfig.currentTheme.onErrorContainerDark,
background = Color.Transparent, background = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else ThemeConfig.currentTheme.backgroundDark,
onBackground = ThemeConfig.currentTheme.onBackgroundDark, onBackground = ThemeConfig.currentTheme.onBackgroundDark,
surface = Color.Transparent, surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else ThemeConfig.currentTheme.surfaceDark,
onSurface = ThemeConfig.currentTheme.onSurfaceDark, onSurface = ThemeConfig.currentTheme.onSurfaceDark,
surfaceVariant = ThemeConfig.currentTheme.surfaceVariantDark, surfaceVariant = ThemeConfig.currentTheme.surfaceVariantDark,
onSurfaceVariant = ThemeConfig.currentTheme.onSurfaceVariantDark, onSurfaceVariant = ThemeConfig.currentTheme.onSurfaceVariantDark,
@@ -369,9 +379,9 @@ private fun createLightColorScheme() = lightColorScheme(
onError = ThemeConfig.currentTheme.onErrorLight, onError = ThemeConfig.currentTheme.onErrorLight,
errorContainer = ThemeConfig.currentTheme.errorContainerLight, errorContainer = ThemeConfig.currentTheme.errorContainerLight,
onErrorContainer = ThemeConfig.currentTheme.onErrorContainerLight, onErrorContainer = ThemeConfig.currentTheme.onErrorContainerLight,
background = Color.Transparent, background = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else ThemeConfig.currentTheme.backgroundLight,
onBackground = ThemeConfig.currentTheme.onBackgroundLight, onBackground = ThemeConfig.currentTheme.onBackgroundLight,
surface = Color.Transparent, surface = if (CardConfig.isCustomBackgroundEnabled) Color.Transparent else ThemeConfig.currentTheme.surfaceLight,
onSurface = ThemeConfig.currentTheme.onSurfaceLight, onSurface = ThemeConfig.currentTheme.onSurfaceLight,
surfaceVariant = ThemeConfig.currentTheme.surfaceVariantLight, surfaceVariant = ThemeConfig.currentTheme.surfaceVariantLight,
onSurfaceVariant = ThemeConfig.currentTheme.onSurfaceVariantLight, onSurfaceVariant = ThemeConfig.currentTheme.onSurfaceVariantLight,
@@ -390,6 +400,7 @@ private fun createLightColorScheme() = lightColorScheme(
surfaceContainerHighest = ThemeConfig.currentTheme.surfaceContainerHighestLight, surfaceContainerHighest = ThemeConfig.currentTheme.surfaceContainerHighestLight,
) )
/** /**
* 复制图片到应用内部存储并提升持久性 * 复制图片到应用内部存储并提升持久性
*/ */

View File

@@ -0,0 +1,44 @@
package com.sukisu.ultra.ui.util
import android.app.Activity
import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.pm.PackageManager
import com.sukisu.ultra.ui.MainActivity
/**
* 重启应用程序
**/
fun Context.restartApp(
activityClass: Class<out Activity>,
finishCurrent: Boolean = true,
clearTask: Boolean = true,
newTask: Boolean = true
) {
val intent = Intent(this, activityClass)
if (clearTask) intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
if (newTask) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)
if (finishCurrent && this is Activity) {
finish()
}
}
/**
* 刷新启动器图标
*/
fun toggleLauncherIcon(context: Context, useAlt: Boolean) {
val pm = context.packageManager
val main = ComponentName(context, MainActivity::class.java.name)
val alt = ComponentName(context, "${MainActivity::class.java.name}Alias")
if (useAlt) {
pm.setComponentEnabledSetting(main, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
pm.setComponentEnabledSetting(alt, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
} else {
pm.setComponentEnabledSetting(alt, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP)
pm.setComponentEnabledSetting(main, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
}
}

View File

@@ -3,7 +3,6 @@ package com.sukisu.ultra.ui.viewmodel
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.content.Context import android.content.Context
import android.os.Build import android.os.Build
import android.os.SystemClock
import android.system.Os import android.system.Os
import android.util.Log import android.util.Log
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@@ -27,7 +26,6 @@ import androidx.core.content.edit
class HomeViewModel : ViewModel() { class HomeViewModel : ViewModel() {
companion object { companion object {
private const val TAG = "HomeViewModel" private const val TAG = "HomeViewModel"
private const val CACHE_DURATION = 5 * 60 * 1000L
private const val PREFS_NAME = "home_cache" private const val PREFS_NAME = "home_cache"
private const val KEY_SYSTEM_STATUS = "system_status" private const val KEY_SYSTEM_STATUS = "system_status"
private const val KEY_SYSTEM_INFO = "system_info" private const val KEY_SYSTEM_INFO = "system_info"
@@ -86,7 +84,7 @@ class HomeViewModel : ViewModel() {
private set private set
var isHideLinkCard by mutableStateOf(false) var isHideLinkCard by mutableStateOf(false)
private set private set
var showKpmInfo by mutableStateOf(true) var showKpmInfo by mutableStateOf(false)
private set private set
fun loadUserSettings(context: Context) { fun loadUserSettings(context: Context) {
@@ -97,21 +95,13 @@ class HomeViewModel : ViewModel() {
isHideOtherInfo = prefs.getBoolean("is_hide_other_info", false) isHideOtherInfo = prefs.getBoolean("is_hide_other_info", false)
isHideSusfsStatus = prefs.getBoolean("is_hide_susfs_status", false) isHideSusfsStatus = prefs.getBoolean("is_hide_susfs_status", false)
isHideLinkCard = prefs.getBoolean("is_hide_link_card", false) isHideLinkCard = prefs.getBoolean("is_hide_link_card", false)
showKpmInfo = prefs.getBoolean("show_kpm_info", true) showKpmInfo = prefs.getBoolean("show_kpm_info", false)
} }
} }
fun initializeData() { fun initializeData() {
viewModelScope.launch { viewModelScope.launch {
val currentTime = System.currentTimeMillis()
val lastUpdateTime = prefs.getLong(KEY_LAST_UPDATE, 0)
val shouldRefresh = currentTime - lastUpdateTime > CACHE_DURATION
if (!shouldRefresh) {
loadCachedData() loadCachedData()
} else {
fetchAndSaveData()
}
} }
} }
@@ -147,16 +137,11 @@ class HomeViewModel : ViewModel() {
.getBoolean("check_update", true) .getBoolean("check_update", true)
if (checkUpdate) { if (checkUpdate) {
val currentTime = System.currentTimeMillis()
val lastUpdateTime = prefs.getLong(KEY_LAST_UPDATE, 0)
val shouldRefresh = currentTime - lastUpdateTime > CACHE_DURATION
if (shouldRefresh) {
val start = SystemClock.elapsedRealtime()
val newVersionInfo = checkNewVersion() val newVersionInfo = checkNewVersion()
latestVersionInfo = newVersionInfo latestVersionInfo = newVersionInfo
prefs.edit { putString(KEY_VERSION_INFO, gson.toJson(newVersionInfo)) } prefs.edit {
Log.i(TAG, "Update check completed in ${SystemClock.elapsedRealtime() - start}ms") putString(KEY_VERSION_INFO, gson.toJson(newVersionInfo))
putLong(KEY_LAST_UPDATE, System.currentTimeMillis())
} }
} }
} catch (e: Exception) { } catch (e: Exception) {
@@ -251,6 +236,16 @@ class HomeViewModel : ViewModel() {
} }
} }
private fun getDeviceInfo(): String {
var manufacturer =
Build.MANUFACTURER[0].uppercaseChar().toString() + Build.MANUFACTURER.substring(1)
if (Build.BRAND != Build.MANUFACTURER) {
manufacturer += " " + Build.BRAND[0].uppercaseChar() + Build.BRAND.substring(1)
}
manufacturer += " " + Build.MODEL + " "
return manufacturer
}
@SuppressLint("PrivateApi") @SuppressLint("PrivateApi")
private fun getDeviceModel(): String { private fun getDeviceModel(): String {
return try { return try {
@@ -262,7 +257,7 @@ class HomeViewModel : ViewModel() {
"ro.vivo.market.name", // Vivo "ro.vivo.market.name", // Vivo
"ro.config.marketing_name" // Huawei "ro.config.marketing_name" // Huawei
) )
var result = Build.DEVICE var result = getDeviceInfo()
for (key in marketNameKeys) { for (key in marketNameKeys) {
val marketName = getMethod.invoke(null, key, "") as String val marketName = getMethod.invoke(null, key, "") as String
if (marketName.isNotEmpty()) { if (marketName.isNotEmpty()) {
@@ -273,7 +268,7 @@ class HomeViewModel : ViewModel() {
result result
} catch (e: Exception) { } catch (e: Exception) {
Log.e(TAG, "Error getting device model", e) Log.e(TAG, "Error getting device model", e)
Build.DEVICE getDeviceInfo()
} }
} }

View File

@@ -1,5 +1,6 @@
package com.sukisu.ultra.ui.viewmodel package com.sukisu.ultra.ui.viewmodel
import android.content.Context
import android.content.pm.ApplicationInfo import android.content.pm.ApplicationInfo
import android.content.pm.PackageInfo import android.content.pm.PackageInfo
import android.os.Parcelable import android.os.Parcelable
@@ -24,6 +25,7 @@ import com.dergoogler.mmrl.platform.TIMEOUT_MILLIS
import com.sukisu.ultra.ui.webui.getInstalledPackagesAll import com.sukisu.ultra.ui.webui.getInstalledPackagesAll
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import androidx.core.content.edit
/** /**
@@ -62,9 +64,11 @@ class SuperUserViewModel : ViewModel() {
} }
} }
} }
private val prefs = ksuApp.getSharedPreferences("settings", Context.MODE_PRIVATE)!!
var search by mutableStateOf("") var search by mutableStateOf("")
var showSystemApps by mutableStateOf(false) var showSystemApps by mutableStateOf(prefs.getBoolean("show_system_apps", false))
private set
var isRefreshing by mutableStateOf(false) var isRefreshing by mutableStateOf(false)
private set private set
@@ -74,6 +78,11 @@ class SuperUserViewModel : ViewModel() {
var selectedApps by mutableStateOf<Set<String>>(emptySet()) var selectedApps by mutableStateOf<Set<String>>(emptySet())
internal set internal set
fun updateShowSystemApps(newValue: Boolean) {
showSystemApps = newValue
prefs.edit { putBoolean("show_system_apps", newValue) }
}
private val sortedList by derivedStateOf { private val sortedList by derivedStateOf {
val comparator = compareBy<AppInfo> { val comparator = compareBy<AppInfo> {
when { when {

View File

@@ -0,0 +1,222 @@
package zako.zako.zako.zakoui.activity.component
import android.annotation.SuppressLint
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.navigation.NavHostController
import com.ramcosta.composedestinations.utils.isRouteOnBackStackAsState
import com.ramcosta.composedestinations.utils.rememberDestinationsNavigator
import com.ramcosta.composedestinations.spec.RouteOrDirection
import com.ramcosta.composedestinations.generated.NavGraphs
import com.sukisu.ultra.Natives
import com.sukisu.ultra.ksuApp
import com.sukisu.ultra.ui.MainActivity
import zako.zako.zako.zakoui.activity.util.AppData
import zako.zako.zako.zakoui.activity.util.AppData.getKpmVersionUse
import com.sukisu.ultra.ui.screen.BottomBarDestination
import com.sukisu.ultra.ui.theme.CardConfig.cardAlpha
import com.sukisu.ultra.ui.theme.CardConfig.cardElevation
import androidx.compose.foundation.layout.windowInsetsPadding
import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.WindowInsetsSides
import androidx.compose.foundation.layout.only
import androidx.compose.foundation.layout.navigationBars
import zako.zako.zako.zakoui.activity.util.AppData.DataRefreshManager
@SuppressLint("ContextCastToActivity")
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BottomBar(navController: NavHostController) {
val navigator = navController.rememberDestinationsNavigator()
val isFullFeatured = AppData.isFullFeatured(ksuApp.packageName)
val kpmVersion = getKpmVersionUse()
val cardColor = MaterialTheme.colorScheme.surfaceContainer
val activity = LocalContext.current as MainActivity
val settings by activity.settingsStateFlow.collectAsState()
// 检查是否隐藏红点
val isHideOtherInfo = settings.isHideOtherInfo
val showKpmInfo = settings.showKpmInfo
// 收集计数数据
val superuserCount by DataRefreshManager.superuserCount.collectAsState()
val moduleCount by DataRefreshManager.moduleCount.collectAsState()
val kpmModuleCount by DataRefreshManager.kpmModuleCount.collectAsState()
NavigationBar(
modifier = Modifier.windowInsetsPadding(
WindowInsets.navigationBars.only(WindowInsetsSides.Horizontal)
),
containerColor = TopAppBarDefaults.topAppBarColors(
containerColor = cardColor.copy(alpha = cardAlpha),
scrolledContainerColor = cardColor.copy(alpha = cardAlpha)
).containerColor,
tonalElevation = cardElevation
) {
BottomBarDestination.entries.forEach { destination ->
if (destination == BottomBarDestination.Kpm) {
if (kpmVersion.isNotEmpty() && !kpmVersion.startsWith("Error") && !showKpmInfo && Natives.version >= Natives.MINIMAL_SUPPORTED_KPM) {
if (!isFullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (!isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root as RouteOrDirection) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
BadgedBox(
badge = {
if (kpmModuleCount > 0 && !isHideOtherInfo) {
Badge(
containerColor = MaterialTheme.colorScheme.secondary
) {
Text(
text = kpmModuleCount.toString(),
style = MaterialTheme.typography.labelSmall
)
}
}
}
) {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
}
} else if (destination == BottomBarDestination.SuperUser) {
if (!isFullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
BadgedBox(
badge = {
if (superuserCount > 0 && !isHideOtherInfo) {
Badge(
containerColor = MaterialTheme.colorScheme.secondary
) {
Text(
text = superuserCount.toString(),
style = MaterialTheme.typography.labelSmall
)
}
}
}
) {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
} else if (destination == BottomBarDestination.Module) {
if (!isFullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
BadgedBox(
badge = {
if (moduleCount > 0 && !isHideOtherInfo) {
Badge(
containerColor = MaterialTheme.colorScheme.secondary)
{
Text(
text = moduleCount.toString(),
style = MaterialTheme.typography.labelSmall
)
}
}
}
) {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
} else {
if (!isFullFeatured && destination.rootRequired) return@forEach
val isCurrentDestOnBackStack by navController.isRouteOnBackStackAsState(destination.direction)
NavigationBarItem(
selected = isCurrentDestOnBackStack,
onClick = {
if (isCurrentDestOnBackStack) {
navigator.popBackStack(destination.direction, false)
}
navigator.navigate(destination.direction) {
popUpTo(NavGraphs.root) {
saveState = true
}
launchSingleTop = true
restoreState = true
}
},
icon = {
if (isCurrentDestOnBackStack) {
Icon(destination.iconSelected, stringResource(destination.label))
} else {
Icon(destination.iconNotSelected, stringResource(destination.label))
}
},
label = { Text(stringResource(destination.label),style = MaterialTheme.typography.labelMedium) },
alwaysShowLabel = false
)
}
}
}
}

View File

@@ -0,0 +1,24 @@
package zako.zako.zako.zakoui.activity.util
import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInVertically
import androidx.compose.animation.slideOutVertically
import androidx.compose.runtime.Composable
object AnimatedBottomBar {
@Composable
fun AnimatedBottomBarWrapper(
showBottomBar: Boolean,
content: @Composable () -> Unit
) {
AnimatedVisibility(
visible = showBottomBar,
enter = slideInVertically(initialOffsetY = { it }) + fadeIn(),
exit = slideOutVertically(targetOffsetY = { it }) + fadeOut()
) {
content()
}
}
}

View File

@@ -0,0 +1,109 @@
package zako.zako.zako.zakoui.activity.util
import com.sukisu.ultra.Natives
import com.sukisu.ultra.ui.util.getKpmModuleCount
import com.sukisu.ultra.ui.util.getKpmVersion
import com.sukisu.ultra.ui.util.getModuleCount
import com.sukisu.ultra.ui.util.getSuperuserCount
import com.sukisu.ultra.ui.util.rootAvailable
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.withContext
object AppData {
object DataRefreshManager {
// 私有状态流
private val _superuserCount = MutableStateFlow(0)
private val _moduleCount = MutableStateFlow(0)
private val _kpmModuleCount = MutableStateFlow(0)
// 公开的只读状态流
val superuserCount: StateFlow<Int> = _superuserCount.asStateFlow()
val moduleCount: StateFlow<Int> = _moduleCount.asStateFlow()
val kpmModuleCount: StateFlow<Int> = _kpmModuleCount.asStateFlow()
/**
* 刷新所有数据计数
*/
fun refreshData() {
_superuserCount.value = getSuperuserCountUse()
_moduleCount.value = getModuleCountUse()
_kpmModuleCount.value = getKpmModuleCountUse()
}
/**
* 异步刷新所有数据
*/
suspend fun refreshDataAsync() = withContext(Dispatchers.IO) {
refreshData()
}
}
/**
* 获取超级用户应用计数
*/
fun getSuperuserCountUse(): Int {
return try {
if (!rootAvailable()) return 0
getSuperuserCount()
} catch (_: Exception) {
0
}
}
/**
* 获取模块计数
*/
fun getModuleCountUse(): Int {
return try {
if (!rootAvailable()) return 0
getModuleCount()
} catch (_: Exception) {
0
}
}
/**
* 获取KPM模块计数
*/
fun getKpmModuleCountUse(): Int {
return try {
if (!rootAvailable()) return 0
val kpmVersion = getKpmVersionUse()
if (kpmVersion.isEmpty() || kpmVersion.startsWith("Error")) return 0
getKpmModuleCount()
} catch (_: Exception) {
0
}
}
/**
* 获取KPM版本
*/
fun getKpmVersionUse(): String {
return try {
if (!rootAvailable()) return ""
val version = getKpmVersion()
if (version.isEmpty()) "" else version
} catch (e: Exception) {
"Error: ${e.message}"
}
}
/**
* 检查是否具有管理员权限
*/
fun isManager(packageName: String): Boolean {
return Natives.becomeManager(packageName)
}
/**
* 检查是否是完整功能模式
*/
fun isFullFeatured(packageName: String): Boolean {
val isManager = Natives.becomeManager(packageName)
return isManager && !Natives.requireNewKernel() && rootAvailable()
}
}

View File

@@ -0,0 +1,46 @@
package zako.zako.zako.zakoui.activity.util
import android.content.Context
import androidx.lifecycle.LifecycleCoroutineScope
import com.sukisu.ultra.ui.MainActivity
import zako.zako.zako.zakoui.activity.util.AppData.DataRefreshManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.isActive
import kotlinx.coroutines.launch
object DataRefreshUtils {
fun startDataRefreshCoroutine(scope: LifecycleCoroutineScope) {
scope.launch(Dispatchers.IO) {
while (isActive) {
DataRefreshManager.refreshData()
delay(5000)
}
}
}
fun startSettingsMonitorCoroutine(
scope: LifecycleCoroutineScope,
activity: MainActivity,
settingsStateFlow: MutableStateFlow<MainActivity.SettingsState>
) {
scope.launch(Dispatchers.IO) {
while (isActive) {
val prefs = activity.getSharedPreferences("settings", Context.MODE_PRIVATE)
settingsStateFlow.value = MainActivity.SettingsState(
isHideOtherInfo = prefs.getBoolean("is_hide_other_info", false),
showKpmInfo = prefs.getBoolean("show_kpm_info", false)
)
delay(1000)
}
}
}
fun refreshData(scope: LifecycleCoroutineScope) {
scope.launch {
DataRefreshManager.refreshData()
}
}
}

View File

@@ -0,0 +1,24 @@
package zako.zako.zako.zakoui.activity.util
import android.content.Context
object DisplayUtils {
fun applyCustomDpi(context: Context) {
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val customDpi = prefs.getInt("app_dpi", 0)
if (customDpi > 0) {
try {
val resources = context.resources
val metrics = resources.displayMetrics
metrics.density = customDpi / 160f
@Suppress("DEPRECATION")
metrics.scaledDensity = customDpi / 160f
metrics.densityDpi = customDpi
} catch (e: Exception) {
e.printStackTrace()
}
}
}
}

View File

@@ -0,0 +1,48 @@
package zako.zako.zako.zakoui.activity.util
import android.annotation.SuppressLint
import android.content.Context
import android.content.res.Configuration
import android.os.Build
import java.util.Locale
object LocaleUtils {
@SuppressLint("ObsoleteSdkInt")
fun applyLanguageSetting(context: Context) {
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val languageCode = prefs.getString("app_language", "") ?: ""
if (languageCode.isNotEmpty()) {
val locale = Locale.forLanguageTag(languageCode)
Locale.setDefault(locale)
val resources = context.resources
val config = Configuration(resources.configuration)
config.setLocale(locale)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
context.createConfigurationContext(config)
} else {
@Suppress("DEPRECATION")
resources.updateConfiguration(config, resources.displayMetrics)
}
}
}
fun applyLocale(context: Context): Context {
val prefs = context.getSharedPreferences("settings", Context.MODE_PRIVATE)
val languageCode = prefs.getString("app_language", "") ?: ""
var newContext = context
if (languageCode.isNotEmpty()) {
val locale = Locale.forLanguageTag(languageCode)
Locale.setDefault(locale)
val config = Configuration(context.resources.configuration)
config.setLocale(locale)
newContext = context.createConfigurationContext(config)
}
return newContext
}
}

View File

@@ -0,0 +1,19 @@
package zako.zako.zako.zakoui.activity.util
import androidx.compose.animation.AnimatedContentTransitionScope
import androidx.compose.animation.EnterTransition
import androidx.compose.animation.ExitTransition
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.navigation.NavBackStackEntry
import com.ramcosta.composedestinations.animations.NavHostAnimatedDestinationStyle
object NavigationUtils {
fun defaultTransitions() = object : NavHostAnimatedDestinationStyle() {
override val enterTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> EnterTransition
get() = { fadeIn(animationSpec = tween(340)) }
override val exitTransition: AnimatedContentTransitionScope<NavBackStackEntry>.() -> ExitTransition
get() = { fadeOut(animationSpec = tween(340)) }
}
}

View File

@@ -0,0 +1,96 @@
package zako.zako.zako.zakoui.activity.util
import android.content.Context
import android.database.ContentObserver
import android.os.Handler
import androidx.core.content.edit
import com.sukisu.ultra.ui.MainActivity
import com.sukisu.ultra.ui.theme.CardConfig
import com.sukisu.ultra.ui.theme.ThemeConfig
import kotlinx.coroutines.flow.MutableStateFlow
class ThemeChangeContentObserver(
handler: Handler,
private val onThemeChanged: () -> Unit
) : ContentObserver(handler) {
override fun onChange(selfChange: Boolean) {
super.onChange(selfChange)
onThemeChanged()
}
}
object ThemeUtils {
fun initializeThemeSettings(activity: MainActivity, settingsStateFlow: MutableStateFlow<MainActivity.SettingsState>) {
val prefs = activity.getSharedPreferences("settings", Context.MODE_PRIVATE)
val isFirstRun = prefs.getBoolean("is_first_run", true)
settingsStateFlow.value = MainActivity.SettingsState(
isHideOtherInfo = prefs.getBoolean("is_hide_other_info", false),
showKpmInfo = prefs.getBoolean("show_kpm_info", false)
)
if (isFirstRun) {
ThemeConfig.preventBackgroundRefresh = false
activity.getSharedPreferences("theme_prefs", Context.MODE_PRIVATE).edit {
putBoolean("prevent_background_refresh", false)
}
prefs.edit { putBoolean("is_first_run", false) }
}
// 加载保存的背景设置
loadThemeMode()
loadThemeColors()
loadDynamicColorState()
CardConfig.load(activity.applicationContext)
}
fun registerThemeChangeObserver(activity: MainActivity): ThemeChangeContentObserver {
val contentObserver = ThemeChangeContentObserver(Handler(activity.mainLooper)) {
activity.runOnUiThread {
if (!ThemeConfig.preventBackgroundRefresh) {
ThemeConfig.backgroundImageLoaded = false
loadCustomBackground()
}
}
}
activity.contentResolver.registerContentObserver(
android.provider.Settings.System.getUriFor("ui_night_mode"),
false,
contentObserver
)
return contentObserver
}
fun unregisterThemeChangeObserver(activity: MainActivity, observer: ThemeChangeContentObserver) {
activity.contentResolver.unregisterContentObserver(observer)
}
fun onActivityPause(activity: MainActivity) {
CardConfig.save(activity.applicationContext)
activity.getSharedPreferences("theme_prefs", Context.MODE_PRIVATE).edit {
putBoolean("prevent_background_refresh", true)
}
ThemeConfig.preventBackgroundRefresh = true
}
fun onActivityResume() {
if (!ThemeConfig.backgroundImageLoaded && !ThemeConfig.preventBackgroundRefresh) {
loadCustomBackground()
}
}
private fun loadThemeMode() {
}
private fun loadThemeColors() {
}
private fun loadDynamicColorState() {
}
private fun loadCustomBackground() {
}
}

View File

@@ -1,4 +1,4 @@
package com.sukisu.ultra.flash package zako.zako.zako.zakoui.flash
import android.app.Activity import android.app.Activity
import android.content.Context import android.content.Context

View File

@@ -1,4 +1,4 @@
package com.sukisu.ultra.ui.screen package zako.zako.zako.zakoui.screen
import android.net.Uri import android.net.Uri
import android.os.Environment import android.os.Environment
@@ -29,8 +29,8 @@ import com.ramcosta.composedestinations.annotation.Destination
import com.ramcosta.composedestinations.annotation.RootGraph import com.ramcosta.composedestinations.annotation.RootGraph
import com.ramcosta.composedestinations.navigation.DestinationsNavigator import com.ramcosta.composedestinations.navigation.DestinationsNavigator
import com.sukisu.ultra.R import com.sukisu.ultra.R
import com.sukisu.ultra.flash.HorizonKernelState import zako.zako.zako.zakoui.flash.HorizonKernelState
import com.sukisu.ultra.flash.HorizonKernelWorker import zako.zako.zako.zakoui.flash.HorizonKernelWorker
import com.sukisu.ultra.ui.component.KeyEventBlocker import com.sukisu.ultra.ui.component.KeyEventBlocker
import com.sukisu.ultra.ui.util.* import com.sukisu.ultra.ui.util.*
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
@@ -42,6 +42,8 @@ import java.util.*
import androidx.compose.ui.input.key.Key import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.key import androidx.compose.ui.input.key.key
import com.sukisu.ultra.ui.theme.CardConfig import com.sukisu.ultra.ui.theme.CardConfig
import zako.zako.zako.zakoui.flash.FlashState
import kotlinx.coroutines.delay
/** /**
* @author ShirkNeko * @author ShirkNeko
@@ -117,7 +119,7 @@ fun KernelFlashScreen(
logContent.clear() logContent.clear()
logContent.append(logText) logContent.append(logText)
} }
kotlinx.coroutines.delay(100) delay(100)
} }
if (flashState.error.isNotEmpty()) { if (flashState.error.isNotEmpty()) {
@@ -239,7 +241,7 @@ fun KernelFlashScreen(
} }
@Composable @Composable
private fun FlashProgressIndicator(flashState: com.sukisu.ultra.flash.FlashState) { private fun FlashProgressIndicator(flashState: FlashState) {
val progressColor = when { val progressColor = when {
flashState.error.isNotEmpty() -> MaterialTheme.colorScheme.error flashState.error.isNotEmpty() -> MaterialTheme.colorScheme.error
flashState.isCompleted -> MaterialTheme.colorScheme.tertiary flashState.isCompleted -> MaterialTheme.colorScheme.tertiary
@@ -355,7 +357,7 @@ private fun FlashProgressIndicator(flashState: com.sukisu.ultra.flash.FlashState
@OptIn(ExperimentalMaterial3Api::class) @OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
private fun TopBar( private fun TopBar(
flashState: com.sukisu.ultra.flash.FlashState, flashState: FlashState,
onBack: () -> Unit, onBack: () -> Unit,
onSave: () -> Unit = {}, onSave: () -> Unit = {},
scrollBehavior: TopAppBarScrollBehavior? = null scrollBehavior: TopAppBarScrollBehavior? = null
@@ -366,7 +368,12 @@ private fun TopBar(
else -> MaterialTheme.colorScheme.primary else -> MaterialTheme.colorScheme.primary
} }
val cardColor = MaterialTheme.colorScheme.surfaceContainerLow val colorScheme = MaterialTheme.colorScheme
val cardColor = if (CardConfig.isCustomBackgroundEnabled) {
colorScheme.surfaceContainerLow
} else {
colorScheme.background
}
val cardAlpha = CardConfig.cardAlpha val cardAlpha = CardConfig.cardAlpha
TopAppBar( TopAppBar(

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.135"
android:scaleY="0.135">
<path
android:pathData="M 259 259 H 541 V 541 H 259 V 259 Z"
android:strokeWidth="18"
android:strokeColor="#1e110d" />
<path
android:fillColor="#1e110d"
android:pathData="M 257 257 H 407 V 407 H 257 V 257 Z" />
<path
android:fillColor="#1e110d"
android:pathData="M 393 393 H 543 V 543 H 393 V 393 Z" />
</group>
</vector>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportWidth="108"
android:viewportHeight="108">
<group
android:scaleX="0.135"
android:scaleY="0.135">
<path
android:pathData="M 259 259 H 541 V 541 H 259 V 259 Z"
android:strokeWidth="18"
android:strokeColor="#000000" />
<path
android:fillColor="#000000"
android:pathData="M 257 257 H 407 V 407 H 257 V 257 Z" />
<path
android:fillColor="#000000"
android:pathData="M 393 393 H 543 V 543 H 393 V 393 Z" />
</group>
</vector>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground_alt"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome_alt" />
</adaptive-icon>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@drawable/ic_launcher_foreground_alt"/>
<monochrome android:drawable="@drawable/ic_launcher_monochrome_alt" />
</adaptive-icon>

View File

@@ -291,20 +291,19 @@
<string name="horizon_getting_original_slot">الحصول على الفتحة الأصلية</string> <string name="horizon_getting_original_slot">الحصول على الفتحة الأصلية</string>
<string name="horizon_setting_target_slot">تعيين الفتحة المحددة</string> <string name="horizon_setting_target_slot">تعيين الفتحة المحددة</string>
<string name="horizon_restoring_original_slot">استعادة الخانة الافتراضية</string> <string name="horizon_restoring_original_slot">استعادة الخانة الافتراضية</string>
<string name="current_slot">خانة حالية:%1$s </string> <string name="current_slot">فتحة النظام الحالية الافتراضية:%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">فشل النسخ</string> <string name="horizon_copy_failed">فشل النسخ</string>
<string name="horizon_unknown_error">خطأ غير معروف</string> <string name="horizon_unknown_error">خطأ غير معروف</string>
<string name="flash_failed_message">فشل التركيب</string> <string name="flash_failed_message">فشل التركيب</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">إصلاح/تثبيت LKM</string> <string name="Lkm_install_methods">إصلاح/تثبيت LKM</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">نواة رمادية</string>
<string name="kernel_version_log">إصدار النواة:%1$s</string> <string name="kernel_version_log">إصدار النواة:%1$s</string>
<string name="tool_version_log">استخدام أداة التصحيح:%1$s</string> <string name="tool_version_log">استخدام أداة التصحيح:%1$s</string>
<string name="configuration">تعيين</string> <string name="configuration">تعيين</string>
<string name="app_settings">إعدادات التطبيق </string> <string name="app_settings">إعدادات التطبيق </string>
<string name="tools">ادوات</string> <string name="tools">ادوات</string>
<string name="currently_selected">حالياً</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">إزالة</string> <string name="clear">إزالة</string>
<string name="apps_with_root">التطبيقات مع امتيازات الجذر</string> <string name="apps_with_root">التطبيقات مع امتيازات الجذر</string>
@@ -323,13 +322,16 @@
<string name="susfs_disabled">تم تعطيل SuSFS</string> <string name="susfs_disabled">تم تعطيل SuSFS</string>
<string name="background_set_success">تم تعيين الخلفية بنجاح</string> <string name="background_set_success">تم تعيين الخلفية بنجاح</string>
<string name="background_removed">إزالة خلفيات مخصصة</string> <string name="background_removed">إزالة خلفيات مخصصة</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">يتطلب امتيازات الجذر</string> <string name="root_require_for_install">يتطلب امتيازات الجذر</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">عرض وظيفة KPM</string> <string name="show_kpm_info">عرض وظيفة KPM</string>
<string name="show_kpm_info_summary">عرض معلومات KPM ووظيفتها في الشريط المنزلي والأسفل (تحتاج إلى إعادة فتح التطبيق)</string> <string name="show_kpm_info_summary">إخفاء معلومات KPM ووظيفتها في الشريط المنزلي والأسفل</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">حدد محرك WebUI لاستخدامه</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">اختيار تلقائي</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">Force the use of WebUI X</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">Mandatory use of KSU WebUI</string>
<string name="use_webuix_eruda">حقن Eruda في WebUI X</string> <string name="use_webuix_eruda">حقن Eruda في WebUI X</string>
@@ -369,5 +371,5 @@
<string name="installing_module">تم تثبيت الوحدة %1$d/%2$d</string> <string name="installing_module">تم تثبيت الوحدة %1$d/%2$d</string>
<string name="module_failed_count">أخفق %d في تثبيت وحدة جديدة</string> <string name="module_failed_count">أخفق %d في تثبيت وحدة جديدة</string>
<string name="module_download_error">فشل تحميل الوحدة</string> <string name="module_download_error">فشل تحميل الوحدة</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">ضرب النواة</string>
</resources> </resources>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -291,20 +291,19 @@
<string name="horizon_getting_original_slot">Den ursprünglichen Slot erhalten</string> <string name="horizon_getting_original_slot">Den ursprünglichen Slot erhalten</string>
<string name="horizon_setting_target_slot">Setze den angegebenen Slot</string> <string name="horizon_setting_target_slot">Setze den angegebenen Slot</string>
<string name="horizon_restoring_original_slot">Standard wiederherstellen</string> <string name="horizon_restoring_original_slot">Standard wiederherstellen</string>
<string name="current_slot">Aktueller Slot%1$s </string> <string name="current_slot">Aktueller Standard-Slot des Systems%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Kopieren fehlgeschlagen</string> <string name="horizon_copy_failed">Kopieren fehlgeschlagen</string>
<string name="horizon_unknown_error">Ein unbekannter Fehler ist aufgetreten</string> <string name="horizon_unknown_error">Ein unbekannter Fehler ist aufgetreten</string>
<string name="flash_failed_message">Schreiben fehlgeschlagen</string> <string name="flash_failed_message">Schreiben fehlgeschlagen</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">LKM Reparatur/Installation</string> <string name="Lkm_install_methods">LKM Reparatur/Installation</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">Flashen des Kernels…</string>
<string name="kernel_version_log">Kernel</string> <string name="kernel_version_log">Kernel</string>
<string name="tool_version_log">Benutze das Patchwerkzeug%1$s</string> <string name="tool_version_log">Benutze das Patchwerkzeug%1$s</string>
<string name="configuration">Konfigurieren</string> <string name="configuration">Konfigurieren</string>
<string name="app_settings">Anwendungs-Einstellungen</string> <string name="app_settings">Anwendungs-Einstellungen</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Derzeit</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Entfernen</string> <string name="clear">Entfernen</string>
<string name="apps_with_root">Anwendungen mit Root-Rechten</string> <string name="apps_with_root">Anwendungen mit Root-Rechten</string>
@@ -323,15 +322,18 @@
<string name="susfs_disabled">SuSFS deaktiviert</string> <string name="susfs_disabled">SuSFS deaktiviert</string>
<string name="background_set_success">Hintergrund erfolgreich gesetzt</string> <string name="background_set_success">Hintergrund erfolgreich gesetzt</string>
<string name="background_removed">Eigene Hintergründe entfernt</string> <string name="background_removed">Eigene Hintergründe entfernt</string>
<string name="icon_switch_title">Alternatives Symbol</string>
<string name="icon_switch_summary">Ändere das Launcher-Symbol auf das KernelSU Icon.</string>
<string name="icon_switched">Icon gewechselt</string>
<string name="root_require_for_install">Erfordert Root-Rechte</string> <string name="root_require_for_install">Erfordert Root-Rechte</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">KPM-Funktion anzeigen</string> <string name="show_kpm_info">KPM-Funktion anzeigen</string>
<string name="show_kpm_info_summary">KPM-Informationen und Funktion in der Home- und unteren Leiste anzeigen (muss die App erneut öffnen)</string> <string name="show_kpm_info_summary">Versteckt KPM-Informationen und Funktion in der Home- und Unterleiste</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Wähle die zu verwendende WebUI-Engine</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Automatisch auswählen</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">Nutzung von WebUI X erzwingen</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">Pflichtanwendung von KSU WebUI</string>
<string name="use_webuix_eruda">Eruda in WebUI X injizieren</string> <string name="use_webuix_eruda">Eruda in WebUI X injizieren</string>
<string name="use_webuix_eruda_summary">Fügen Sie eine Debug-Konsole in WebUI X ein, um das Debuggen zu vereinfachen. Benötigt Debugging im WebUI X.</string> <string name="use_webuix_eruda_summary">Fügen Sie eine Debug-Konsole in WebUI X ein, um das Debuggen zu vereinfachen. Benötigt Debugging im WebUI X.</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->
@@ -369,5 +371,5 @@
<string name="installing_module">Modul wird installiert %1$d/%2$d</string> <string name="installing_module">Modul wird installiert %1$d/%2$d</string>
<string name="module_failed_count">%d Fehler bei der Installation eines neuen Moduls</string> <string name="module_failed_count">%d Fehler bei der Installation eines neuen Moduls</string>
<string name="module_download_error">Modul-Download fehlgeschlagen</string> <string name="module_download_error">Modul-Download fehlgeschlagen</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">Kernel-Flashen</string>
</resources> </resources>

View File

@@ -289,20 +289,19 @@
<string name="horizon_getting_original_slot">Obteniendo la ranura original</string> <string name="horizon_getting_original_slot">Obteniendo la ranura original</string>
<string name="horizon_setting_target_slot">Establecer la ranura especificada</string> <string name="horizon_setting_target_slot">Establecer la ranura especificada</string>
<string name="horizon_restoring_original_slot">Restaurar Ranura Predeterminada</string> <string name="horizon_restoring_original_slot">Restaurar Ranura Predeterminada</string>
<string name="current_slot">Ranura actual%1$s </string> <string name="current_slot">Ranura predeterminada del sistema actual%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Hubo un fallo al copiar</string> <string name="horizon_copy_failed">Hubo un fallo al copiar</string>
<string name="horizon_unknown_error">Error desconocido</string> <string name="horizon_unknown_error">Error desconocido</string>
<string name="flash_failed_message">Flash falló</string> <string name="flash_failed_message">Flash falló</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">Reparación/instalación de LKM</string> <string name="Lkm_install_methods">Reparación/instalación de LKM</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">Flashear kernel</string>
<string name="kernel_version_log">Versión del kernel</string> <string name="kernel_version_log">Versión del kernel</string>
<string name="tool_version_log">Usando la herramienta de parches%1$s</string> <string name="tool_version_log">Usando la herramienta de parches%1$s</string>
<string name="configuration">Configurar</string> <string name="configuration">Configurar</string>
<string name="app_settings">Configuración de la Aplicación</string> <string name="app_settings">Configuración de la Aplicación</string>
<string name="tools">Herramientas</string> <string name="tools">Herramientas</string>
<string name="currently_selected">Actualmente</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Eliminaciones</string> <string name="clear">Eliminaciones</string>
<string name="apps_with_root">Aplicaciones con privilegios de root</string> <string name="apps_with_root">Aplicaciones con privilegios de root</string>
@@ -321,15 +320,18 @@
<string name="susfs_disabled">SuSFS desactivado</string> <string name="susfs_disabled">SuSFS desactivado</string>
<string name="background_set_success">Fondo establecido correctamente</string> <string name="background_set_success">Fondo establecido correctamente</string>
<string name="background_removed">Eliminar fondo personalizado</string> <string name="background_removed">Eliminar fondo personalizado</string>
<string name="icon_switch_title">Icono alternativo</string>
<string name="icon_switch_summary">Cambiar el icono del lanzador al icono de KernelSU.</string>
<string name="icon_switched">Icono cambiado</string>
<string name="root_require_for_install">Requiere privilegios de root</string> <string name="root_require_for_install">Requiere privilegios de root</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Mostrar función KPM</string> <string name="show_kpm_info">Mostrar función KPM</string>
<string name="show_kpm_info_summary">Mostrar información y función KPM en la barra de inicio e inferior (Necesita reabrir la aplicación)</string> <string name="show_kpm_info_summary">Oculta la información y función del KPM en la barra de inicio e inferior</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Seleccione el motor WebUI a usar</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Selección automática</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">Forzar el uso de WebUI X</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">Uso obligatorio de KSU WebUI</string>
<string name="use_webuix_eruda">Inyectar Eruda en WebUI X</string> <string name="use_webuix_eruda">Inyectar Eruda en WebUI X</string>
<string name="use_webuix_eruda_summary">Inyecta una consola de depuración en WebUI X para facilitar la depuración. Requiere que la depuración web esté encendida.</string> <string name="use_webuix_eruda_summary">Inyecta una consola de depuración en WebUI X para facilitar la depuración. Requiere que la depuración web esté encendida.</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->
@@ -367,5 +369,5 @@
<string name="installing_module">Módulo instalado %1$d/%2$d</string> <string name="installing_module">Módulo instalado %1$d/%2$d</string>
<string name="module_failed_count">%d falló al instalar un nuevo módulo</string> <string name="module_failed_count">%d falló al instalar un nuevo módulo</string>
<string name="module_download_error">La descarga del modelo falló</string> <string name="module_download_error">La descarga del modelo falló</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">Parpadeo Kernel</string>
</resources> </resources>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -298,13 +298,12 @@
<string name="flash_failed_message">Échec du flash</string> <string name="flash_failed_message">Échec du flash</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">Réparation/installation LKM</string> <string name="Lkm_install_methods">Réparation/installation LKM</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">Flash du noyau…</string>
<string name="kernel_version_log">Version du noyau%1$s</string> <string name="kernel_version_log">Version du noyau%1$s</string>
<string name="tool_version_log">Utilisation de l\'outil de correctifs%1$s</string> <string name="tool_version_log">Utilisation de l\'outil de correctifs%1$s</string>
<string name="configuration">Configurer</string> <string name="configuration">Configurer</string>
<string name="app_settings">Paramètres de l\'application</string> <string name="app_settings">Paramètres de l\'application</string>
<string name="tools">Outils</string> <string name="tools">Outils</string>
<string name="currently_selected">Actuellement</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Suppressions</string> <string name="clear">Suppressions</string>
<string name="apps_with_root">Applications avec droits root</string> <string name="apps_with_root">Applications avec droits root</string>
@@ -323,15 +322,18 @@
<string name="susfs_disabled">SuSFS désactivé</string> <string name="susfs_disabled">SuSFS désactivé</string>
<string name="background_set_success">Fond d\'écran défini avec succès</string> <string name="background_set_success">Fond d\'écran défini avec succès</string>
<string name="background_removed">Fond d\'écran personnalisé supprimé</string> <string name="background_removed">Fond d\'écran personnalisé supprimé</string>
<string name="icon_switch_title">Icône alternative</string>
<string name="icon_switch_summary">Changer l\'icône du lanceur en icône de KernelSU.</string>
<string name="icon_switched">Icône changée</string>
<string name="root_require_for_install">Nécessite les privilèges root</string> <string name="root_require_for_install">Nécessite les privilèges root</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Afficher la fonction KPM</string> <string name="show_kpm_info">Afficher la fonction KPM</string>
<string name="show_kpm_info_summary">Afficher les informations et fonctions KPM dans la barre d\'accueil et du bas (nécessite de rouvrir l\'application)</string> <string name="show_kpm_info_summary">Masque les informations et fonctions KPM dans la barre d\'accueil et en bas</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Sélectionnez le moteur WebUI à utiliser</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Sélectionner automatiquement</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">Forcer l\'utilisation de WebUI X</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">Utilisation obligatoire de KSU WebUI</string>
<string name="use_webuix_eruda">Injecter Eruda dans WebUI X</string> <string name="use_webuix_eruda">Injecter Eruda dans WebUI X</string>
<string name="use_webuix_eruda_summary">Injectez une console de débogage dans WebUI X pour faciliter le débogage. Nécessite que le débogage soit activé.</string> <string name="use_webuix_eruda_summary">Injectez une console de débogage dans WebUI X pour faciliter le débogage. Nécessite que le débogage soit activé.</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->
@@ -369,5 +371,5 @@
<string name="installing_module">Module en cours d\'installation %1$d/%2$d</string> <string name="installing_module">Module en cours d\'installation %1$d/%2$d</string>
<string name="module_failed_count">%d a échoué à installer un nouveau module</string> <string name="module_failed_count">%d a échoué à installer un nouveau module</string>
<string name="module_download_error">Le téléchargement du modèle a échoué</string> <string name="module_download_error">Le téléchargement du modèle a échoué</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">Clignotement du noyau</string>
</resources> </resources>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -117,7 +117,7 @@
<string name="enable_web_debugging">WebView デバッグを有効化する</string> <string name="enable_web_debugging">WebView デバッグを有効化する</string>
<string name="enable_web_debugging_summary">WebUI のデバッグに使用できます。必要な場合でのみ有効化してください</string> <string name="enable_web_debugging_summary">WebUI のデバッグに使用できます。必要な場合でのみ有効化してください</string>
<string name="direct_install">直接インストール (推奨)</string> <string name="direct_install">直接インストール (推奨)</string>
<string name="select_file">パッチを行うイメージを選択してください</string> <string name="select_file">パッチを行うイメージを選択</string>
<string name="install_inactive_slot">非アクティブなスロットにインストール (OTA 後)</string> <string name="install_inactive_slot">非アクティブなスロットにインストール (OTA 後)</string>
<string name="install_inactive_slot_warning">再起動後、デバイスは**強制的に**、現在非アクティブなスロットから起動します。 <string name="install_inactive_slot_warning">再起動後、デバイスは**強制的に**、現在非アクティブなスロットから起動します。
\nこのオプションは、OTA が完了した後にのみ使用してください。 \nこのオプションは、OTA が完了した後にのみ使用してください。
@@ -192,7 +192,7 @@
<string name="hide_kernel_kernelsu_version">カーネルのバージョンを非表示</string> <string name="hide_kernel_kernelsu_version">カーネルのバージョンを非表示</string>
<string name="hide_kernel_kernelsu_version_summary">カーネルのバージョンを非表示にします</string> <string name="hide_kernel_kernelsu_version_summary">カーネルのバージョンを非表示にします</string>
<string name="hide_other_info">その他の情報を非表示</string> <string name="hide_other_info">その他の情報を非表示</string>
<string name="hide_other_info_summary">ホームページ上のスーパーユーザー、モジュール、KPM モジュールの数に関する情報を非表示にします</string> <string name="hide_other_info_summary">ナビゲーションバーページスーパーユーザー、モジュール、KPM モジュールの数に関する赤いドットを非表示にします</string>
<string name="hide_susfs_status">SuSFS ステータスを非表示</string> <string name="hide_susfs_status">SuSFS ステータスを非表示</string>
<string name="hide_susfs_status_summary">ホームページ上の SuSFS ステータス情報を非表示にします</string> <string name="hide_susfs_status_summary">ホームページ上の SuSFS ステータス情報を非表示にします</string>
<string name="hide_link_card">リンクカードのステータスを非表示</string> <string name="hide_link_card">リンクカードのステータスを非表示</string>
@@ -212,7 +212,7 @@
<string name="color_pink">ピンク</string> <string name="color_pink">ピンク</string>
<string name="color_gray">グレー</string> <string name="color_gray">グレー</string>
<string name="color_yellow">イエロー</string> <string name="color_yellow">イエロー</string>
<string name="flash_option">ブラシの設定</string> <string name="flash_option">フラッシュオプション</string>
<string name="flash_option_tip">フラッシュするファイルを選択</string> <string name="flash_option_tip">フラッシュするファイルを選択</string>
<string name="horizon_kernel">AnyKernel3 をインストール</string> <string name="horizon_kernel">AnyKernel3 をインストール</string>
<string name="horizon_kernel_summary">AnyKernel3 カーネルファイルをフラッシュします</string> <string name="horizon_kernel_summary">AnyKernel3 カーネルファイルをフラッシュします</string>
@@ -291,7 +291,7 @@
<string name="horizon_getting_original_slot">オリジナルのスロットを取得</string> <string name="horizon_getting_original_slot">オリジナルのスロットを取得</string>
<string name="horizon_setting_target_slot">指定するスロットを設定</string> <string name="horizon_setting_target_slot">指定するスロットを設定</string>
<string name="horizon_restoring_original_slot">デフォルトのスロットに復元</string> <string name="horizon_restoring_original_slot">デフォルトのスロットに復元</string>
<string name="current_slot">現在のスロット: %1$s </string> <string name="current_slot">現在のシステムデフォルトスロット: %1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">コピーに失敗しました</string> <string name="horizon_copy_failed">コピーに失敗しました</string>
<string name="horizon_unknown_error">不明なエラー</string> <string name="horizon_unknown_error">不明なエラー</string>
@@ -304,7 +304,6 @@
<string name="configuration">設定</string> <string name="configuration">設定</string>
<string name="app_settings">アプリの設定</string> <string name="app_settings">アプリの設定</string>
<string name="tools">ツール</string> <string name="tools">ツール</string>
<string name="currently_selected">現在</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">削除</string> <string name="clear">削除</string>
<string name="apps_with_root">root アプリの権限</string> <string name="apps_with_root">root アプリの権限</string>
@@ -323,15 +322,18 @@
<string name="susfs_disabled">SuSFS 無効</string> <string name="susfs_disabled">SuSFS 無効</string>
<string name="background_set_success">背景の設定が成功しました</string> <string name="background_set_success">背景の設定が成功しました</string>
<string name="background_removed">カスタム背景を削除しました</string> <string name="background_removed">カスタム背景を削除しました</string>
<string name="icon_switch_title">代替アイコン</string>
<string name="icon_switch_summary">ランチャーアイコンを KernelSU のアイコンに変更します</string>
<string name="icon_switched">アイコンを変更しました</string>
<string name="root_require_for_install">root 権限が必要です</string> <string name="root_require_for_install">root 権限が必要です</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">KPM 機能を表示</string> <string name="show_kpm_info">KPM 機能を表示</string>
<string name="show_kpm_info_summary">KPM の情報と機能をホームとボトムバーに表示します (アプリを開き直す必要があります)</string> <string name="show_kpm_info_summary">ホームとボトムバーから KPM の情報と機能を表示します</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">WebUI で使用するエンジン</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">自動選択</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">WebUI X の使用を強制する</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">KSU WebUI の使用を強制する</string>
<string name="use_webuix_eruda">WebUI に Eruda をインジェクトする</string> <string name="use_webuix_eruda">WebUI に Eruda をインジェクトする</string>
<string name="use_webuix_eruda_summary">デバッグを容易にするために WebUI X にデバッグコンソールを挿入します。Web デバッグが ON になっている必要があります。</string> <string name="use_webuix_eruda_summary">デバッグを容易にするために WebUI X にデバッグコンソールを挿入します。Web デバッグが ON になっている必要があります。</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -289,20 +289,19 @@
<string name="horizon_getting_original_slot">Obtendo o espaço original</string> <string name="horizon_getting_original_slot">Obtendo o espaço original</string>
<string name="horizon_setting_target_slot">Configurando o slot especificado</string> <string name="horizon_setting_target_slot">Configurando o slot especificado</string>
<string name="horizon_restoring_original_slot">Restaurar Slot Padrão</string> <string name="horizon_restoring_original_slot">Restaurar Slot Padrão</string>
<string name="current_slot">Slot Atual%1$s </string> <string name="current_slot">Slot padrão do sistema atual%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Falha ao copiar</string> <string name="horizon_copy_failed">Falha ao copiar</string>
<string name="horizon_unknown_error">Você parece estar convertendo de um formato com degradação para&#10;&#10;um sem perdas. Esteja ciente que a perda de qualidade não pode ser desfeita,&#10;&#10;então este processo não melhorará a qualidade do áudio e provavelmente&#10;&#10;aumentará o tamanho do arquivo. Continuar assim mesmo?</string> <string name="horizon_unknown_error">Você parece estar convertendo de um formato com degradação para&#10;&#10;um sem perdas. Esteja ciente que a perda de qualidade não pode ser desfeita,&#10;&#10;então este processo não melhorará a qualidade do áudio e provavelmente&#10;&#10;aumentará o tamanho do arquivo. Continuar assim mesmo?</string>
<string name="flash_failed_message">Flash falhou</string> <string name="flash_failed_message">Flash falhou</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">LKM reparo/instalação</string> <string name="Lkm_install_methods">LKM reparo/instalação</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">Flasheando kernel</string>
<string name="kernel_version_log">Kernel</string> <string name="kernel_version_log">Kernel</string>
<string name="tool_version_log">Usando a ferramenta de correção%1$s</string> <string name="tool_version_log">Usando a ferramenta de correção%1$s</string>
<string name="configuration">Configurar</string> <string name="configuration">Configurar</string>
<string name="app_settings">Configurações Do Aplicativo</string> <string name="app_settings">Configurações Do Aplicativo</string>
<string name="tools">Ferramentas</string> <string name="tools">Ferramentas</string>
<string name="currently_selected">Atual</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Remoções</string> <string name="clear">Remoções</string>
<string name="apps_with_root">Aplicativos com privilégios de superusuário</string> <string name="apps_with_root">Aplicativos com privilégios de superusuário</string>
@@ -321,15 +320,18 @@
<string name="susfs_disabled">SuSFS desativado</string> <string name="susfs_disabled">SuSFS desativado</string>
<string name="background_set_success">Fundo definido com sucesso</string> <string name="background_set_success">Fundo definido com sucesso</string>
<string name="background_removed">Remover</string> <string name="background_removed">Remover</string>
<string name="icon_switch_title">Ícone alternativo</string>
<string name="icon_switch_summary">Alterar o ícone do launcher para o ícone do KernelSU.</string>
<string name="icon_switched">Ícone alterado</string>
<string name="root_require_for_install">Requer privilégios de superusuário</string> <string name="root_require_for_install">Requer privilégios de superusuário</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Exibir função KPM</string> <string name="show_kpm_info">Exibir função KPM</string>
<string name="show_kpm_info_summary">Exibir informações e funções do KPM na barra inicial e inferior (Precisa reabrir o aplicativo)</string> <string name="show_kpm_info_summary">Oculta as informações e funções do KPM na barra inicial e inferior</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Selecione o mecanismo de WebUI para usar</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Seleção automática</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">Forçar o uso de WebUI X</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">Uso obrigatório do KSU WebUI</string>
<string name="use_webuix_eruda">Injetar Eruda na WebUI X</string> <string name="use_webuix_eruda">Injetar Eruda na WebUI X</string>
<string name="use_webuix_eruda_summary">Injetar um console de depuração na WebUI X para facilitar a depuração. Requer depuração da web para estar ligada.</string> <string name="use_webuix_eruda_summary">Injetar um console de depuração na WebUI X para facilitar a depuração. Requer depuração da web para estar ligada.</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -5,13 +5,13 @@
<string name="home_click_to_install">Нажмите, чтобы установить</string> <string name="home_click_to_install">Нажмите, чтобы установить</string>
<string name="home_working">Работает</string> <string name="home_working">Работает</string>
<string name="home_working_version">Версия: %d</string> <string name="home_working_version">Версия: %d</string>
<string name="home_superuser_count">Суперпользователи: %d</string> <string name="home_superuser_count">Рут-доступ: %d</string>
<string name="home_module_count">Модули: %d</string> <string name="home_module_count">Модули: %d</string>
<string name="home_unsupported">Не поддерживается</string> <string name="home_unsupported">Не поддерживается</string>
<string name="home_unsupported_reason">Драйвера KernelSU не найдены в ядре, не то ядро?</string> <string name="home_unsupported_reason">Драйвера KernelSU не найдены в ядре, не то ядро?</string>
<string name="home_kernel">Ядро</string> <string name="home_kernel">Ядро</string>
<string name="home_susfs">SuSFS: %s</string> <string name="home_susfs">SuSFS: %s</string>
<string name="home_susfs_version">Версия SuSFS</string> <string name="home_susfs_version">Статус SuSFS</string>
<string name="home_susfs_sus_su">SuS SU</string> <string name="home_susfs_sus_su">SuS SU</string>
<string name="home_manager_version">Версия менеджера</string> <string name="home_manager_version">Версия менеджера</string>
<string name="home_fingerprint">Подпись</string> <string name="home_fingerprint">Подпись</string>
@@ -20,7 +20,7 @@
<string name="selinux_status_enforcing">Принудительный</string> <string name="selinux_status_enforcing">Принудительный</string>
<string name="selinux_status_permissive">Разрешающий</string> <string name="selinux_status_permissive">Разрешающий</string>
<string name="selinux_status_unknown">Неизвестно</string> <string name="selinux_status_unknown">Неизвестно</string>
<string name="superuser">Суперпользователь</string> <string name="superuser">Рут-доступ</string>
<string name="module_failed_to_enable">Не удалось включить модуль %s</string> <string name="module_failed_to_enable">Не удалось включить модуль %s</string>
<string name="module_failed_to_disable">Не удалось отключить модуль %s</string> <string name="module_failed_to_disable">Не удалось отключить модуль %s</string>
<string name="module_empty">Нет установленных модулей</string> <string name="module_empty">Нет установленных модулей</string>
@@ -69,7 +69,7 @@
<string name="profile_capabilities">Возможности</string> <string name="profile_capabilities">Возможности</string>
<string name="profile_selinux_context">Контекст SELinux</string> <string name="profile_selinux_context">Контекст SELinux</string>
<string name="profile_umount_modules">Размонтировать модули</string> <string name="profile_umount_modules">Размонтировать модули</string>
<string name="failed_to_update_app_profile">Не удалось обновить App Profile для %s</string> <string name="failed_to_update_app_profile">Не удалось обновить профиль приложения для %s</string>
<string name="require_kernel_version" formatted="false">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string> <string name="require_kernel_version" formatted="false">Текущая версия KernelSU %d слишком низкая для правильной работы менеджера. Пожалуйста, обновите до версии %d или выше!</string>
<string name="settings_umount_modules_default">Размонтировать модули по умолчанию</string> <string name="settings_umount_modules_default">Размонтировать модули по умолчанию</string>
<string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в профиле приложения. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан профиль</string> <string name="settings_umount_modules_default_summary">Глобальное значение по умолчанию для \"Размонтировать модули\" в профиле приложения. При включении будут удалены все модификации модулей в системе для приложений, у которых не задан профиль</string>
@@ -109,7 +109,7 @@
<string name="app_profile_template_import_empty">Буфер обмена пуст!</string> <string name="app_profile_template_import_empty">Буфер обмена пуст!</string>
<string name="module_changelog_failed">Не удалось получить список изменений: %s</string> <string name="module_changelog_failed">Не удалось получить список изменений: %s</string>
<string name="settings_check_update">Проверка обновлений</string> <string name="settings_check_update">Проверка обновлений</string>
<string name="settings_check_update_summary">Автоматическая проверка обновлений при открытии приложения</string> <string name="settings_check_update_summary">Автоматически проверять обновления при открытии приложения</string>
<string name="grant_root_failed">Не удалось выдать root!</string> <string name="grant_root_failed">Не удалось выдать root!</string>
<string name="action">Действие</string> <string name="action">Действие</string>
<string name="open">Открыть</string> <string name="open">Открыть</string>
@@ -123,7 +123,7 @@
\n Используйте эту опцию только после завершения OTA. \n Используйте эту опцию только после завершения OTA.
\n Продолжить?</string> \n Продолжить?</string>
<string name="install_next">Далее</string> <string name="install_next">Далее</string>
<string name="select_file_tip">%1$s образ раздела рекомендуется</string> <string name="select_file_tip">Образ раздела %1$s рекомендуется</string>
<string name="select_kmi">Выбрать KMI</string> <string name="select_kmi">Выбрать KMI</string>
<string name="settings_uninstall">Удалить</string> <string name="settings_uninstall">Удалить</string>
<string name="settings_uninstall_temporary">Удалить на время</string> <string name="settings_uninstall_temporary">Удалить на время</string>
@@ -151,7 +151,7 @@
<string name="confirm">Подтвердить</string> <string name="confirm">Подтвердить</string>
<string name="cancel">Отмена</string> <string name="cancel">Отмена</string>
<!-- Backup related --> <!-- Backup related -->
<string name="backup_success">Успешная резервная копия (tar.gz)</string> <string name="backup_success">Резервная копия создана успешно</string>
<string name="backup_failed">Ошибка резервного копирования: %1$s</string> <string name="backup_failed">Ошибка резервного копирования: %1$s</string>
<string name="backup_modules">Резервное копирование модулей</string> <string name="backup_modules">Резервное копирование модулей</string>
<string name="restore_modules">Восстановить модули</string> <string name="restore_modules">Восстановить модули</string>
@@ -163,7 +163,7 @@
<!-- Command related --> <!-- Command related -->
<string name="command_execution_failed">Выполнение команды не удалось: %1$s</string> <string name="command_execution_failed">Выполнение команды не удалось: %1$s</string>
<!-- Allowlist related --> <!-- Allowlist related -->
<string name="allowlist_backup_success">Резервное копирование успешно завершено</string> <string name="allowlist_backup_success">Резервная копия создана успешно</string>
<string name="allowlist_backup_failed">Ошибка резервного копирования списка: %1$s</string> <string name="allowlist_backup_failed">Ошибка резервного копирования списка: %1$s</string>
<string name="allowlist_restore_confirm_title">Подтвердите восстановление списка</string> <string name="allowlist_restore_confirm_title">Подтвердите восстановление списка</string>
<string name="allowlist_restore_confirm_message">Эта операция перезапишет текущий список разрешений. Продолжить?</string> <string name="allowlist_restore_confirm_message">Эта операция перезапишет текущий список разрешений. Продолжить?</string>
@@ -177,9 +177,9 @@
<string name="settings_restore_default">По умолчанию</string> <string name="settings_restore_default">По умолчанию</string>
<string name="home_android_version">Версия Android</string> <string name="home_android_version">Версия Android</string>
<string name="home_device_model">Модель устройства</string> <string name="home_device_model">Модель устройства</string>
<string name="su_not_allowed">Предоставление %s суперпользователю не допускается</string> <string name="su_not_allowed">Предоставление рут-доступа %s запрещено</string>
<string name="settings_disable_su">Отключить совместимость su</string> <string name="settings_disable_su">Отключить su совместимость</string>
<string name="settings_disable_su_summary">Временно отключить все приложения от получения привилегий суперпользователя через su команду (запущенные процессы с рут доступом не будут затронуты).</string> <string name="settings_disable_su_summary">Временно отключить все приложения от получения рут-доступа через su команду (запущенные процессы с рут-доступом не будут затронуты).</string>
<string name="using_mksu_manager">Вы используете менеджер SukiSU бета-версии</string> <string name="using_mksu_manager">Вы используете менеджер SukiSU бета-версии</string>
<string name="module_install_multiple_confirm">Вы уверены, что хотите установить выбранные модули %d?</string> <string name="module_install_multiple_confirm">Вы уверены, что хотите установить выбранные модули %d?</string>
<string name="module_install_multiple_confirm_with_names">Уверены, что хотите установить следующие %1$d модули? \n\n%2$s</string> <string name="module_install_multiple_confirm_with_names">Уверены, что хотите установить следующие %1$d модули? \n\n%2$s</string>
@@ -188,22 +188,22 @@
<string name="selinux_enabled">Включено</string> <string name="selinux_enabled">Включено</string>
<string name="selinux_disabled">Выключен</string> <string name="selinux_disabled">Выключен</string>
<string name="simple_mode">Режим простоты</string> <string name="simple_mode">Режим простоты</string>
<string name="simple_mode_summary">Скрывает ненужные карты при включении</string> <string name="simple_mode_summary">Скрывать ненужные карточки при запуске</string>
<string name="hide_kernel_kernelsu_version">Скрыть версию ядра</string> <string name="hide_kernel_kernelsu_version">Скрыть версию ядра</string>
<string name="hide_kernel_kernelsu_version_summary">Скрыть версию ядра</string> <string name="hide_kernel_kernelsu_version_summary">Скрывать версию ядра на главной странице</string>
<string name="hide_other_info">Скрыть другую информацию</string> <string name="hide_other_info">Скрыть другую информацию</string>
<string name="hide_other_info_summary">Скрывает информацию о количестве суперпользователей, модулей и KPM-модулей на домашней странице</string> <string name="hide_other_info_summary">Скрывать информацию о количестве приложений с рут-доступом, модулей и KPM-модулей на главной странице</string>
<string name="hide_susfs_status">Скрыть статус SuSFS</string> <string name="hide_susfs_status">Скрыть статус SuSFS</string>
<string name="hide_susfs_status_summary">Скрыть информацию о статусе SuSFS на главной странице</string> <string name="hide_susfs_status_summary">Скрывать информацию о статусе SuSFS на главной странице</string>
<string name="hide_link_card">Скрыть статус карточки ссылки</string> <string name="hide_link_card">Скрыть карточки со ссылками</string>
<string name="hide_link_card_summary">Скрыть информацию о карте ссылки на главной странице</string> <string name="hide_link_card_summary">Скрывать карточки со ссылками на главной странице</string>
<string name="theme_mode">Тема</string> <string name="theme_mode">Тема</string>
<string name="theme_follow_system">Использовать системные настройки</string> <string name="theme_follow_system">Как в системе</string>
<string name="theme_light">Светлая</string> <string name="theme_light">Светлая</string>
<string name="theme_dark">Тёмная</string> <string name="theme_dark">Тёмная</string>
<string name="manual_hook">Подключено вручную</string> <string name="manual_hook">Самопис. хуки</string>
<string name="dynamic_color_title">Динамический цвет</string> <string name="dynamic_color_title">Динамические цвета</string>
<string name="dynamic_color_summary">Динамические цвета с использованием системных тем</string> <string name="dynamic_color_summary">Использовать акцентные цвета системы</string>
<string name="choose_theme_color">Выберите цвет темы</string> <string name="choose_theme_color">Выберите цвет темы</string>
<string name="color_default">Синий</string> <string name="color_default">Синий</string>
<string name="color_green">Зеленый</string> <string name="color_green">Зеленый</string>
@@ -214,8 +214,8 @@
<string name="color_yellow">Желтый</string> <string name="color_yellow">Желтый</string>
<string name="flash_option">Параметры прошивки</string> <string name="flash_option">Параметры прошивки</string>
<string name="flash_option_tip">Выберите файл для прошивки</string> <string name="flash_option_tip">Выберите файл для прошивки</string>
<string name="horizon_kernel">Install Anykernel3</string> <string name="horizon_kernel">Установка AnyKernel3</string>
<string name="horizon_kernel_summary">Файл ядра Flash AnyKernel3</string> <string name="horizon_kernel_summary">Прошить файл ядра AnyKernel3</string>
<string name="root_required">Требуется root-права</string> <string name="root_required">Требуется root-права</string>
<string name="copy_failed">Ошибка копирования файла</string> <string name="copy_failed">Ошибка копирования файла</string>
<string name="reboot_complete_title">Скрабровка завершена</string> <string name="reboot_complete_title">Скрабровка завершена</string>
@@ -234,11 +234,11 @@
<string name="kpm_uninstall_success">Удаление завершено</string> <string name="kpm_uninstall_success">Удаление завершено</string>
<string name="kpm_uninstall_failed">Не удалось удалить</string> <string name="kpm_uninstall_failed">Не удалось удалить</string>
<string name="kpm_install">Установить</string> <string name="kpm_install">Установить</string>
<string name="kpm_install_success">Модуль kpm успешно загружен</string> <string name="kpm_install_success">KPM модуль успешно загружен</string>
<string name="kpm_install_failed">Ошибка загрузки модуля kpm</string> <string name="kpm_install_failed">Ошибка загрузки KPM модуля</string>
<string name="kpm_args">Параметры</string> <string name="kpm_args">Параметры</string>
<string name="kpm_control">Выполнить</string> <string name="kpm_control">Выполнить</string>
<string name="home_kpm_version">Версия KPM</string> <string name="home_kpm_version">Статус KPM</string>
<string name="close_notice">Закрыть</string> <string name="close_notice">Закрыть</string>
<string name="kernel_module_notice">Следующие модульные функции ядра были разработаны KernelPatch и изменены для включения в него функций модуля ядра SukiSU Ultra</string> <string name="kernel_module_notice">Следующие модульные функции ядра были разработаны KernelPatch и изменены для включения в него функций модуля ядра SukiSU Ultra</string>
<string name="home_ContributionCard_kernelsu">Будущее SukiSU Ultra</string> <string name="home_ContributionCard_kernelsu">Будущее SukiSU Ultra</string>
@@ -246,13 +246,13 @@
<string name="kpm_control_failed">Провален</string> <string name="kpm_control_failed">Провален</string>
<string name="home_click_to_ContributionCard_kernelsu">В будущем SukiSU Ultra будет относительно независимым ответвлением KSU, но мы по-прежнему ценим официальный KernelSU и MKSU и т.д. за их вклад!</string> <string name="home_click_to_ContributionCard_kernelsu">В будущем SukiSU Ultra будет относительно независимым ответвлением KSU, но мы по-прежнему ценим официальный KernelSU и MKSU и т.д. за их вклад!</string>
<string name="not_supported">Не поддерживается</string> <string name="not_supported">Не поддерживается</string>
<string name="supported">Поддерживаемые</string> <string name="supported">Поддерживается</string>
<string name="home_kpm_module">"Количество KPM-модулей: %d "</string> <string name="home_kpm_module">"KPM-модули: %d "</string>
<string name="kpm_invalid_file">Недопустимый файл KPM</string> <string name="kpm_invalid_file">Недопустимый файл KPM</string>
<string name="kernel_patched">Ядро не изменено</string> <string name="kernel_patched">Ядро не изменено</string>
<string name="kernel_not_enabled">Ядро не настроено</string> <string name="kernel_not_enabled">Ядро не настроено</string>
<string name="custom_settings">Другие уровни доступа</string> <string name="custom_settings">Персонализация</string>
<string name="kpm_install_mode">KPM Install</string> <string name="kpm_install_mode">Установка KPM</string>
<string name="kpm_install_mode_load">Загрузить</string> <string name="kpm_install_mode_load">Загрузить</string>
<string name="kpm_install_mode_embed">Код для вставки</string> <string name="kpm_install_mode_embed">Код для вставки</string>
<string name="kpm_install_mode_description">Пожалуйста, выберите %1\$s режим установки модуля \n\nЗагрузить: Временно загрузить модуль \nВстроенный: Окончательно установить в систему</string> <string name="kpm_install_mode_description">Пожалуйста, выберите %1\$s режим установки модуля \n\nЗагрузить: Временно загрузить модуль \nВстроенный: Окончательно установить в систему</string>
@@ -261,7 +261,7 @@
<string name="confirm_uninstall_title">Подтверждение удаления</string> <string name="confirm_uninstall_title">Подтверждение удаления</string>
<string name="confirm_uninstall_confirm">Удалить</string> <string name="confirm_uninstall_confirm">Удалить</string>
<string name="confirm_uninstall_dismiss">Отмена</string> <string name="confirm_uninstall_dismiss">Отмена</string>
<string name="theme_color">Цвет Темы</string> <string name="theme_color">Цвет темы</string>
<string name="invalid_file_type">Неверный тип файла! Пожалуйста, выберите .kpm файл.</string> <string name="invalid_file_type">Неверный тип файла! Пожалуйста, выберите .kpm файл.</string>
<string name="confirm_uninstall_title_with_filename">Удалить</string> <string name="confirm_uninstall_title_with_filename">Удалить</string>
<string name="confirm_uninstall_content">Следующие KPM будут удалены: %s</string> <string name="confirm_uninstall_content">Следующие KPM будут удалены: %s</string>
@@ -273,7 +273,7 @@
<!-- Kernel Flash Progress Related --> <!-- Kernel Flash Progress Related -->
<string name="horizon_flash_title">Мигание ядра</string> <string name="horizon_flash_title">Мигание ядра</string>
<string name="horizon_logs_label">Логи:</string> <string name="horizon_logs_label">Логи:</string>
<string name="horizon_flash_complete">Вспышка завершена</string> <string name="horizon_flash_complete">Прошивка завершена</string>
<!-- Flash Status Related --> <!-- Flash Status Related -->
<string name="horizon_preparing">Подготовка…</string> <string name="horizon_preparing">Подготовка…</string>
<string name="horizon_cleaning_files">Очистка файлов…</string> <string name="horizon_cleaning_files">Очистка файлов…</string>
@@ -291,20 +291,19 @@
<string name="horizon_getting_original_slot">Получение оригинальной ячейки</string> <string name="horizon_getting_original_slot">Получение оригинальной ячейки</string>
<string name="horizon_setting_target_slot">Установка указанного слота</string> <string name="horizon_setting_target_slot">Установка указанного слота</string>
<string name="horizon_restoring_original_slot">Восстановить</string> <string name="horizon_restoring_original_slot">Восстановить</string>
<string name="current_slot">Текущий слот:%1$s </string> <string name="current_slot">Текущий слот по умолчанию%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Копирование не удалось</string> <string name="horizon_copy_failed">Копирование не удалось</string>
<string name="horizon_unknown_error">Неизвестная ошибка</string> <string name="horizon_unknown_error">Неизвестная ошибка</string>
<string name="flash_failed_message">Установка не выполнена</string> <string name="flash_failed_message">Установка не выполнена</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">Ремонт/установка LKM</string> <string name="Lkm_install_methods">Починить/установить LKM</string>
<string name="GKI_install_methods">Прошить AnyKernel3</string> <string name="GKI_install_methods">Прошить AnyKernel3</string>
<string name="kernel_version_log">Ядро</string> <string name="kernel_version_log">Ядро</string>
<string name="tool_version_log">С помощью инструмента патрулирования:%1$s</string> <string name="tool_version_log">С помощью инструмента патрулирования:%1$s</string>
<string name="configuration">Настройка</string> <string name="configuration">Настройка</string>
<string name="app_settings">Настройки приложения</string> <string name="app_settings">Настройки приложения</string>
<string name="tools">Инструменты</string> <string name="tools">Инструменты</string>
<string name="currently_selected">В данный момент</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Удаление</string> <string name="clear">Удаление</string>
<string name="apps_with_root">Приложения с привилегиями root</string> <string name="apps_with_root">Приложения с привилегиями root</string>
@@ -314,21 +313,24 @@
<string name="selinux_enabled_toast">SELinux включен</string> <string name="selinux_enabled_toast">SELinux включен</string>
<string name="selinux_disabled_toast">SELinux отключен</string> <string name="selinux_disabled_toast">SELinux отключен</string>
<string name="selinux_change_failed">Сбой изменения статуса SELinux</string> <string name="selinux_change_failed">Сбой изменения статуса SELinux</string>
<string name="advanced_settings">Расширенные настройки</string> <string name="advanced_settings">Расширенные</string>
<string name="appearance_settings">Настройка панели инструментов.</string> <string name="appearance_settings">Внешний вид</string>
<string name="back">Возвращение</string> <string name="back">Возвращение</string>
<string name="expand">Будьте в полном шаге</string> <string name="expand">Будьте в полном шаге</string>
<string name="collapse">Свернуть</string> <string name="collapse">Свернуть</string>
<string name="susfs_enabled">SuSFS включен</string> <string name="susfs_enabled">SuSFS включен</string>
<string name="susfs_disabled">SuSFS выключен</string> <string name="susfs_disabled">SuSFS выключен</string>
<string name="background_set_success">Фон успешно установлен</string> <string name="background_set_success">Фон успешно установлен</string>
<string name="background_removed">Удалить свой фон</string> <string name="background_removed">Пользовательский фон удалён</string>
<string name="icon_switch_title">Альт. иконка</string>
<string name="icon_switch_summary">Поменять иконку приложения на иконку KernelSU</string>
<string name="icon_switched">Иконка поменяна</string>
<string name="root_require_for_install">Требуется root-права</string> <string name="root_require_for_install">Требуется root-права</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Показать функцию KPM</string> <string name="show_kpm_info">Скрыть статус KPM</string>
<string name="show_kpm_info_summary">Отображение информации и функции KPM в домашней и нижней панели (необходимо переоткрыть приложение)</string> <string name="show_kpm_info_summary">Скрывать информацию и функции KPM на домашней странице и панели навигации</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Выбрать движок WebUi</string> <string name="use_webuix">Движок WebUI</string>
<string name="engine_auto_select">Автовыбор</string> <string name="engine_auto_select">Автовыбор</string>
<string name="engine_force_webuix">WebUI X</string> <string name="engine_force_webuix">WebUI X</string>
<string name="engine_force_ksu">KSU WebUI</string> <string name="engine_force_ksu">KSU WebUI</string>
@@ -346,13 +348,13 @@
<string name="dpi_apply_settings">Применить настройки DPI</string> <string name="dpi_apply_settings">Применить настройки DPI</string>
<string name="dpi_confirm_title">Подтвердите изменение DPI</string> <string name="dpi_confirm_title">Подтвердите изменение DPI</string>
<string name="dpi_confirm_message">Вы уверены, что хотите изменить DPI приложения с %1$d на %2$d?</string> <string name="dpi_confirm_message">Вы уверены, что хотите изменить DPI приложения с %1$d на %2$d?</string>
<string name="dpi_confirm_summary">Приложение должно быть перезапущено, чтобы применить новые настройки DPI, не влияет на системную строку состояния или другие приложения</string> <string name="dpi_confirm_summary">Приложение нужно перезапустить, чтобы применить новые настройки DPI. Это не влияет на системную строку состояния или другие приложения</string>
<string name="dpi_applied_success">DPI был установлен в %1$d, действующий после перезапуска приложения</string> <string name="dpi_applied_success">DPI был установлен в %1$d, действующий после перезапуска приложения</string>
<!-- Language settings related strings --> <!-- Language settings related strings -->
<string name="language_setting">Язык приложения</string> <string name="language_setting">Язык приложения</string>
<string name="language_follow_system">Как в системе</string> <string name="language_follow_system">Как в системе</string>
<string name="language_changed">Язык изменён, перезапуск для применения изменений</string> <string name="language_changed">Язык изменён, перезапуск для применения изменений</string>
<string name="settings_card_dim">Корректировка \"Тьма Карты\"</string> <string name="settings_card_dim">Затемнение карточек</string>
<!-- Super User Related --> <!-- Super User Related -->
<string name="scroll_to_top">Лучшие</string> <string name="scroll_to_top">Лучшие</string>
<string name="scroll_to_bottom">Снизу</string> <string name="scroll_to_bottom">Снизу</string>

View File

@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -302,7 +302,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -321,6 +320,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -190,7 +190,7 @@
<string name="hide_kernel_kernelsu_version">Çekirdek sürümünü gizle</string> <string name="hide_kernel_kernelsu_version">Çekirdek sürümünü gizle</string>
<string name="hide_kernel_kernelsu_version_summary">Çekirdek sürümünü gizle</string> <string name="hide_kernel_kernelsu_version_summary">Çekirdek sürümünü gizle</string>
<string name="hide_other_info">Diğer bilgileri gizle</string> <string name="hide_other_info">Diğer bilgileri gizle</string>
<string name="hide_other_info_summary">Ana sayfadaki süper kullanıcı sayısı, modüller ve KPM modülleri hakkındaki bilgileri gizler</string> <string name="hide_other_info_summary">Gezinme çubuğu sayfasında süper kullanıcı, modül ve KPM modülü sayısı hakkında bilgi veren kırmızı noktayı gizler</string>
<string name="hide_susfs_status">SuSFS durumunu gizle</string> <string name="hide_susfs_status">SuSFS durumunu gizle</string>
<string name="hide_susfs_status_summary">Ana sayfadaki SuSFS durum bilgilerini gizle</string> <string name="hide_susfs_status_summary">Ana sayfadaki SuSFS durum bilgilerini gizle</string>
<string name="hide_link_card">Bağlantı Kartı Durumunu Gizle</string> <string name="hide_link_card">Bağlantı Kartı Durumunu Gizle</string>
@@ -289,7 +289,7 @@
<string name="horizon_getting_original_slot">Orijinal yuva alınıyor</string> <string name="horizon_getting_original_slot">Orijinal yuva alınıyor</string>
<string name="horizon_setting_target_slot">Belirtilen yuva ayarlanıyor</string> <string name="horizon_setting_target_slot">Belirtilen yuva ayarlanıyor</string>
<string name="horizon_restoring_original_slot">Varsayılan Yuvayı Geri Yükle</string> <string name="horizon_restoring_original_slot">Varsayılan Yuvayı Geri Yükle</string>
<string name="current_slot">Mevcut Yuva%1$s </string> <string name="current_slot">Geçerli varsayılan sistem yuvası: %1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Kopyalama başarısız</string> <string name="horizon_copy_failed">Kopyalama başarısız</string>
<string name="horizon_unknown_error">Bilinmeyen hata</string> <string name="horizon_unknown_error">Bilinmeyen hata</string>
@@ -302,7 +302,6 @@
<string name="configuration">Yapılandır</string> <string name="configuration">Yapılandır</string>
<string name="app_settings">Uygulama Ayarları</string> <string name="app_settings">Uygulama Ayarları</string>
<string name="tools">Araçlar</string> <string name="tools">Araçlar</string>
<string name="currently_selected">Şu anda</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Kaldır</string> <string name="clear">Kaldır</string>
<string name="apps_with_root">Root izinlerine sahip uygulamalar</string> <string name="apps_with_root">Root izinlerine sahip uygulamalar</string>
@@ -321,15 +320,18 @@
<string name="susfs_disabled">SuSFS devre dışı</string> <string name="susfs_disabled">SuSFS devre dışı</string>
<string name="background_set_success">Arka plan başarıyla ayarlandı</string> <string name="background_set_success">Arka plan başarıyla ayarlandı</string>
<string name="background_removed">Özel arka planlar kaldırıldı</string> <string name="background_removed">Özel arka planlar kaldırıldı</string>
<string name="icon_switch_title">Alternatif simge</string>
<string name="icon_switch_summary">Başlatıcı simgesini KernelSU simgesiyle değiştir.</string>
<string name="icon_switched">Simge değiştirildi</string>
<string name="root_require_for_install">Root ayrıcalıkları gerektirir</string> <string name="root_require_for_install">Root ayrıcalıkları gerektirir</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">KPM İşlevini Görüntüle</string> <string name="show_kpm_info">KPM İşlevini Gizle</string>
<string name="show_kpm_info_summary">Ana sayfa ve alt çubukta KPM bilgilerini ve İşlevini görüntüle (Uygulamayı yeniden açmanız gerekir)</string> <string name="show_kpm_info_summary">Ana sayfa ve alt çubuktaki KPM bilgilerini ve işlevini gizler</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Kullanılacak WebUI motorunu seç</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Otomatik Seçim</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">WebUI X kullanımını zorla</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">KSU WebUI kullanımını zorunlu kıl</string>
<string name="use_webuix_eruda">WebUI X\'e Eruda enjekte et</string> <string name="use_webuix_eruda">WebUI X\'e Eruda enjekte et</string>
<string name="use_webuix_eruda_summary">WebUI X\'e bir hata ayıklama konsolu enjekte edin, böylece hata ayıklama daha kolay olur. Web hata ayıklamanın açık olması gerekir.</string> <string name="use_webuix_eruda_summary">WebUI X\'e bir hata ayıklama konsolu enjekte edin, böylece hata ayıklama daha kolay olur. Web hata ayıklamanın açık olması gerekir.</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->
@@ -367,5 +369,5 @@
<string name="installing_module">Modül yükleniyor %1$d/%2$d</string> <string name="installing_module">Modül yükleniyor %1$d/%2$d</string>
<string name="module_failed_count">Yeni bir modül yüklenemedi: %d başarısız</string> <string name="module_failed_count">Yeni bir modül yüklenemedi: %d başarısız</string>
<string name="module_download_error">Modül indirilemedi</string> <string name="module_download_error">Modül indirilemedi</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">Çekirdek Flash\'lama</string>
</resources> </resources>

View File

@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,6 +322,9 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Display KPM Function</string>

View File

@@ -68,11 +68,11 @@
<string name="profile_groups">Nhóm</string> <string name="profile_groups">Nhóm</string>
<string name="profile_capabilities">Tính tương thích</string> <string name="profile_capabilities">Tính tương thích</string>
<string name="profile_selinux_context">Bối cảnh SELinux</string> <string name="profile_selinux_context">Bối cảnh SELinux</string>
<string name="profile_umount_modules">Bỏ gắn kết các module</string> <string name="profile_umount_modules">Unmount modules</string>
<string name="failed_to_update_app_profile">Cập nhật Hồ sơ ứng dụng cho %s thất bại</string> <string name="failed_to_update_app_profile">Cập nhật Hồ sơ ứng dụng cho %s thất bại</string>
<string name="require_kernel_version" formatted="false">Phiên bản SukiSU Ultra hiện tại %d quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %d hoặc cao hơn!</string> <string name="require_kernel_version" formatted="false">Phiên bản SukiSU Ultra hiện tại %d quá thấp để trình quản lý hoạt động bình thường. Vui lòng cập nhật lên phiên bản %d hoặc cao hơn!</string>
<string name="settings_umount_modules_default">Bỏ gắn kết các module cho toàn hệ thống</string> <string name="settings_umount_modules_default">Unmount modules</string>
<string name="settings_umount_modules_default_summary">Giá trị mặc định chung cho \"Bỏ gắn kết các module\" trong Hồ sơ ứng dụng. Nếu được bật, mọi thay đổi hệ thống do các module gây ra sẽ bị gỡ bỏ khỏi hệ thống và các ứng dụng chưa thiết lập hồ sơ</string> <string name="settings_umount_modules_default_summary">Giá trị mặc định chung cho \"Unmount modules\" trong Hồ sơ ứng dụng. Nếu được bật, mọi thay đổi hệ thống do các module gây ra sẽ bị gỡ bỏ khỏi hệ thống và các ứng dụng chưa thiết lập hồ sơ</string>
<string name="settings_susfs_toggle">Ẩn hooks kprobe</string> <string name="settings_susfs_toggle">Ẩn hooks kprobe</string>
<string name="profile_umount_modules_summary">Bật tùy chọn này sẽ cho phép SukiSU Ultra khôi phục mọi file đã được các module sửa đổi trong ứng dụng này</string> <string name="profile_umount_modules_summary">Bật tùy chọn này sẽ cho phép SukiSU Ultra khôi phục mọi file đã được các module sửa đổi trong ứng dụng này</string>
<string name="profile_selinux_domain">Tên miền</string> <string name="profile_selinux_domain">Tên miền</string>
@@ -171,12 +171,12 @@
<string name="restore_allowlist">Khôi phục danh sách cho phép</string> <string name="restore_allowlist">Khôi phục danh sách cho phép</string>
<string name="settings_custom_background">Tuỳ chỉnh nền ứng dụng</string> <string name="settings_custom_background">Tuỳ chỉnh nền ứng dụng</string>
<string name="settings_custom_background_summary">Chọn một hình ảnh làm hình nền</string> <string name="settings_custom_background_summary">Chọn một hình ảnh làm hình nền</string>
<string name="settings_card_alpha">Độ trong suốt của thanh tác vụ</string> <string name="settings_card_alpha">Độ trong suốt của thanh điều hướng</string>
<string name="settings_restore_default">Khôi phục mặc định</string> <string name="settings_restore_default">Khôi phục mặc định</string>
<string name="home_android_version">Phiên bản Android</string> <string name="home_android_version">Phiên bản Android</string>
<string name="home_device_model">Model thiết bị</string> <string name="home_device_model">Model thiết bị</string>
<string name="su_not_allowed">Quyền SU cho %s chưa được cấp</string> <string name="su_not_allowed">Quyền SU cho %s chưa được cấp</string>
<string name="settings_disable_su">Vô hiệu hoá khả năng của lệnh SU</string> <string name="settings_disable_su">Vô hiệu hoá lệnh SU</string>
<string name="settings_disable_su_summary">Vô hiệu hoá khả năng thực thi lệnh SU để lấy quyền root (Những app đã cấp trước đó không bị ảnh hưởng)</string> <string name="settings_disable_su_summary">Vô hiệu hoá khả năng thực thi lệnh SU để lấy quyền root (Những app đã cấp trước đó không bị ảnh hưởng)</string>
<string name="using_mksu_manager">Bạn đang sử dụng trình quản lý SukiSU Beta</string> <string name="using_mksu_manager">Bạn đang sử dụng trình quản lý SukiSU Beta</string>
<string name="module_install_multiple_confirm">Bạn có chắc muốn cài đặt các module %d đã chọn không?</string> <string name="module_install_multiple_confirm">Bạn có chắc muốn cài đặt các module %d đã chọn không?</string>
@@ -187,10 +187,10 @@
<string name="selinux_disabled">Đang tắt</string> <string name="selinux_disabled">Đang tắt</string>
<string name="simple_mode">Chế độ đơn giản</string> <string name="simple_mode">Chế độ đơn giản</string>
<string name="simple_mode_summary">Ẩn các thẻ không cần thiết ở trang chủ</string> <string name="simple_mode_summary">Ẩn các thẻ không cần thiết ở trang chủ</string>
<string name="hide_kernel_kernelsu_version">Ẩn phiên bản kernel</string> <string name="hide_kernel_kernelsu_version">Ẩn phiên bản Kernel</string>
<string name="hide_kernel_kernelsu_version_summary">Ẩn thông tin phiên bản kernel ở trang chủ</string> <string name="hide_kernel_kernelsu_version_summary">Ẩn thông tin phiên bản Kernel ở trang chủ</string>
<string name="hide_other_info">Ẩn thông tin khác</string> <string name="hide_other_info">Ẩn thông tin số lượng</string>
<string name="hide_other_info_summary">Ẩn thông tin về số lượng ứng dụng đã được cấp quyền root, các module và các kpmodule trang chủ</string> <string name="hide_other_info_summary">Ẩn thông tin về số lượng ở các mục Superuser, Module và KPModule trên thanh điều hướng</string>
<string name="hide_susfs_status">Ẩn trạng thái SuSFS</string> <string name="hide_susfs_status">Ẩn trạng thái SuSFS</string>
<string name="hide_susfs_status_summary">Ẩn thông tin trạng thái SuSFS ở trang chủ</string> <string name="hide_susfs_status_summary">Ẩn thông tin trạng thái SuSFS ở trang chủ</string>
<string name="hide_link_card">Ẩn trạng thái thẻ liên kết</string> <string name="hide_link_card">Ẩn trạng thái thẻ liên kết</string>
@@ -212,7 +212,7 @@
<string name="color_yellow">Vàng</string> <string name="color_yellow">Vàng</string>
<string name="flash_option">Tuỳ chọn Flash</string> <string name="flash_option">Tuỳ chọn Flash</string>
<string name="flash_option_tip">Chọn file cần Flash</string> <string name="flash_option_tip">Chọn file cần Flash</string>
<string name="horizon_kernel">Cài đặt Anykernel3</string> <string name="horizon_kernel">Cài đặt AnyKernel3</string>
<string name="horizon_kernel_summary">Flash file AnyKernel3</string> <string name="horizon_kernel_summary">Flash file AnyKernel3</string>
<string name="root_required">Yêu cầu quyền root</string> <string name="root_required">Yêu cầu quyền root</string>
<string name="copy_failed">Sao chép file thất bại</string> <string name="copy_failed">Sao chép file thất bại</string>
@@ -232,8 +232,8 @@
<string name="kpm_uninstall_success">Gỡ cài đặt thành công</string> <string name="kpm_uninstall_success">Gỡ cài đặt thành công</string>
<string name="kpm_uninstall_failed">Gỡ cài đặt thất bại</string> <string name="kpm_uninstall_failed">Gỡ cài đặt thất bại</string>
<string name="kpm_install">Cài đặt</string> <string name="kpm_install">Cài đặt</string>
<string name="kpm_install_success">Load kpmodule thành công</string> <string name="kpm_install_success">Load KPModule thành công</string>
<string name="kpm_install_failed">Load kpmodule thất bại</string> <string name="kpm_install_failed">Load KPModule thất bại</string>
<string name="kpm_args">Thông số</string> <string name="kpm_args">Thông số</string>
<string name="kpm_control">Tuỳ chỉnh</string> <string name="kpm_control">Tuỳ chỉnh</string>
<string name="home_kpm_version">Phiên bản KPM</string> <string name="home_kpm_version">Phiên bản KPM</string>
@@ -251,7 +251,7 @@
<string name="kernel_not_enabled">Kernel chưa được cấu hình</string> <string name="kernel_not_enabled">Kernel chưa được cấu hình</string>
<string name="custom_settings">Cài đặt giản lược</string> <string name="custom_settings">Cài đặt giản lược</string>
<string name="kpm_install_mode">Cài đặt KPM</string> <string name="kpm_install_mode">Cài đặt KPM</string>
<string name="kpm_install_mode_load">Tải</string> <string name="kpm_install_mode_load">Load</string>
<string name="kpm_install_mode_embed">Nhúng</string> <string name="kpm_install_mode_embed">Nhúng</string>
<string name="kpm_install_mode_description">Vui lòng chọn: %1\$s Chế Độ Cài Đặt Module \n\nTải: Tải tạm thời module \nNhúng: Cài đặt vĩnh viễn vào hệ thống</string> <string name="kpm_install_mode_description">Vui lòng chọn: %1\$s Chế Độ Cài Đặt Module \n\nTải: Tải tạm thời module \nNhúng: Cài đặt vĩnh viễn vào hệ thống</string>
<string name="log_failed_to_check_module_file">Kiểm tra file module thất bại</string> <string name="log_failed_to_check_module_file">Kiểm tra file module thất bại</string>
@@ -266,7 +266,7 @@
<string name="settings_susfs_toggle_summary">Vô hiệu hóa các hook kprobe được tạo bởi SukiSU Ultra, thay vào đó sử dụng các hook nội tuyến, tương tự như phương pháp hook kernel không phải GKI</string> <string name="settings_susfs_toggle_summary">Vô hiệu hóa các hook kprobe được tạo bởi SukiSU Ultra, thay vào đó sử dụng các hook nội tuyến, tương tự như phương pháp hook kernel không phải GKI</string>
<string name="image_editor_title">Điều chỉnh hình nền</string> <string name="image_editor_title">Điều chỉnh hình nền</string>
<string name="image_editor_hint">Sử dụng hai ngón tay để phóng to hình ảnh và một ngón tay để kéo nó để điều chỉnh vị trí</string> <string name="image_editor_hint">Sử dụng hai ngón tay để phóng to hình ảnh và một ngón tay để kéo nó để điều chỉnh vị trí</string>
<string name="background_image_error">Không thể tải hình ảnh</string> <string name="background_image_error">Không thể load hình ảnh</string>
<string name="reprovision">Chọn lại</string> <string name="reprovision">Chọn lại</string>
<!-- Kernel Flash Progress Related --> <!-- Kernel Flash Progress Related -->
<string name="horizon_flash_title">Kernel Flashing</string> <string name="horizon_flash_title">Kernel Flashing</string>
@@ -302,7 +302,6 @@
<string name="configuration">Cấu hình</string> <string name="configuration">Cấu hình</string>
<string name="app_settings">Cài đặt ứng dụng</string> <string name="app_settings">Cài đặt ứng dụng</string>
<string name="tools">Công cụ</string> <string name="tools">Công cụ</string>
<string name="currently_selected">Hiện tại</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Loại bỏ</string> <string name="clear">Loại bỏ</string>
<string name="apps_with_root">Các ứng dụng đã cấp quyền Root</string> <string name="apps_with_root">Các ứng dụng đã cấp quyền Root</string>
@@ -321,12 +320,15 @@
<string name="susfs_disabled">SuSFS đã tắt</string> <string name="susfs_disabled">SuSFS đã tắt</string>
<string name="background_set_success">Đã cài đặt hình nền thành công</string> <string name="background_set_success">Đã cài đặt hình nền thành công</string>
<string name="background_removed">Đã xóa hình nền tùy chỉnh</string> <string name="background_removed">Đã xóa hình nền tùy chỉnh</string>
<string name="icon_switch_title">Thay thế icon</string>
<string name="icon_switch_summary">Thay đổi icon SukiSU thành icon của KernelSU</string>
<string name="icon_switched">Đã thay đổi icon</string>
<string name="root_require_for_install">Yêu cầu quyền root</string> <string name="root_require_for_install">Yêu cầu quyền root</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Hiển thị chức năng KPM</string> <string name="show_kpm_info">Ẩn chức năng KPM</string>
<string name="show_kpm_info_summary">Hiển thị thông tin KPM, chức năng ở trang chủ và thanh dưới cùng (Cần khởi động lại ứng dụng)</string> <string name="show_kpm_info_summary">Ẩn thông tin chức năng của KPM ở trang chủ và thanh điều hướng</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Chọn công cụ WebUI để sử dụng</string> <string name="use_webuix">Tuỳ chỉnh WebUI</string>
<string name="engine_auto_select">Tự động chọn</string> <string name="engine_auto_select">Tự động chọn</string>
<string name="engine_force_webuix">Sử dụng WebUI X</string> <string name="engine_force_webuix">Sử dụng WebUI X</string>
<string name="engine_force_ksu">Sử dụng KSU WebUI</string> <string name="engine_force_ksu">Sử dụng KSU WebUI</string>
@@ -360,7 +362,7 @@
<string name="unauthorized">Huỷ uỷ quyền</string> <string name="unauthorized">Huỷ uỷ quyền</string>
<string name="selected">Đã chọn</string> <string name="selected">Đã chọn</string>
<string name="select">Chọn</string> <string name="select">Chọn</string>
<string name="profile_umount_modules_disable">Vô hiệu hóa bỏ gắn kết các module</string> <string name="profile_umount_modules_disable">Vô hiệu hóa unmount modules</string>
<!-- Flash related --> <!-- Flash related -->
<string name="error_code">Code lỗi</string> <string name="error_code">Code lỗi</string>
<string name="check_log">Vui lòng kiểm tra logs</string> <string name="check_log">Vui lòng kiểm tra logs</string>

View File

@@ -35,7 +35,7 @@
<string name="settings">设置</string> <string name="settings">设置</string>
<string name="reboot_userspace">软重启</string> <string name="reboot_userspace">软重启</string>
<string name="reboot_recovery">重启到 Recovery</string> <string name="reboot_recovery">重启到 Recovery</string>
<string name="reboot_bootloader">重启到 BootLoader</string> <string name="reboot_bootloader">重启到 Bootloader</string>
<string name="reboot_download">重启到 Download</string> <string name="reboot_download">重启到 Download</string>
<string name="reboot_edl">重启到 EDL</string> <string name="reboot_edl">重启到 EDL</string>
<string name="about">关于</string> <string name="about">关于</string>
@@ -190,7 +190,7 @@
<string name="hide_kernel_kernelsu_version">隐藏内核版本号</string> <string name="hide_kernel_kernelsu_version">隐藏内核版本号</string>
<string name="hide_kernel_kernelsu_version_summary">隐藏内核部分的 KernelSU 版本号</string> <string name="hide_kernel_kernelsu_version_summary">隐藏内核部分的 KernelSU 版本号</string>
<string name="hide_other_info">强迫症开关</string> <string name="hide_other_info">强迫症开关</string>
<string name="hide_other_info_summary">隐藏主页上的超级用户数、模块数和 KPM 模块数信息</string> <string name="hide_other_info_summary">隐藏导航栏上的超级用户数、模块数和 KPM 模块数红点</string>
<string name="hide_susfs_status">隐藏 SuSFS 状态信息</string> <string name="hide_susfs_status">隐藏 SuSFS 状态信息</string>
<string name="hide_susfs_status_summary">隐藏主页上的 SuSFS 状态信息</string> <string name="hide_susfs_status_summary">隐藏主页上的 SuSFS 状态信息</string>
<string name="hide_link_card">隐藏链接卡片</string> <string name="hide_link_card">隐藏链接卡片</string>
@@ -232,8 +232,8 @@
<string name="kpm_uninstall_success">卸载成功</string> <string name="kpm_uninstall_success">卸载成功</string>
<string name="kpm_uninstall_failed">卸载失败</string> <string name="kpm_uninstall_failed">卸载失败</string>
<string name="kpm_install">选择安装</string> <string name="kpm_install">选择安装</string>
<string name="kpm_install_success">加载 kpm 模块成功</string> <string name="kpm_install_success">加载 KPM 模块成功</string>
<string name="kpm_install_failed">加载 kpm 模块失败</string> <string name="kpm_install_failed">加载 KPM 模块失败</string>
<string name="kpm_args">参数</string> <string name="kpm_args">参数</string>
<string name="kpm_control">调参</string> <string name="kpm_control">调参</string>
<string name="home_kpm_version">KPM 版本</string> <string name="home_kpm_version">KPM 版本</string>
@@ -245,7 +245,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra 未来将会成为一个相对独立的 KSU 分支,但是依然感谢官方 KernelSU 和 MKSU 等做出的贡献</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra 未来将会成为一个相对独立的 KSU 分支,但是依然感谢官方 KernelSU 和 MKSU 等做出的贡献</string>
<string name="not_supported">不支持</string> <string name="not_supported">不支持</string>
<string name="supported">支持</string> <string name="supported">支持</string>
<string name="home_kpm_module">"KPM 模块数:%d "</string> <string name="home_kpm_module">"内核模块数:%d "</string>
<string name="kpm_invalid_file">KPM 文件无效</string> <string name="kpm_invalid_file">KPM 文件无效</string>
<string name="kernel_patched">内核未进行补丁</string> <string name="kernel_patched">内核未进行补丁</string>
<string name="kernel_not_enabled">内核未配置</string> <string name="kernel_not_enabled">内核未配置</string>
@@ -262,7 +262,7 @@
<string name="theme_color">主题颜色</string> <string name="theme_color">主题颜色</string>
<string name="invalid_file_type">文件类型不正确,请选择 .kpm 文件</string> <string name="invalid_file_type">文件类型不正确,请选择 .kpm 文件</string>
<string name="confirm_uninstall_title_with_filename">卸载</string> <string name="confirm_uninstall_title_with_filename">卸载</string>
<string name="confirm_uninstall_content">将卸载以下 kpm 模块:\n%s</string> <string name="confirm_uninstall_content">将卸载以下 KPM 模块:\n%s</string>
<string name="settings_susfs_toggle_summary">禁用由 KernelSU 创建的 kprobe 钩子,并使用非 kprobe 内联钩子代替,实现方式类似于不支持 kprobe 的非 GKI 内核。</string> <string name="settings_susfs_toggle_summary">禁用由 KernelSU 创建的 kprobe 钩子,并使用非 kprobe 内联钩子代替,实现方式类似于不支持 kprobe 的非 GKI 内核。</string>
<string name="image_editor_title">调整背景图片</string> <string name="image_editor_title">调整背景图片</string>
<string name="image_editor_hint">使用双指缩放图片,单指拖动调整位置</string> <string name="image_editor_hint">使用双指缩放图片,单指拖动调整位置</string>
@@ -289,7 +289,7 @@
<string name="horizon_getting_original_slot">获取原有槽位</string> <string name="horizon_getting_original_slot">获取原有槽位</string>
<string name="horizon_setting_target_slot">设置指定槽位</string> <string name="horizon_setting_target_slot">设置指定槽位</string>
<string name="horizon_restoring_original_slot">恢复默认槽位</string> <string name="horizon_restoring_original_slot">恢复默认槽位</string>
<string name="current_slot">当前槽位:%1$s </string> <string name="current_slot">当前系统默认槽位:%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">复制失败</string> <string name="horizon_copy_failed">复制失败</string>
<string name="horizon_unknown_error">未知错误</string> <string name="horizon_unknown_error">未知错误</string>
@@ -302,7 +302,6 @@
<string name="configuration">配置</string> <string name="configuration">配置</string>
<string name="app_settings">应用设置</string> <string name="app_settings">应用设置</string>
<string name="tools">工具</string> <string name="tools">工具</string>
<string name="currently_selected">当前</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">清除</string> <string name="clear">清除</string>
<string name="apps_with_root">Root 权限应用</string> <string name="apps_with_root">Root 权限应用</string>
@@ -321,10 +320,13 @@
<string name="susfs_disabled">SuSFS 已禁用</string> <string name="susfs_disabled">SuSFS 已禁用</string>
<string name="background_set_success">背景设置成功</string> <string name="background_set_success">背景设置成功</string>
<string name="background_removed">已移除自定义背景</string> <string name="background_removed">已移除自定义背景</string>
<string name="icon_switch_title">备选图标</string>
<string name="icon_switch_summary">更换为 KernelSU 图标</string>
<string name="icon_switched">已切换图标</string>
<string name="root_require_for_install">需要 root 权限</string> <string name="root_require_for_install">需要 root 权限</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">显示 KPM 功能</string> <string name="show_kpm_info">隐藏 KPM 功能</string>
<string name="show_kpm_info_summary">在主页和底栏显示 KPM 相关功能和信息 (需要重新打开应用)</string> <string name="show_kpm_info_summary">在主页和底栏隐藏 KPM 相关功能和信息</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">选择使用的 WebUI 引擎</string> <string name="use_webuix">选择使用的 WebUI 引擎</string>
<string name="engine_auto_select">自动选择</string> <string name="engine_auto_select">自动选择</string>

View File

@@ -291,7 +291,7 @@
<string name="horizon_getting_original_slot">獲取原始槽位</string> <string name="horizon_getting_original_slot">獲取原始槽位</string>
<string name="horizon_setting_target_slot">設定指定槽位</string> <string name="horizon_setting_target_slot">設定指定槽位</string>
<string name="horizon_restoring_original_slot">恢復原始槽位</string> <string name="horizon_restoring_original_slot">恢復原始槽位</string>
<string name="current_slot">當前槽位:%1$s </string> <string name="current_slot">當前系统槽位:%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">複製失敗</string> <string name="horizon_copy_failed">複製失敗</string>
<string name="horizon_unknown_error">未知錯誤</string> <string name="horizon_unknown_error">未知錯誤</string>
@@ -304,7 +304,6 @@
<string name="configuration">配置</string> <string name="configuration">配置</string>
<string name="app_settings">應用設置</string> <string name="app_settings">應用設置</string>
<string name="tools">工具</string> <string name="tools">工具</string>
<string name="currently_selected">現在</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">清除</string> <string name="clear">清除</string>
<string name="apps_with_root">應用已擁有root權限</string> <string name="apps_with_root">應用已擁有root權限</string>
@@ -323,10 +322,13 @@
<string name="susfs_disabled">SuSFS 未啟用</string> <string name="susfs_disabled">SuSFS 未啟用</string>
<string name="background_set_success">背景設置成功</string> <string name="background_set_success">背景設置成功</string>
<string name="background_removed">刪除背景</string> <string name="background_removed">刪除背景</string>
<string name="icon_switch_title">備選圖示</string>
<string name="icon_switch_summary">將啟動器圖示變更為 KernelSU 圖示</string>
<string name="icon_switched">圖示已切換</string>
<string name="root_require_for_install">需要root權限</string> <string name="root_require_for_install">需要root權限</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">顯示KPM功能</string> <string name="show_kpm_info">隐藏KPM功能</string>
<string name="show_kpm_info_summary">顯示KPM功能和信息在主頁和工具欄(需要重新打開應用)</string> <string name="show_kpm_info_summary">隐藏KPM功能和信息在主頁和工具欄</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">選擇使用的 WebUI 引擎</string> <string name="use_webuix">選擇使用的 WebUI 引擎</string>
<string name="engine_auto_select">自動選擇</string> <string name="engine_auto_select">自動選擇</string>

View File

@@ -2,34 +2,34 @@
<resources> <resources>
<string name="home">首頁</string> <string name="home">首頁</string>
<string name="home_not_installed">尚未安裝</string> <string name="home_not_installed">尚未安裝</string>
<string name="home_click_to_install">開始安裝</string> <string name="home_click_to_install">開始安裝</string>
<string name="home_working">已開始運作</string> <string name="home_working">運作</string>
<string name="home_working_version">版本:%d</string> <string name="home_working_version">版本:%d</string>
<string name="home_superuser_count">授權:%d 個應用程式</string> <string name="home_superuser_count">超級使用者數量:%d</string>
<string name="home_module_count">掛載:%d 個模組</string> <string name="home_module_count">模組數量:%d</string>
<string name="home_unsupported">未受支援</string> <string name="home_unsupported">支援</string>
<string name="home_unsupported_reason">KernelSU 目前僅支援 GKI 核心</string> <string name="home_unsupported_reason">未在内核上偵測到 KernelSU 驅動程式,内核錯誤?</string>
<string name="home_kernel">裝置核心</string> <string name="home_kernel">内核版本</string>
<string name="home_susfs">SuSFS: %s</string> <string name="home_susfs">SuSFS%s</string>
<string name="home_susfs_version">SuSFS Version</string> <string name="home_susfs_version">SuSFS 版本</string>
<string name="home_susfs_sus_su">SuS SU</string> <string name="home_susfs_sus_su">SuS SU</string>
<string name="home_manager_version">管理工具</string> <string name="home_manager_version">管理器版本</string>
<string name="home_fingerprint">指紋資訊</string> <string name="home_fingerprint">系統指紋</string>
<string name="home_selinux_status">SELinux 狀態</string> <string name="home_selinux_status">SELinux 狀態</string>
<string name="selinux_status_disabled"></string> <string name="selinux_status_disabled"></string>
<string name="selinux_status_enforcing">強制執行</string> <string name="selinux_status_enforcing">強制執行</string>
<string name="selinux_status_permissive">容許執行</string> <string name="selinux_status_permissive">寬鬆模式</string>
<string name="selinux_status_unknown">不明</string> <string name="selinux_status_unknown">未知</string>
<string name="superuser">授權</string> <string name="superuser">超級使用者</string>
<string name="module_failed_to_enable">無法啟用模組:%s</string> <string name="module_failed_to_enable">無法啟用模組:%s</string>
<string name="module_failed_to_disable">無法用模組:%s</string> <string name="module_failed_to_disable">無法用模組:%s</string>
<string name="module_empty">查無已安裝的模組</string> <string name="module_empty">尚未安裝任何模組</string>
<string name="module">模組</string> <string name="module">模組</string>
<string name="module_sort_action_first">Sort (Action first)</string> <string name="module_sort_action_first">排序(可執行優先)</string>
<string name="module_sort_enabled_first">Sort (Enabled first)</string> <string name="module_sort_enabled_first">排序(已啟用優先)</string>
<string name="uninstall">解除安裝</string> <string name="uninstall">解除安裝</string>
<string name="restore">Restore</string> <string name="restore">還原</string>
<string name="module_install">安裝</string> <string name="module_install">安裝模組</string>
<string name="install">安裝</string> <string name="install">安裝</string>
<string name="reboot">重新啟動</string> <string name="reboot">重新啟動</string>
<string name="settings">設定</string> <string name="settings">設定</string>
@@ -39,333 +39,335 @@
<string name="reboot_download">重新啟動至 Download</string> <string name="reboot_download">重新啟動至 Download</string>
<string name="reboot_edl">重新啟動至 EDL</string> <string name="reboot_edl">重新啟動至 EDL</string>
<string name="about">關於</string> <string name="about">關於</string>
<string name="module_uninstall_confirm">你是否要解除安裝「%s」模組?</string> <string name="module_uninstall_confirm">確定要解除安裝模組 %s 嗎</string>
<string name="module_uninstall_success">%s已解除安裝</string> <string name="module_uninstall_success">%s 已解除安裝</string>
<string name="module_uninstall_failed">無法解除安裝:%s</string> <string name="module_uninstall_failed">解除安裝失敗%s</string>
<string name="module_version">版本</string> <string name="module_version">版本</string>
<string name="module_author">作者</string> <string name="module_author">作者</string>
<string name="refresh">重新載入</string> <string name="refresh">重新整理</string>
<string name="show_system_apps">顯示系統程式</string> <string name="show_system_apps">顯示系統應用程式</string>
<string name="hide_system_apps">隱藏系統程式</string> <string name="hide_system_apps">隱藏系統應用程式</string>
<string name="send_log">發送運作日誌</string> <string name="send_log">傳送日誌</string>
<string name="safe_mode">安全模式</string> <string name="safe_mode">安全模式</string>
<string name="reboot_to_apply">將在重新啟動生效</string> <string name="reboot_to_apply">重新啟動生效</string>
<string name="module_magisk_conflict">與 Magisk 發生衝突,無法使用模組功能</string> <string name="module_magisk_conflict">與 Magisk 衝突,所有模組將無法使用!</string>
<string name="home_learn_kernelsu">深入瞭解 KernelSU</string> <string name="home_learn_kernelsu">解 KernelSU</string>
<string name="home_learn_kernelsu_url">https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html</string> <string name="home_learn_kernelsu_url">https://kernelsu.org/zh_TW/guide/what-is-kernelsu.html</string>
<string name="home_click_to_learn_kernelsu">知曉安裝、使用 KernelSU 本體與其模組功能的方法</string> <string name="home_click_to_learn_kernelsu">了解如何安裝 KernelSU 以及如何開發模組</string>
<string name="home_support_title">協助發展</string> <string name="home_support_title">支持開發</string>
<string name="home_support_content">KernelSU 一向以免費製品與開放原始碼自居,矢志不渝。若想協助我們,請以小額捐款表達你對專案發展的大力支持。</string> <string name="home_support_content">KernelSU 將保持免費開源,向開發者捐款以表支持。</string>
<string name="about_source_code"><![CDATA[View source code at %1$s<br/>Join our %2$s channel]]></string> <string name="about_source_code"><![CDATA[在 %1$s 查看原始碼<br/>加入我們的 %2$s 頻道<br/>加入我們的 <b><a href="https://qm.qq.com/q/WbrOMxgLG8">QQ 群聊</a></b>]]></string>
<string name="profile_default">預設</string> <string name="profile_default">預設</string>
<string name="profile_template">範本</string> <string name="profile_template">模板</string>
<string name="profile_custom">自訂</string> <string name="profile_custom">自訂</string>
<string name="profile_name">Profile 名稱</string> <string name="profile_name">名稱</string>
<string name="profile_namespace">命名空間掛載</string> <string name="profile_namespace">命名空間</string>
<string name="profile_namespace_inherited">繼承</string> <string name="profile_namespace_inherited">繼承</string>
<string name="profile_namespace_global">全域</string> <string name="profile_namespace_global">全域</string>
<string name="profile_namespace_individual">個體</string> <string name="profile_namespace_individual">私有</string>
<string name="profile_groups">群組</string> <string name="profile_groups">群組</string>
<string name="profile_capabilities">權限</string> <string name="profile_capabilities">權限</string>
<string name="profile_selinux_context">SELinux 上下文</string> <string name="profile_selinux_context">SELinux 上下文</string>
<string name="profile_umount_modules">解除掛載模組功能</string> <string name="profile_umount_modules">載模組</string>
<string name="failed_to_update_app_profile">無法更新「%s」App Profile</string> <string name="failed_to_update_app_profile">為 %s 更新應用程式設定檔失敗</string>
<string name="require_kernel_version" formatted="false">管理工具無法以老舊的 KernelSU %d 版本正常運作。請升級至 %d 以上的版本</string> <string name="require_kernel_version" formatted="false">目前 KernelSU 版本 %d 過低,管理器無法正常運作,請將内核 KernelSU 版本升級至 %d 以上!</string>
<string name="settings_umount_modules_default">預設解除掛載模組功能</string> <string name="settings_umount_modules_default">預設載模組</string>
<string name="settings_umount_modules_default_summary">將 App Profile 的全域預設行為設作「解除掛載模組功能」。啟用,將向未指派 Profile 的應用程式移除模組功能</string> <string name="settings_umount_modules_default_summary">應用程式設定檔中「卸載模組」的全域預設值,若啟用,將為未設定設定檔的應用程式移除所有模組對系統的修改</string>
<string name="settings_susfs_toggle">Disable kprobe hooks</string> <string name="settings_susfs_toggle">禁用 kprobe 切換</string>
<string name="profile_umount_modules_summary">啟用選項後KernelSU 會將應用程式內遭模組修改的檔案恢復原狀</string> <string name="profile_umount_modules_summary">啟用選項後,將允許 KernelSU 為此應用程式還原被模組修改的檔案。</string>
<string name="profile_selinux_domain"></string> <string name="profile_selinux_domain"></string>
<string name="profile_selinux_rules">規則</string> <string name="profile_selinux_rules">規則</string>
<string name="module_update">更新</string> <string name="module_update">更新</string>
<string name="module_downloading">正在下載模組:%s</string> <string name="module_downloading">正在下載模組:%s</string>
<string name="module_start_downloading">準備下載模組%s</string> <string name="module_start_downloading">開始下載%s</string>
<string name="new_version_available">版本 %s 現已開放下載,點選開始更新</string> <string name="new_version_available">發現新版本%s,點擊升級</string>
<string name="launch_app">開始執行</string> <string name="launch_app">啟動應用程式</string>
<string name="force_stop_app" formatted="false">強制停止</string> <string name="force_stop_app" formatted="false">強制停止</string>
<string name="restart_app">重新執行</string> <string name="restart_app">重新啟動應用程式</string>
<string name="failed_to_update_sepolicy">無法為「%s更新 SELinux 規則</string> <string name="failed_to_update_sepolicy">%s 更新 SELinux 規則失敗</string>
<string name="module_changelog">更新說明</string> <string name="module_changelog">更新日誌</string>
<string name="settings_profile_template">App Profile 範本</string> <string name="settings_profile_template">應用程式設定檔模板</string>
<string name="settings_profile_template_summary">管理 App Profile 的本地線上範本</string> <string name="settings_profile_template_summary">管理本地線上的應用程式設定檔模板</string>
<string name="app_profile_template_create">建立範本</string> <string name="app_profile_template_create">建立模板</string>
<string name="app_profile_template_edit">編輯範本</string> <string name="app_profile_template_edit">編輯模板</string>
<string name="app_profile_template_id">編號</string> <string name="app_profile_template_id">模板 ID</string>
<string name="app_profile_template_id_invalid">範本編號無效</string> <string name="app_profile_template_id_invalid">模板 ID 不合法</string>
<string name="app_profile_template_name">名稱</string> <string name="app_profile_template_name">名稱</string>
<string name="app_profile_template_description">說明</string> <string name="app_profile_template_description">描述</string>
<string name="app_profile_template_save">儲存</string> <string name="app_profile_template_save">儲存</string>
<string name="app_profile_template_delete">刪除</string> <string name="app_profile_template_delete">刪除</string>
<string name="app_profile_template_view">檢視範本</string> <string name="app_profile_template_view">檢視模板</string>
<string name="app_profile_template_readonly">唯讀</string> <string name="app_profile_template_readonly">唯讀</string>
<string name="app_profile_template_id_exist">編號已由其他範本領有</string> <string name="app_profile_template_id_exist">模板 ID 已存在</string>
<string name="app_profile_import_export">匯入匯出</string> <string name="app_profile_import_export">匯入/匯出</string>
<string name="app_profile_import_from_clipboard">剪貼簿匯入</string> <string name="app_profile_import_from_clipboard">剪貼簿匯入</string>
<string name="app_profile_export_to_clipboard">匯出至剪貼簿</string> <string name="app_profile_export_to_clipboard">匯出至剪貼簿</string>
<string name="app_profile_template_export_empty">無可匯出的本地範本</string> <string name="app_profile_template_export_empty">無可匯出的本地模板</string>
<string name="app_profile_template_import_success">已成功匯入</string> <string name="app_profile_template_import_success">匯入成功</string>
<string name="app_profile_template_sync">同步線上範本</string> <string name="app_profile_template_sync">同步線上規則</string>
<string name="app_profile_template_save_failed">無法儲存範本</string> <string name="app_profile_template_save_failed">模板儲存失敗</string>
<string name="app_profile_template_import_empty">查無剪貼簿內容</string> <string name="app_profile_template_import_empty">剪貼簿為空</string>
<string name="module_changelog_failed">無法提取更新說明%s</string> <string name="module_changelog_failed">獲取更新日誌失敗%s</string>
<string name="settings_check_update">檢查更新</string> <string name="settings_check_update">檢查更新</string>
<string name="settings_check_update_summary">開啟本應用程式時,自動檢查更新</string> <string name="settings_check_update_summary">應用程式啟動後自動檢查是否有最新版本</string>
<string name="grant_root_failed">無法獲取 Root 權限!</string> <string name="grant_root_failed">獲取 root 權限失敗</string>
<string name="action">執行</string> <string name="action">執行</string>
<string name="open">開啟</string> <string name="open">開啟</string>
<string name="close">Close</string> <string name="close">關閉</string>
<string name="enable_web_debugging">啟用 WebView </string> <string name="enable_web_debugging">啟用 WebView </string>
<string name="enable_web_debugging_summary">旨在偵錯 WebUI。請依自身狀況適時啟用。</string> <string name="enable_web_debugging_summary">可用於除錯 WebUI,請僅在需要時啟用。</string>
<string name="direct_install">直接安裝(推薦)</string> <string name="direct_install">直接安裝(推薦)</string>
<string name="select_file">選擇檔</string> <string name="select_file">選擇需要修補的映像</string>
<string name="install_inactive_slot">安裝至非作用擴充槽(適用於 OTA 更新過後)</string> <string name="install_inactive_slot">安裝至未使用的槽位(OTA 後)</string>
<string name="install_inactive_slot_warning">你的裝置將在重新啟動時**強制**開機至目前的非作用擴充槽!\n確保僅在 OTA 更新過後選擇此選項。\n是否繼續?</string> <string name="install_inactive_slot_warning">將在重新啟動後強制切換至另一槽位!\n注意僅能在 OTA 更新完成後重新啟動前使用。\n確定繼續?</string>
<string name="install_next">繼續</string> <string name="install_next">下一步</string>
<string name="select_file_tip">建議選擇 %1$s 分區映像檔</string> <string name="select_file_tip">建議選擇 %1$s 分區映像檔</string>
<string name="select_kmi">選擇 KMI</string> <string name="select_kmi">選擇 KMI</string>
<string name="settings_uninstall">解除安裝</string> <string name="settings_uninstall">解除安裝</string>
<string name="settings_uninstall_temporary">暫時性解除安裝</string> <string name="settings_uninstall_temporary">臨時解除安裝</string>
<string name="settings_uninstall_permanent">永久解除安裝</string> <string name="settings_uninstall_permanent">永久解除安裝</string>
<string name="settings_restore_stock_image">恢復原廠映像檔</string> <string name="settings_restore_stock_image">還原原廠映像檔</string>
<string name="settings_uninstall_temporary_message">時解除安裝 KernelSU。會在下次重新啟動恢復原狀</string> <string name="settings_uninstall_temporary_message">時解除安裝 KernelSU下次重新啟動恢復至原始狀態</string>
<string name="settings_uninstall_permanent_message">徹底解除安裝 KernelSU Root 授權與所有模組)。</string> <string name="settings_uninstall_permanent_message">完全且永久解除安裝 KernelSU包括 Root 權限和所有模組)。</string>
<string name="settings_restore_stock_image_message">若裝置內含有備份檔案,遂以 OTA 更新前的原廠系統映像檔進行復原。若需解除安裝 KernelSU選擇「永久解除安裝」。</string> <string name="settings_restore_stock_image_message">還原原廠映像檔(若存在備份),通常在 OTA 前使用;若需解除安裝 KernelSU使用「永久解除安裝」。</string>
<string name="flashing">正在</string> <string name="flashing">正在刷</string>
<string name="flash_success">閃刷成功</string> <string name="flash_success">刷寫完成</string>
<string name="flash_failed">刷失敗</string> <string name="flash_failed">失敗</string>
<string name="selected_lkm">已選 LKM%s</string> <string name="selected_lkm">已選擇的 LKM%s</string>
<string name="save_log">儲存運作日誌</string> <string name="save_log">儲存日誌</string>
<string name="log_saved">已儲存運作日誌</string> <string name="log_saved">日誌已儲存</string>
<string name="status_supported">Supported</string> <string name="status_supported">支援</string>
<string name="status_not_supported">Not Supported</string> <string name="status_not_supported">不支援</string>
<string name="status_unknown">Unknown</string> <string name="status_unknown">未知</string>
<string name="sus_su_mode">SuS SU mode:</string> <string name="sus_su_mode">SuS SU 模式:</string>
<!-- Module related --> <!-- Module related -->
<string name="module_install_confirm">confirm install module %1$s</string> <string name="module_install_confirm">確定要安裝模組 %1$s</string>
<string name="unknown_module">unknown module</string> <string name="unknown_module">未知模組</string>
<!-- Restore related --> <!-- Restore related -->
<string name="restore_confirm_title">Confirm Module Restoration</string> <string name="restore_confirm_title">確定還原模組</string>
<string name="restore_confirm_message">This operation will overwrite all existing modules. Continue?</string> <string name="restore_confirm_message">此操作將覆蓋所有現有模組,是否繼續?</string>
<string name="confirm">Confirm</string> <string name="confirm">確定</string>
<string name="cancel">Cancel</string> <string name="cancel">取消</string>
<!-- Backup related --> <!-- Backup related -->
<string name="backup_success">Backup successful (tar.gz)</string> <string name="backup_success">備份成功 (tar.gz)</string>
<string name="backup_failed">Backup failed: %1$s</string> <string name="backup_failed">備份失敗:%1$s</string>
<string name="backup_modules">backup modules</string> <string name="backup_modules">備份模組</string>
<string name="restore_modules">restore modules</string> <string name="restore_modules">還原模組</string>
<!-- Restore related messages --> <!-- Restore related messages -->
<string name="restore_success">Modules restored successfully, restart required</string> <string name="restore_success">模組已成功還原,需重新啟動生效</string>
<string name="restore_failed">Restore failed: %1$s</string> <string name="restore_failed">還原失敗:%1$s</string>
<string name="restart_now">Restart Now</string> <string name="restart_now">立即重新啟動</string>
<string name="unknown_error">Unknown error</string> <string name="unknown_error">未知錯誤</string>
<!-- Command related --> <!-- Command related -->
<string name="command_execution_failed">Command execution failed: %1$s</string> <string name="command_execution_failed">命令執行失敗:%1$s</string>
<!-- Allowlist related --> <!-- Allowlist related -->
<string name="allowlist_backup_success">Allowlist backup successful</string> <string name="allowlist_backup_success">應用程式清單備份成功</string>
<string name="allowlist_backup_failed">Allowlist backup failed: %1$s</string> <string name="allowlist_backup_failed">應用程式清單備份失敗:%1$s</string>
<string name="allowlist_restore_confirm_title">Confirm Allowlist Restoration</string> <string name="allowlist_restore_confirm_title">確定還原應用程式清單</string>
<string name="allowlist_restore_confirm_message">This operation will overwrite the current allowlist. Continue?</string> <string name="allowlist_restore_confirm_message">此操作將覆蓋目前的應用程式清單,是否繼續?</string>
<string name="allowlist_restore_success">Allowlist restored successfully</string> <string name="allowlist_restore_success">應用程式清單還原成功</string>
<string name="allowlist_restore_failed">Allowlist restore failed: %1$s</string> <string name="allowlist_restore_failed">應用程式清單還原失敗:%1$s</string>
<string name="backup_allowlist">Backup Allowlist</string> <string name="backup_allowlist">備份應用程式清單</string>
<string name="restore_allowlist">Restore Allowlist</string> <string name="restore_allowlist">還原應用程式清單</string>
<string name="settings_custom_background">Custom App Background</string> <string name="settings_custom_background">自訂背景</string>
<string name="settings_custom_background_summary">Select an image as background</string> <string name="settings_custom_background_summary">選擇一張圖片作為應用程式背景</string>
<string name="settings_card_alpha">Navigation bar transparency</string> <string name="settings_card_alpha">卡片不透明度</string>
<string name="settings_restore_default">Restore default</string> <string name="settings_restore_default">恢復預設</string>
<string name="home_android_version">Android version</string> <string name="home_android_version">Android 版本</string>
<string name="home_device_model">Device model</string> <string name="home_device_model">設備型號</string>
<string name="su_not_allowed">Granting superuser to %s is not allowed</string> <string name="su_not_allowed">不允許授予 %s 超級使用者權限</string>
<string name="settings_disable_su">Disable su compatibility</string> <string name="settings_disable_su">禁用 su 相容性</string>
<string name="settings_disable_su_summary">Temporarily disable any applications from obtaining root privileges via the su command (existing root processes will not be affected).</string> <string name="settings_disable_su_summary">暫時禁止任何應用程式透過 su 命令取得 Root 權限(現有的 Root 程序不受影響)</string>
<string name="using_mksu_manager">You are using the SukiSU Beta manager</string> <string name="using_mksu_manager">您正在使用 SukiSU Beta 版管理器</string>
<string name="module_install_multiple_confirm">Are you sure you want to install the selected %d modules?</string> <string name="module_install_multiple_confirm">確定要安裝選擇的 %d 個模組嗎?</string>
<string name="module_install_multiple_confirm_with_names">Sure you want to install the following %1$d modules? \n\n%2$s</string> <string name="module_install_multiple_confirm_with_names">確定要安裝以下 %1$d 個模組嗎?\n\n%2$s</string>
<string name="more_settings">More settings</string> <string name="more_settings">更多設定</string>
<string name="selinux">SELinux</string> <string name="selinux">SELinux</string>
<string name="selinux_enabled">Enabled</string> <string name="selinux_enabled">強制執行</string>
<string name="selinux_disabled">Disabled</string> <string name="selinux_disabled">寬鬆模式</string>
<string name="simple_mode">Simplicity mode</string> <string name="simple_mode">簡潔模式</string>
<string name="simple_mode_summary">Hides unnecessary cards when turned on</string> <string name="simple_mode_summary">啟用後將隱藏不必要的卡片</string>
<string name="hide_kernel_kernelsu_version">Hide kernel version</string> <string name="hide_kernel_kernelsu_version">隱藏内核版本號</string>
<string name="hide_kernel_kernelsu_version_summary">Hide kernel version</string> <string name="hide_kernel_kernelsu_version_summary">隱藏内核部分的 KernelSU 版本號</string>
<string name="hide_other_info">Hide other info</string> <string name="hide_other_info">強迫症開關</string>
<string name="hide_other_info_summary">Hides information about the number of super users, modules and KPM modules on the home page</string> <string name="hide_other_info_summary">隱藏首頁上的超級使用者數量、模組數量及 KPM 模組數量資訊</string>
<string name="hide_susfs_status">Hide SuSFS status</string> <string name="hide_susfs_status">隱藏 SuSFS 狀態資訊</string>
<string name="hide_susfs_status_summary">Hide SuSFS status information on the home page</string> <string name="hide_susfs_status_summary">隱藏首頁上的 SuSFS 狀態資訊</string>
<string name="hide_link_card">Hide Link Card Status</string> <string name="hide_link_card">隱藏連結卡片</string>
<string name="hide_link_card_summary">Hide link card information on the home page</string> <string name="hide_link_card_summary">隱藏首頁上的連結卡片資訊</string>
<string name="theme_mode">Theme</string> <string name="theme_mode">主題模式</string>
<string name="theme_follow_system">Follow system</string> <string name="theme_follow_system">跟隨系統</string>
<string name="theme_light">Light</string> <string name="theme_light">淺色</string>
<string name="theme_dark">Dark</string> <string name="theme_dark">深色</string>
<string name="manual_hook">Manual Hook</string> <string name="manual_hook">手動鉤子</string>
<string name="dynamic_color_title">Dynamic colours</string> <string name="dynamic_color_title">動態顏色</string>
<string name="dynamic_color_summary">Dynamic colours using system themes</string> <string name="dynamic_color_summary">使用系統主題的動態顏色</string>
<string name="choose_theme_color">Choose a theme colour</string> <string name="choose_theme_color">選擇主題顏色</string>
<string name="color_default">Blue</string> <string name="color_default">藍色</string>
<string name="color_green">Green</string> <string name="color_green">綠色</string>
<string name="color_purple">Purple</string> <string name="color_purple">紫色</string>
<string name="color_orange">Orange</string> <string name="color_orange">橙色</string>
<string name="color_pink">Pink</string> <string name="color_pink">粉色</string>
<string name="color_gray">Gray</string> <string name="color_gray">高級灰</string>
<string name="color_yellow">Yellow</string> <string name="color_yellow">黃色</string>
<string name="flash_option">Brush Options</string> <string name="flash_option">刷寫選項</string>
<string name="flash_option_tip">Select the file to be flashed</string> <string name="flash_option_tip">選擇要刷寫的檔案</string>
<string name="horizon_kernel">Install Anykernel3</string> <string name="horizon_kernel">刷寫 AnyKernel3 壓縮包</string>
<string name="horizon_kernel_summary">Flash AnyKernel3 kernel file</string> <string name="horizon_kernel_summary">刷寫 AnyKernel3 内核</string>
<string name="root_required">Requires root privileges</string> <string name="root_required">需要 Root 權限</string>
<string name="copy_failed">File Copy Failure</string> <string name="copy_failed">檔案複製失敗</string>
<string name="reboot_complete_title">Scrubbing complete</string> <string name="reboot_complete_title">刷寫完成</string>
<string name="reboot_complete_msg">Whether to reboot immediately</string> <string name="reboot_complete_msg">是否立即重新啟動</string>
<string name="yes">Yes</string> <string name="yes"></string>
<string name="no">No</string> <string name="no"></string>
<string name="failed_reboot">Reboot Failed</string> <string name="failed_reboot">重新啟動失敗</string>
<string name="batch_authorization">empower</string> <string name="batch_authorization">批次授權</string>
<string name="batch_cancel_authorization">withdraw</string> <string name="batch_cancel_authorization">批次取消授權</string>
<string name="backup">Backup</string> <string name="backup">備份</string>
<string name="kpm_title">KPM</string> <string name="kpm_title">内核模組</string>
<string name="kpm_empty">No installed kernel modules at this time</string> <string name="kpm_empty">暫無已安裝的内核模組</string>
<string name="kpm_version">Version</string> <string name="kpm_version">版本</string>
<string name="kpm_author">Author</string> <string name="kpm_author">作者</string>
<string name="kpm_uninstall">Uninstall</string> <string name="kpm_uninstall">解除安裝</string>
<string name="kpm_uninstall_success">Uninstalled successfully</string> <string name="kpm_uninstall_success">解除安裝成功</string>
<string name="kpm_uninstall_failed">Failed to uninstall</string> <string name="kpm_uninstall_failed">解除安裝失敗</string>
<string name="kpm_install">Install</string> <string name="kpm_install">選擇安裝</string>
<string name="kpm_install_success">Load of kpm module successful</string> <string name="kpm_install_success">載入 KPM 模組成功</string>
<string name="kpm_install_failed">Load of kpm module failed</string> <string name="kpm_install_failed">載入 KPM 模組失敗</string>
<string name="kpm_args">Parameters</string> <string name="kpm_args">參數</string>
<string name="kpm_control">Execute</string> <string name="kpm_control">調參</string>
<string name="home_kpm_version">KPM Version</string> <string name="home_kpm_version">KPM 版本</string>
<string name="close_notice">Close</string> <string name="close_notice">關閉</string>
<string name="kernel_module_notice">The following kernel module functions were developed by KernelPatch and modified to include the kernel module functions of SukiSU Ultra</string> <string name="kernel_module_notice">以下内核模組功能由 KernelPatch 開發,經修改後加入 SukiSU Ultra 的内核模組功能</string>
<string name="home_ContributionCard_kernelsu">SukiSU Ultra Look forward to</string> <string name="home_ContributionCard_kernelsu">SukiSU Ultra 展望</string>
<string name="kpm_control_success">Success</string> <string name="kpm_control_success">成功</string>
<string name="kpm_control_failed">Failed</string> <string name="kpm_control_failed">錯誤</string>
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra 未來將成為一個相對獨立的 KSU 分支,但仍感謝官方 KernelSU MKSU 等做出的貢獻</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">不支援</string>
<string name="supported">Supported</string> <string name="supported">支援</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"KPM 模組數量:%d"</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">KPM 檔案無效</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">内核未進行修補</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">内核未配置</string>
<string name="custom_settings">Custom settings</string> <string name="custom_settings">個人化設定</string>
<string name="kpm_install_mode">KPM Install</string> <string name="kpm_install_mode">安裝模式</string>
<string name="kpm_install_mode_load">Load</string> <string name="kpm_install_mode_load">載入</string>
<string name="kpm_install_mode_embed">Embed</string> <string name="kpm_install_mode_embed">嵌入</string>
<string name="kpm_install_mode_description">Please select: %1\$s Module Installation Mode \n\nLoad: Temporarily load the module \nEmbedded: Permanently install into the system</string> <string name="kpm_install_mode_description">請選擇 %1$s 模組的安裝模式\n\n載入臨時載入模組\n嵌入永久安裝至系統</string>
<string name="log_failed_to_check_module_file">Failed to check module file existence</string> <string name="log_failed_to_check_module_file">無法檢查模組檔案是否存在</string>
<string name="snackbar_failed_to_check_module_file">Unable to check if module file exists</string> <string name="snackbar_failed_to_check_module_file">無法檢查模組檔案是否存在</string>
<string name="confirm_uninstall_title">Confirm uninstallation</string> <string name="confirm_uninstall_title">確定解除安裝</string>
<string name="confirm_uninstall_confirm">Uninstall</string> <string name="confirm_uninstall_confirm">刪除</string>
<string name="confirm_uninstall_dismiss">Cancel</string> <string name="confirm_uninstall_dismiss">取消</string>
<string name="theme_color">Theme Color</string> <string name="theme_color">主題顏色</string>
<string name="invalid_file_type">Incorrect file type! Please select .kpm file.</string> <string name="invalid_file_type">檔案類型不正確,請選擇 .kpm 檔案</string>
<string name="confirm_uninstall_title_with_filename">Uninstall</string> <string name="confirm_uninstall_title_with_filename">解除安裝</string>
<string name="confirm_uninstall_content">The following KPM will be uninstalled: %s</string> <string name="confirm_uninstall_content">將解除安裝以下 KPM 模組:\n%s</string>
<string name="settings_susfs_toggle_summary">Disable kprobe hooks created by KernelSU, using inline hooks instead, which is similar to non-GKI kernel hooking method.</string> <string name="settings_susfs_toggle_summary">禁用由 KernelSU 建立的 kprobe 鉤子,並使用非 kprobe 內聯鉤子代替,實現方式類似於不支援 kprobe 的非 GKI 内核。</string>
<string name="image_editor_title">Adjust background image</string> <string name="image_editor_title">調整背景圖片</string>
<string name="image_editor_hint">Use two fingers to zoom the image, and one finger to drag it to adjust the position</string> <string name="image_editor_hint">使用雙指縮放圖片,單指拖曳調整位置</string>
<string name="background_image_error">Could not load image</string> <string name="background_image_error">無法載入圖片</string>
<string name="reprovision">Reprovision</string> <string name="reprovision">重置</string>
<!-- Kernel Flash Progress Related --> <!-- Kernel Flash Progress Related -->
<string name="horizon_flash_title">Kernel Flashing</string> <string name="horizon_flash_title">刷寫内核</string>
<string name="horizon_logs_label">Logs:</string> <string name="horizon_logs_label">日誌:</string>
<string name="horizon_flash_complete">Flash Complete</string> <string name="horizon_flash_complete">刷寫完成</string>
<!-- Flash Status Related --> <!-- Flash Status Related -->
<string name="horizon_preparing">Preparing</string> <string name="horizon_preparing">準備中</string>
<string name="horizon_cleaning_files">Cleaning files</string> <string name="horizon_cleaning_files">清理檔案</string>
<string name="horizon_copying_files">Copying files</string> <string name="horizon_copying_files">複製檔案</string>
<string name="horizon_extracting_tool">Extracting flash tool</string> <string name="horizon_extracting_tool">提取刷寫工具</string>
<string name="horizon_patching_script">Patching flash script</string> <string name="horizon_patching_script">修補刷寫腳本</string>
<string name="horizon_flashing">Flashing kernel</string> <string name="horizon_flashing">正在刷寫内核</string>
<string name="horizon_flash_complete_status">Flash completed</string> <string name="horizon_flash_complete_status">刷寫完成</string>
<!-- Slot selection related strings --> <!-- Slot selection related strings -->
<string name="select_slot_title">Select Flash Slot</string> <string name="select_slot_title">選擇刷寫槽位</string>
<string name="select_slot_description">Please select the target slot for flashing boot</string> <string name="select_slot_description">請選擇要刷寫 boot 的目標槽位</string>
<string name="slot_a">Slot A</string> <string name="slot_a">A 槽位</string>
<string name="slot_b">Slot B</string> <string name="slot_b">B 槽位</string>
<string name="selected_slot">Selected slot: %1$s</string> <string name="selected_slot">已選擇槽位:%1$s</string>
<string name="horizon_getting_original_slot">Getting the original slot</string> <string name="horizon_getting_original_slot">取得原有槽位</string>
<string name="horizon_setting_target_slot">Setting the specified slot</string> <string name="horizon_setting_target_slot">設定指定槽位</string>
<string name="horizon_restoring_original_slot">Restore Default Slot</string> <string name="horizon_restoring_original_slot">恢復預設槽位</string>
<string name="current_slot">Current Slot%1$s </string> <string name="current_slot">目前槽位%1$s</string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Copy failed</string> <string name="horizon_copy_failed">複製失敗</string>
<string name="horizon_unknown_error">Unknown error</string> <string name="horizon_unknown_error">未知錯誤</string>
<string name="flash_failed_message">Flash failed</string> <string name="flash_failed_message">刷寫失敗</string>
<!-- lkm/gki install --> <!-- lkm/gki install -->
<string name="Lkm_install_methods">LKM repair/installation</string> <string name="Lkm_install_methods">LKM 修補/安裝</string>
<string name="GKI_install_methods">Flashing AnyKernel3</string> <string name="GKI_install_methods">刷寫 AnyKernel3</string>
<string name="kernel_version_log">Kernel version%1$s</string> <string name="kernel_version_log">内核版本%1$s</string>
<string name="tool_version_log">Using the patching tool%1$s</string> <string name="tool_version_log">使用修補工具%1$s</string>
<string name="configuration">Configure</string> <string name="configuration">配置</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">應用程式設定</string>
<string name="tools">Tools</string> <string name="tools">工具</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">清除</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">擁有 Root 權限的應用程式</string>
<string name="apps_with_custom_profile">Applications with customized configurations</string> <string name="apps_with_custom_profile">自訂設定檔的應用程式</string>
<string name="other_apps">Applications with unchanged defaults</string> <string name="other_apps">預設設定檔的應用程式</string>
<string name="no_apps_found">Application not found</string> <string name="no_apps_found">未找到應用程式</string>
<string name="selinux_enabled_toast">SELinux Enabled</string> <string name="selinux_enabled_toast">SELinux 已設為啟用狀態</string>
<string name="selinux_disabled_toast">SELinux Disabled</string> <string name="selinux_disabled_toast">SELinux 已設為禁用狀態</string>
<string name="selinux_change_failed">SELinux Status change failed</string> <string name="selinux_change_failed">SELinux 狀態更改失敗</string>
<string name="advanced_settings">Advanced Settings</string> <string name="advanced_settings">進階設定</string>
<string name="appearance_settings">Customize the toolbar</string> <string name="appearance_settings">外觀設定</string>
<string name="back">Comeback</string> <string name="back">返回</string>
<string name="expand">Be in full swing</string> <string name="expand">展開</string>
<string name="collapse">put away</string> <string name="collapse">收合</string>
<string name="susfs_enabled">SuSFS enabled</string> <string name="susfs_enabled">SuSFS 已啟用</string>
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS 已禁用</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">背景設定成功</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">已移除自訂背景</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="icon_switch_title">備用圖示</string>
<string name="icon_switch_summary">更換為 KernelSU 圖示</string>
<string name="icon_switched">已切換圖示</string>
<string name="root_require_for_install">需要 Root 權限</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">顯示 KPM 功能</string>
<string name="show_kpm_info_summary">Display KPM information and Function in home and bottom bar (Need to reopen the app)</string> <string name="show_kpm_info_summary">在首頁和底欄顯示 KPM 相關功能與資訊(需重新開啟應用程式)</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">選擇使用的 WebUI 引擎</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">自動選擇</string>
<string name="engine_force_webuix">Force the use of WebUI X</string> <string name="engine_force_webuix">強制使用 WebUI X</string>
<string name="engine_force_ksu">Mandatory use of KSU WebUI</string> <string name="engine_force_ksu">強制使用 KSU WebUI</string>
<string name="use_webuix_eruda">Inject Eruda into WebUI X</string> <string name="use_webuix_eruda"> Eruda 注入 WebUI X</string>
<string name="use_webuix_eruda_summary">Inject a debug console into WebUI X to make debugging easier. Requires web debugging to be on.</string> <string name="use_webuix_eruda_summary">在 WebUI X 中注入除錯控制台,方便除錯,需啟用 WebView 除錯</string>
<!-- DPI setting related strings --> <!-- DPI setting related strings -->
<string name="dpi_settings">DPI setting</string> <string name="dpi_settings">DPI 設定</string>
<string name="app_dpi_title">Applied DPI</string> <string name="app_dpi_title">應用程式 DPI</string>
<string name="app_dpi_summary">Adjust the screen display density for the current application only</string> <string name="app_dpi_summary">僅調整目前應用程式的螢幕顯示密度</string>
<string name="dpi_size_small">Small </string> <string name="dpi_size_small"></string>
<string name="dpi_size_medium">Medium </string> <string name="dpi_size_medium"></string>
<string name="dpi_size_large">Big</string> <string name="dpi_size_large"></string>
<string name="dpi_size_extra_large">oversize</string> <string name="dpi_size_extra_large">超大</string>
<string name="dpi_size_custom">customizable</string> <string name="dpi_size_custom">自訂</string>
<string name="dpi_apply_settings">Applying DPI settings</string> <string name="dpi_apply_settings">套用 DPI 設定</string>
<string name="dpi_confirm_title">Confirm DPI change</string> <string name="dpi_confirm_title">確認更改 DPI</string>
<string name="dpi_confirm_message">Are you sure you want to change the application DPI from %1$d to %2$d?</string> <string name="dpi_confirm_message">您確定要將應用程式 DPI %1$d 更改為 %2$d 嗎?</string>
<string name="dpi_confirm_summary">Application needs to be restarted to apply the new DPI settings, does not affect the system status bar or other applications</string> <string name="dpi_confirm_summary">應用程式需重新啟動以套用新的 DPI 設定,不會影響系統狀態列或其他應用程式</string>
<string name="dpi_applied_success">DPI has been set to %1$d, effective after restarting the application</string> <string name="dpi_applied_success">DPI 已設為 %1$d重新啟動應用程式後生效</string>
<!-- Language settings related strings --> <!-- Language settings related strings -->
<string name="language_setting">App Language</string> <string name="language_setting">應用程式語言</string>
<string name="language_follow_system">Follow System</string> <string name="language_follow_system">跟隨系統</string>
<string name="language_changed">Language changed, restarting to apply changes</string> <string name="language_changed">語言已更改,重新啟動應用程式以套用變更</string>
<string name="settings_card_dim">Card Darkness Adjustment</string> <string name="settings_card_dim">卡片暗度調整</string>
<!-- Super User Related --> <!-- Super User Related -->
<string name="scroll_to_top">Top</string> <string name="scroll_to_top">頂部</string>
<string name="scroll_to_bottom">Bottom</string> <string name="scroll_to_bottom">底部</string>
<string name="scroll_to_top_description">Scroll to top</string> <string name="scroll_to_top_description">捲動至頂部</string>
<string name="scroll_to_bottom_description">Scroll to the bottom</string> <string name="scroll_to_bottom_description">捲動至底部</string>
<string name="authorized">authorized</string> <string name="authorized">已授權</string>
<string name="unauthorized">unauthorized</string> <string name="unauthorized">未授權</string>
<string name="selected">Selected</string> <string name="selected">已選擇</string>
<string name="select">option</string> <string name="select">選擇</string>
<string name="profile_umount_modules_disable">Disable custom uninstallation module</string> <string name="profile_umount_modules_disable">禁用自訂卸載模組</string>
<!-- Flash related --> <!-- Flash related -->
<string name="error_code">error code</string> <string name="error_code">錯誤代碼</string>
<string name="check_log">Please check the log</string> <string name="check_log">請檢查日誌</string>
<string name="installing_module">Module being installed %1$d/%2$d</string> <string name="installing_module">正在安裝模組 %1$d/%2$d</string>
<string name="module_failed_count">%d Failed to install a new module</string> <string name="module_failed_count">%d 個模組安裝失敗</string>
<string name="module_download_error">Module download failed</string> <string name="module_download_error">模組下載失敗</string>
<string name="kernel_flashing">Kernel Flashing</string> <string name="kernel_flashing">内核刷寫</string>
</resources> </resources>

View File

@@ -192,7 +192,7 @@
<string name="hide_kernel_kernelsu_version">Hide kernel version</string> <string name="hide_kernel_kernelsu_version">Hide kernel version</string>
<string name="hide_kernel_kernelsu_version_summary">Hide kernel version</string> <string name="hide_kernel_kernelsu_version_summary">Hide kernel version</string>
<string name="hide_other_info">Hide other info</string> <string name="hide_other_info">Hide other info</string>
<string name="hide_other_info_summary">Hides information about the number of super users, modules and KPM modules on the home page</string> <string name="hide_other_info_summary">Hides Red dot about the number of super users, modules and KPM modules on the navigation bar page</string>
<string name="hide_susfs_status">Hide SuSFS status</string> <string name="hide_susfs_status">Hide SuSFS status</string>
<string name="hide_susfs_status_summary">Hide SuSFS status information on the home page</string> <string name="hide_susfs_status_summary">Hide SuSFS status information on the home page</string>
<string name="hide_link_card">Hide Link Card Status</string> <string name="hide_link_card">Hide Link Card Status</string>
@@ -247,7 +247,7 @@
<string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string> <string name="home_click_to_ContributionCard_kernelsu">SukiSU Ultra will be a relatively independent branch of KSU in the future, but we still appreciate the official KernelSU and MKSU etc. for their contributions!</string>
<string name="not_supported">Unsupported</string> <string name="not_supported">Unsupported</string>
<string name="supported">Supported</string> <string name="supported">Supported</string>
<string name="home_kpm_module">"Number of KPM modules: %d "</string> <string name="home_kpm_module">"Number of KPMs: %d "</string>
<string name="kpm_invalid_file">Invalid KPM file</string> <string name="kpm_invalid_file">Invalid KPM file</string>
<string name="kernel_patched">Kernel not patched</string> <string name="kernel_patched">Kernel not patched</string>
<string name="kernel_not_enabled">Kernel not configured</string> <string name="kernel_not_enabled">Kernel not configured</string>
@@ -291,7 +291,7 @@
<string name="horizon_getting_original_slot">Getting the original slot</string> <string name="horizon_getting_original_slot">Getting the original slot</string>
<string name="horizon_setting_target_slot">Setting the specified slot</string> <string name="horizon_setting_target_slot">Setting the specified slot</string>
<string name="horizon_restoring_original_slot">Restore Default Slot</string> <string name="horizon_restoring_original_slot">Restore Default Slot</string>
<string name="current_slot">Current Slot%1$s </string> <string name="current_slot">Current system default slot%1$s </string>
<!-- Error Messages --> <!-- Error Messages -->
<string name="horizon_copy_failed">Copy failed</string> <string name="horizon_copy_failed">Copy failed</string>
<string name="horizon_unknown_error">Unknown error</string> <string name="horizon_unknown_error">Unknown error</string>
@@ -304,7 +304,6 @@
<string name="configuration">Configure</string> <string name="configuration">Configure</string>
<string name="app_settings">Application Settings</string> <string name="app_settings">Application Settings</string>
<string name="tools">Tools</string> <string name="tools">Tools</string>
<string name="currently_selected">Currently</string>
<!-- String resources used in SuperUser --> <!-- String resources used in SuperUser -->
<string name="clear">Removals</string> <string name="clear">Removals</string>
<string name="apps_with_root">Applications with root privileges</string> <string name="apps_with_root">Applications with root privileges</string>
@@ -323,10 +322,13 @@
<string name="susfs_disabled">SuSFS disabled</string> <string name="susfs_disabled">SuSFS disabled</string>
<string name="background_set_success">Background set successfully</string> <string name="background_set_success">Background set successfully</string>
<string name="background_removed">Removed custom backgrounds</string> <string name="background_removed">Removed custom backgrounds</string>
<string name="icon_switch_title">Alternate icon</string>
<string name="icon_switch_summary">Change the launcher icon to KernelSU\'s icon.</string>
<string name="icon_switched">Icon switched</string>
<string name="root_require_for_install">Requires root privileges</string> <string name="root_require_for_install">Requires root privileges</string>
<!-- KPM display settings --> <!-- KPM display settings -->
<string name="show_kpm_info">Display KPM Function</string> <string name="show_kpm_info">Hides KPM Function</string>
<string name="show_kpm_info_summary">Display KPM information and Function in home and bottom bar (Need to reopen the app)</string> <string name="show_kpm_info_summary">Hides KPM information and Function in home and bottom bar</string>
<!-- Webui X settings --> <!-- Webui X settings -->
<string name="use_webuix">Select the WebUI engine to use</string> <string name="use_webuix">Select the WebUI engine to use</string>
<string name="engine_auto_select">Automatic Selection</string> <string name="engine_auto_select">Automatic Selection</string>