Compare commits
41 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fa060dca58 | ||
|
|
9c7ba5b998 | ||
|
|
061136900a | ||
|
|
6375bf4b7c | ||
|
|
17288c086a | ||
|
|
15747ceaa5 | ||
|
|
675bb20f52 | ||
|
|
ec0b26a174 | ||
|
|
92f6f2f51e | ||
|
|
587e73b449 | ||
|
|
07c9cce4b9 | ||
|
|
1d34ea4995 | ||
|
|
d58ec6952c | ||
|
|
50631aade6 | ||
|
|
6df8f6f5d4 | ||
|
|
4aee26b48e | ||
|
|
3bbe415c7e | ||
|
|
892fa9040f | ||
|
|
cadc123eab | ||
|
|
3a27537648 | ||
|
|
6fa1a5c8b8 | ||
|
|
b772c8ece1 | ||
|
|
c0e839dd8e | ||
|
|
a6ed7befdc | ||
|
|
c210b00d54 | ||
|
|
13b5290598 | ||
|
|
b99516da69 | ||
|
|
fe8b5f2135 | ||
|
|
04e1b9bf77 | ||
|
|
b8aaf918fe | ||
|
|
54925188e8 | ||
|
|
3443e48ef1 | ||
|
|
53b3e84890 | ||
|
|
a5b85bfdad | ||
|
|
2817583e3c | ||
|
|
8a6116b4ec | ||
|
|
6a4270787a | ||
|
|
5457a4772b | ||
|
|
ee4c3bb03b | ||
|
|
dd1d17d2cf | ||
|
|
3c353e8f88 |
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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) ウェブサイトドメイン名の寄付
|
||||||
|
|
||||||
## 貢献者
|
## 貢献者
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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) 网站域名捐赠
|
||||||
|
|
||||||
## 贡献
|
## 贡献
|
||||||
|
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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())
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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) {
|
||||||
""
|
""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -85,3 +92,20 @@ fun SwitchItem(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun RadioItem(
|
||||||
|
title: String,
|
||||||
|
selected: Boolean,
|
||||||
|
onClick: () -> Unit,
|
||||||
|
) {
|
||||||
|
ListItem(
|
||||||
|
headlineContent = {
|
||||||
|
Text(title)
|
||||||
|
},
|
||||||
|
leadingContent = {
|
||||||
|
RadioButton(selected = selected, onClick = onClick)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -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),
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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(
|
||||||
@@ -354,6 +385,7 @@ private fun AppProfileInner(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private enum class Mode(@StringRes private val res: Int) {
|
private enum class Mode(@StringRes private val res: Int) {
|
||||||
Default(R.string.profile_default), Template(R.string.profile_template), Custom(R.string.profile_custom);
|
Default(R.string.profile_default), Template(R.string.profile_template), Custom(R.string.profile_custom);
|
||||||
@@ -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",
|
||||||
@@ -591,3 +620,4 @@ private fun AppProfilePreview() {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -278,25 +257,20 @@ fun UpdateCard() {
|
|||||||
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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -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(
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -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(SPACING_LARGE))
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Spacer(modifier = Modifier.height(16.dp))
|
@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(
|
||||||
|
|||||||
@@ -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
|
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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(
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据背景颜色、主题模式和用户设置确定内容颜色
|
* 根据背景颜色、主题模式和用户设置确定内容颜色
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 复制图片到应用内部存储并提升持久性
|
* 复制图片到应用内部存储并提升持久性
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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() {
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 -->
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 um sem perdas. Esteja ciente que a perda de qualidade não pode ser desfeita, então este processo não melhorará a qualidade do áudio e provavelmente 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 um sem perdas. Esteja ciente que a perda de qualidade não pode ser desfeita, então este processo não melhorará a qualidade do áudio e provavelmente 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 -->
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 và 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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user