You've already forked Tricky-Addon-Update-Target-List
mirror of
https://github.com/KOWX712/Tricky-Addon-Update-Target-List.git
synced 2025-09-06 06:37:09 +00:00
Compare commits
97 Commits
v2.6-beta.
...
v2.8
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cfb51e28fb | ||
|
|
6bdfff7f92 | ||
|
|
4146f09062 | ||
|
|
d223b39e29 | ||
|
|
6bf5009cb8 | ||
|
|
22bdb3986a | ||
|
|
2a04b7426d | ||
|
|
a03b785323 | ||
|
|
d307c57171 | ||
|
|
c6339f4e5d | ||
|
|
4c9e56c1db | ||
|
|
9302d39910 | ||
|
|
06d2edf57f | ||
|
|
ff6244b140 | ||
|
|
dfe4a23f8a | ||
|
|
5dd1496ca7 | ||
|
|
8c831cea39 | ||
|
|
42a8f6baae | ||
|
|
befa011c15 | ||
|
|
f576b4bb2f | ||
|
|
a2b2da27f8 | ||
|
|
b3282816cb | ||
|
|
15f975ee67 | ||
|
|
11d3b34657 | ||
|
|
ad905cb6e0 | ||
|
|
5b966f5626 | ||
|
|
c500e7476a | ||
|
|
1b2a1701f4 | ||
|
|
4563a3399d | ||
|
|
873354b11c | ||
|
|
3d8ca67a6a | ||
|
|
f13e4ecca5 | ||
|
|
878a5faacf | ||
|
|
504918a289 | ||
|
|
6f9d4482a7 | ||
|
|
765444fcd5 | ||
|
|
7905ebcca5 | ||
|
|
030f48f8ce | ||
|
|
27b932ed82 | ||
|
|
d839e3ea4d | ||
|
|
119e0aa2cf | ||
|
|
d17ca1d7ef | ||
|
|
3f5832608e | ||
|
|
b06ffda6bf | ||
|
|
8f6dc6523d | ||
|
|
552758a01f | ||
|
|
6a21702f25 | ||
|
|
31a229e52b | ||
|
|
c7fa970158 | ||
|
|
9e569421cd | ||
|
|
13f020ebd0 | ||
|
|
f1ca044c4f | ||
|
|
227cbeeb5b | ||
|
|
951ae11bcd | ||
|
|
410576094a | ||
|
|
20747caa66 | ||
|
|
879735e33a | ||
|
|
a44941d482 | ||
|
|
3504ec15ce | ||
|
|
ba2e699ca5 | ||
|
|
785250d748 | ||
|
|
b227ad990c | ||
|
|
cb2d8c0192 | ||
|
|
f12fe49d17 | ||
|
|
a0b0c5ca15 | ||
|
|
69198fa458 | ||
|
|
2198313a4a | ||
|
|
85998d76fe | ||
|
|
a399c4a69a | ||
|
|
18e3048028 | ||
|
|
9b5293f7b0 | ||
|
|
375af46292 | ||
|
|
017491b652 | ||
|
|
aea3e9fff3 | ||
|
|
84b7bd9f4e | ||
|
|
9fa022bad6 | ||
|
|
ec024a2936 | ||
|
|
72d505dec5 | ||
|
|
0e06ea4902 | ||
|
|
45657574d2 | ||
|
|
315f254123 | ||
|
|
4772755965 | ||
|
|
18968a4fcb | ||
|
|
457c771cfa | ||
|
|
c5804fabdc | ||
|
|
60ae2e42f9 | ||
|
|
04394ca65d | ||
|
|
3f8ef22b83 | ||
|
|
71e6d7ec8b | ||
|
|
01300c9524 | ||
|
|
8747df3969 | ||
|
|
792e5a15a1 | ||
|
|
df7167dc55 | ||
|
|
ffa0aa461d | ||
|
|
3926980b28 | ||
|
|
a92928838b | ||
|
|
fd837d41e8 |
124
.github/workflows/build.yml
vendored
Normal file
124
.github/workflows/build.yml
vendored
Normal file
@@ -0,0 +1,124 @@
|
||||
name: build
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'module/**'
|
||||
workflow_dispatch:
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: build
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
version_tag_exists: ${{ steps.check_tag.outputs.version_tag_exists }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
fetch-tags: true
|
||||
|
||||
- name: Extract Module Info
|
||||
id: extract_info
|
||||
run: |
|
||||
MODULE_VERSION=$(grep -oP '^version=\K.*' module/module.prop)
|
||||
BUILD_COUNT=$((1000 + ${{ github.run_number }}))
|
||||
ARTIFACT_NAME="TrickyAddonModule-${MODULE_VERSION}-canary-${BUILD_COUNT}"
|
||||
echo "MODULE_VERSION=${MODULE_VERSION}" >> $GITHUB_ENV
|
||||
echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV
|
||||
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: ${{ env.ARTIFACT_NAME }}
|
||||
path: module/
|
||||
include-hidden-files: true
|
||||
|
||||
- name: Check if valid to release
|
||||
id: check_tag
|
||||
run: |
|
||||
VERSION=$(grep '^version=' module/module.prop | sed 's/version=//')
|
||||
git fetch --tags
|
||||
if git tag | grep -qx "^$VERSION"; then
|
||||
echo "version_tag_exists=true" >> $GITHUB_OUTPUT
|
||||
else
|
||||
echo "version_tag_exists=false" >> $GITHUB_OUTPUT
|
||||
fi
|
||||
|
||||
release:
|
||||
name: release
|
||||
runs-on: ubuntu-latest
|
||||
needs: build
|
||||
if: ${{ needs.build.outputs.version_tag_exists == 'false' }}
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 2
|
||||
|
||||
- name: Configure Git user
|
||||
run: |
|
||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
||||
git config --global user.name "github-actions[bot]"
|
||||
|
||||
- name: Create a new tag
|
||||
run: |
|
||||
VERSION=$(grep '^version=' module/module.prop | sed 's/version=//')
|
||||
git tag -a "$VERSION" -m "Release version $VERSION"
|
||||
git push origin "$VERSION"
|
||||
|
||||
- name: Set release variables
|
||||
id: set_release_variables
|
||||
run: |
|
||||
VERSION=$(grep '^version=' module/module.prop | sed 's/version=//')
|
||||
CURRENT_TAG="$VERSION"
|
||||
RELEASE_NOTES=$(awk -v tag="### $CURRENT_TAG" '
|
||||
$0 == tag {flag=1; next}
|
||||
/^###/ && flag {exit}
|
||||
flag {print}
|
||||
' changelog.md)
|
||||
|
||||
if [[ "$VERSION" == *"beta"* ]]; then
|
||||
PRERELEASE=true
|
||||
FORMATTED_RELEASE_NOTES=$(echo -e "- Due to extensive code refactoring, you might encounter unexpected bugs in this version, feedback in [Telegram](https://t.me/kowchannel) or [create issue](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues) if you found any issues.\n---\n### Tricky Addon module\n$RELEASE_NOTES")
|
||||
FILES="TrickyAddonModule-${VERSION}.zip"
|
||||
else
|
||||
PRERELEASE=false
|
||||
FORMATTED_RELEASE_NOTES=$(echo -e "### Tricky Addon module\n$RELEASE_NOTES\n---\n### Tricky Addon Lite - script only\n- Check on [changelog](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/tree/main/lite-script_only#tricky-addon-lite-update-target-list-script)")
|
||||
FILES="TrickyAddonModule-${VERSION}.zip,TrickyAddonLite_ScriptOnly_Extract-${VERSION}.zip"
|
||||
fi
|
||||
|
||||
echo "CURRENT_TAG=$CURRENT_TAG" >> $GITHUB_ENV
|
||||
echo "ZIP_NAME=TrickyAddonModule-${VERSION}.zip" >> $GITHUB_ENV
|
||||
echo "LITE_SCRIPT_ONLY_ZIP_NAME=TrickyAddonLite_ScriptOnly_Extract-${VERSION}.zip" >> $GITHUB_ENV
|
||||
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
|
||||
echo "$FORMATTED_RELEASE_NOTES" >> $GITHUB_ENV
|
||||
echo "EOF" >> $GITHUB_ENV
|
||||
echo "FILES=$FILES" >> $GITHUB_ENV
|
||||
echo "PRERELEASE=$PRERELEASE" >> $GITHUB_ENV
|
||||
|
||||
- name: Compress module folder
|
||||
run: |
|
||||
cd module && zip -r "../${{ env.ZIP_NAME }}" ./*
|
||||
echo "Created zip file: ${{ env.ZIP_NAME }}"
|
||||
|
||||
- name: Compress lite-script_only folder
|
||||
if: ${{ env.PRERELEASE == 'false' }}
|
||||
run: |
|
||||
cd lite-script_only && zip -r "../${{ env.LITE_SCRIPT_ONLY_ZIP_NAME }}" ./*
|
||||
echo "Created zip file: ${{ env.LITE_SCRIPT_ONLY_ZIP_NAME }}"
|
||||
|
||||
- name: Create release
|
||||
uses: softprops/action-gh-release@v2
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
files: ${{ env.FILES }}
|
||||
tag_name: ${{ env.CURRENT_TAG }}
|
||||
name: ${{ env.CURRENT_TAG }}
|
||||
body: ${{ env.RELEASE_NOTES }}
|
||||
draft: false
|
||||
prerelease: ${{ env.PRERELEASE }}
|
||||
59
README.md
59
README.md
@@ -1,41 +1,46 @@
|
||||
# **Tricky Addon - Update Target List**
|
||||
A **KSU WebUI** to configure tricky store target.txt
|
||||
# Tricky Addon - Update Target List
|
||||
Configure Tricky Store target.txt with KSU WebUI.
|
||||
|
||||
---
|
||||
## Description
|
||||
- Automated script to update tricky store target list.
|
||||
- System app excluded by default
|
||||
- This module is **not** a part of Tricky Store module, DO NOT report to Tricky Store if you encounter any issue.
|
||||
- This is **not** a necessary module for root hide but for those who lazy to do it manually
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/latest)
|
||||
[](https://nightly.link/KOWX712/Tricky-Addon-Update-Target-List/workflows/build/main?status=completed)
|
||||
|
||||
> [!WARNING]
|
||||
> This module is **not** a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered.
|
||||
|
||||
## Requirements
|
||||
- [Tricky store](https://github.com/5ec1cff/TrickyStore) module installed
|
||||
|
||||
## Custom Configuration
|
||||
- Configuration target list with **KSU WebUI**
|
||||
- For Magisk users, first attempt perform action button can install KSU WebUI (optional).
|
||||
- Advance configure: ADDITION and EXCLUDE in `/data/adb/tricky_store/target_list_config`
|
||||
|
||||
## Instructions
|
||||
### Automatic update
|
||||
- On boot
|
||||
### KernelSU & Apatch
|
||||
- KSU WebUI
|
||||
|
||||
### Manually update
|
||||
**KSU WebUI**
|
||||
- Configure target list
|
||||
- Save and Update
|
||||
### Magisk
|
||||
- Action button to open WebUI
|
||||
- Support KSUWebUIStandalone and latest MMRL
|
||||
- Automatic install [KSUWebUIStandalone](https://github.com/5ec1cff/KsuWebUIStandalone) if none of them are installed.
|
||||
|
||||
**Manual script method**
|
||||
- Run `UpdateTargetList.sh` under `/data/adb/tricky_store` manually.
|
||||
- MT manager is recommened for this method
|
||||
### What Can This Module Do
|
||||
| Feature | Status |
|
||||
|:---|:---:|
|
||||
| Configure target.txt with app name display | ✅ |
|
||||
| Select apps from Magisk DenyList (optional) | ✅ |
|
||||
| Deselect [unnecessary apps](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/main/more-excldue.json) (optional) | ✅ |
|
||||
| Set verifiedBootHash (optional) | ✅ |
|
||||
| Provide AOSP Keybox (optional) | ✅ |
|
||||
| Valid Keybox (not guaranteed) | ❌ |
|
||||
| Shamiko Whitelist switch ([Why?](https://github.com/rushizgithub/shamiko?tab=readme-ov-file#whitelist)) | ❌ |
|
||||
| Add `!` or `?` to the target ([Not needed](https://github.com/5ec1cff/TrickyStore/releases/tag/1.1.0)) | ❌ |
|
||||
| Periodically update target and add new apps | ❌ |
|
||||
| Add system apps (GMS added by default) | ❌ |
|
||||
|
||||
## Translation
|
||||
- Read [Translation Guide](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/tree/master/module/webroot/locales/A-translate.md)
|
||||
## Localization
|
||||
- Read [Translation Guide](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/main/module/webui/locales/A-translate.md)
|
||||
|
||||
## Acknowledgement
|
||||
- [j-hc/zygisk-detach](https://github.com/j-hc/zygisk-detach) - KSU WebUI template
|
||||
|
||||
## Links
|
||||
Download: [GitHub release](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases)
|
||||
|
||||
Telegram channel: [KOW's Little World](https://t.me/kowchannel)
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases)
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues)
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/main/changelog.md)
|
||||
[](https://t.me/kowchannel)
|
||||
|
||||
41
changelog.md
41
changelog.md
@@ -1,15 +1,42 @@
|
||||
### Tricky Addon: Update Target List
|
||||
A **KSU WebUI** to configure tricky store target.txt
|
||||
|
||||
Requirement: Tricky Store module installed
|
||||
|
||||
This module is not a part of Tricky Store, DO NOT report to Tricky Store if you encounter any issue.
|
||||
*This module is **not** a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered.*
|
||||
|
||||
GitHub release: [Tricky Addon: Update Target List](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/latest)
|
||||
|
||||
Telegram channel: [KOW's Little World](https://t.me/kowchannel)
|
||||
|
||||
## Changelog
|
||||
### v2.8
|
||||
- Fixed all KSUWebUIStandalone freeze issue, removed visible option.
|
||||
- Reduced WebUI loading time.
|
||||
- Added Japanese. Thanks to @reindex-ot.
|
||||
|
||||
### v2.7.1
|
||||
- Link redirect quick fix
|
||||
|
||||
### v2.7
|
||||
- Abandoned `UpdateTargetList.sh`; No longer automatically update target on boot.
|
||||
- Adapted with MMRL, Magisk user can uninstall KSUWebUIStandalone if you have latest MMRL installed, action button will redirect to MMRL if KSUWebUIStandalone not found.
|
||||
- New update card for invisible module.
|
||||
- Improved UI.
|
||||
- Press any position of app card to select/deselct.
|
||||
|
||||
### v2.6
|
||||
- Invisible module, intergrate action button & webui on tricky store card. You can stil use visible option if you found any issue with invisble module. Thanks for idea from @backslashxx.
|
||||
- To uninstall invisble module, scroll down to the bottom of WebUI and press Uninstall WebUI.
|
||||
- Add update prompt if found new version in webui, and show module if found an update. (invisible)
|
||||
- Reduced WebUI loading time
|
||||
- Added feature to save verifiedBootHash
|
||||
- New way to detect Xposed module, now can catch all Xposed module apk package name in Deselect Unnecessary option, feedback in [Telegram](https://t.me/kowchannel) or [create issue](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues) if missed any.
|
||||
- **Initial support for multiple languages**
|
||||
- Language available: **en-US**, **ru-RU**, **tl-PH**, **zh-CN**, **zh-TW**
|
||||
- Add language or fix translation error? [Read here](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/tree/master/module/webui/locales/A-translate.md).
|
||||
|
||||
### v2.6-beta.3
|
||||
- Check in [release notes](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/tag/v2.6-beta.3).
|
||||
|
||||
### v2.6-beta.2
|
||||
- Check in [release notes](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/tag/v2.6-beta.2).
|
||||
|
||||
@@ -23,7 +50,7 @@ Telegram channel: [KOW's Little World](https://t.me/kowchannel)
|
||||
### v2.4
|
||||
- Added aapt binary for app name display
|
||||
|
||||
**KSU WebUI**
|
||||
- **KSU WebUI:**
|
||||
- Added app name display
|
||||
|
||||
### v2.3
|
||||
@@ -33,13 +60,13 @@ Telegram channel: [KOW's Little World](https://t.me/kowchannel)
|
||||
- Abandoned action button in KernelSU and Apatch
|
||||
- Magisk action button: open WebUI, automatic download if not installed (optional)
|
||||
|
||||
**KSU WebUI**
|
||||
- **KSU WebUI:**
|
||||
- Option to select app from DenyList (Magisk)
|
||||
|
||||
### v2.2
|
||||
**KSU WebUI:**
|
||||
- **KSU WebUI:**
|
||||
- Added help menu
|
||||
- Added extra [unnecessary app](https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/more-excldue.json) exclude option
|
||||
- Added extra [unnecessary app](https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/more-excldue.json) exclude option
|
||||
- Added no Internet connection prompt
|
||||
|
||||
### v2.1
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
- Recommend to run with MT manager
|
||||
|
||||
## Changelog
|
||||
### v2.1, v2.2, v2.3, v2.4, v2.5
|
||||
### v2.8
|
||||
- Remove wait time
|
||||
|
||||
### v2.1~2.7.1
|
||||
- Remain same with v2.0
|
||||
|
||||
### v2.0
|
||||
@@ -31,7 +34,6 @@
|
||||
- Synched some code with module script
|
||||
|
||||
## Link
|
||||
[Telegram channel](https://t.me/kowchannel)
|
||||
|
||||
[GitHub Release](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/latest)
|
||||
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases)
|
||||
[](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues)
|
||||
[](https://t.me/kowchannel)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Tricky Addon Lite: Update Target List Script v2.5
|
||||
# GitHub Repository: https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/master/lite-script_only/README.md
|
||||
# Tricky Addon Lite: Update Target List Script v2.8
|
||||
# GitHub Repository: https://github.com/KOWX712/Tricky-Addon-Update-Target-List/tree/main/lite-script_only
|
||||
# Telegram channel: https://t.me/kowchannel
|
||||
|
||||
# This script will put all non-system app into /data/adb/tricky_store/target.txt
|
||||
|
||||
###################################################
|
||||
# Configurable exclude and addition list
|
||||
# DO NOT remove default package names here
|
||||
# Don't remove default package names here
|
||||
###################################################
|
||||
|
||||
EXCLUDE="
|
||||
@@ -39,7 +39,6 @@ ADDITION=$(echo "$ADDITION" | tr '\n' ' ' | sed 's/^ //;s/ $//')
|
||||
|
||||
# Add all non-system apps to the target file and remove exclusions
|
||||
su -c pm list packages -3 </dev/null 2>&1 | cat | awk -F: '{print $2}' | grep -Ev "$EXCLUDE" > /data/adb/tricky_store/target.txt
|
||||
sleep 1
|
||||
|
||||
# Add additional apps to the target file if they are not already present
|
||||
for app in $ADDITION; do
|
||||
|
||||
@@ -5,33 +5,68 @@
|
||||
MODPATH="/data/adb/modules/.TA_utl"
|
||||
COMPATH="$MODPATH/common"
|
||||
SCRIPT_DIR="/data/adb/tricky_store"
|
||||
URL="https://github.com/5ec1cff/KsuWebUIStandalone/releases/download/v1.0/KsuWebUI-1.0-34-release.apk"
|
||||
APK_DIR="$COMPATH/tmp"
|
||||
BBPATH="/data/adb/magisk/busybox \
|
||||
/data/adb/ksu/bin/busybox \
|
||||
/data/adb/ap/bin/busybox \
|
||||
/data/adb/modules/busybox-ndk/system/*/busybox"
|
||||
|
||||
. "$COMPATH/util_func.sh"
|
||||
|
||||
if pm list packages | grep -q "$PACKAGE_NAME"; then
|
||||
echo "- Launching KSU WebUI..."
|
||||
am start -n "${PACKAGE_NAME}/.WebUIActivity" -e id "$MODID"
|
||||
else
|
||||
SKIP_FILE="$SCRIPT_DIR/target_list_config/skipwebui"
|
||||
if [ ! -f "$SKIP_FILE" ]; then
|
||||
echo "**********************************************"
|
||||
echo "- Do you want to install KSU WebUI standalone?"
|
||||
echo " VOL [+]: YES"
|
||||
echo " VOL [-]: NO"
|
||||
echo "**********************************************"
|
||||
|
||||
key_check
|
||||
if [[ "$keycheck" == "KEY_VOLUMEUP" ]]; then
|
||||
echo "- Installing KSU WebUI..."
|
||||
. "$COMPATH/get_WebUI.sh"
|
||||
check_wget() {
|
||||
for path in $BBPATH; do
|
||||
[ -f "$path" ] && BUSYBOX="$path" && break
|
||||
done
|
||||
if ! command -v wget >/dev/null || grep -q "wget-curl" "$(command -v wget)"; then
|
||||
if [ -n "$BUSYBOX" ]; then
|
||||
wget() { "$BUSYBOX" wget "$@"; }
|
||||
else
|
||||
echo "- Skipping WebUI installation..."
|
||||
touch "$SKIP_FILE"
|
||||
echo "- Skip WebUI check until next installation."
|
||||
echo ""
|
||||
update_script
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
update_script
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
get_webui() {
|
||||
echo "- Downloading the WebUI APK..."
|
||||
check_wget
|
||||
if ! wget --no-check-certificate -P "$APK_DIR" "$URL"; then
|
||||
echo "! Error: APK download failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "- Download complete."
|
||||
APK_PATH=$(find "$APK_DIR" -type f -name "*.apk" | head -n 1)
|
||||
if [ -z "$APK_PATH" ]; then
|
||||
echo "! Error: No APK file found in $APK_DIR."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "- Installing..."
|
||||
if ! pm install -r "$APK_PATH" >/dev/null 2>&1; then
|
||||
echo "! Error: APK installation failed."
|
||||
rm -f "$APK_PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "- Done."
|
||||
rm -f "$APK_PATH"
|
||||
|
||||
echo "- Launching..."
|
||||
if ! am start -n "io.github.a13e300.ksuwebui/.WebUIActivity" -e id "tricky_store"; then
|
||||
echo "! Error: WebUI launch failed."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "- Application launched successfully."
|
||||
}
|
||||
|
||||
# Lunch KSUWebUI standalone or MMRL, install KSUWebUI standalone if both are not installed
|
||||
if pm list packages | grep -q "io.github.a13e300.ksuwebui"; then
|
||||
echo "- Launching WebUI in KSUWebUIStandalone..."
|
||||
am start -n "io.github.a13e300.ksuwebui/.WebUIActivity" -e id "tricky_store"
|
||||
elif pm list packages | grep -q "com.dergoogler.mmrl"; then
|
||||
echo "- Launching WebUI in MMRL WebUI..."
|
||||
am start -n "com.dergoogler.mmrl/.ui.activity.webui.WebUIActivity" -e MOD_ID "tricky_store"
|
||||
else
|
||||
echo "- Installing KSU WebUI..."
|
||||
get_webui
|
||||
fi
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
# This is the list of additional apps to include in the target file
|
||||
# DO NOT remove the default app here
|
||||
# You can add your custom addition app's package name here
|
||||
# Each app package name should be on a new line
|
||||
com.google.android.gms
|
||||
io.github.vvb2060.keyattestation
|
||||
io.github.vvb2060.mahoshojo
|
||||
icu.nullptr.nativetest
|
||||
@@ -1,10 +0,0 @@
|
||||
# This is the list of apps to exclude from the target file
|
||||
# DO NOT remove the default app here
|
||||
# You can add your custom exclusion app here
|
||||
# Each app package name should be on a new line
|
||||
oneplus
|
||||
coloros
|
||||
miui
|
||||
com.android.patch
|
||||
me.bmax.apatch
|
||||
me.garfieldhan.apatch.next
|
||||
@@ -1,49 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# This script will put non-system app into /data/adb/tricky_store/target.txt
|
||||
CONFIG_DIR="/data/adb/tricky_store/target_list_config"
|
||||
|
||||
echo "- Checking config files..."
|
||||
echo " "
|
||||
if [ ! -f "$CONFIG_DIR/EXCLUDE" ]; then
|
||||
echo "! Exclude list is missing, please install module again"
|
||||
exit 1
|
||||
else
|
||||
echo "- Exclude config file found"
|
||||
echo " "
|
||||
fi
|
||||
if [ ! -f "$CONFIG_DIR/ADDITION" ]; then
|
||||
echo "! Addition list is missing, please install module again"
|
||||
exit 1
|
||||
else
|
||||
echo "- Addition config file found"
|
||||
echo " "
|
||||
fi
|
||||
|
||||
EXCLUDE=$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$CONFIG_DIR/EXCLUDE" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
||||
ADDITION=$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$CONFIG_DIR/ADDITION" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//')
|
||||
|
||||
for app in $ADDITION; do
|
||||
app=$(echo "$app" | tr -d '[:space:]')
|
||||
if grep -Fq "$app" "$CONFIG_DIR/EXCLUDE"; then
|
||||
sed -i "\|^$app$|d" "$CONFIG_DIR/EXCLUDE"
|
||||
fi
|
||||
done
|
||||
|
||||
EXCLUDE=$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$CONFIG_DIR/EXCLUDE" | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | tr '\n' '|' | sed 's/|$//')
|
||||
|
||||
echo "- Adding apps into /data/adb/tricky_store/target.txt..."
|
||||
echo " "
|
||||
pm list packages -3 </dev/null 2>&1 | awk -F: '{print $2}' | grep -Ev "$EXCLUDE" > /data/adb/tricky_store/target.txt
|
||||
|
||||
echo "- Adding addition app..."
|
||||
echo " "
|
||||
for app in $ADDITION; do
|
||||
app=$(echo "$app" | tr -d '[:space:]')
|
||||
if ! grep -Fq "$app" /data/adb/tricky_store/target.txt; then
|
||||
echo "$app" >> /data/adb/tricky_store/target.txt
|
||||
fi
|
||||
done
|
||||
|
||||
echo "- target.txt updated successfully"
|
||||
echo " "
|
||||
@@ -1,27 +0,0 @@
|
||||
URL="https://github.com/5ec1cff/KsuWebUIStandalone/releases/download/v1.0/KsuWebUI-1.0-34-release.apk"
|
||||
APK_DIR="$COMPATH"
|
||||
|
||||
find_busybox
|
||||
check_wget
|
||||
|
||||
echo "- Downloading the WebUI apk..."
|
||||
download_webui
|
||||
echo "- Download complete."
|
||||
|
||||
APK_PATH=$(find "$APK_DIR" -type f -name "*.apk" | head -n 1)
|
||||
if [ -z "$APK_PATH" ]; then
|
||||
echo "Error: No APK file found in $APK_DIR."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "- Installing..."
|
||||
install_webui
|
||||
echo "- Done."
|
||||
rm -f "$APK_PATH"
|
||||
echo "- Launching..."
|
||||
am start -n "${PACKAGE_NAME}/.WebUIActivity" -e id "$MODID" </dev/null 2>&1 | cat
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: Failed to start application."
|
||||
exit 1
|
||||
fi
|
||||
echo "- Application launched successfully."
|
||||
@@ -1,49 +1,71 @@
|
||||
#!/system/bin/sh
|
||||
|
||||
MODPATH=${0%/*}
|
||||
SKIPLIST="$MODPATH/skiplist"
|
||||
OUTPUT="$MODPATH/exclude-list"
|
||||
KBOUTPUT="$MODPATH/.extra"
|
||||
SKIPLIST="$MODPATH/tmp/skiplist"
|
||||
OUTPUT="$MODPATH/tmp/exclude-list"
|
||||
KBOUTPUT="$MODPATH/tmp/.extra"
|
||||
BBPATH="/data/adb/magisk/busybox \
|
||||
/data/adb/ksu/bin/busybox \
|
||||
/data/adb/ap/bin/busybox \
|
||||
/data/adb/modules/busybox-ndk/system/*/busybox"
|
||||
|
||||
. $MODPATH/util_func.sh
|
||||
|
||||
find_busybox
|
||||
check_wget
|
||||
|
||||
# Fetch additional package names
|
||||
wget --no-check-certificate -q -O - "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/more-excldue.json" 2>/dev/null | \
|
||||
grep -o '"package-name": *"[^"]*"' | \
|
||||
awk -F'"' '{print $4}' > "$OUTPUT"
|
||||
|
||||
if [ ! -s "$OUTPUT" ]; then
|
||||
rm -f "$KBOUTPUT"
|
||||
skipfetch=true
|
||||
fi
|
||||
|
||||
# Find xposed package name
|
||||
pm list packages -3 </dev/null 2>&1 | cat | awk -F: '{print $2}' | while read -r PACKAGE; do
|
||||
if ! grep -Fq "$PACKAGE" "$SKIPLIST"; then
|
||||
pm path "$PACKAGE" | grep "base.apk" | awk -F: '{print $2}' | tr -d '\r' | while read -r APK_PATH; do
|
||||
aapt dump xmltree "$APK_PATH" AndroidManifest.xml 2>/dev/null | grep -qE "xposed.category|xposeddescription" && echo "$PACKAGE" >> "$OUTPUT"
|
||||
done
|
||||
check_wget() {
|
||||
for path in $BBPATH; do
|
||||
[ -f "$path" ] && BUSYBOX="$path" && break
|
||||
done
|
||||
if ! command -v wget >/dev/null || grep -q "wget-curl" "$(command -v wget)"; then
|
||||
if [ -n "$BUSYBOX" ]; then
|
||||
wget() { "$BUSYBOX" wget "$@"; }
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
if [ "$skipfetch" != "true" ]; then
|
||||
wget --no-check-certificate -qO "$KBOUTPUT" "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/.extra"
|
||||
aapt() { "$MODPATH/aapt" "$@"; }
|
||||
|
||||
if [ ! -s "$KBOUTPUT" ]; then
|
||||
rm -f "$KBOUTPUT"
|
||||
get_kb() {
|
||||
check_wget
|
||||
wget --no-check-certificate -qO "$KBOUTPUT" "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/.extra"
|
||||
[ -s "$KBOUTPUT" ] || rm -f "$KBOUTPUT"
|
||||
}
|
||||
|
||||
get_unnecessary() {
|
||||
check_wget
|
||||
if [ ! -s "$OUTPUT" ] || [ ! -f "$OUTPUT" ]; then
|
||||
wget --no-check-certificate -q -O - "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/more-excldue.json" 2>/dev/null | \
|
||||
grep -o '"package-name": *"[^"]*"' | \
|
||||
awk -F'"' '{print $4}' > "$OUTPUT"
|
||||
fi
|
||||
get_xposed
|
||||
}
|
||||
|
||||
if [ -d "$MODPATH/temp" ]; then
|
||||
JSON=$(wget --no-check-certificate -q -O - "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/update.json")
|
||||
get_xposed() {
|
||||
pm list packages -3 | cut -d':' -f2 | grep -vxF -f "$SKIPLIST" | grep -vxF -f "$OUTPUT" | while read -r PACKAGE; do
|
||||
APK_PATH=$(pm path "$PACKAGE" | grep "base.apk" | cut -d':' -f2 | tr -d '\r')
|
||||
if [[ -n "$APK_PATH" ]]; then
|
||||
if aapt dump xmltree "$APK_PATH" AndroidManifest.xml 2>/dev/null | grep -qE "xposed.category|xposeddescription"; then
|
||||
echo "$PACKAGE" >> "$OUTPUT"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
check_update() {
|
||||
check_wget
|
||||
if [ -d "$MODPATH/update" ]; then
|
||||
JSON=$(wget --no-check-certificate -q -O - "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/update.json") || exit 1
|
||||
REMOTE_VERSION=$(echo "$JSON" | grep -o '"versionCode": *[0-9]*' | awk -F: '{print $2}' | tr -d ' ')
|
||||
LOCAL_VERSION=$(grep -o 'versionCode=[0-9]*' "$MODPATH/temp/module.prop" | awk -F= '{print $2}')
|
||||
LOCAL_VERSION=$(grep -o 'versionCode=[0-9]*' "$MODPATH/update/module.prop" | awk -F= '{print $2}')
|
||||
if [ "$REMOTE_VERSION" -gt "$LOCAL_VERSION" ]; then
|
||||
echo "update"
|
||||
fi
|
||||
fi
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
--kb) get_kb; exit ;;
|
||||
--unnecessary) get_unnecessary; exit ;;
|
||||
--xposed) get_xposed; exit ;;
|
||||
--update) check_update; exit ;;
|
||||
esac
|
||||
11
module/common/repo.json
Normal file
11
module/common/repo.json
Normal file
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"support": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues",
|
||||
"categories": [
|
||||
"WebUI"
|
||||
],
|
||||
"readme": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/refs/heads/main/README.md",
|
||||
"note": {
|
||||
"message": "This module is not a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered"
|
||||
},
|
||||
"license": " GPL-3.0"
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
MODPATH=${0%/*}
|
||||
TS="/data/adb/modules/tricky_store"
|
||||
SCRIPT_DIR="/data/adb/tricky_store"
|
||||
|
||||
# Enable back TSupport-A auto update
|
||||
if [ -f "/storage/emulated/0/stop-tspa-auto-target" ]; then
|
||||
rm -f "/storage/emulated/0/stop-tspa-auto-target"
|
||||
fi
|
||||
|
||||
# Remove residue and restore aosp keybox.
|
||||
rm -rf "/data/adb/modules/.TA_utl"
|
||||
rm -rf "$SCRIPT_DIR/target_list_config"
|
||||
rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
rm -f "/data/adb/boot_hash"
|
||||
if [ -d "$TS" ]; then
|
||||
if [ -f "$TS/action.sh" ]; then
|
||||
rm -f "$TS/action.sh"
|
||||
else
|
||||
rm -rf "$TS/webroot"
|
||||
fi
|
||||
fi
|
||||
xxd -r -p "$MODPATH/.default" | base64 -d > "$SCRIPT_DIR/keybox.xml"
|
||||
@@ -1,86 +0,0 @@
|
||||
PACKAGE_NAME="io.github.a13e300.ksuwebui"
|
||||
MODID="set-id"
|
||||
BBPATH="/data/adb/modules/busybox-ndk/system/*/busybox \
|
||||
/data/adb/magisk/busybox \
|
||||
/data/adb/ksu/bin/busybox \
|
||||
/data/adb/ap/bin/busybox"
|
||||
|
||||
find_busybox() {
|
||||
for path in $BBPATH; do
|
||||
if [ -f "$path" ]; then
|
||||
BUSYBOX="$path"
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
return 1
|
||||
}
|
||||
|
||||
check_wget() {
|
||||
if ! command -v wget >/dev/null || grep -q "wget-curl" "$(command -v wget)"; then
|
||||
if find_busybox; then
|
||||
wget() { "$BUSYBOX" wget "$@"; }
|
||||
else
|
||||
echo "Error: busybox not found." > "$OUTPUT"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
aapt() { "$MODPATH/aapt" "$@"; }
|
||||
|
||||
download_webui() {
|
||||
wget --no-check-certificate -P "$APK_DIR" "$URL"
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: APK download failed."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
install_webui() {
|
||||
pm install -r "$APK_PATH" </dev/null 2>&1 | cat
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Error: APK installation failed."
|
||||
rm -f "$APK_PATH"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
key_check() {
|
||||
while true; do
|
||||
key_check=$(/system/bin/getevent -qlc 1)
|
||||
key_event=$(echo "$key_check" | awk '{ print $3 }' | grep 'KEY_')
|
||||
key_status=$(echo "$key_check" | awk '{ print $4 }')
|
||||
if [[ "$key_event" == *"KEY_"* && "$key_status" == "DOWN" ]]; then
|
||||
keycheck="$key_event"
|
||||
break
|
||||
fi
|
||||
done
|
||||
while true; do
|
||||
key_check=$(/system/bin/getevent -qlc 1)
|
||||
key_event=$(echo "$key_check" | awk '{ print $3 }' | grep 'KEY_')
|
||||
key_status=$(echo "$key_check" | awk '{ print $4 }')
|
||||
if [[ "$key_event" == *"KEY_"* && "$key_status" == "UP" ]]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
|
||||
update_script() {
|
||||
echo "**********************************************"
|
||||
echo "- Starting script..."
|
||||
echo ""
|
||||
|
||||
if [[ ! -f "$SCRIPT_DIR/UpdateTargetList.sh" ]]; then
|
||||
echo "! Script missing, please install module again."
|
||||
echo "**********************************************"
|
||||
exit 1
|
||||
else
|
||||
. "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
fi
|
||||
|
||||
echo "**********************************************"
|
||||
echo ""
|
||||
echo "\(__All set!__)/"
|
||||
echo "Exiting in 2 seconds..."
|
||||
sleep 2
|
||||
}
|
||||
@@ -5,7 +5,7 @@ TS="/data/adb/modules/tricky_store"
|
||||
SCRIPT_DIR="/data/adb/tricky_store"
|
||||
CONFIG_DIR="$SCRIPT_DIR/target_list_config"
|
||||
MODID=`grep_prop id $TMPDIR/module.prop`
|
||||
NEW_MODID=.TA_utl
|
||||
NEW_MODID=".TA_utl"
|
||||
kb="$COMPATH/.default"
|
||||
|
||||
ui_print " ";
|
||||
@@ -33,11 +33,17 @@ fi
|
||||
ui_print "- Installing..."
|
||||
initialize
|
||||
|
||||
ui_print "- Creating config directory..."
|
||||
ui_print "- Finalizing..."
|
||||
find_config
|
||||
migrate_old_boot_hash
|
||||
|
||||
rm -f "$MODPATH/install_func.sh"
|
||||
|
||||
ui_print " "
|
||||
ui_print "! This module is not a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered."
|
||||
ui_print " "
|
||||
|
||||
sleep 1
|
||||
|
||||
ui_print "- Installation completed successfully! "
|
||||
ui_print " "
|
||||
ui_print " "
|
||||
|
||||
@@ -1,93 +1,37 @@
|
||||
initialize() {
|
||||
if [ -f "$SCRIPT_DIR/UpdateTargetList.sh" ]; then
|
||||
rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
fi
|
||||
if [ -f "$CONFIG_DIR/skipwebui" ]; then
|
||||
rm -f "$CONFIG_DIR/skipwebui"
|
||||
fi
|
||||
if [ -d "/data/adb/modules/$NEW_MODID" ]; then
|
||||
rm -rf "/data/adb/modules/$NEW_MODID"
|
||||
fi
|
||||
|
||||
cp "$MODPATH/module.prop" "$COMPATH/temp/module.prop"
|
||||
cp "$COMPATH/.default" "$COMPATH/temp/.default"
|
||||
mv "$COMPATH/UpdateTargetList.sh" "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
set_perm $SCRIPT_DIR/UpdateTargetList.sh 0 2000 0755
|
||||
# Cleanup left over
|
||||
[ -d "/data/adb/modules/$NEW_MODID" ] && rm -rf "/data/adb/modules/$NEW_MODID"
|
||||
|
||||
# Set permission
|
||||
set_perm $COMPATH/get_extra.sh 0 2000 0755
|
||||
set_perm $COMPATH/get_WebUI.sh 0 2000 0755
|
||||
|
||||
|
||||
# Handdle Magisk/non-Magisk root manager
|
||||
if [ "$ACTION" = "false" ]; then
|
||||
rm -f "$MODPATH/action.sh"
|
||||
rm -f "$COMPATH/get_WebUI.sh"
|
||||
echo "**********************************************"
|
||||
echo "- Tricky Addon's visibility in root manager?"
|
||||
echo " VOL [+]: Visible"
|
||||
echo " VOL [-]: Invisible (default)"
|
||||
echo "**********************************************"
|
||||
|
||||
key_check
|
||||
if [[ "$keycheck" == "KEY_VOLUMEUP" ]]; then
|
||||
echo "- Setting to visible..."
|
||||
rm -rf "$COMPATH/temp"
|
||||
NEW_MODID="$MODID"
|
||||
fi
|
||||
NEW_MODID="$MODID"
|
||||
else
|
||||
mkdir -p "$COMPATH/update/common"
|
||||
cp "$COMPATH/.default" "$COMPATH/update/common/.default"
|
||||
cp "$MODPATH/uninstall.sh" "$COMPATH/update/uninstall.sh"
|
||||
fi
|
||||
sed -i "s|\"set-path\"|\"/data/adb/modules/$NEW_MODID/common/\"|" "$MODPATH/webroot/index.js" || {
|
||||
|
||||
#Set specific path
|
||||
sed -i "s|\"set-path\"|\"/data/adb/modules/$NEW_MODID/\"|" "$MODPATH/webui/index.js" || {
|
||||
ui_print "! Failed to set path"
|
||||
abort
|
||||
}
|
||||
sed -i "s|\"set-id\"|\"$NEW_MODID\"|" "$COMPATH/util_func.sh" || {
|
||||
ui_print "! Failed to set id"
|
||||
abort
|
||||
}
|
||||
|
||||
|
||||
# Set aapt binary
|
||||
cp "$MODPATH/module.prop" "$COMPATH/update/module.prop"
|
||||
mv "$MODPATH/bin/$(getprop ro.product.cpu.abi)/aapt" "$COMPATH/aapt"
|
||||
set_perm $COMPATH/aapt 0 2000 0755
|
||||
rm -rf "$MODPATH/bin"
|
||||
}
|
||||
|
||||
add_exclude() {
|
||||
EXCLUDE=$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$CONFIG_DIR/EXCLUDE")
|
||||
for app in $EXCLUDE; do
|
||||
app=$(echo "$app" | tr -d '[:space:]')
|
||||
if ! grep -Fq "$app" $COMPATH/EXCLUDE; then
|
||||
echo "$app" >> $COMPATH/EXCLUDE
|
||||
fi
|
||||
done
|
||||
mv "$COMPATH/EXCLUDE" "$CONFIG_DIR/EXCLUDE"
|
||||
}
|
||||
|
||||
add_addition() {
|
||||
ADDITION=$(grep -vE '^[[:space:]]*#|^[[:space:]]*$' "$CONFIG_DIR/ADDITION")
|
||||
for app in $ADDITION; do
|
||||
app=$(echo "$app" | tr -d '[:space:]')
|
||||
if ! grep -Fq "$app" $COMPATH/ADDITION; then
|
||||
echo "$app" >> $COMPATH/ADDITION
|
||||
fi
|
||||
done
|
||||
mv "$COMPATH/ADDITION" "$CONFIG_DIR/ADDITION"
|
||||
}
|
||||
|
||||
find_config() {
|
||||
if [ -d "$CONFIG_DIR" ]; then
|
||||
if [ ! -f "$CONFIG_DIR/EXCLUDE" ] && [ ! -f "$CONFIG_DIR/ADDITION" ]; then
|
||||
mv "$COMPATH/EXCLUDE" "$CONFIG_DIR/EXCLUDE"
|
||||
mv "$COMPATH/ADDITION" "$CONFIG_DIR/ADDITION"
|
||||
elif [ ! -f "$CONFIG_DIR/ADDITION" ]; then
|
||||
mv "$COMPATH/ADDITION" "$CONFIG_DIR/ADDITION"
|
||||
add_exclude
|
||||
elif [ ! -f "$CONFIG_DIR/EXCLUDE" ]; then
|
||||
mv "$COMPATH/EXCLUDE" "$CONFIG_DIR/EXCLUDE"
|
||||
add_addition
|
||||
else
|
||||
add_exclude
|
||||
add_addition
|
||||
fi
|
||||
else
|
||||
mkdir -p "$CONFIG_DIR"
|
||||
mv "$COMPATH/EXCLUDE" "$CONFIG_DIR/EXCLUDE"
|
||||
mv "$COMPATH/ADDITION" "$CONFIG_DIR/ADDITION"
|
||||
fi
|
||||
# Remove legacy setup
|
||||
[ -f "$SCRIPT_DIR/UpdateTargetList.sh" ] && rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
[ -d "$CONFIG_DIR" ] && rm -rf "$CONFIG_DIR"
|
||||
}
|
||||
|
||||
migrate_old_boot_hash() {
|
||||
@@ -97,23 +41,3 @@ migrate_old_boot_hash() {
|
||||
rm -f "$COMPATH/boot_hash"
|
||||
fi
|
||||
}
|
||||
|
||||
key_check() {
|
||||
while true; do
|
||||
key_check=$(/system/bin/getevent -qlc 1)
|
||||
key_event=$(echo "$key_check" | awk '{ print $3 }' | grep 'KEY_')
|
||||
key_status=$(echo "$key_check" | awk '{ print $4 }')
|
||||
if [[ "$key_event" == *"KEY_"* && "$key_status" == "DOWN" ]]; then
|
||||
keycheck="$key_event"
|
||||
break
|
||||
fi
|
||||
done
|
||||
while true; do
|
||||
key_check=$(/system/bin/getevent -qlc 1)
|
||||
key_event=$(echo "$key_check" | awk '{ print $3 }' | grep 'KEY_')
|
||||
key_status=$(echo "$key_check" | awk '{ print $4 }')
|
||||
if [[ "$key_event" == *"KEY_"* && "$key_status" == "UP" ]]; then
|
||||
break
|
||||
fi
|
||||
done
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
id=TA_utl
|
||||
name=Tricky Addon - Update Target List
|
||||
version=v2.6-beta.2
|
||||
versionCode=250
|
||||
version=v2.8
|
||||
versionCode=280
|
||||
author=KOWX712
|
||||
description=A WebUI to conifgure tricky store target.txt
|
||||
updateJson=https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/update.json
|
||||
description=A WebUI to conifgure tricky store target.txt
|
||||
updateJson=https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/update.json
|
||||
|
||||
19
module/post-fs-data.sh
Normal file
19
module/post-fs-data.sh
Normal file
@@ -0,0 +1,19 @@
|
||||
MODPATH=${0%/*}
|
||||
TS="/data/adb/modules/tricky_store"
|
||||
|
||||
while [ -z "$(ls -A /data/adb/modules/)" ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
if [ ! -d "$TS" ] || [ -f "$TS/remove" ]; then
|
||||
if [ -f "$MODPATH/action.sh" ]; then
|
||||
[ -d "/data/adb/modules/TA_utl" ] && rm -rf "/data/adb/modules/TA_utl"
|
||||
cp -rf "$MODPATH/common/temp" "/data/adb/modules/TA_utl"
|
||||
touch "/data/adb/modules/TA_utl/remove"
|
||||
else
|
||||
touch "$MODPATH/remove"
|
||||
fi
|
||||
fi
|
||||
|
||||
rm -f "$TS/action.sh"
|
||||
rm -rf "$TS/webroot"
|
||||
@@ -6,6 +6,7 @@ TSPA="/data/adb/modules/tsupport-advance"
|
||||
|
||||
aapt() { "$MODPATH/common/aapt" "$@"; }
|
||||
|
||||
# Reset verified Boot Hash
|
||||
hash_value=$(grep -v '^#' "/data/adb/boot_hash" | tr -d '[:space:]')
|
||||
if [ -n "$hash_value" ]; then
|
||||
resetprop -n ro.boot.vbmeta.digest "$hash_value"
|
||||
@@ -18,64 +19,42 @@ elif [ ! -d "$TSPA" ] && [ -f "/storage/emulated/0/stop-tspa-auto-target" ]; the
|
||||
rm -f "/storage/emulated/0/stop-tspa-auto-target"
|
||||
fi
|
||||
|
||||
if [ -d "$MODPATH/common/temp" ]; then
|
||||
if [ "$KSU" ] || [ "$APATCH" ]; then
|
||||
rm -f "$MODPATH/module.prop"
|
||||
fi
|
||||
if [ ! -d "$HIDE_DIR" ]; then
|
||||
# Hide module
|
||||
if [ -f "$MODPATH/action.sh" ]; then
|
||||
if [[ "$MODPATH" != "$HIDE_DIR" ]]; then
|
||||
rm -rf "$HIDE_DIR"
|
||||
mv "$MODPATH" "$HIDE_DIR"
|
||||
elif [[ "$MODPATH" != "$HIDE_DIR" ]]; then
|
||||
rm -rf "$MODPATH"
|
||||
exit 0
|
||||
fi
|
||||
MODPATH="$HIDE_DIR"
|
||||
elif [ -d "$HIDE_DIR" ]; then
|
||||
rm -rf "$HIDE_DIR"
|
||||
fi
|
||||
rm -f "$MODPATH/module.prop"
|
||||
|
||||
OUTPUT_APP="$MODPATH/common/applist"
|
||||
OUTPUT_SKIP="$MODPATH/common/skiplist"
|
||||
# Symlink tricky store
|
||||
[ -f "$MODPATH/action.sh" ] && ln -s "$MODPATH/action.sh" "$TS/action.sh"
|
||||
ln -s "$MODPATH/webui" "$TS/webroot"
|
||||
|
||||
if [ ! -d "$TS" ]; then
|
||||
if [ -d "$MODPATH/common/temp" ]; then
|
||||
mkdir -p "/data/adb/modules/TA_utl"
|
||||
cp -rf "$MODPATH/common/temp/*" "/data/adb/modules/TA_utl/"
|
||||
touch "/data/adb/modules/TA_utl/remove"
|
||||
exit 1
|
||||
# Optimization
|
||||
OUTPUT_APP="$MODPATH/common/tmp/applist"
|
||||
OUTPUT_SKIP="$MODPATH/common/tmp/skiplist"
|
||||
|
||||
until [ "$(getprop sys.boot_completed)" = "1" ]; do
|
||||
sleep 1
|
||||
done
|
||||
|
||||
mkdir -p "$MODPATH/common/tmp"
|
||||
echo "# This file is generated from service.sh to speed up load time" > "$OUTPUT_APP"
|
||||
echo "# This file is generated from service.sh to speed up load time" > "$OUTPUT_SKIP"
|
||||
pm list packages -3 </dev/null 2>&1 | cat | awk -F: '{print $2}' | while read -r PACKAGE; do
|
||||
APK_PATH=$(pm path "$PACKAGE" </dev/null 2>&1 | cat | grep "base.apk" | awk -F: '{print $2}' | tr -d '\r')
|
||||
if [ -n "$APK_PATH" ]; then
|
||||
APP_NAME=$(aapt dump badging "$APK_PATH" </dev/null 2>&1 | cat | grep "application-label:" | sed "s/application-label://g; s/'//g")
|
||||
echo "app-name: $APP_NAME, package-name: $PACKAGE" >> "$OUTPUT_APP"
|
||||
else
|
||||
touch "$MODPATH/remove"
|
||||
exit 1
|
||||
echo "app-name: Unknown App package-name: $PACKAGE" >> "$OUTPUT_APP"
|
||||
fi
|
||||
elif [ -f "$TS/disable" ]; then
|
||||
exit 1
|
||||
else
|
||||
if [ -f "$MODPATH/action.sh" ]; then
|
||||
if [ -f "$TS/action.sh" ]; then
|
||||
rm -f "$TS/action.sh"
|
||||
fi
|
||||
ln -s "$MODPATH/action.sh" "$TS/action.sh"
|
||||
else
|
||||
if [ -d "$TS/webroot" ]; then
|
||||
rm -rf "$TS/webroot"
|
||||
fi
|
||||
if [ -d "$MODPATH/common/temp" ]; then
|
||||
ln -s "$MODPATH/webroot" "$TS/webroot"
|
||||
fi
|
||||
if ! aapt dump xmltree "$APK_PATH" AndroidManifest.xml </dev/null 2>&1 | cat | grep -qE "xposed.category|xposeddescription"; then
|
||||
echo "$PACKAGE" >> "$OUTPUT_SKIP"
|
||||
fi
|
||||
until [ "$(getprop sys.boot_completed)" = "1" ]; do
|
||||
sleep 1
|
||||
done
|
||||
echo "# This file is generated from service.sh to speed up load time" > "$OUTPUT_APP"
|
||||
echo "# This file is generated from service.sh to speed up load time" > "$OUTPUT_SKIP"
|
||||
pm list packages -3 </dev/null 2>&1 | cat | awk -F: '{print $2}' | while read -r PACKAGE; do
|
||||
APK_PATH=$(pm path "$PACKAGE" </dev/null 2>&1 | cat | grep "base.apk" | awk -F: '{print $2}' | tr -d '\r')
|
||||
if [ -n "$APK_PATH" ]; then
|
||||
APP_NAME=$(aapt dump badging "$APK_PATH" </dev/null 2>&1 | cat | grep "application-label:" | sed "s/application-label://g; s/'//g")
|
||||
echo "app-name: $APP_NAME, package-name: $PACKAGE" >> "$OUTPUT_APP"
|
||||
else
|
||||
echo "app-name: Unknown App package-name: $PACKAGE" >> "$OUTPUT_APP"
|
||||
fi
|
||||
if ! aapt dump xmltree "$APK_PATH" AndroidManifest.xml </dev/null 2>&1 | cat | grep -qE "xposed.category|xposeddescription"; then
|
||||
echo "$PACKAGE" >> "$OUTPUT_SKIP"
|
||||
fi
|
||||
done
|
||||
. "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -8,14 +8,10 @@ if [ -f "/storage/emulated/0/stop-tspa-auto-target" ]; then
|
||||
fi
|
||||
|
||||
# Remove residue and restore aosp keybox.
|
||||
rm -rf "$SCRIPT_DIR/target_list_config"
|
||||
rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
|
||||
rm -rf "/data/adb/modules/.TA_utl"
|
||||
rm -f "/data/adb/boot_hash"
|
||||
if [ -d "$TS" ]; then
|
||||
if [ -f "$TS/action.sh" ]; then
|
||||
rm -f "$TS/action.sh"
|
||||
else
|
||||
rm -rf "$TS/webroot"
|
||||
fi
|
||||
rm -f "$TS/action.sh"
|
||||
rm -rf "$TS/webroot"
|
||||
fi
|
||||
xxd -r -p "$MODPATH/common/.default" | base64 -d > "$SCRIPT_DIR/keybox.xml"
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M6.92,5.51h0L3.71,2.29A1,1,0,0,0,2.29,3.71L4.56,6A15.21,15.21,0,0,0,1.4,8.39a1,1,0,0,0,0,1.41,1,1,0,0,0,.71.3,1,1,0,0,0,.7-.29A13.07,13.07,0,0,1,6.05,7.46L7.54,9a10.78,10.78,0,0,0-3.32,2.27,1,1,0,1,0,1.42,1.4,8.8,8.8,0,0,1,3.45-2.12l1.62,1.61a7.07,7.07,0,0,0-3.66,1.94,1,1,0,1,0,1.42,1.4A5,5,0,0,1,12,14a4.13,4.13,0,0,1,.63.05l7.66,7.66a1,1,0,0,0,1.42,0,1,1,0,0,0,0-1.42ZM12,16a3,3,0,1,0,3,3A3,3,0,0,0,12,16Zm0,4a1,1,0,1,1,1-1A1,1,0,0,1,12,20ZM22.61,8.39A15,15,0,0,0,10.29,4.1a1,1,0,1,0,.22,2A13.07,13.07,0,0,1,21.2,9.81a1,1,0,0,0,1.41-1.42Zm-4.25,4.24a1,1,0,0,0,1.42-1.4,10.75,10.75,0,0,0-4.84-2.82,1,1,0,1,0-.52,1.92A8.94,8.94,0,0,1,18.36,12.63Z"/></svg>
|
||||
|
Before Width: | Height: | Size: 725 B |
@@ -1,32 +1,39 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title data-i18n="title">Document</title>
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
|
||||
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
|
||||
<link rel="stylesheet" href="/styles.css" type="text/css">
|
||||
<link rel="stylesheet" type="text/css" href="/mmrl/insets.css" />
|
||||
<script type="module" crossorigin src="/index.js"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<!-- Header -->
|
||||
<div class="header-block"></div>
|
||||
<div class="header">
|
||||
<div id="title" data-i18n="title"></div>
|
||||
<button id="help-button" class="help-button"><i class="fa fa-question-circle"></i></button>
|
||||
<button id="help-button" class="help-button"><svg xmlns="http://www.w3.org/2000/svg" height="21px" viewBox="0 -1060 960 990" width="21px" fill="#6E6E6E"><path d="M478-240q21 0 35.5-14.5T528-290q0-21-14.5-35.5T478-340q-21 0-35.5 14.5T428-290q0 21 14.5 35.5T478-240Zm-36-154h74q0-33 7.5-52t42.5-52q26-26 41-49.5t15-56.5q0-56-41-86t-97-30q-57 0-92.5 30T342-618l66 26q5-18 22.5-39t53.5-21q32 0 48 17.5t16 38.5q0 20-12 37.5T506-526q-44 39-54 59t-10 73Zm38 314q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/></svg></button>
|
||||
<div class="no-connection">
|
||||
<img src="wifi-slash.svg" alt="No Connection Icon" class="wifi-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="20px" viewBox="0 -920 960 960" width="20px" fill="#6E6E6E"><path d="M790-56 414-434q-47 11-87.5 33T254-346l-84-86q32-32 69-56t79-42l-90-90q-41 21-76.5 46.5T84-516L0-602q32-32 66.5-57.5T140-708l-84-84 56-56 736 736-58 56Zm-310-64q-42 0-71-29.5T380-220q0-42 29-71t71-29q42 0 71 29t29 71q0 41-29 70.5T480-120Zm236-238-29-29-29-29-144-144q81 8 151.5 41T790-432l-74 74Zm160-158q-77-77-178.5-120.5T480-680q-21 0-40.5 1.5T400-674L298-776q44-12 89.5-18t92.5-6q142 0 265 53t215 145l-84 86Z"/></svg>
|
||||
</div>
|
||||
<div class="language-dropdown">
|
||||
<button class="language-button">
|
||||
<i class="fa fa-compass"></i>
|
||||
<i class="material-icons">language</i>
|
||||
</button>
|
||||
<div class="language-menu">
|
||||
<button class="language-option" data-lang="en-US" data-i18n="language_english_us">English</button>
|
||||
<button class="language-option" data-lang="ru-RU" data-i18n="language_russian">Русский</button>
|
||||
<button class="language-option" data-lang="tl-PH" data-i18n="language_tagalog">Tagalog</button>
|
||||
<button class="language-option" data-lang="zh-CN"data-i18n="language_chinese_simplified">中文(简体)</button>
|
||||
<button class="language-option" data-lang="zh-TW"data-i18n="language_chinese_traditional">中文(繁体)</button>
|
||||
<button class="language-option" data-lang="en-US">English</button>
|
||||
<button class="language-option" data-lang="ja-JP">日本語</button>
|
||||
<button class="language-option" data-lang="ru-RU">Русский</button>
|
||||
<button class="language-option" data-lang="tl-PH">Tagalog</button>
|
||||
<button class="language-option" data-lang="zh-CN">中文(简体)</button>
|
||||
<button class="language-option" data-lang="zh-TW">中文(繁体)</button>
|
||||
</div>
|
||||
<div id="language-overlay" class="language-overlay"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -44,7 +51,9 @@
|
||||
<!-- Menu Options -->
|
||||
<div class="search-menu-container">
|
||||
<div class="search-card">
|
||||
<span class="search-icon"><i class="fa fa-search"></i></span>
|
||||
<span class="search-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="19px" viewBox="0 -960 960 960" width="24px" fill="#6E6E6E"><path d="M784-120 532-372q-30 24-69 38t-83 14q-109 0-184.5-75.5T120-580q0-109 75.5-184.5T380-840q109 0 184.5 75.5T640-580q0 44-14 83t-38 69l252 252-56 56ZM380-400q75 0 127.5-52.5T560-580q0-75-52.5-127.5T380-760q-75 0-127.5 52.5T200-580q0 75 52.5 127.5T380-400Z"/></svg>
|
||||
</span>
|
||||
<input type="text" class="search-input" id="search" placeholder="Search" data-i18n="search_placeholder">
|
||||
<button class="clear-btn" id="clear-btn">✕</button>
|
||||
</div>
|
||||
@@ -67,15 +76,22 @@
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div id="menu-overlay" class="menu-overlay"></div>
|
||||
</div>
|
||||
|
||||
<!-- Applist Display -->
|
||||
<div id="apps-list"></div>
|
||||
<div class="update-card" id="update-card">
|
||||
<p id="update-available" data-i18n="update_available"></p>
|
||||
<p id="redirect-to-release" data-i18n="redirect_to_release"></p>
|
||||
</div>
|
||||
<template id="app-template">
|
||||
<div class="card" onclick="toggleCheckbox(event)">
|
||||
<div class="content" data-package="">
|
||||
<p class="name"></p>
|
||||
<input type="checkbox" class="checkbox" checked>
|
||||
<div class="card-box">
|
||||
<div class="card">
|
||||
<div class="content" data-package="">
|
||||
<p class="name"></p>
|
||||
<input type="checkbox" class="checkbox">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -110,20 +126,15 @@
|
||||
<p data-i18n="module_name_line2"></p>
|
||||
<p><span data-i18n="by"></span>KOWX712</p>
|
||||
<br>
|
||||
<p>
|
||||
<span data-i18n="telegram_channel"></span>
|
||||
<br>
|
||||
<span>t.me/kowchannel</span>
|
||||
</p>
|
||||
<br>
|
||||
<p>
|
||||
<span data-i18n="github"></span>
|
||||
<br>
|
||||
<span>github.com/KOWX712/Tricky-Addon-Update-Target-List</span>
|
||||
</p>
|
||||
<br>
|
||||
<p data-i18n="disclaimer"></p>
|
||||
<br>
|
||||
<p>
|
||||
<div class="link">
|
||||
<i class="fa fa-telegram" id="telegram" aria-hidden="true"> <span id="link-text" data-i18n="telegram_channel"></span></i>
|
||||
<i class="fa fa-github" id="github" aria-hidden="true"> <span id="link-text" data-i18n="github"></span></i>
|
||||
</div>
|
||||
</p>
|
||||
<br>
|
||||
<p data-i18n="acknowledgment"></p>
|
||||
<p>j-hc/zygisk-detach: WebUI template</p>
|
||||
</div>
|
||||
@@ -133,9 +144,10 @@
|
||||
<!-- Footer -->
|
||||
<div class="footer">
|
||||
<div class="uninstall-container hidden-uninstall">
|
||||
<i class="fa fa-trash"></i>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 -960 960 960" width="24px" fill="#FFFFFF"><path d="M280-120q-33 0-56.5-23.5T200-200v-520h-40v-80h200v-40h240v40h200v80h-40v520q0 33-23.5 56.5T680-120H280Zm400-600H280v520h400v-520ZM360-280h80v-360h-80v360Zm160 0h80v-360h-80v360ZM280-720v520-520Z"/></svg>
|
||||
<span data-i18n="uninstall_webui"></span>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,17 +1,17 @@
|
||||
// Header Elements
|
||||
const headerBlock = document.querySelector('.header-block');
|
||||
const title = document.querySelector('.header');
|
||||
const helpButton = document.getElementById('help-button');
|
||||
const noConnection = document.querySelector('.no-connection');
|
||||
const languageButton = document.querySelector('.language-button');
|
||||
const languageMenu = document.querySelector('.language-menu');
|
||||
const languageOptions = document.querySelectorAll('.language-option');
|
||||
const languageOverlay = document.getElementById('language-overlay');
|
||||
|
||||
// Loading and Prompt Elements
|
||||
const loadingIndicator = document.querySelector('.loading');
|
||||
const prompt = document.getElementById('prompt');
|
||||
|
||||
// Floating Button
|
||||
const floatingBtn = document.querySelector('.floating-btn');
|
||||
// Help Overlay Elements
|
||||
const helpOverlay = document.getElementById('help-overlay');
|
||||
const closeHelp = document.getElementById('close-help');
|
||||
const helpList = document.getElementById('help-list');
|
||||
|
||||
// Search and Menu Elements
|
||||
const searchInput = document.getElementById('search');
|
||||
@@ -22,15 +22,8 @@ const menu = document.querySelector('.menu');
|
||||
const menuButton = document.getElementById('menu-button');
|
||||
const menuOptions = document.getElementById('menu-options');
|
||||
const selectDenylistElement = document.getElementById('select-denylist');
|
||||
|
||||
// Applist Elements
|
||||
const appTemplate = document.getElementById('app-template').content;
|
||||
const appListContainer = document.getElementById('apps-list');
|
||||
|
||||
// Help Overlay Elements
|
||||
const helpOverlay = document.getElementById('help-overlay');
|
||||
const closeHelp = document.getElementById('close-help');
|
||||
const helpList = document.getElementById('help-list');
|
||||
const menuOverlay = document.getElementById('menu-overlay');
|
||||
const menuIcon = menuButton.querySelector('.menu-icon');
|
||||
|
||||
// BootHash Overlay Elements
|
||||
const bootHashOverlay = document.getElementById('boot-hash-overlay');
|
||||
@@ -38,7 +31,27 @@ const card = document.getElementById('boot-hash-card');
|
||||
const inputBox = document.getElementById('boot-hash-input');
|
||||
const saveButton = document.getElementById('boot-hash-save-button');
|
||||
|
||||
// Applist Elements
|
||||
const appTemplate = document.getElementById('app-template').content;
|
||||
const appListContainer = document.getElementById('apps-list');
|
||||
const updateCard = document.getElementById('update-card');
|
||||
|
||||
// Loading, Save and Prompt Elements
|
||||
const loadingIndicator = document.querySelector('.loading');
|
||||
const floatingBtn = document.querySelector('.floating-btn');
|
||||
const prompt = document.getElementById('prompt');
|
||||
|
||||
// About Elements
|
||||
const telegramLink = document.getElementById('telegram');
|
||||
const githubLink = document.getElementById('github');
|
||||
|
||||
const basePath = "set-path";
|
||||
const ADDITIONAL_APPS = [
|
||||
"com.google.android.gms",
|
||||
"io.github.vvb2060.keyattestation",
|
||||
"io.github.vvb2060.mahoshojo",
|
||||
"icu.nullptr.nativetest"
|
||||
];
|
||||
|
||||
// Variables
|
||||
let e = 0;
|
||||
@@ -46,19 +59,28 @@ let excludeList = [];
|
||||
let isRefreshing = false;
|
||||
let translations = {};
|
||||
let currentLang = 'en-US';
|
||||
let availableLanguages = ['en-US'];
|
||||
|
||||
// Function to check for available language
|
||||
async function initializeAvailableLanguages() {
|
||||
try {
|
||||
const multiLang = await execCommand(`find ${basePath}webui/locales -type f -name "*.json" ! -name "A-template.json" -exec basename -s .json {} \\;`);
|
||||
availableLanguages = multiLang.trim().split('\n');
|
||||
} catch (error) {
|
||||
console.error('Failed to fetch available languages:', error);
|
||||
availableLanguages = ['en-US'];
|
||||
}
|
||||
}
|
||||
|
||||
// Function to detect user's default language
|
||||
function detectUserLanguage() {
|
||||
const userLang = navigator.language || navigator.userLanguage;
|
||||
const langCode = userLang.split('-')[0];
|
||||
const availableLanguages = ['en-US', 'ru-RU', 'tl-PH', 'zh-CN', 'zh-TW'];
|
||||
if (availableLanguages.includes(userLang)) {
|
||||
return userLang;
|
||||
}
|
||||
else if (availableLanguages.includes(langCode)) {
|
||||
} else if (availableLanguages.includes(langCode)) {
|
||||
return langCode;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return 'en-US';
|
||||
}
|
||||
}
|
||||
@@ -101,6 +123,74 @@ document.querySelectorAll(".language-option").forEach((button) => {
|
||||
});
|
||||
});
|
||||
|
||||
// Function to setup the language menu
|
||||
function setupLanguageMenu() {
|
||||
languageButton.addEventListener("click", (event) => {
|
||||
event.stopPropagation();
|
||||
const isVisible = languageMenu.classList.contains("show");
|
||||
if (isVisible) {
|
||||
closeLanguageMenu();
|
||||
} else {
|
||||
openLanguageMenu();
|
||||
}
|
||||
});
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!languageButton.contains(event.target) && !languageMenu.contains(event.target)) {
|
||||
closeLanguageMenu();
|
||||
}
|
||||
});
|
||||
languageOptions.forEach(option => {
|
||||
option.addEventListener("click", () => {
|
||||
closeLanguageMenu();
|
||||
});
|
||||
});
|
||||
window.addEventListener('scroll', () => {
|
||||
if (languageMenu.classList.contains("show")) {
|
||||
closeLanguageMenu();
|
||||
}
|
||||
});
|
||||
function openLanguageMenu() {
|
||||
languageMenu.classList.add("show");
|
||||
languageOverlay.style.display = 'flex';
|
||||
}
|
||||
function closeLanguageMenu() {
|
||||
languageMenu.classList.remove("show");
|
||||
languageOverlay.style.display = 'none';
|
||||
}
|
||||
}
|
||||
|
||||
// Focus on search input when search card is clicked
|
||||
searchCard.addEventListener("click", () => {
|
||||
searchInput.focus();
|
||||
});
|
||||
|
||||
// Search functionality
|
||||
searchInput.addEventListener("input", (e) => {
|
||||
const searchQuery = e.target.value.toLowerCase();
|
||||
const apps = appListContainer.querySelectorAll(".card");
|
||||
apps.forEach(app => {
|
||||
const name = app.querySelector(".name").textContent.toLowerCase();
|
||||
app.style.display = name.includes(searchQuery) ? "block" : "none";
|
||||
window.scrollTo(0, 0);
|
||||
});
|
||||
if (searchQuery !== "") {
|
||||
clearBtn.style.display = "block";
|
||||
} else {
|
||||
clearBtn.style.display = "none";
|
||||
}
|
||||
});
|
||||
|
||||
// Clear search input
|
||||
clearBtn.addEventListener("click", () => {
|
||||
searchInput.value = "";
|
||||
clearBtn.style.display = "none";
|
||||
window.scrollTo(0, 0);
|
||||
const apps = appListContainer.querySelectorAll(".card");
|
||||
apps.forEach(app => {
|
||||
app.style.display = "block";
|
||||
});
|
||||
});
|
||||
|
||||
// Function to dynamically update the help menu
|
||||
function updateHelpMenu() {
|
||||
helpList.innerHTML = "";
|
||||
@@ -128,111 +218,90 @@ function updateHelpMenu() {
|
||||
});
|
||||
}
|
||||
|
||||
// Function to execute shell commands
|
||||
async function execCommand(command) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const callbackName = `exec_callback_${Date.now()}_${e++}`;
|
||||
window[callbackName] = (errno, stdout, stderr) => {
|
||||
delete window[callbackName];
|
||||
if (errno === 0) {
|
||||
resolve(stdout);
|
||||
} else {
|
||||
console.error(`Error executing command: ${stderr}`);
|
||||
reject(stderr);
|
||||
}
|
||||
};
|
||||
try {
|
||||
ksu.exec(command, "{}", callbackName);
|
||||
} catch (error) {
|
||||
console.error(`Execution error: ${error}`);
|
||||
reject(error);
|
||||
// Function to setup the help menu
|
||||
function setupHelpOverlay() {
|
||||
helpButton.addEventListener("click", () => {
|
||||
helpOverlay.classList.remove("hide");
|
||||
helpOverlay.style.display = "flex";
|
||||
requestAnimationFrame(() => {
|
||||
helpOverlay.classList.add("show");
|
||||
});
|
||||
document.body.classList.add("no-scroll");
|
||||
});
|
||||
const hideHelpOverlay = () => {
|
||||
helpOverlay.classList.remove("show");
|
||||
helpOverlay.classList.add("hide");
|
||||
document.body.classList.remove("no-scroll");
|
||||
setTimeout(() => {
|
||||
helpOverlay.style.display = "none";
|
||||
}, 200);
|
||||
};
|
||||
closeHelp.addEventListener("click", hideHelpOverlay);
|
||||
helpOverlay.addEventListener("click", (event) => {
|
||||
if (event.target === helpOverlay) {
|
||||
hideHelpOverlay();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Function to read the EXCLUDE file and return its contents as an array
|
||||
async function readExcludeFile() {
|
||||
try {
|
||||
const result = await execCommand('cat /data/adb/tricky_store/target_list_config/EXCLUDE');
|
||||
excludeList = result.split("\n").filter(app => app.trim() !== ''); // Filter out empty lines
|
||||
console.log("Current EXCLUDE list:", excludeList);
|
||||
} catch (error) {
|
||||
console.error("Failed to read EXCLUDE file:", error);
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to check if an app name should be excluded
|
||||
function isExcluded(appName) {
|
||||
return excludeList.some(excludeItem => appName.includes(excludeItem));
|
||||
}
|
||||
|
||||
// Function to fetch, sort, and render the app list with app names
|
||||
async function fetchAppList() {
|
||||
try {
|
||||
await readExcludeFile();
|
||||
let applistMap = {};
|
||||
try {
|
||||
const applistResult = await execCommand(`cat ${basePath}applist`);
|
||||
applistMap = applistResult
|
||||
.split("\n")
|
||||
.reduce((map, line) => {
|
||||
const match = line.match(/app-name:\s*(.+),\s*package-name:\s*(.+)/);
|
||||
if (match) {
|
||||
const appName = match[1].trim();
|
||||
const packageName = match[2].trim();
|
||||
map[packageName] = appName;
|
||||
}
|
||||
return map;
|
||||
}, {});
|
||||
console.log("Applist loaded successfully.");
|
||||
} catch (error) {
|
||||
console.warn("Applist file not found or could not be loaded. Skipping applist lookup.");
|
||||
// Function to toggle menu option
|
||||
function setupMenuToggle() {
|
||||
let menuOpen = false;
|
||||
let menuAnimating = false;
|
||||
menuButton.addEventListener('click', (event) => {
|
||||
if (menuAnimating) return;
|
||||
event.stopPropagation();
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
const result = await execCommand("pm list packages -3");
|
||||
const appEntries = result
|
||||
.split("\n")
|
||||
.map(line => {
|
||||
const packageName = line.replace("package:", "").trim();
|
||||
const appName = applistMap[packageName] || null;
|
||||
return { appName, packageName };
|
||||
})
|
||||
.filter(entry => entry.packageName);
|
||||
for (const entry of appEntries) {
|
||||
if (!entry.appName) {
|
||||
try {
|
||||
const apkPath = await execCommand(`pm path ${entry.packageName} | grep "base.apk" | awk -F: '{print $2}' | tr -d '\\r'`);
|
||||
if (apkPath) {
|
||||
const appName = await execCommand(`${basePath}aapt dump badging ${apkPath.trim()} 2>/dev/null | grep "application-label:" | sed "s/application-label://; s/'//g"`);
|
||||
entry.appName = appName.trim() || "Unknown App";
|
||||
} else {
|
||||
entry.appName = "Unknown App";
|
||||
}
|
||||
} catch (error) {
|
||||
entry.appName = "Unknown App";
|
||||
}
|
||||
}
|
||||
});
|
||||
document.addEventListener('click', (event) => {
|
||||
if (!menuOptions.contains(event.target) && event.target !== menuButton) {
|
||||
closeMenu();
|
||||
}
|
||||
const sortedApps = appEntries.sort((a, b) => {
|
||||
const aInExclude = isExcluded(a.packageName);
|
||||
const bInExclude = isExcluded(b.packageName);
|
||||
return aInExclude === bInExclude ? a.appName.localeCompare(b.appName) : aInExclude ? 1 : -1;
|
||||
});
|
||||
window.addEventListener('scroll', () => {
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
const menuOptionsList = document.querySelectorAll('#menu-options li');
|
||||
menuOptionsList.forEach(option => {
|
||||
option.addEventListener('click', (event) => {
|
||||
event.stopPropagation();
|
||||
closeMenu();
|
||||
});
|
||||
appListContainer.innerHTML = "";
|
||||
sortedApps.forEach(({ appName, packageName }) => {
|
||||
const appElement = document.importNode(appTemplate, true);
|
||||
const contentElement = appElement.querySelector(".content");
|
||||
contentElement.setAttribute("data-package", packageName);
|
||||
const nameElement = appElement.querySelector(".name");
|
||||
nameElement.innerHTML = `<strong>${appName || "Unknown App"}</strong><br>${packageName}`;
|
||||
const checkbox = appElement.querySelector(".checkbox");
|
||||
checkbox.checked = !isExcluded(packageName);
|
||||
appListContainer.appendChild(appElement);
|
||||
});
|
||||
console.log("App list with names and packages rendered successfully.");
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch or render app list with names:", error);
|
||||
});
|
||||
function openMenu() {
|
||||
menuAnimating = true;
|
||||
menuOptions.style.display = 'block';
|
||||
setTimeout(() => {
|
||||
menuOptions.classList.remove('hidden');
|
||||
menuOptions.classList.add('visible');
|
||||
menuIcon.classList.add('menu-open');
|
||||
menuIcon.classList.remove('menu-closed');
|
||||
menuOverlay.style.display = 'flex';
|
||||
menuOpen = true;
|
||||
menuAnimating = false;
|
||||
}, 10);
|
||||
}
|
||||
function closeMenu() {
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
menuAnimating = true;
|
||||
menuOptions.classList.remove('visible');
|
||||
menuOptions.classList.add('hidden');
|
||||
menuIcon.classList.remove('menu-open');
|
||||
menuIcon.classList.add('menu-closed');
|
||||
menuOverlay.style.display = 'none';
|
||||
setTimeout(() => {
|
||||
menuOptions.style.display = 'none';
|
||||
menuOpen = false;
|
||||
menuAnimating = false;
|
||||
}, 200);
|
||||
}
|
||||
}
|
||||
floatingBtn.style.transform = "translateY(-120px)";
|
||||
}
|
||||
|
||||
// Function to refresh app list
|
||||
@@ -249,7 +318,12 @@ async function refreshAppList() {
|
||||
await new Promise(resolve => setTimeout(resolve, 500));
|
||||
window.scrollTo(0, 0);
|
||||
if (noConnection.style.display === "flex") {
|
||||
await runExtraScript();
|
||||
try {
|
||||
await updateCheck();
|
||||
await execCommand(`[ -f ${basePath}common/tmp/exclude-list ] && rm -f "${basePath}common/tmp/exclude-list"`);
|
||||
} catch (error) {
|
||||
console.error("Error occurred:", error);
|
||||
}
|
||||
}
|
||||
await fetchAppList();
|
||||
loadingIndicator.style.display = 'none';
|
||||
@@ -275,34 +349,56 @@ function deselectAllApps() {
|
||||
});
|
||||
}
|
||||
|
||||
// Function to run the extra script
|
||||
async function runExtraScript() {
|
||||
try {
|
||||
const scriptPath = `${basePath}get_extra.sh`;
|
||||
const output = await execCommand(scriptPath);
|
||||
console.log("Extra script executed successfully.");
|
||||
noConnection.style.display = "none";
|
||||
if (output.includes("update")) {
|
||||
console.log("Update detected from extra script.");
|
||||
showPrompt("new_update");
|
||||
await execCommand(`
|
||||
su -c "mkdir -p '/data/adb/modules/TA_utl' &&
|
||||
cp -rf '${basePath}temp/'* '/data/adb/modules/TA_utl/'"
|
||||
`);
|
||||
} else {
|
||||
console.log("No update detected from extra script.");
|
||||
// Function to run the update check
|
||||
async function updateCheck() {
|
||||
try {
|
||||
const scriptPath = `sh ${basePath}common/get_extra.sh --update`;
|
||||
const output = await execCommand(scriptPath);
|
||||
console.log("update script executed successfully.");
|
||||
noConnection.style.display = "none";
|
||||
if (output.includes("update")) {
|
||||
console.log("Update detected from extra script.");
|
||||
showPrompt("new_update");
|
||||
updateCard.style.display = "flex";
|
||||
await execCommand(`
|
||||
su -c "
|
||||
if [ -f '${basePath}action.sh' ]; then
|
||||
if [ -d "/data/adb/modules/TA_utl" ]; then
|
||||
rm -rf "/data/adb/modules/TA_utl"
|
||||
fi
|
||||
cp -rf '${basePath}common/update' '/data/adb/modules/TA_utl'
|
||||
else
|
||||
cp '${basePath}common/update/module.prop' '/data/adb/modules/TA_utl/module.prop'
|
||||
fi
|
||||
"
|
||||
`);
|
||||
} else {
|
||||
console.log("No update detected from extra script.");
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Failed to execute update script:", error);
|
||||
showPrompt("no_internet", false);
|
||||
noConnection.style.display = "flex";
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Failed to execute Extra script:", error);
|
||||
showPrompt("no_internet", false);
|
||||
noConnection.style.display = "flex";
|
||||
}
|
||||
}
|
||||
|
||||
// Function to read the exclude list and uncheck corresponding apps
|
||||
async function deselectUnnecessaryApps() {
|
||||
try {
|
||||
const result = await execCommand(`cat ${basePath}exclude-list`);
|
||||
const fileCheck = await execCommand(`test -f ${basePath}common/tmp/exclude-list && echo "exists" || echo "not found"`);
|
||||
if (fileCheck.trim() === "not found") {
|
||||
setTimeout(async () => {
|
||||
await execCommand(`sh ${basePath}common/get_extra.sh --unnecessary`);
|
||||
}, 0);
|
||||
console.log("Exclude list not found. Running the unnecessary apps script.");
|
||||
} else {
|
||||
setTimeout(async () => {
|
||||
await execCommand(`sh ${basePath}common/get_extra.sh --xposed`);
|
||||
}, 0);
|
||||
console.log("Exclude list found. Running xposed script.");
|
||||
}
|
||||
await new Promise(resolve => setTimeout(resolve, 100));
|
||||
const result = await execCommand(`cat ${basePath}common/tmp/exclude-list`);
|
||||
const UnnecessaryApps = result.split("\n").map(app => app.trim()).filter(Boolean);
|
||||
const apps = document.querySelectorAll(".card");
|
||||
apps.forEach(app => {
|
||||
@@ -310,10 +406,10 @@ async function deselectUnnecessaryApps() {
|
||||
const packageName = contentElement.getAttribute("data-package");
|
||||
const checkbox = app.querySelector(".checkbox");
|
||||
if (UnnecessaryApps.includes(packageName)) {
|
||||
checkbox.checked = false; // Uncheck if found in more-exclude list
|
||||
checkbox.checked = false;
|
||||
}
|
||||
});
|
||||
console.log("unnecessary apps deselected successfully.");
|
||||
console.log("Unnecessary apps deselected successfully.");
|
||||
} catch (error) {
|
||||
console.error("Failed to deselect unnecessary apps:", error);
|
||||
}
|
||||
@@ -369,7 +465,7 @@ async function selectDenylistApps() {
|
||||
// Function to replace aosp kb
|
||||
async function aospkb() {
|
||||
try {
|
||||
const sourcePath = `${basePath}.default`;
|
||||
const sourcePath = `${basePath}common/.default`;
|
||||
const destinationPath = "/data/adb/tricky_store/keybox.xml";
|
||||
await execCommand(`xxd -r -p ${sourcePath} | base64 -d > ${destinationPath}`);
|
||||
console.log("AOSP keybox copied successfully.");
|
||||
@@ -382,9 +478,13 @@ async function aospkb() {
|
||||
|
||||
// Function to replace valid kb
|
||||
async function extrakb() {
|
||||
const sourcePath = `${basePath}.extra`;
|
||||
setTimeout(async () => {
|
||||
await execCommand(`sh ${basePath}common/get_extra.sh --kb`);
|
||||
}, 100);
|
||||
const sourcePath = `${basePath}common/tmp/.extra`;
|
||||
const destinationPath = "/data/adb/tricky_store/keybox.xml";
|
||||
try {
|
||||
await new Promise(resolve => setTimeout(resolve, 300));
|
||||
const fileExists = await execCommand(`[ -f ${sourcePath} ] && echo "exists"`);
|
||||
if (fileExists.trim() !== "exists") {
|
||||
throw new Error(".extra file not found");
|
||||
@@ -450,19 +550,19 @@ async function setBootHash() {
|
||||
// Function to show about overlay
|
||||
function aboutMenu() {
|
||||
const aboutOverlay = document.getElementById('about-overlay');
|
||||
const menu = document.getElementById('about-menu');
|
||||
const aboutMenu = document.getElementById('about-menu');
|
||||
const closeAbout = document.getElementById('close-about');
|
||||
const showMenu = () => {
|
||||
aboutOverlay.style.display = 'flex';
|
||||
setTimeout(() => {
|
||||
aboutOverlay.style.opacity = '1';
|
||||
menu.style.opacity = '1';
|
||||
aboutMenu.style.opacity = '1';
|
||||
}, 10);
|
||||
document.body.style.overflow = 'hidden';
|
||||
};
|
||||
const hideMenu = () => {
|
||||
aboutOverlay.style.opacity = '0';
|
||||
menu.style.opacity = '0';
|
||||
aboutMenu.style.opacity = '0';
|
||||
setTimeout(() => {
|
||||
aboutOverlay.style.display = 'none';
|
||||
document.body.style.overflow = 'auto';
|
||||
@@ -474,13 +574,116 @@ function aboutMenu() {
|
||||
hideMenu();
|
||||
});
|
||||
aboutOverlay.addEventListener('click', (event) => {
|
||||
if (!menu.contains(event.target)) {
|
||||
if (!aboutMenu.contains(event.target)) {
|
||||
hideMenu();
|
||||
}
|
||||
});
|
||||
menu.addEventListener('click', (event) => event.stopPropagation());
|
||||
}
|
||||
|
||||
// Fetch and render applist
|
||||
async function fetchAppList() {
|
||||
try {
|
||||
let targetList = [];
|
||||
try {
|
||||
const targetFileContent = await execCommand('cat /data/adb/tricky_store/target.txt');
|
||||
targetList = targetFileContent.split("\n").filter(app => app.trim() !== ''); // Filter out empty lines
|
||||
console.log("Current target list:", targetList);
|
||||
} catch (error) {
|
||||
console.error("Failed to read target.txt file:", error);
|
||||
}
|
||||
|
||||
let applistMap = {};
|
||||
try {
|
||||
const applistResult = await execCommand(`cat ${basePath}common/tmp/applist`);
|
||||
applistMap = applistResult
|
||||
.split("\n")
|
||||
.reduce((map, line) => {
|
||||
const match = line.match(/app-name:\s*(.+),\s*package-name:\s*(.+)/);
|
||||
if (match) {
|
||||
const appName = match[1].trim();
|
||||
const packageName = match[2].trim();
|
||||
map[packageName] = appName;
|
||||
}
|
||||
return map;
|
||||
}, {});
|
||||
console.log("Applist loaded successfully.");
|
||||
} catch (error) {
|
||||
console.warn("Applist file not found or could not be loaded. Skipping applist lookup.");
|
||||
}
|
||||
|
||||
const result = await execCommand("pm list packages -3");
|
||||
const appEntries = result
|
||||
.split("\n")
|
||||
.map(line => {
|
||||
const packageName = line.replace("package:", "").trim();
|
||||
const appName = applistMap[packageName] || null;
|
||||
return { appName, packageName };
|
||||
})
|
||||
.filter(entry => entry.packageName);
|
||||
for (const entry of appEntries) {
|
||||
if (!entry.appName) {
|
||||
try {
|
||||
const apkPath = await execCommand(`pm path ${entry.packageName} | grep "base.apk" | awk -F: '{print $2}' | tr -d '\\r'`);
|
||||
if (apkPath) {
|
||||
const appName = await execCommand(`${basePath}common/aapt dump badging ${apkPath.trim()} 2>/dev/null | grep "application-label:" | sed "s/application-label://; s/'//g"`);
|
||||
entry.appName = appName.trim() || "Unknown App";
|
||||
} else {
|
||||
entry.appName = "Unknown App";
|
||||
}
|
||||
} catch (error) {
|
||||
entry.appName = "Unknown App";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Sort
|
||||
const sortedApps = appEntries.sort((a, b) => {
|
||||
const aChecked = targetList.includes(a.packageName);
|
||||
const bChecked = targetList.includes(b.packageName);
|
||||
if (aChecked !== bChecked) {
|
||||
return aChecked ? -1 : 1;
|
||||
}
|
||||
return (a.appName || "").localeCompare(b.appName || "");
|
||||
});
|
||||
|
||||
// Render
|
||||
appListContainer.innerHTML = "";
|
||||
sortedApps.forEach(({ appName, packageName }) => {
|
||||
const appElement = document.importNode(appTemplate, true);
|
||||
const contentElement = appElement.querySelector(".content");
|
||||
contentElement.setAttribute("data-package", packageName);
|
||||
const nameElement = appElement.querySelector(".name");
|
||||
nameElement.innerHTML = `<strong>${appName || "Unknown App"}</strong><br>${packageName}`;
|
||||
const checkbox = appElement.querySelector(".checkbox");
|
||||
checkbox.checked = targetList.includes(packageName);
|
||||
appListContainer.appendChild(appElement);
|
||||
});
|
||||
console.log("App list with names and packages rendered successfully.");
|
||||
} catch (error) {
|
||||
console.error("Failed to fetch or render app list with names:", error);
|
||||
}
|
||||
floatingBtn.style.transform = "translateY(-120px)";
|
||||
toggleableCheckbox();
|
||||
if (appListContainer.firstChild !== updateCard) {
|
||||
appListContainer.insertBefore(updateCard, appListContainer.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
// Make checkboxes toggleable
|
||||
function toggleableCheckbox() {
|
||||
const appElements = appListContainer.querySelectorAll(".card");
|
||||
appElements.forEach(card => {
|
||||
const content = card.querySelector(".content");
|
||||
const checkbox = content.querySelector(".checkbox");
|
||||
content.addEventListener("click", (event) => {
|
||||
if (event.target !== checkbox) {
|
||||
checkbox.checked = !checkbox.checked;
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Function to show the prompt with a success or error message
|
||||
function showPrompt(key, isSuccess = true) {
|
||||
const message = translations[key] || key;
|
||||
@@ -499,156 +702,91 @@ function showPrompt(key, isSuccess = true) {
|
||||
}, 500);
|
||||
}
|
||||
|
||||
// Function to toggle menu option
|
||||
function setupMenuToggle() {
|
||||
const menuIcon = menuButton.querySelector('.menu-icon');
|
||||
let menuOpen = false;
|
||||
let menuAnimating = false;
|
||||
|
||||
menuButton.addEventListener('click', (event) => {
|
||||
if (menuAnimating) return;
|
||||
event.stopPropagation();
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
closeMenu();
|
||||
} else {
|
||||
openMenu();
|
||||
}
|
||||
// Save configure
|
||||
document.getElementById("save").addEventListener("click", async () => {
|
||||
const selectedApps = Array.from(appListContainer.querySelectorAll(".checkbox:checked"))
|
||||
.map(checkbox => checkbox.closest(".card").querySelector(".content").getAttribute("data-package"));
|
||||
let finalAppsList = new Set(selectedApps);
|
||||
ADDITIONAL_APPS.forEach(app => {
|
||||
finalAppsList.add(app);
|
||||
});
|
||||
|
||||
document.addEventListener('click', (event) => {
|
||||
if (!menuOptions.contains(event.target) && event.target !== menuButton) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('scroll', () => {
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
closeMenu();
|
||||
}
|
||||
});
|
||||
|
||||
const closeMenuItems = ['refresh', 'select-all', 'deselect-all', 'select-denylist', 'deselect-unnecessary', 'aospkb', 'extrakb', 'boot-hash', 'about'];
|
||||
closeMenuItems.forEach(id => {
|
||||
const item = document.getElementById(id);
|
||||
if (item) {
|
||||
item.addEventListener('click', (event) => {
|
||||
event.stopPropagation();
|
||||
closeMenu();
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
function openMenu() {
|
||||
menuAnimating = true;
|
||||
menuOptions.style.display = 'block';
|
||||
setTimeout(() => {
|
||||
menuOptions.classList.remove('hidden');
|
||||
menuOptions.classList.add('visible');
|
||||
menuIcon.classList.add('menu-open');
|
||||
menuIcon.classList.remove('menu-closed');
|
||||
menuOpen = true;
|
||||
menuAnimating = false;
|
||||
}, 10);
|
||||
finalAppsList = Array.from(finalAppsList);
|
||||
try {
|
||||
const updatedTargetContent = finalAppsList.join("\n");
|
||||
await execCommand(`echo "${updatedTargetContent}" > /data/adb/tricky_store/target.txt`);
|
||||
console.log("target.txt updated successfully.");
|
||||
showPrompt("saved_target");
|
||||
} catch (error) {
|
||||
console.error("Failed to update target.txt:", error);
|
||||
showPrompt("save_error", false);
|
||||
}
|
||||
await refreshAppList();
|
||||
});
|
||||
|
||||
function closeMenu() {
|
||||
if (menuOptions.classList.contains('visible')) {
|
||||
menuAnimating = true;
|
||||
menuOptions.classList.remove('visible');
|
||||
menuOptions.classList.add('hidden');
|
||||
menuIcon.classList.remove('menu-open');
|
||||
menuIcon.classList.add('menu-closed');
|
||||
setTimeout(() => {
|
||||
menuOptions.style.display = 'none';
|
||||
menuOpen = false;
|
||||
menuAnimating = false;
|
||||
}, 200);
|
||||
}
|
||||
// Uninstall WebUI
|
||||
document.querySelector(".uninstall-container").addEventListener("click", async () => {
|
||||
try {
|
||||
await execCommand(`
|
||||
su -c "
|
||||
if [ -f '${basePath}action.sh' ]; then
|
||||
if [ -d "/data/adb/modules/TA_utl" ]; then
|
||||
rm -rf "/data/adb/modules/TA_utl"
|
||||
fi
|
||||
cp -rf '${basePath}common/update' '/data/adb/modules/TA_utl' &&
|
||||
touch '/data/adb/modules/TA_utl/remove'
|
||||
else
|
||||
touch '${basePath}remove'
|
||||
fi
|
||||
"
|
||||
`);
|
||||
showPrompt("uninstall_prompt");
|
||||
} catch (error) {
|
||||
console.error("Failed to execute uninstall command:", error);
|
||||
console.log("Error message:", error.message);
|
||||
showPrompt("uninstall_failed", false);
|
||||
}
|
||||
});
|
||||
|
||||
// Function to check if running in MMRL
|
||||
function adjustHeaderForMMRL() {
|
||||
if (typeof ksu !== 'undefined' && ksu.mmrl) {
|
||||
console.log("Running in MMRL");
|
||||
title.style.top = 'var(--window-inset-top)';
|
||||
const insetTop = getComputedStyle(document.documentElement).getPropertyValue('--window-inset-top');
|
||||
const insetTopValue = parseInt(insetTop, 10);
|
||||
searchMenuContainer.style.top = `${insetTopValue + 40}px`;
|
||||
headerBlock.style.display = 'block';
|
||||
}
|
||||
}
|
||||
|
||||
// Focus on search input when search card is clicked
|
||||
searchCard.addEventListener("click", () => {
|
||||
searchInput.focus();
|
||||
});
|
||||
|
||||
// Search functionality
|
||||
searchInput.addEventListener("input", (e) => {
|
||||
const searchQuery = e.target.value.toLowerCase();
|
||||
const apps = appListContainer.querySelectorAll(".card");
|
||||
apps.forEach(app => {
|
||||
const name = app.querySelector(".name").textContent.toLowerCase();
|
||||
app.style.display = name.includes(searchQuery) ? "block" : "none";
|
||||
window.scrollTo(0, 0);
|
||||
});
|
||||
if (searchQuery !== "") {
|
||||
clearBtn.style.display = "block";
|
||||
} else {
|
||||
clearBtn.style.display = "none";
|
||||
// Scroll event
|
||||
let lastScrollY = window.scrollY;
|
||||
const scrollThreshold = 40;
|
||||
window.addEventListener('scroll', () => {
|
||||
if (isRefreshing) return;
|
||||
if (window.scrollY > lastScrollY && window.scrollY > scrollThreshold) {
|
||||
title.style.transform = 'translateY(-80px)';
|
||||
headerBlock.style.transform = 'translateY(-80px)';
|
||||
searchMenuContainer.style.transform = 'translateY(-40px)';
|
||||
floatingBtn.style.transform = 'translateY(0)';
|
||||
} else if (window.scrollY < lastScrollY) {
|
||||
headerBlock.style.transform = 'translateY(0)';
|
||||
title.style.transform = 'translateY(0)';
|
||||
searchMenuContainer.style.transform = 'translateY(0)';
|
||||
floatingBtn.style.transform = 'translateY(-120px)';
|
||||
}
|
||||
});
|
||||
|
||||
// Clear search input
|
||||
clearBtn.addEventListener("click", () => {
|
||||
searchInput.value = "";
|
||||
clearBtn.style.display = "none";
|
||||
window.scrollTo(0, 0);
|
||||
const apps = appListContainer.querySelectorAll(".card");
|
||||
apps.forEach(app => {
|
||||
app.style.display = "block";
|
||||
});
|
||||
});
|
||||
|
||||
// Add button click event to update EXCLUDE file and run UpdateTargetList.sh
|
||||
document.getElementById("save").addEventListener("click", async () => {
|
||||
await readExcludeFile();
|
||||
const deselectedApps = Array.from(appListContainer.querySelectorAll(".checkbox:not(:checked)"))
|
||||
.map(checkbox => checkbox.closest(".card").querySelector(".content").getAttribute("data-package"));
|
||||
const selectedApps = Array.from(appListContainer.querySelectorAll(".checkbox:checked"))
|
||||
.map(checkbox => checkbox.closest(".card").querySelector(".content").getAttribute("data-package"));
|
||||
// Add deselected apps to EXCLUDE list
|
||||
for (const packageName of deselectedApps) {
|
||||
if (!excludeList.includes(packageName)) {
|
||||
excludeList.push(packageName);
|
||||
console.log("Added to EXCLUDE list:", packageName);
|
||||
} else {
|
||||
console.log("Package already in EXCLUDE file, skipping:", packageName);
|
||||
}
|
||||
}
|
||||
// Remove selected apps from EXCLUDE list
|
||||
if (selectedApps.length > 0) {
|
||||
selectedApps.forEach(packageName => {
|
||||
excludeList = excludeList.filter(excludedPackage => excludedPackage !== packageName);
|
||||
console.log("Removed from EXCLUDE list:", packageName);
|
||||
});
|
||||
}
|
||||
try {
|
||||
// Save the EXCLUDE file
|
||||
const updatedExcludeContent = excludeList.join("\n");
|
||||
await execCommand(`echo "${updatedExcludeContent}" > /data/adb/tricky_store/target_list_config/EXCLUDE`);
|
||||
console.log("EXCLUDE file updated successfully.");
|
||||
|
||||
// Execute UpdateTargetList.sh
|
||||
try {
|
||||
await execCommand("/data/adb/tricky_store/UpdateTargetList.sh");
|
||||
showPrompt("saved_and_updated");
|
||||
} catch (error) {
|
||||
console.error("Failed to update target list:", error);
|
||||
showPrompt("saved_not_updated", false);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error("Failed to update EXCLUDE file:", error);
|
||||
showPrompt("save_error", false);
|
||||
}
|
||||
await readExcludeFile();
|
||||
await refreshAppList();
|
||||
lastScrollY = window.scrollY;
|
||||
});
|
||||
|
||||
// Initial load
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
adjustHeaderForMMRL();
|
||||
await initializeAvailableLanguages();
|
||||
const userLang = detectUserLanguage();
|
||||
await loadTranslations(userLang);
|
||||
setupMenuToggle();
|
||||
setupLanguageMenu();
|
||||
setupHelpOverlay();
|
||||
document.getElementById("refresh").addEventListener("click", refreshAppList);
|
||||
document.getElementById("select-all").addEventListener("click", selectAllApps);
|
||||
document.getElementById("deselect-all").addEventListener("click", deselectAllApps);
|
||||
@@ -662,96 +800,52 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||
checkMagisk();
|
||||
loadingIndicator.style.display = "none";
|
||||
document.querySelector('.uninstall-container').classList.remove('hidden-uninstall');
|
||||
runExtraScript();
|
||||
setTimeout(updateCheck, 0);
|
||||
});
|
||||
|
||||
// Toggle the visibility of the language menu when clicking the button
|
||||
languageButton.addEventListener("click", (event) => {
|
||||
event.stopPropagation();
|
||||
const isVisible = languageMenu.classList.contains("show");
|
||||
if (isVisible) {
|
||||
languageMenu.classList.remove("show");
|
||||
} else {
|
||||
languageMenu.classList.add("show");
|
||||
}
|
||||
});
|
||||
document.addEventListener("click", (event) => {
|
||||
if (!languageButton.contains(event.target) && !languageMenu.contains(event.target)) {
|
||||
languageMenu.classList.remove("show");
|
||||
}
|
||||
});
|
||||
languageOptions.forEach(option => {
|
||||
option.addEventListener("click", () => {
|
||||
languageMenu.classList.remove("show");
|
||||
});
|
||||
});
|
||||
|
||||
// Scroll event
|
||||
let lastScrollY = window.scrollY;
|
||||
const scrollThreshold = 40;
|
||||
window.addEventListener('scroll', () => {
|
||||
if (isRefreshing) return;
|
||||
if (window.scrollY > lastScrollY && window.scrollY > scrollThreshold) {
|
||||
title.style.transform = 'translateY(-100%)';
|
||||
searchMenuContainer.style.transform = 'translateY(-40px)';
|
||||
floatingBtn.style.transform = 'translateY(0)';
|
||||
} else if (window.scrollY < lastScrollY) {
|
||||
title.style.transform = 'translateY(0)';
|
||||
searchMenuContainer.style.transform = 'translateY(0)';
|
||||
floatingBtn.style.transform = 'translateY(-120px)';
|
||||
}
|
||||
if (languageMenu.classList.contains("show")) {
|
||||
languageMenu.classList.remove("show");
|
||||
}
|
||||
lastScrollY = window.scrollY;
|
||||
});
|
||||
|
||||
// Show help overlay
|
||||
helpButton.addEventListener("click", () => {
|
||||
helpOverlay.classList.remove("hide");
|
||||
helpOverlay.style.display = "flex";
|
||||
requestAnimationFrame(() => {
|
||||
helpOverlay.classList.add("show");
|
||||
});
|
||||
document.body.classList.add("no-scroll");
|
||||
});
|
||||
|
||||
// Hide help overlay
|
||||
const hideHelpOverlay = () => {
|
||||
helpOverlay.classList.remove("show");
|
||||
helpOverlay.classList.add("hide");
|
||||
document.body.classList.remove("no-scroll");
|
||||
setTimeout(() => {
|
||||
helpOverlay.style.display = "none";
|
||||
}, 200);
|
||||
};
|
||||
|
||||
// Hide when clicking on close button or outside of the overlay content
|
||||
closeHelp.addEventListener("click", hideHelpOverlay);
|
||||
helpOverlay.addEventListener("click", (event) => {
|
||||
if (event.target === helpOverlay) {
|
||||
hideHelpOverlay();
|
||||
}
|
||||
});
|
||||
|
||||
// Uninstall WebUI
|
||||
document.querySelector(".uninstall-container").addEventListener("click", async () => {
|
||||
// Redirect to GitHub release page
|
||||
updateCard.addEventListener('click', async () => {
|
||||
try {
|
||||
await execCommand(`
|
||||
su -c "
|
||||
if [ -d '${basePath}temp/' ]; then
|
||||
mkdir -p '/data/adb/modules/TA_utl' &&
|
||||
cp -rf '${basePath}temp/'* '/data/adb/modules/TA_utl/' &&
|
||||
touch '/data/adb/modules/TA_utl/remove'
|
||||
else
|
||||
touch '/data/adb/modules/TA_utl/remove'
|
||||
fi
|
||||
"
|
||||
`);
|
||||
showPrompt("uninstall_prompt");
|
||||
await execCommand('am start -a android.intent.action.VIEW -d https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/latest');
|
||||
} catch (error) {
|
||||
console.error("Failed to execute uninstall command:", error);
|
||||
console.log("Error message:", error.message);
|
||||
showPrompt("uninstall_failed", false);
|
||||
console.error('Error opening GitHub Release link:', error);
|
||||
}
|
||||
});
|
||||
|
||||
telegramLink.addEventListener('click', async () => {
|
||||
try {
|
||||
await execCommand('am start -a android.intent.action.VIEW -d https://t.me/kowchannel');
|
||||
} catch (error) {
|
||||
console.error('Error opening Telegram link:', error);
|
||||
}
|
||||
});
|
||||
|
||||
githubLink.addEventListener('click', async () => {
|
||||
try {
|
||||
await execCommand('am start -a android.intent.action.VIEW -d https://github.com/KOWX712/Tricky-Addon-Update-Target-List');
|
||||
} catch (error) {
|
||||
console.error('Error opening GitHub link:', error);
|
||||
}
|
||||
});
|
||||
|
||||
// Function to execute shell commands
|
||||
async function execCommand(command) {
|
||||
return new Promise((resolve, reject) => {
|
||||
const callbackName = `exec_callback_${Date.now()}_${e++}`;
|
||||
window[callbackName] = (errno, stdout, stderr) => {
|
||||
delete window[callbackName];
|
||||
if (errno === 0) {
|
||||
resolve(stdout);
|
||||
} else {
|
||||
console.error(`Error executing command: ${stderr}`);
|
||||
reject(stderr);
|
||||
}
|
||||
};
|
||||
try {
|
||||
ksu.exec(command, "{}", callbackName);
|
||||
} catch (error) {
|
||||
console.error(`Execution error: ${error}`);
|
||||
reject(error);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"title": "Tricky Addon - Update Target List",
|
||||
"search_placeholder": "Search",
|
||||
"save_and_update_button": "Save and Update",
|
||||
"save_and_update_button": "Save",
|
||||
"boot_hash_save_button": "Save",
|
||||
"loading": "Loading...",
|
||||
"boot_hash_input_placeholder": "Paste your verified Boot Hash here",
|
||||
"uninstall_webui": "Uninstall WebUI",
|
||||
|
||||
"update_available": "A new version is ready",
|
||||
"redirect_to_release": "tap to download the latest version",
|
||||
|
||||
"refresh": "Refresh",
|
||||
"select_all": "Select All",
|
||||
"deselect_all": "Deselect All",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "About",
|
||||
|
||||
"help_instructions": "Instructions",
|
||||
"save_and_update_description": "Save the current configuration and update target.txt immediately.",
|
||||
"save_and_update_description": "Save current configure to target.txt.",
|
||||
"refresh_description": "Refresh app list and exclude list.",
|
||||
"select_deselect": "Select & Deselect All",
|
||||
"select_description": "Select or deselect all apps in the current interface.",
|
||||
@@ -33,7 +36,7 @@
|
||||
"by": "by ",
|
||||
"telegram_channel": "Telegram Channel",
|
||||
"github": "GitHub",
|
||||
"disclaimer": "This WebUI is not a part of Tricky Store, DO NOT report to Tricky Store author if you encounter any issue.",
|
||||
"disclaimer": "This module is not a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered.",
|
||||
"acknowledgment": "Acknowledgment",
|
||||
|
||||
"no_internet": "Please check your Internet connection",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "No valid keybox found, replaced with AOSP keybox.",
|
||||
"boot_hash_set": "Verified Boot Hash saved successfully",
|
||||
"boot_hash_set_error": "Failed to update Verified Boot Hash",
|
||||
"saved_and_updated": "Config and target.txt updated",
|
||||
"saved_not_updated": "Config saved, but failed to update target list",
|
||||
"saved_target": "Config saved to target.txt",
|
||||
"save_error": "Failed to save config",
|
||||
"uninstall_prompt": "WebUI will be removed after reboot",
|
||||
"uninstall_failed": "Failed to uninstall WebUI",
|
||||
@@ -1,5 +1,5 @@
|
||||
# Translation Guide
|
||||
## Fix Translation Error
|
||||
## Fix Bad Translation
|
||||
1. Fork this repository.
|
||||
2. Find your language string file in `/module/webroot/locales/`.
|
||||
3. Edit the string value with translated incorrectly.
|
||||
@@ -8,7 +8,7 @@
|
||||
---
|
||||
## Add a New Language
|
||||
### Simple
|
||||
- Contact me in Telegram to add a new translation langauge for you.
|
||||
- Contact me in Telegram to add a new translation langauge.
|
||||
|
||||
### Advanced
|
||||
1. Fork this repository.
|
||||
@@ -16,21 +16,16 @@
|
||||
3. Rename it to `language_code-COUNTRY_CODE.json`, e.g., `en-US.json`.
|
||||
4. Translate the string value inside.
|
||||
5. Add `langauge-option` into `/module/webroot/index.html`.
|
||||
|
||||
Format:
|
||||
```xml
|
||||
<button class="language-option" data-lang="language_code-COUNTRY_CODE" data-i18n="language_languageName">languageName</button>
|
||||
<button class="language-option" data-lang="language_code-COUNTRY_CODE">languageName</button>
|
||||
```
|
||||
|
||||
Example:
|
||||
```xml
|
||||
<div class="language-menu">
|
||||
<button class="language-option" data-lang="en-US" data-i18n="language_english_us">English</button>
|
||||
<button class="language-option" data-lang="en-US">English</button>
|
||||
</div>
|
||||
```
|
||||
6. Add language_code-COUNTRY_CODE in `/module/webroot/index.js` under `function detectUserLanguage()`
|
||||
Format:
|
||||
```js
|
||||
function detectUserLanguage() {
|
||||
const availableLanguages = ['en-US', 'ru-RU', 'tl-PH', 'zh-CN', 'zh-TW'];
|
||||
}
|
||||
```
|
||||
7. Create a Pull Request
|
||||
Finally, Create a Pull Request.
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"title": "Tricky Addon - Update Target List",
|
||||
"search_placeholder": "Search",
|
||||
"save_and_update_button": "Save and Update",
|
||||
"save_and_update_button": "Save",
|
||||
"boot_hash_save_button": "Save",
|
||||
"loading": "Loading...",
|
||||
"boot_hash_input_placeholder": "Paste your verified Boot Hash here",
|
||||
"uninstall_webui": "Uninstall WebUI",
|
||||
|
||||
"update_available": "A new version is ready",
|
||||
"redirect_to_release": "tap to download the latest version",
|
||||
|
||||
"refresh": "Refresh",
|
||||
"select_all": "Select All",
|
||||
"deselect_all": "Deselect All",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "About",
|
||||
|
||||
"help_instructions": "Instructions",
|
||||
"save_and_update_description": "Save the current configuration and update target.txt immediately.",
|
||||
"save_and_update_description": "Save current configure to target.txt.",
|
||||
"refresh_description": "Refresh app list and exclude list.",
|
||||
"select_deselect": "Select & Deselect All",
|
||||
"select_description": "Select or deselect all apps in the current interface.",
|
||||
@@ -33,7 +36,7 @@
|
||||
"by": "by ",
|
||||
"telegram_channel": "Telegram Channel",
|
||||
"github": "GitHub",
|
||||
"disclaimer": "This WebUI is not a part of Tricky Store, DO NOT report to Tricky Store author if you encounter any issue.",
|
||||
"disclaimer": "This module is not a part of the Tricky Store module. DO NOT report any issues to Tricky Store if encountered.",
|
||||
"acknowledgment": "Acknowledgment",
|
||||
|
||||
"no_internet": "Please check your Internet connection",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "No valid keybox found, replaced with AOSP keybox.",
|
||||
"boot_hash_set": "Verified Boot Hash saved successfully",
|
||||
"boot_hash_set_error": "Failed to update Verified Boot Hash",
|
||||
"saved_and_updated": "Config and target.txt updated",
|
||||
"saved_not_updated": "Config saved, but failed to update target list",
|
||||
"saved_target": "Config saved to target.txt",
|
||||
"save_error": "Failed to save config",
|
||||
"uninstall_prompt": "WebUI will be removed after reboot",
|
||||
"uninstall_failed": "Failed to uninstall WebUI",
|
||||
54
module/webui/locales/ja-JP.json
Normal file
54
module/webui/locales/ja-JP.json
Normal file
@@ -0,0 +1,54 @@
|
||||
{
|
||||
"title": "Tricky Addon - Update Target List",
|
||||
"search_placeholder": "検索",
|
||||
"save_and_update_button": "保存",
|
||||
"boot_hash_save_button": "保存",
|
||||
"loading": "読み込み中...",
|
||||
"boot_hash_input_placeholder": "確認付きブートハッシュをここに貼り付け",
|
||||
"uninstall_webui": "WebUI をアンインストール",
|
||||
|
||||
"update_available": "新しいバージョンの準備完了",
|
||||
"redirect_to_release": "タップで最新のバージョンをダウンロード",
|
||||
|
||||
"refresh": "更新",
|
||||
"select_all": "すべて選択",
|
||||
"deselect_all": "すべての選択を解除",
|
||||
"select_denylist": "DenyList から選択",
|
||||
"deselect_unnecessary": "不要な選択を解除",
|
||||
"set_aosp_keybox": "AOSP Keybox を設定",
|
||||
"set_valid_keybox": "有効な Keybox を設定",
|
||||
"set_verified_boot_hash": "確認付きブートハッシュを設定",
|
||||
"about": "このアドオンについて",
|
||||
|
||||
"help_instructions": "使い方",
|
||||
"save_and_update_description": "現在の設定を target.txt に保存します。",
|
||||
"refresh_description": "アプリリストと除外リストを更新します。",
|
||||
"select_deselect": "すべてを選択と解除",
|
||||
"select_description": "現在のインターフェースのすべてのアプリを選択または解除します。",
|
||||
"select_denylist_description": "Magisk の環境でのみ使用可能です。Deny List 内のアプリを選択します(推奨)。",
|
||||
"deselect_unnecessary_description": "不要なカテゴリー: Xposed モジュール、root マネージャー、root 関連アプリ、Bootloader の状態を確認しない一般的なアプリです。このオプションはインターネット接続が必要です。",
|
||||
"set_keybox": "AOSP と 有効な Keybox",
|
||||
"set_aosp_keybox_description": "Tricky Store の keybox.xml を置き換えます。有効な Keybox がなくなった場合は、AOSP Keybox に置き換えられます。インターネット接続が必要です。",
|
||||
"set_verified_boot_hash_description": "Key Attestation Demo から確認付きブートハッシュの値を取得します。ro.boot.vbmeta.digest をリセットして異常なブート状態を修正します。",
|
||||
|
||||
"module_name_line1": "Tricky Addon",
|
||||
"module_name_line2": "Update Target List",
|
||||
"by": "開発者: ",
|
||||
"telegram_channel": "Telegram チャンネル",
|
||||
"github": "GitHub",
|
||||
"disclaimer": "このモジュールは、Tricky Store モジュールの一部ではありません。Tricky Store 公式に問題を報告しないでください。",
|
||||
"acknowledgment": "謝辞",
|
||||
|
||||
"no_internet": "インターネット接続を確認してください。",
|
||||
"aosp_key_set": "AOSP Keybox の設定に成功しました。",
|
||||
"key_set_error": "Keybox の更新に失敗しました。",
|
||||
"valid_key_set": "有効な Keybox の設定に成功しました。",
|
||||
"no_valid_fallback": "有効な Keybox がありません。AOSP Keybox に置き換えます。",
|
||||
"boot_hash_set": "確認付きブートハッシュの更新に成功しました。",
|
||||
"boot_hash_set_error": "確認付きブートハッシュの更新に失敗しました。",
|
||||
"saved_target": "設定を target.txt に保存しました。",
|
||||
"save_error": "設定の保存に失敗しました。",
|
||||
"uninstall_prompt": "WebUI は再起動後に削除されます。",
|
||||
"uninstall_failed": "WebUI のアンインストールに失敗しました。",
|
||||
"new_update": "新しいバージョンがあります!"
|
||||
}
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"title": "Tricky Addon - Обновить список целей",
|
||||
"search_placeholder": "Поиск",
|
||||
"save_and_update_button": "Сохранить и обновить",
|
||||
"save_and_update_button": "Сохранить",
|
||||
"boot_hash_save_button": "Сохранить",
|
||||
"loading": "Загрузка...",
|
||||
"boot_hash_input_placeholder": "Вставьте свой проверенный Boot Hash сюда",
|
||||
"uninstall_webui": "Удалить WebUI",
|
||||
|
||||
"update_available": "Доступна новая версия",
|
||||
"redirect_to_release": "нажмите, чтобы скачать последнюю версию",
|
||||
|
||||
"refresh": "Обновить",
|
||||
"select_all": "Выбрать все",
|
||||
"deselect_all": "Отменить выбор всех",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "О программе",
|
||||
|
||||
"help_instructions": "Инструкции",
|
||||
"save_and_update_description": "Сохраните текущую конфигурацию и немедленно обновите target.txt.",
|
||||
"save_and_update_description": "Сохранить текущую конфигурацию в target.txt.",
|
||||
"refresh_description": "Обновить список приложений и список исключений.",
|
||||
"select_deselect": "Выбрать и отменить выбор всех",
|
||||
"select_description": "Выбрать или отменить выбор всех приложений в текущем интерфейсе.",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "Не найден действующий keybox, заменен на AOSP keybox.",
|
||||
"boot_hash_set": "Verified Boot Hash успешно сохранен",
|
||||
"boot_hash_set_error": "Не удалось обновить Verified Boot Hash",
|
||||
"saved_and_updated": "Конфигурация и target.txt обновлены",
|
||||
"saved_not_updated": "Конфигурация сохранена, но не удалось обновить список целей",
|
||||
"saved_target": "Конфигурация сохранена в target.txt",
|
||||
"save_error": "Не удалось сохранить конфигурацию",
|
||||
"uninstall_prompt": "WebUI будет удален после перезагрузки",
|
||||
"uninstall_failed": "Не удалось удалить WebUI",
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"title": "Tricky Addon - I-update ang Target List",
|
||||
"search_placeholder": "Maghanap",
|
||||
"save_and_update_button": "I-save at I-update",
|
||||
"save_and_update_button": "I-save",
|
||||
"boot_hash_save_button": "I-save",
|
||||
"loading": "Naglo-load...",
|
||||
"boot_hash_input_placeholder": "I-paste ang iyong verified Boot Hash dito",
|
||||
"uninstall_webui": "I-uninstall ang WebUI",
|
||||
|
||||
"update_available": "Handa na ang bagong bersyon",
|
||||
"redirect_to_release": "i-tap para i-download ang pinakabagong bersyon",
|
||||
|
||||
"refresh": "I-refresh",
|
||||
"select_all": "Piliin Lahat",
|
||||
"deselect_all": "Huwag Pumili ng Lahat",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "Tungkol",
|
||||
|
||||
"help_instructions": "Mga Tagubilin",
|
||||
"save_and_update_description": "I-save ang kasalukuyang configuration at i-update ang target.txt agad.",
|
||||
"save_and_update_description": "I-save ang kasalukuyang configuration sa target.txt.",
|
||||
"refresh_description": "I-refresh ang listahan ng apps at exclude list.",
|
||||
"select_deselect": "Piliin & Huwag Pumili ng Lahat",
|
||||
"select_description": "Piliin o huwag piliin ang lahat ng apps sa kasalukuyang interface.",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "Walang valid na keybox na natagpuan, pinalitan ng AOSP keybox.",
|
||||
"boot_hash_set": "Matagumpay na na-save ang Verified Boot Hash",
|
||||
"boot_hash_set_error": "Nabigong i-update ang Verified Boot Hash",
|
||||
"saved_and_updated": "Na-save ang config at na-update ang target.txt",
|
||||
"saved_not_updated": "Na-save ang config, ngunit nabigong i-update ang target list",
|
||||
"saved_target": "Na-save ang configuration sa target.txt",
|
||||
"save_error": "Nabigong i-save ang config",
|
||||
"uninstall_prompt": "Mawawala ang WebUI pagkatapos ng reboot",
|
||||
"uninstall_failed": "Nabigong i-uninstall ang WebUI",
|
||||
@@ -1,11 +1,14 @@
|
||||
{
|
||||
"title": "TS插件 - 更新目标列表",
|
||||
"search_placeholder": "搜索",
|
||||
"save_and_update_button": "保存并更新",
|
||||
"save_and_update_button": "保存",
|
||||
"boot_hash_save_button": "保存",
|
||||
"loading": "加载中...",
|
||||
"boot_hash_input_placeholder": "在此粘贴您的哈希值",
|
||||
"uninstall_webui": "卸载 WebUI",
|
||||
|
||||
"update_available": "发现新的版本",
|
||||
"redirect_to_release": "点击跳转 GitHub 下载最新版本",
|
||||
|
||||
"refresh": "刷新",
|
||||
"select_all": "全选",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "关于",
|
||||
|
||||
"help_instructions": "使用指南",
|
||||
"save_and_update_description": "保存当前配置并立即更新目标列表(target.txt)。",
|
||||
"save_and_update_description": "保存当前配置到目标列表(target.txt)。",
|
||||
"refresh_description": "刷新应用列表和排除列表。",
|
||||
"select_deselect": "全选 & 取消全选",
|
||||
"select_description": "选择或取消选择当前界面中的所有应用。",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "未找到有效密钥,已替换为 AOSP 密钥。",
|
||||
"boot_hash_set": "哈希值重置成功",
|
||||
"boot_hash_set_error": "哈希值重置失败",
|
||||
"saved_and_updated": "成功保存配置和更新目标列表",
|
||||
"saved_not_updated": "配置已保存,但更新目标列表失败",
|
||||
"saved_target": "成功保存配置",
|
||||
"save_error": "保存配置失败",
|
||||
"uninstall_prompt": "WebUI 将在重启后被移除",
|
||||
"uninstall_failed": "卸载 WebUI 失败",
|
||||
@@ -1,12 +1,15 @@
|
||||
{
|
||||
"title": "TS插件 - 更新目標列表",
|
||||
"search_placeholder": "搜尋",
|
||||
"save_and_update_button": "保存並更新",
|
||||
"save_and_update_button": "保存",
|
||||
"boot_hash_save_button": "保存",
|
||||
"loading": "加載中...",
|
||||
"boot_hash_input_placeholder": "在此粘貼您的哈希值",
|
||||
"uninstall_webui": "卸載 WebUI",
|
||||
|
||||
"update_available": "發現新的版本",
|
||||
"redirect_to_release": "點擊跳轉至 GitHub 下載最新版本",
|
||||
|
||||
"refresh": "刷新",
|
||||
"select_all": "全選",
|
||||
"deselect_all": "取消全選",
|
||||
@@ -18,7 +21,7 @@
|
||||
"about": "關於",
|
||||
|
||||
"help_instructions": "使用指南",
|
||||
"save_and_update_description": "保存當前配置並立即更新目標列表(target.txt)。",
|
||||
"save_and_update_description": "保存當前配置到目標列表(target.txt)。",
|
||||
"refresh_description": "刷新應用列表和排除列表。",
|
||||
"select_deselect": "全選 & 取消全選",
|
||||
"select_description": "選擇或取消選擇當前界面中的所有應用。",
|
||||
@@ -43,8 +46,7 @@
|
||||
"no_valid_fallback": "未找到有效密鑰,已替換為 AOSP 密鑰。",
|
||||
"boot_hash_set": "哈希值重置成功",
|
||||
"boot_hash_set_error": "哈希值重置失敗",
|
||||
"saved_and_updated": "成功保存配置和更新目標列表",
|
||||
"saved_not_updated": "配置已保存,但更新目標列表失敗",
|
||||
"saved_target": "成功保存配置",
|
||||
"save_error": "保存配置失敗",
|
||||
"uninstall_prompt": "WebUI 將在重啟後被移除",
|
||||
"uninstall_failed": "卸載 WebUI 失敗",
|
||||
@@ -1,5 +1,7 @@
|
||||
body {
|
||||
background-color: #F5F5F5;
|
||||
padding-top: var(--window-inset-top);
|
||||
padding-bottom: var(--window-inset-bottom);
|
||||
}
|
||||
|
||||
.no-scroll {
|
||||
@@ -13,57 +15,69 @@ body {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
height: 40px;
|
||||
width: 100%;
|
||||
width: calc(100% - 10px);
|
||||
max-width: 1100px;
|
||||
background-color: #F5F5F5;
|
||||
transition: transform 0.3s ease;
|
||||
z-index: 1100;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.header-block {
|
||||
background-color: #F5F5F5;
|
||||
display: none;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 1100;
|
||||
transition: transform 0.3s ease;
|
||||
height: var(--window-inset-top);
|
||||
}
|
||||
|
||||
#title {
|
||||
padding-left: 5px;
|
||||
font-size: 16.5px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.no-connection {
|
||||
padding-bottom: 2px;
|
||||
padding: 0;
|
||||
display: none;
|
||||
position: relative;
|
||||
margin-right: 0px;
|
||||
color: #7E7E7E;
|
||||
}
|
||||
|
||||
.no-connection .wifi-icon {
|
||||
width: 22px;
|
||||
height: 22px;
|
||||
filter: invert(0.6) sepia(0) saturate(0) hue-rotate(180deg) brightness(0.8) contrast(1);
|
||||
background: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
.language-dropdown {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.language-button {
|
||||
padding-top: 5px;
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 23px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.language-menu {
|
||||
display: flex;
|
||||
padding: 5px;
|
||||
padding: 3px 10px;
|
||||
flex-direction: column;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
||||
z-index: 2000;
|
||||
z-index: 1800;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 8px;
|
||||
opacity: 0;
|
||||
visibility: hidden;
|
||||
max-height: calc(100vh - 50px);
|
||||
overflow-y: auto;
|
||||
transform: translateY(-10px);
|
||||
transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
|
||||
}
|
||||
@@ -76,24 +90,38 @@ body {
|
||||
}
|
||||
|
||||
.language-option {
|
||||
padding: 10px;
|
||||
padding: 8px 5px;
|
||||
text-align: left;
|
||||
background: none;
|
||||
border: none;
|
||||
width: 100%;
|
||||
font-size: 16px;
|
||||
color: #333;
|
||||
width: auto;
|
||||
width: 100%;
|
||||
white-space: nowrap;
|
||||
border-bottom: 1px solid #ccc;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.language-option:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.language-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color: none;
|
||||
z-index: 1100;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.help-button {
|
||||
padding-left: 5px;
|
||||
margin-right: auto;
|
||||
background: none;
|
||||
border: none;
|
||||
font-size: 22px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.help-overlay {
|
||||
@@ -241,9 +269,11 @@ body {
|
||||
border: none;
|
||||
border-radius: 38px;
|
||||
font-size: 18px;
|
||||
font-weight: bold;
|
||||
background-color: #007bff;
|
||||
color: white;
|
||||
margin-left: auto;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.about-overlay {
|
||||
@@ -265,12 +295,15 @@ body {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 75vw;
|
||||
max-width: 800px;
|
||||
transform: translate(-50%, -50%);
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
padding: 25px 30px;
|
||||
z-index: 1200;
|
||||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
|
||||
z-index: 1200;
|
||||
opacity: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -306,25 +339,47 @@ body {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.about-content p span[data-i18n="telegram_channel"] {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.about-content p span[data-i18n="github"] {
|
||||
font-weight: bold;
|
||||
.about-content p[data-i18n="disclaimer"] {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.about-content p[data-i18n="acknowledgment"] {
|
||||
font-weight: bold;
|
||||
font-size: 18px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.about-content p:not([data-i18n]) {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
#apps-list {
|
||||
margin-top: 100px;
|
||||
.link{
|
||||
flex: 0 1 auto;
|
||||
}
|
||||
|
||||
#telegram {
|
||||
font-size: 18px;
|
||||
padding: 5px 10px;
|
||||
background-color: #38A7ED;
|
||||
color: #fff;
|
||||
border-radius: 8px;
|
||||
margin-right: 3px;
|
||||
margin-bottom: 5px;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
#github {
|
||||
font-size: 18px;
|
||||
padding: 5px 10px;
|
||||
background-color: #606060;
|
||||
color: #fff;
|
||||
border-radius: 8px;
|
||||
margin-bottom: 5px;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
#link-text {
|
||||
font-size: 17px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.search-menu-container {
|
||||
@@ -332,9 +387,14 @@ body {
|
||||
position: fixed;
|
||||
top: 40px;
|
||||
height: 50px;
|
||||
width: calc(100% - 17px);
|
||||
width: calc(100% - 20px);
|
||||
max-width: 1100px;
|
||||
z-index: 1000;
|
||||
transition: transform 0.3s ease;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
left: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.search-card {
|
||||
@@ -352,12 +412,11 @@ body {
|
||||
|
||||
.search-icon {
|
||||
position: absolute;
|
||||
left: 18px;
|
||||
font-size: 15px;
|
||||
padding-top: 5px;
|
||||
left: 15px;
|
||||
z-index: 1000;
|
||||
}
|
||||
|
||||
|
||||
.search-input {
|
||||
position: absolute;
|
||||
border: none;
|
||||
@@ -371,6 +430,7 @@ body {
|
||||
.clear-btn {
|
||||
position: absolute;
|
||||
color: #ccc;
|
||||
padding-bottom: 3px;
|
||||
right: 10px;
|
||||
border: none;
|
||||
background: none;
|
||||
@@ -422,12 +482,15 @@ body {
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
|
||||
display: none;
|
||||
position: absolute;
|
||||
padding: 5px;
|
||||
padding: 5px 12px;
|
||||
top: 110%;
|
||||
right: 0;
|
||||
z-index: 1200;
|
||||
transform: translateX(120%);
|
||||
transition: transform 0.2s ease;
|
||||
width: auto;
|
||||
max-height: calc(100vh - 120px);
|
||||
overflow-y: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
@@ -452,17 +515,78 @@ body {
|
||||
|
||||
.menu-options li {
|
||||
cursor: default;
|
||||
padding: 13px 12px;
|
||||
padding: 12px 4px;
|
||||
text-align: left;
|
||||
border-bottom: 1px solid #ccc;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.menu-options li:last-child {
|
||||
border-bottom: none;
|
||||
}
|
||||
|
||||
.menu-overlay {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color: none;
|
||||
z-index: 1000;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.card-box {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#apps-list {
|
||||
margin-top: 100px;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.update-card {
|
||||
display: none;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #DCDCDC;
|
||||
border: none;
|
||||
border-radius: 10px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 10px;
|
||||
outline: none;
|
||||
padding: 12px;
|
||||
width: calc(100% - 30px);
|
||||
max-width: 900px;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
#update-available {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
margin-top: 15px;
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
#redirect-to-release {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background-color: white;
|
||||
border: none;
|
||||
border-radius: 8px;
|
||||
border-radius: 12px;
|
||||
margin: 0 auto;
|
||||
margin-bottom: 10px;
|
||||
outline: none;
|
||||
padding: 15px;
|
||||
padding: 12px;
|
||||
width: calc(100% - 30px);
|
||||
max-width: 900px;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.content {
|
||||
@@ -474,6 +598,7 @@ body {
|
||||
.name {
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
font-size: 15.5px;
|
||||
max-width: calc(100% - 30px);
|
||||
overflow-wrap: break-word;
|
||||
word-break: break-word;
|
||||
@@ -481,6 +606,7 @@ body {
|
||||
|
||||
.checkbox {
|
||||
margin-left: auto;
|
||||
transform: scale(1.15);
|
||||
}
|
||||
|
||||
.prompt {
|
||||
@@ -493,7 +619,7 @@ body {
|
||||
color: white;
|
||||
font-size: 15px;
|
||||
padding: 5px 15px;
|
||||
z-index: 1000;
|
||||
z-index: 2000;
|
||||
transform: translateY(100%);
|
||||
transition: transform 0.5s ease;
|
||||
white-space: nowrap;
|
||||
@@ -558,9 +684,10 @@ body {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
padding: 12px 17px;
|
||||
font-size: 17px;
|
||||
transition: transform 0.3s ease-in-out;
|
||||
padding: 10px 20px;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
transition: transform 0.3s ease-in-out, background-color 0.2s ease;
|
||||
border-top-left-radius: 50px;
|
||||
border-top-right-radius: 50px;
|
||||
border-bottom-left-radius: 50px;
|
||||
@@ -582,26 +709,33 @@ body {
|
||||
}
|
||||
|
||||
.footer {
|
||||
padding: 25px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: calc(100% - 10px);
|
||||
max-width: 1100px;
|
||||
padding: 25px 0;
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
.uninstall-container {
|
||||
padding: 10px 10px;
|
||||
position: absolute;
|
||||
right: 15px;
|
||||
right: 0;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
border-radius: 8px;
|
||||
background-color: #B10000;
|
||||
background-color: #CE0000;
|
||||
white-space: nowrap;
|
||||
transition: background-color 0.2s ease;
|
||||
}
|
||||
|
||||
.uninstall-container i {
|
||||
margin-right: 5px;
|
||||
font-size: 18px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.uninstall-container span {
|
||||
@@ -614,12 +748,37 @@ body {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.language-option:active,
|
||||
.menu-options li:active,
|
||||
.card:active,
|
||||
.update-card:active {
|
||||
background-color: #C8C8C8;
|
||||
}
|
||||
|
||||
.boot-hash-save-button:active,
|
||||
.floating-btn:active {
|
||||
background-color: #003d80;
|
||||
}
|
||||
|
||||
.uninstall-container:active {
|
||||
background-color: #830000;
|
||||
}
|
||||
|
||||
#telegram:active {
|
||||
background-color: #1A78B3;
|
||||
}
|
||||
|
||||
#github:active {
|
||||
background-color: #4D4D4D;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
background-color: #121212;
|
||||
color: #eee;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
|
||||
.header-block,
|
||||
.header {
|
||||
background-color: #121212;
|
||||
}
|
||||
@@ -640,6 +799,10 @@ body {
|
||||
background-color: #343434;
|
||||
}
|
||||
|
||||
.update-card {
|
||||
background-color: #4D4D4D;
|
||||
}
|
||||
|
||||
.search-card {
|
||||
border: 1px solid #6E6E6E;
|
||||
}
|
||||
@@ -655,4 +818,16 @@ body {
|
||||
background-color: #343434;
|
||||
border: 1px solid #6E6E6E;
|
||||
}
|
||||
|
||||
.language-option,
|
||||
.menu-options li {
|
||||
border-bottom: 1px solid #6E6E6E;
|
||||
}
|
||||
|
||||
.language-option:active,
|
||||
.menu-options li:active,
|
||||
.card:active,
|
||||
.update-card:active {
|
||||
background-color: #616161;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"description": "Unnecessary app list",
|
||||
"repo-link": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List",
|
||||
"json-link": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/more-excldue.json",
|
||||
"json-link": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/more-excldue.json",
|
||||
"data": [
|
||||
{
|
||||
"info": "Root manager",
|
||||
@@ -58,6 +58,14 @@
|
||||
{
|
||||
"name": "KSUWebUI",
|
||||
"package-name": "io.github.a13e300.ksuwebui"
|
||||
},
|
||||
{
|
||||
"name": "Shizuku",
|
||||
"package-name": "moe.shizuku.privileged.api"
|
||||
},
|
||||
{
|
||||
"name": "MMRL",
|
||||
"package-name": "com.dergoogler.mmrl"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"versionCode": 250,
|
||||
"version": "v2.5",
|
||||
"zipUrl": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/download/v2.5/TrickyAddonModule-v2.5.zip",
|
||||
"changelog": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/changelog.md"
|
||||
"versionCode": 280,
|
||||
"version": "v2.8",
|
||||
"zipUrl": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/download/v2.8/TrickyAddonModule-v2.8.zip",
|
||||
"changelog": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/changelog.md"
|
||||
}
|
||||
Reference in New Issue
Block a user