Compare commits

60 Commits
v2.4 ... v2.6

Author SHA1 Message Date
KOWX712
84b7bd9f4e release v2.6 2024-11-30 21:08:04 +08:00
KOWX712
9fa022bad6 workflow fix 4 2024-11-30 21:06:46 +08:00
KOWX712
ec024a2936 workflow fix 3 2024-11-30 21:02:45 +08:00
KOWX712
72d505dec5 fix release workflow 2024-11-30 20:58:48 +08:00
KOWX712
0e06ea4902 Update module.prop 2024-11-30 20:53:26 +08:00
KOWX712
45657574d2 test run workflow 2024-11-30 20:51:41 +08:00
KOWX712
315f254123 fix multiple zip 2024-11-30 20:51:14 +08:00
KOWX712
4772755965 workflow test 2024-11-30 20:48:45 +08:00
KOWX712
18968a4fcb fix workflow 2 2024-11-30 20:42:16 +08:00
KOWX712
457c771cfa fix workflow 2024-11-30 20:37:12 +08:00
KOWX712
c5804fabdc revert 2024-11-30 20:33:11 +08:00
KOWX712
60ae2e42f9 limit to module folder only 2024-11-30 20:24:40 +08:00
KOWX712
04394ca65d Update README.md 2024-11-30 20:18:34 +08:00
KOWX712
3f8ef22b83 Update update.json 2024-11-30 20:16:43 +08:00
KOWX712
71e6d7ec8b Update module.prop 2024-11-30 20:14:50 +08:00
KOWX712
01300c9524 Update changelog.md 2024-11-30 20:14:08 +08:00
KOWX712
8747df3969 v2.6 changelog 2024-11-30 20:12:18 +08:00
KOWX712
792e5a15a1 push v2.6 stable 2024-11-30 20:12:09 +08:00
KOWX712
df7167dc55 workflow test 2024-11-30 20:09:11 +08:00
KOWX712
ffa0aa461d migrate to main 2024-11-30 04:08:19 +08:00
KOWX712
3926980b28 Update README.md 2024-11-30 03:57:56 +08:00
KOWX712
a92928838b Update README.md 2024-11-28 19:19:20 +08:00
KOWX712
fd837d41e8 beta3 2024-11-28 19:17:50 +08:00
KOWX712
ce2164b6c2 add back missing string 2024-11-28 18:46:40 +08:00
KOWX712
1c1333d0c8 Update A-translate.md 2024-11-28 18:35:19 +08:00
KOWX712
561de52bf7 fix typo 2024-11-28 18:31:44 +08:00
KOWX712
6fe8d30ccf Update translate template 2024-11-28 18:29:43 +08:00
KOWX712
101bb6abd0 update prompt
translation update
2024-11-28 18:15:08 +08:00
KOWX712
b7341c80bc support for invisible module update function 2024-11-28 18:03:26 +08:00
KOWX712
5460a2fa5d Add update method for invisible module
optimize uninstall process
2024-11-28 18:02:56 +08:00
KOWX712
d6d890ef10 make invisible module optional
add choices for invisible module on installation
2024-11-28 18:01:49 +08:00
KOWX712
8801513684 Update uninstall.sh
logic change
2024-11-27 21:21:07 +08:00
KOWX712
db6e591010 Fix WebUI standalone app freeze in Magisk 2024-11-27 21:20:41 +08:00
KOWX712
ad5e2ca551 Fix prompt animation missing
fix prompt bounce out animation missing
2024-11-27 21:14:20 +08:00
KOWX712
7f431f13f3 fix 2024-11-26 23:51:31 +08:00
KOWX712
ed379dfde5 found 2024-11-26 22:33:02 +08:00
KOWX712
3dd007882b wait for next 2024-11-26 22:16:20 +08:00
KOWX712
0607f2d223 Header UI adjust 2024-11-26 01:41:09 +08:00
KOWX712
6a5fb6c717 hotfix 2024-11-26 01:00:47 +08:00
KOWX712
6561ea861b Update changelog.md 2024-11-26 00:51:42 +08:00
KOWX712
f4085f8cf0 Invisible + UI fix
integrate module action.sh and WebUI into tricky store, module now is not visible root manager, Thanks for ideaa from @backslashxx . Add uninstall button in the bottom of WebUI. Fix some UI bug.
2024-11-26 00:42:57 +08:00
KOWX712
336efb8d3e Minor ui fix 2024-11-24 23:01:29 +08:00
KOWX712
9e57c81a66 Update changelog.md
Fix syntax error
2024-11-24 22:43:16 +08:00
KOWX712
cfa17eea26 v2.6-beta.1 pre-release 2024-11-24 22:36:45 +08:00
KOWX712
dbed7f9f90 Fix an issue that may happen in Apatch
and update translation guide
2024-11-24 22:25:27 +08:00
KOWX712
5352e8604e Add translation guide and translation template 2024-11-24 21:47:48 +08:00
KOWX712
ff18585543 Initial support for multiple language, add save boot hash in WebUI
Language available: en-US, ru-RU, tl-PH, zh-CN, zh-TW. Add feature to save verifiedBootHash in WebUI
2024-11-24 21:46:49 +08:00
KOWX712
b50e9aa086 Optimize loading time x2
Reduce load time by preload skiplist in service.sh.
2024-11-24 20:33:09 +08:00
KOWX712
213c4a2f13 Optimize + set verified boot hash in WebUI
Reduce load time by preload applist in service.sh. New function in WebUI: set verified boot hash in WebUI
2024-11-23 21:22:23 +08:00
KOWX712
f4860d1a00 Improve xposed detection logic
Detect Xposed module from AndroidMainfest.xml instead of relying on LSPosed module repository since not all Xposed module will available in the repo.
2024-11-22 17:02:30 +08:00
KOWX712
e192fcc916 v2.5 2024-11-22 00:23:08 +08:00
KOWX712
7a2c87b365 minor ui change x2 2024-11-22 00:15:51 +08:00
KOWX712
a1f4d8fc72 minor layout change 2024-11-21 23:51:26 +08:00
KOWX712
7f7c124b25 Add more detail x2 2024-11-21 23:24:38 +08:00
KOWX712
90696c5c5d Update update.json 2024-11-21 23:09:01 +08:00
KOWX712
9cbb73bab0 Add more detail
Add more detail in help menu and clarity keybox operation prompt.
2024-11-21 23:04:38 +08:00
KOWX712
d9eb97cb3c fix webui installation skip
Magisk action.sh: On next installation, prompt webui again if rejected.
2024-11-21 23:04:13 +08:00
KOWX712
e848da327b change kb logic 2024-11-20 15:05:37 +08:00
KOWX712
67581ae941 Update .extra 2024-11-20 13:56:15 +08:00
KOWX712
91dea027ce Create .extra 2024-11-20 13:40:27 +08:00
32 changed files with 1473 additions and 299 deletions

1
.extra Normal file

File diff suppressed because one or more lines are too long

40
.github/workflows/canary.yml vendored Normal file
View File

@@ -0,0 +1,40 @@
name: canary
on:
push:
branches:
- main
paths:
- 'module/**'
jobs:
build:
name: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v3
- name: Extract Module Info
id: extract_info
run: |
# Extract module name and version
MODULE_NAME=$(grep -oP '^name=\K.*' module/module.prop | tr ' ' '_')
MODULE_VERSION=$(grep -oP '^version=\K.*' module/module.prop)
# Generate build count based on GitHub Actions run number
BUILD_COUNT=$((1000 + ${{ github.run_number }}))
# Combine for artifact name
ARTIFACT_NAME="${MODULE_NAME}-${MODULE_VERSION}-${BUILD_COUNT}"
echo "MODULE_NAME=${MODULE_NAME}" >> $GITHUB_ENV
echo "MODULE_VERSION=${MODULE_VERSION}" >> $GITHUB_ENV
echo "ARTIFACT_NAME=${ARTIFACT_NAME}" >> $GITHUB_ENV
- name: Upload Artifact (without zipping)
uses: actions/upload-artifact@v4
with:
name: ${{ env.ARTIFACT_NAME }}
path: module/

95
.github/workflows/release.yml vendored Normal file
View File

@@ -0,0 +1,95 @@
name: release
on:
push:
paths:
- 'module/module.prop'
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
with:
fetch-depth: 2
- name: Get the version from module.prop
id: get_version
run: |
VERSION=$(grep '^version=' module/module.prop | sed 's/version=//')
echo "VERSION=$VERSION" >> $GITHUB_ENV
- name: Check if version is already tagged
id: check_version
run: |
LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "none")
echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_ENV
if [ "$LATEST_TAG" == "none" ]; then
echo "skip=false" >> $GITHUB_ENV
elif [ "$LATEST_TAG" == "$VERSION" ]; then
echo "skip=true" >> $GITHUB_ENV
else
echo "skip=false" >> $GITHUB_ENV
fi
- name: Configure Git user
if: env.skip == 'false'
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 (if version changed)
if: env.skip == 'false'
run: |
git tag -a "$VERSION" -m "Release version $VERSION"
git push origin "$VERSION"
- name: Set release variables
if: env.skip == 'false'
id: setup
run: |
CURRENT_TAG="$VERSION"
RELEASE_NOTES=$(awk -v tag="### $CURRENT_TAG" '
$0 == tag {flag=1; next}
/^###/ && flag {exit}
flag {print}
' changelog.md)
FORMATTED_RELEASE_NOTES=$(printf "### Tricky Addon module\n%s\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)" "$RELEASE_NOTES")
echo "$FORMATTED_RELEASE_NOTES" > release_notes.txt
echo "RELEASE_NOTES<<EOF" >> $GITHUB_ENV
cat release_notes.txt >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
echo "CURRENT_TAG=$CURRENT_TAG" >> $GITHUB_ENV
echo "ZIP_NAME=TrickyAddonModule-${VERSION}.zip" >> $GITHUB_ENV
echo "ZIP_PATH=module" >> $GITHUB_ENV
echo "LITE_SCRIPT_ONLY_ZIP_NAME=TrickyAddonLite_ScriptOnly_Extract-${VERSION}.zip" >> $GITHUB_ENV
echo "LITE_SCRIPT_ONLY_PATH=lite-script_only" >> $GITHUB_ENV
- name: Compress the module folder
if: env.skip == 'false'
run: |
cd "${{ env.ZIP_PATH }}" && zip -r "../${{ env.ZIP_NAME }}" ./*
echo "Created zip file: ${{ env.ZIP_NAME }}"
- name: Compress the lite-script_only folder
if: env.skip == 'false'
run: |
cd "${{ env.LITE_SCRIPT_ONLY_PATH }}" && zip -r "../${{ env.LITE_SCRIPT_ONLY_ZIP_NAME }}" ./*
echo "Created zip file: ${{ env.LITE_SCRIPT_ONLY_ZIP_NAME }}"
- name: Create release
if: env.skip == 'false'
uses: softprops/action-gh-release@v2
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
files: ${{ env.ZIP_NAME }},${{ env.LITE_SCRIPT_ONLY_ZIP_NAME }}
tag_name: ${{ env.CURRENT_TAG }}
name: ${{ env.CURRENT_TAG }}
body: ${{ env.RELEASE_NOTES }}
draft: false
prerelease: false

View File

@@ -5,6 +5,7 @@ A **KSU WebUI** to configure tricky store target.txt
## 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
## Requirements
@@ -28,9 +29,8 @@ A **KSU WebUI** to configure tricky store target.txt
- Run `UpdateTargetList.sh` under `/data/adb/tricky_store` manually.
- MT manager is recommened for this method
## More
**Support to pass abnormal boot state**
- Paste Verfied Boot Hash to `boot_hash` in `/data/adb/`, reboot.
## Translation
- Read [Translation Guide](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/main/module/webroot/locales/A-translate.md)
## Acknowledgement
- [j-hc/zygisk-detach](https://github.com/j-hc/zygisk-detach) - KSU WebUI template
@@ -38,4 +38,6 @@ A **KSU WebUI** to configure tricky store target.txt
## Links
Download: [GitHub release](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases)
Update log: Read [ChangeLog](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/blob/main/changelog.md)
Telegram channel: [KOW's Little World](https://t.me/kowchannel)

View File

@@ -1,15 +1,37 @@
### Tricky Addon: Update Target List
A **KSU WebUI** to configure tricky store target.txt
Requirement: Tricky Store module installed
Manually add VerifiedBootHash to /data/adb/boot_hash (optional)
This module is not a part of Tricky Store, DO NOT report to Tricky Store if you encounter any issue.
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.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/webroot/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).
### v2.6-beta.1
- Check in [release notes](https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/tag/v2.6-beta.1).
### v2.5
- Remove kb prompt on installation, moved into WebUI
- Restore to AOSP keybox during uninstallation
### v2.4
- Added aapt binary for app name display
@@ -29,7 +51,7 @@ Telegram channel: [KOW's Little World](https://t.me/kowchannel)
### v2.2
**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

View File

@@ -4,7 +4,7 @@
- Recommend to run with MT manager
## Changelog
### v2.1, v2.2, v2.3, v2.4
### v2.1, v2.2, v2.3, v2.4, v2.5, v2.6
- Remain same with v2.0
### v2.0

View File

@@ -1,6 +1,6 @@
#!/bin/sh
# Tricky Addon Lite: Update Target List Script v2.4
# 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
# Telegram channel: https://t.me/kowchannel

View File

@@ -1,4 +1,8 @@
MODPATH="${0%/*}"
###########################################
## This file is NOT a part of Tricky Store
###########################################
MODPATH="/data/adb/modules/.TA_utl"
COMPATH="$MODPATH/common"
SCRIPT_DIR="/data/adb/tricky_store"

File diff suppressed because one or more lines are too long

View File

@@ -1,6 +1,5 @@
URL="https://github.com/5ec1cff/KsuWebUIStandalone/releases/download/v1.0/KsuWebUI-1.0-34-release.apk"
APK_DIR="$COMPATH"
LOG_FILE="$COMPATH/webuiError.log"
find_busybox
check_wget

View File

@@ -1,24 +0,0 @@
#!/system/bin/sh
MODPATH=${0%/*}
OUTPUT="$MODPATH/exclude-list"
. $MODPATH/util_func.sh
find_busybox
check_wget
# Fetch Xposed module package names
wget --no-check-certificate -q -O - "https://modules.lsposed.org/modules.json" 2>/dev/null | \
grep -o '"name":"[^"]*","description":' | \
awk -F'"' '{print $4}' > "$OUTPUT"
# 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
echo "Error: Failed to fetch data." > "$OUTPUT"
exit 1
fi

View File

@@ -0,0 +1,49 @@
#!/system/bin/sh
MODPATH=${0%/*}
SKIPLIST="$MODPATH/skiplist"
OUTPUT="$MODPATH/exclude-list"
KBOUTPUT="$MODPATH/.extra"
. $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/main/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
fi
done
if [ "$skipfetch" != "true" ]; then
wget --no-check-certificate -qO "$KBOUTPUT" "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/.extra"
if [ ! -s "$KBOUTPUT" ]; then
rm -f "$KBOUTPUT"
fi
if [ -d "$MODPATH/temp" ]; then
JSON=$(wget --no-check-certificate -q -O - "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/update.json")
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}')
if [ "$REMOTE_VERSION" -gt "$LOCAL_VERSION" ]; then
echo "update"
fi
fi
else
exit 1
fi

View File

@@ -0,0 +1,3 @@
MODPATH=${0%/*}
rm -rf "$MODPATH"

View File

@@ -0,0 +1,22 @@
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"

View File

@@ -1,9 +1,9 @@
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"
/data/adb/magisk/busybox \
/data/adb/ksu/bin/busybox \
/data/adb/ap/bin/busybox"
find_busybox() {
for path in $BBPATH; do
@@ -26,6 +26,8 @@ check_wget() {
fi
}
aapt() { "$MODPATH/aapt" "$@"; }
download_webui() {
wget --no-check-certificate -P "$APK_DIR" "$URL"
if [ $? -ne 0 ]; then

View File

@@ -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`
ORG_DIR="/data/adb/modules/$MODID"
NEW_MODID=.TA_utl
kb="$COMPATH/.default"
ui_print " ";
@@ -37,14 +37,6 @@ ui_print "- Creating config directory..."
find_config
migrate_old_boot_hash
ui_print "*********************************************"
ui_print "- Do you want to replace tricky store keybox? (AOSP, no strong)"
ui_print " VOL [+]: YES"
ui_print " VOL [-]: NO"
ui_print "*********************************************"
key_check
kb_operation
rm -f "$MODPATH/install_func.sh"
ui_print "- Installation completed successfully! "

View File

@@ -2,31 +2,48 @@ initialize() {
if [ -f "$SCRIPT_DIR/UpdateTargetList.sh" ]; then
rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
fi
cp "$MODPATH/module.prop" "$COMPATH/module.prop.orig"
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"
sed -i "s|\"set-path\"|\"/data/adb/modules/$MODID/common/\"|" "$MODPATH/webroot/index.js" || {
ui_print "! Failed to set path"
abort
}
sed -i "s|\"set-id\"|\"$MODID\"|" "$COMPATH/util_func.sh" || {
ui_print "! Failed to set id"
abort
}
mkdir -p "$MODPATH/system/bin"
mv "$MODPATH/bin/$(getprop ro.product.cpu.abi)/aapt" "$COMPATH/aapt"
rm -rf "$MODPATH/bin"
set_perm $COMPATH/aapt 0 2000 0755
set_perm $SCRIPT_DIR/UpdateTargetList.sh 0 2000 0755
set_perm $COMPATH/get_exclude-list.sh 0 2000 0755
set_perm $COMPATH/get_extra.sh 0 2000 0755
set_perm $COMPATH/get_WebUI.sh 0 2000 0755
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
fi
sed -i "s|\"set-path\"|\"/data/adb/modules/$NEW_MODID/common/\"|" "$MODPATH/webroot/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
}
mv "$MODPATH/bin/$(getprop ro.product.cpu.abi)/aapt" "$COMPATH/aapt"
set_perm $COMPATH/aapt 0 2000 0755
rm -rf "$MODPATH/bin"
}
add_exclude() {
@@ -75,21 +92,10 @@ find_config() {
migrate_old_boot_hash() {
if [ ! -f "/data/adb/boot_hash" ]; then
if [ -f "$ORG_DIR/boot_hash" ]; then
mv "$ORG_DIR/boot_hash" "/data/adb/boot_hash"
fi
mv "$COMPATH/boot_hash" "/data/adb/boot_hash"
mv "$COMPATH/boot_hash" "/data/adb/boot_hash"
else
rm -f "$COMPATH/boot_hash"
fi
# Migrate from old version setup
if [ -f "$ORG_DIR/system.prop" ]; then
hash_value=$(sed -n 's/^ro.boot.vbmeta.digest=//p' "$ORG_DIR/system.prop")
if [ -n "$hash_value" ]; then
echo -e "\n$hash_value" >> "/data/adb/boot_hash"
fi
fi
}
key_check() {
@@ -110,26 +116,4 @@ key_check() {
break
fi
done
}
kb_operation() {
if [[ "$keycheck" == "KEY_VOLUMEUP" ]]; then
ui_print "- Backing up original keybox..."
ui_print "- Replacing keybox..."
ui_print "*********************************************"
if [ -f "$ORG_DIR/common/origkeybox" ]; then
mv "$ORG_DIR/common/origkeybox" "$COMPATH/origkeybox"
else
mv "$SCRIPT_DIR/keybox.xml" "$COMPATH/origkeybox"
fi
mv "$kb" "$SCRIPT_DIR/keybox.xml"
else
if [ -f "$ORG_DIR/common/origkeybox" ]; then
mv "$ORG_DIR/common/origkeybox" "$COMPATH/origkeybox"
fi
rm -f "$kb"
fi
}

View File

@@ -1,7 +1,7 @@
id=TA_utl
name=Tricky Addon - Update Target List
version=v2.4
versionCode=240
version=v2.6
versionCode=260
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

View File

@@ -1,8 +1,11 @@
MODPATH=${0%/*}
HIDE_DIR="/data/adb/modules/.TA_utl"
TS="/data/adb/modules/tricky_store"
SCRIPT_DIR="/data/adb/tricky_store"
TSPA="/data/adb/modules/tsupport-advance"
aapt() { "$MODPATH/common/aapt" "$@"; }
hash_value=$(grep -v '^#' "/data/adb/boot_hash" | tr -d '[:space:]')
if [ -n "$hash_value" ]; then
resetprop -n ro.boot.vbmeta.digest "$hash_value"
@@ -15,25 +18,64 @@ elif [ ! -d "$TSPA" ] && [ -f "/storage/emulated/0/stop-tspa-auto-target" ]; the
rm -f "/storage/emulated/0/stop-tspa-auto-target"
fi
if [ ! -f "$MODPATH/common/module.prop.orig" ]; then
sed -i 's/^description=.*/description=Module is corrupted, please reinstall module./' "$MODPATH/module.prop"
touch "$MODPATH/disable"
exit 1
if [ -d "$MODPATH/common/temp" ]; then
if [ "$KSU" ] || [ "$APATCH" ]; then
rm -f "$MODPATH/module.prop"
fi
if [ ! -d "$HIDE_DIR" ]; then
mv "$MODPATH" "$HIDE_DIR"
elif [[ "$MODPATH" != "$HIDE_DIR" ]]; then
rm -rf "$MODPATH"
exit 0
fi
MODPATH="$HIDE_DIR"
fi
OUTPUT_APP="$MODPATH/common/applist"
OUTPUT_SKIP="$MODPATH/common/skiplist"
if [ ! -d "$TS" ]; then
sed -i 's/^description=.*/description=Tricky store is not installed/' "$MODPATH/module.prop"
touch "$MODPATH/disable"
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
else
touch "$MODPATH/remove"
exit 1
fi
elif [ -f "$TS/disable" ]; then
sed -i 's/^description=.*/description=Tricky store is disabled/' "$MODPATH/module.prop"
touch "$MODPATH/disable"
elif [ ! -f "$SCRIPT_DIR/UpdateTargetList.sh" ]; then
sed -i 's/^description=.*/description=Script missing, please install module again/' "$MODPATH/module.prop"
touch "$MODPATH/disable"
exit 1
else
cat "$MODPATH/common/module.prop.orig" > "$MODPATH/module.prop"
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
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
fi

View File

@@ -1,4 +1,5 @@
MODPATH=${0%/*}
TS="/data/adb/modules/tricky_store"
SCRIPT_DIR="/data/adb/tricky_store"
# Enable back TSupport-A auto update
@@ -6,11 +7,15 @@ if [ -f "/storage/emulated/0/stop-tspa-auto-target" ]; then
rm -f "/storage/emulated/0/stop-tspa-auto-target"
fi
# Remove residue and restore original keybox.
# Remove residue and restore aosp keybox.
rm -rf "$SCRIPT_DIR/target_list_config"
rm -f "$SCRIPT_DIR/UpdateTargetList.sh"
rm -f "/data/adb/boot_hash"
if [ -f "$MODPATH/common/origkeybox" ]; then
rm -f "$SCRIPT_DIR/keybox.xml"
mv "$MODPATH/common/origkeybox" "$SCRIPT_DIR/keybox.xml"
fi
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/common/.default" | base64 -d > "$SCRIPT_DIR/keybox.xml"

View File

@@ -1,77 +1,51 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<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="/styles.css" type="text/css">
<script type="module" crossorigin src="/index.js"></script>
</head>
<body>
<div class="title-container">
<div id="title">Tricky Addon - Update Target List</div>
<!-- Header -->
<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>
<div class="no-connection">
<img src="wifi-slash.svg" alt="No Connection Icon" class="wifi-icon">
</div>
</div>
<div id="help-overlay" class="help-overlay">
<div class="help-menu">
<button id="close-help" class="close-help">&#x2715;</button>
<div class="help-content">
<p>Instructions</p>
<ul>
<li>Save and Update
<ul>
<li>Save the current configuration and update target.txt immediately.</li>
<li><br></li>
</ul>
</li>
<li>Refresh
<ul>
<li>Refresh app list and exclude list.</li>
<li><br></li>
</ul>
</li>
<li>Select All & Deselect All
<ul>
<li>Select or deselect all apps in the current interface.</li>
<li><br></li>
</ul>
</li>
<li>Select From DenyList
<ul>
<li>Available in Magisk only, select apps that in the DenyList. Recommended.</li>
<li><br></li>
</ul>
</li>
<li>Deselect Unnecessary
<ul>
<li>Unnecessary category: Xposed module, root manager, root-related apps, and general apps
that never check bootloader status.</li>
<ul>
<li>Contribute to <a
href="https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/master/more-excldue.json"
target="_blank">unnecessary app list</a>? Create an <a
href="https://github.com/KOWX712/Tricky-Addon-Update-Target-List/issues"
target="_blank">issue</a> or <a
href="https://github.com/KOWX712/Tricky-Addon-Update-Target-List/pulls"
target="_blank">pull request</a>.</li>
</ul>
<li><br></li>
</ul>
</li>
</ul>
<div class="language-dropdown">
<button class="language-button">
<i class="fa fa-compass"></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>
</div>
</div>
</div>
<!-- Loading Element -->
<div class="loading" data-i18n="loading"></div>
<!-- Prompt Element -->
<div id="prompt" class="prompt"></div>
<!-- Floating Button Element -->
<div class="floating-card">
<button class="floating-btn" id="save" data-i18n="save_and_update_button"></button>
</div>
<!-- Menu Options -->
<div class="search-menu-container">
<div class="search-card">
<span class="search-icon"><i class="fa fa-search"></i></span>
<input type="text" class="search-input" id="search" placeholder="Search">
<input type="text" class="search-input" id="search" placeholder="Search" data-i18n="search_placeholder">
<button class="clear-btn" id="clear-btn">&#x2715;</button>
</div>
<div class="menu">
@@ -81,19 +55,22 @@
</label>
<div id="menu-options" class="menu-options">
<ul>
<li id="refresh">Refresh</li>
<li id="select-all">Select All</li>
<li id="deselect-all">Deselect All</li>
<li id="select-denylist">Select From DenyList</li>
<li id="deselect-xposed">Deselect Unnecessary</li>
<li id="refresh" data-i18n="refresh"></li>
<li id="select-all" data-i18n="select_all"></li>
<li id="deselect-all" data-i18n="deselect_all"></li>
<li id="select-denylist" data-i18n="select_denylist"></li>
<li id="deselect-unnecessary" data-i18n="deselect_unnecessary"></li>
<li id="aospkb" data-i18n="set_aosp_keybox"></li>
<li id="extrakb" data-i18n="set_valid_keybox"></li>
<li id="boot-hash" data-i18n="set_verified_boot_hash"></li>
<li id="about" data-i18n="about"></li>
</ul>
</div>
</div>
</div>
<!-- Applist Display -->
<div id="apps-list"></div>
<div class="floating-card">
<button class="floating-btn" id="save">Save and Update</button>
</div>
<template id="app-template">
<div class="card" onclick="toggleCheckbox(event)">
<div class="content" data-package="">
@@ -102,9 +79,63 @@
</div>
</div>
</template>
<div class="loading">Loading...</div>
<div class="acknowledgment">Credit to j-hc/zygisk-detach WebUI</div>
<div id="prompt" class="prompt"></div>
</body>
<!-- Help Overlay -->
<div id="help-overlay" class="help-overlay">
<div class="help-menu">
<button id="close-help" class="close-help">&#x2715;</button>
<div class="help-content">
<p data-i18n="help_instructions"></p>
<ul id="help-list"></ul>
</div>
</div>
</div>
<!-- BootHash Input Overlay -->
<div id="boot-hash-overlay" class="boot-hash-overlay"></div>
<div id="boot-hash-card" class="boot-hash-card">
<textarea id="boot-hash-input" class="input-box" placeholder="Paste your verified Boot Hash here"
data-i18n="boot_hash_input_placeholder"></textarea>
<div class="button-container">
<button id="boot-hash-save-button" class="boot-hash-save-button" data-i18n="boot_hash_save_button"></button>
</div>
</div>
<!-- About Overlay -->
<div id="about-overlay" class="about-overlay">
<div id="about-menu" class="about-menu">
<button id="close-about" class="close-about">&#x2715;</button>
<div class="about-content">
<p data-i18n="module_name_line1"></p>
<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 data-i18n="acknowledgment"></p>
<p>j-hc/zygisk-detach: WebUI template</p>
</div>
</div>
</div>
<!-- Footer -->
<div class="footer">
<div class="uninstall-container hidden-uninstall">
<i class="fa fa-trash"></i>
<span data-i18n="uninstall_webui"></span>
</div>
</div>
</body>
</html>

View File

@@ -1,22 +1,132 @@
let e = 0;
const appTemplate = document.getElementById("app-template").content;
const appListContainer = document.getElementById("apps-list");
const loadingIndicator = document.querySelector(".loading");
// Header Elements
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');
// Loading and Prompt Elements
const loadingIndicator = document.querySelector('.loading');
const prompt = document.getElementById('prompt');
// Floating Button
const floatingBtn = document.querySelector('.floating-btn');
// Search and Menu Elements
const searchInput = document.getElementById('search');
const clearBtn = document.getElementById('clear-btn');
const searchMenuContainer = document.querySelector('.search-menu-container');
const searchInput = document.getElementById("search");
const clearBtn = document.getElementById("clear-btn");
const title = document.querySelector('.title-container');
const noConnection = document.querySelector(".no-connection");
const helpButton = document.getElementById("help-button");
const helpOverlay = document.getElementById("help-overlay");
const closeHelp = document.getElementById("close-help");
const searchCard = document.querySelector('.search-card');
const menu = document.querySelector('.menu');
const selectDenylistElement = document.getElementById("select-denylist");
const floatingBtn = document.querySelector('.floating-btn');
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');
// BootHash Overlay Elements
const bootHashOverlay = document.getElementById('boot-hash-overlay');
const card = document.getElementById('boot-hash-card');
const inputBox = document.getElementById('boot-hash-input');
const saveButton = document.getElementById('boot-hash-save-button');
const basePath = "set-path";
// Variables
let e = 0;
let excludeList = [];
let isRefreshing = false;
let translations = {};
let currentLang = '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)) {
return langCode;
}
else {
return 'en-US';
}
}
// Load translations dynamically based on the selected language
async function loadTranslations(lang) {
try {
const response = await fetch(`/locales/${lang}.json`);
translations = await response.json();
applyTranslations();
} catch (error) {
console.error(`Error loading translations for ${lang}:`, error);
if (lang !== 'en-US') {
console.log("Falling back to English.");
loadTranslations('en-US');
}
}
}
// Function to apply translations to all elements with data-i18n attributes
function applyTranslations() {
document.querySelectorAll("[data-i18n]").forEach((el) => {
const key = el.getAttribute("data-i18n");
if (translations[key]) {
if (el.hasAttribute("placeholder")) {
el.setAttribute("placeholder", translations[key]);
} else {
el.textContent = translations[key];
}
}
});
updateHelpMenu();
}
// Language selection event listener
document.querySelectorAll(".language-option").forEach((button) => {
button.addEventListener("click", (e) => {
const lang = e.target.getAttribute("data-lang");
loadTranslations(lang);
});
});
// Function to dynamically update the help menu
function updateHelpMenu() {
helpList.innerHTML = "";
const helpSections = [
{ title: "save_and_update_button", description: "save_and_update_description" },
{ title: "refresh", description: "refresh_description" },
{ title: "select_deselect", description: "select_description" },
{ title: "select_denylist", description: "select_denylist_description" },
{ title: "deselect_unnecessary", description: "deselect_unnecessary_description" },
{ title: "set_keybox", description: "set_aosp_keybox_description" },
{ title: "set_verified_boot_hash", description: "set_verified_boot_hash_description" }
];
helpSections.forEach((section) => {
const listItem = document.createElement("li");
listItem.innerHTML = `<strong data-i18n="${section.title}">${translations[section.title]}</strong>`;
const description = document.createElement("ul");
const descriptionItem = document.createElement("li");
descriptionItem.textContent = translations[section.description] || `[Missing: ${section.description}]`;
description.appendChild(descriptionItem);
listItem.appendChild(description);
helpList.appendChild(listItem);
const emptyLine = document.createElement("li");
emptyLine.innerHTML = "<br>";
helpList.appendChild(emptyLine);
});
}
// Function to execute shell commands
async function execCommand(command) {
@@ -60,28 +170,54 @@ function isExcluded(appName) {
async function fetchAppList() {
try {
await readExcludeFile();
const result = await execCommand(`
pm list packages -3 | while read -r line; do
PACKAGE=$(echo "$line" | awk -F: '{print $2}')
APK_PATH=$(pm path "$PACKAGE" | grep "base.apk" | awk -F: '{print $2}' | tr -d '\\r')
if [ -n "$APK_PATH" ]; then
APP_NAME=$( ${basePath}aapt dump badging "$APK_PATH" 2>/dev/null | grep "application-label:" | sed "s/application-label://; s/'//g" )
echo "$APP_NAME|$PACKAGE"
else
echo "Unknown App|$PACKAGE"
fi
done
`);
const appEntries = result.split("\n").map(line => {
const [appName, packageName] = line.split("|").map(item => item.trim());
return { appName, packageName };
}).filter(entry => entry.packageName); // Remove invalid entries
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.");
}
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";
}
}
}
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;
});
appListContainer.innerHTML = ""; // Clear the container before rendering
appListContainer.innerHTML = "";
sortedApps.forEach(({ appName, packageName }) => {
const appElement = document.importNode(appTemplate, true);
const contentElement = appElement.querySelector(".content");
@@ -96,7 +232,7 @@ async function fetchAppList() {
} catch (error) {
console.error("Failed to fetch or render app list with names:", error);
}
floatingBtn.style.transform = "translateY(-100px)";
floatingBtn.style.transform = "translateY(-120px)";
}
// Function to refresh app list
@@ -109,47 +245,77 @@ async function refreshAppList() {
clearBtn.style.display = "none";
appListContainer.innerHTML = '';
loadingIndicator.style.display = 'flex';
document.querySelector('.uninstall-container').classList.add('hidden-uninstall');
await new Promise(resolve => setTimeout(resolve, 500));
window.scrollTo(0, 0);
if (noConnection.style.display === "flex") {
await runXposedScript();
await runExtraScript();
}
await fetchAppList();[]
await fetchAppList();
loadingIndicator.style.display = 'none';
document.querySelector('.uninstall-container').classList.remove('hidden-uninstall');
isRefreshing = false;
}
// Function to run the Xposed script
async function runXposedScript() {
try {
const scriptPath = `${basePath}get_exclude-list.sh`;
await execCommand(scriptPath);
console.log("Xposed script executed successfully.");
noConnection.style.display = "none";
} catch (error) {
console.error("Failed to execute Xposed script:", error);
showPrompt("Please check your Internet connection", false);
noConnection.style.display = "flex";
}
// Function to select all visible apps
function selectAllApps() {
document.querySelectorAll(".card").forEach(card => {
if (card.style.display !== "none") {
card.querySelector(".checkbox").checked = true;
}
});
}
// Function to read the Xposed list and uncheck corresponding apps
async function deselectXposedApps() {
// Function to deselect all visible apps
function deselectAllApps() {
document.querySelectorAll(".card").forEach(card => {
if (card.style.display !== "none") {
card.querySelector(".checkbox").checked = false;
}
});
}
// 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.");
}
} 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 xposedApps = result.split("\n").map(app => app.trim()).filter(Boolean);
const UnnecessaryApps = result.split("\n").map(app => app.trim()).filter(Boolean);
const apps = document.querySelectorAll(".card");
apps.forEach(app => {
const contentElement = app.querySelector(".content");
const packageName = contentElement.getAttribute("data-package");
const checkbox = app.querySelector(".checkbox");
if (xposedApps.includes(packageName)) {
checkbox.checked = false; // Uncheck if found in Xposed list
if (UnnecessaryApps.includes(packageName)) {
checkbox.checked = false; // Uncheck if found in more-exclude list
}
});
console.log("Xposed apps deselected successfully.");
console.log("unnecessary apps deselected successfully.");
} catch (error) {
console.error("Failed to deselect Xposed apps:", error);
console.error("Failed to deselect unnecessary apps:", error);
}
}
@@ -185,6 +351,7 @@ async function selectDenylistApps() {
`);
const denylistApps = result.split("\n").map(app => app.trim()).filter(Boolean);
const apps = document.querySelectorAll(".card");
await deselectAllApps();
apps.forEach(app => {
const contentElement = app.querySelector(".content");
const packageName = contentElement.getAttribute("data-package");
@@ -199,27 +366,124 @@ async function selectDenylistApps() {
}
}
// Function to select all visible apps
function selectAllApps() {
document.querySelectorAll(".card").forEach(card => {
if (card.style.display !== "none") {
card.querySelector(".checkbox").checked = true;
// Function to replace aosp kb
async function aospkb() {
try {
const sourcePath = `${basePath}.default`;
const destinationPath = "/data/adb/tricky_store/keybox.xml";
await execCommand(`xxd -r -p ${sourcePath} | base64 -d > ${destinationPath}`);
console.log("AOSP keybox copied successfully.");
showPrompt("aosp_key_set");
} catch (error) {
console.error("Failed to copy AOSP keybox:", error);
showPrompt("key_set_error", false);
}
}
// Function to replace valid kb
async function extrakb() {
const sourcePath = `${basePath}.extra`;
const destinationPath = "/data/adb/tricky_store/keybox.xml";
try {
const fileExists = await execCommand(`[ -f ${sourcePath} ] && echo "exists"`);
if (fileExists.trim() !== "exists") {
throw new Error(".extra file not found");
}
await execCommand(`xxd -r -p ${sourcePath} | base64 -d > ${destinationPath}`);
console.log("Valid keybox copied successfully.");
showPrompt("valid_key_set");
} catch (error) {
console.error("Failed to copy valid keybox:", error);
await aospkb();
showPrompt("no_valid_fallback", false);
}
}
// Function to handle Verified Boot Hash
async function setBootHash() {
const showCard = () => {
bootHashOverlay.style.display = "flex";
card.style.display = "flex";
requestAnimationFrame(() => {
bootHashOverlay.classList.add("show");
card.classList.add("show");
});
document.body.style.overflow = "hidden";
};
const closeCard = () => {
bootHashOverlay.classList.remove("show");
card.classList.remove("show");
setTimeout(() => {
bootHashOverlay.style.display = "none";
card.style.display = "none";
document.body.style.overflow = "auto";
}, 200);
};
showCard();
try {
const bootHashContent = await execCommand("cat /data/adb/boot_hash");
const validHash = bootHashContent
.split("\n")
.filter(line => !line.startsWith("#") && line.trim())[0];
inputBox.value = validHash || "";
} catch (error) {
console.warn("Failed to read boot_hash file. Defaulting to empty input.");
inputBox.value = "";
}
saveButton.addEventListener("click", async () => {
const inputValue = inputBox.value.trim();
try {
await execCommand(`echo "${inputValue}" > /data/adb/boot_hash`);
await execCommand(`su -c resetprop -n ro.boot.vbmeta.digest ${inputValue}`);
showPrompt("boot_hash_set");
closeCard();
} catch (error) {
console.error("Failed to update boot_hash:", error);
showPrompt("boot_hash_set_error", false);
}
});
bootHashOverlay.addEventListener("click", (event) => {
if (event.target === bootHashOverlay) closeCard();
});
}
// Function to deselect all visible apps
function deselectAllApps() {
document.querySelectorAll(".card").forEach(card => {
if (card.style.display !== "none") {
card.querySelector(".checkbox").checked = false;
// Function to show about overlay
function aboutMenu() {
const aboutOverlay = document.getElementById('about-overlay');
const menu = 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';
}, 10);
document.body.style.overflow = 'hidden';
};
const hideMenu = () => {
aboutOverlay.style.opacity = '0';
menu.style.opacity = '0';
setTimeout(() => {
aboutOverlay.style.display = 'none';
document.body.style.overflow = 'auto';
}, 200);
};
showMenu();
closeAbout.addEventListener('click', (event) => {
event.stopPropagation();
hideMenu();
});
aboutOverlay.addEventListener('click', (event) => {
if (!menu.contains(event.target)) {
hideMenu();
}
});
menu.addEventListener('click', (event) => event.stopPropagation());
}
// Function to show the prompt with a success or error message
function showPrompt(message, isSuccess = true) {
const prompt = document.getElementById('prompt');
function showPrompt(key, isSuccess = true) {
const message = translations[key] || key;
prompt.textContent = message;
prompt.classList.toggle('error', !isSuccess);
if (window.promptTimeout) {
@@ -237,9 +501,7 @@ function showPrompt(message, isSuccess = true) {
// Function to toggle menu option
function setupMenuToggle() {
const menuButton = document.getElementById('menu-button');
const menuIcon = menuButton.querySelector('.menu-icon');
const menuOptions = document.getElementById('menu-options');
let menuOpen = false;
let menuAnimating = false;
@@ -265,7 +527,7 @@ function setupMenuToggle() {
}
});
const closeMenuItems = ['refresh', 'select-all', 'deselect-all', 'select-denylist', 'deselect-xposed'];
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) {
@@ -369,14 +631,14 @@ document.getElementById("save").addEventListener("click", async () => {
// Execute UpdateTargetList.sh
try {
await execCommand("/data/adb/tricky_store/UpdateTargetList.sh");
showPrompt("Config and target.txt updated");
showPrompt("saved_and_updated");
} catch (error) {
console.error("Failed to update target list:", error);
showPrompt("Config saved, but failed to update target list", false);
showPrompt("saved_not_updated", false);
}
} catch (error) {
console.error("Failed to update EXCLUDE file:", error);
showPrompt("Failed to save config", false);
showPrompt("save_error", false);
}
await readExcludeFile();
await refreshAppList();
@@ -384,31 +646,62 @@ document.getElementById("save").addEventListener("click", async () => {
// Initial load
document.addEventListener('DOMContentLoaded', async () => {
const userLang = detectUserLanguage();
await loadTranslations(userLang);
setupMenuToggle();
document.getElementById("refresh").addEventListener("click", refreshAppList);
document.getElementById("select-all").addEventListener("click", selectAllApps);
document.getElementById("deselect-all").addEventListener("click", deselectAllApps);
document.getElementById("select-denylist").addEventListener("click", selectDenylistApps);
document.getElementById("deselect-xposed").addEventListener("click", deselectXposedApps);
document.getElementById("deselect-unnecessary").addEventListener("click", deselectUnnecessaryApps);
document.getElementById("aospkb").addEventListener("click", aospkb);
document.getElementById("extrakb").addEventListener("click", extrakb);
document.getElementById("boot-hash").addEventListener("click", setBootHash);
document.getElementById("about").addEventListener("click", aboutMenu);
await fetchAppList();
checkMagisk();
runXposedScript();
loadingIndicator.style.display = "none";
document.querySelector('.uninstall-container').classList.remove('hidden-uninstall');
runExtraScript();
});
// 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 = 35;
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(-35px)';
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(-100px)';
floatingBtn.style.transform = 'translateY(-120px)';
}
if (languageMenu.classList.contains("show")) {
languageMenu.classList.remove("show");
}
lastScrollY = window.scrollY;
});
@@ -439,4 +732,26 @@ helpOverlay.addEventListener("click", (event) => {
if (event.target === helpOverlay) {
hideHelpOverlay();
}
});
});
// Uninstall WebUI
document.querySelector(".uninstall-container").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");
} catch (error) {
console.error("Failed to execute uninstall command:", error);
console.log("Error message:", error.message);
showPrompt("uninstall_failed", false);
}
});

View File

@@ -0,0 +1,52 @@
{
"title": "Tricky Addon - Update Target List",
"search_placeholder": "Search",
"save_and_update_button": "Save and Update",
"boot_hash_save_button": "Save",
"loading": "Loading...",
"boot_hash_input_placeholder": "Paste your verified Boot Hash here",
"uninstall_webui": "Uninstall WebUI",
"refresh": "Refresh",
"select_all": "Select All",
"deselect_all": "Deselect All",
"select_denylist": "Select From DenyList",
"deselect_unnecessary": "Deselect Unnecessary",
"set_aosp_keybox": "Set AOSP Keybox",
"set_valid_keybox": "Set Valid Keybox",
"set_verified_boot_hash": "Set Verified Boot Hash",
"about": "About",
"help_instructions": "Instructions",
"save_and_update_description": "Save the current configuration and update target.txt immediately.",
"refresh_description": "Refresh app list and exclude list.",
"select_deselect": "Select & Deselect All",
"select_description": "Select or deselect all apps in the current interface.",
"select_denylist_description": "Available in Magisk only, select apps that are in the DenyList. Recommended.",
"deselect_unnecessary_description": "Unnecessary category: Xposed module, root manager, root-related apps, and general apps that never check bootloader status. This option requires an Internet connection.",
"set_keybox": "Set AOSP & Valid Keybox",
"set_aosp_keybox_description": "Replace tricky store keybox.xml. AOSP keybox will be replaced if there's no more valid keybox. Valid keybox option requires Internet connection.",
"set_verified_boot_hash_description": "Get verifiedBootHash value from Key Attestation Demo. Fix abnormal boot state by resetting ro.boot.vbmeta.digest.",
"module_name_line1": "Tricky Addon",
"module_name_line2": "Update Target List",
"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.",
"acknowledgment": "Acknowledgment",
"no_internet": "Please check your Internet connection",
"aosp_key_set": "AOSP keybox set successfully",
"key_set_error": "Failed to update keybox",
"valid_key_set": "Valid keybox set successfully",
"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",
"save_error": "Failed to save config",
"uninstall_prompt": "WebUI will be removed after reboot",
"uninstall_failed": "Failed to uninstall WebUI",
"new_update": "A new update is available!"
}

View File

@@ -0,0 +1,36 @@
# Translation Guide
## Fix Translation Error
1. Fork this repository.
2. Find your language string file in `/module/webroot/locales/`.
3. Edit the string value with translated incorrectly.
4. Create a Pull Request.
---
## Add a New Language
### Simple
- Contact me in Telegram to add a new translation langauge for you.
### Advanced
1. Fork this repository.
2. Make a copy of `/module/webroot/locales/A-template.json`
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>
```
Example:
```xml
<div class="language-menu">
<button class="language-option" data-lang="en-US" data-i18n="language_english_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

View File

@@ -0,0 +1,52 @@
{
"title": "Tricky Addon - Update Target List",
"search_placeholder": "Search",
"save_and_update_button": "Save and Update",
"boot_hash_save_button": "Save",
"loading": "Loading...",
"boot_hash_input_placeholder": "Paste your verified Boot Hash here",
"uninstall_webui": "Uninstall WebUI",
"refresh": "Refresh",
"select_all": "Select All",
"deselect_all": "Deselect All",
"select_denylist": "Select From DenyList",
"deselect_unnecessary": "Deselect Unnecessary",
"set_aosp_keybox": "Set AOSP Keybox",
"set_valid_keybox": "Set Valid Keybox",
"set_verified_boot_hash": "Set Verified Boot Hash",
"about": "About",
"help_instructions": "Instructions",
"save_and_update_description": "Save the current configuration and update target.txt immediately.",
"refresh_description": "Refresh app list and exclude list.",
"select_deselect": "Select & Deselect All",
"select_description": "Select or deselect all apps in the current interface.",
"select_denylist_description": "Available in Magisk only, select apps that are in the DenyList. Recommended.",
"deselect_unnecessary_description": "Unnecessary category: Xposed module, root manager, root-related apps, and general apps that never check bootloader status. This option requires an Internet connection.",
"set_keybox": "Set AOSP & Valid Keybox",
"set_aosp_keybox_description": "Replace tricky store keybox.xml. AOSP keybox will be replaced if there's no more valid keybox. Valid keybox option requires Internet connection.",
"set_verified_boot_hash_description": "Get verifiedBootHash value from Key Attestation Demo. Fix abnormal boot state by resetting ro.boot.vbmeta.digest.",
"module_name_line1": "Tricky Addon",
"module_name_line2": "Update Target List",
"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.",
"acknowledgment": "Acknowledgment",
"no_internet": "Please check your Internet connection",
"aosp_key_set": "AOSP keybox set successfully",
"key_set_error": "Failed to update keybox",
"valid_key_set": "Valid keybox set successfully",
"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",
"save_error": "Failed to save config",
"uninstall_prompt": "WebUI will be removed after reboot",
"uninstall_failed": "Failed to uninstall WebUI",
"new_update": "A new update is available!"
}

View File

@@ -0,0 +1,52 @@
{
"title": "Tricky Addon - Обновить список целей",
"search_placeholder": "Поиск",
"save_and_update_button": "Сохранить и обновить",
"boot_hash_save_button": "Сохранить",
"loading": "Загрузка...",
"boot_hash_input_placeholder": "Вставьте свой проверенный Boot Hash сюда",
"uninstall_webui": "Удалить WebUI",
"refresh": "Обновить",
"select_all": "Выбрать все",
"deselect_all": "Отменить выбор всех",
"select_denylist": "Выбрать из DenyList",
"deselect_unnecessary": "Отменить выбор ненужных",
"set_aosp_keybox": "Установить AOSP Keybox",
"set_valid_keybox": "Установить действующий Keybox",
"set_verified_boot_hash": "Установить Verified Boot Hash",
"about": "О программе",
"help_instructions": "Инструкции",
"save_and_update_description": "Сохраните текущую конфигурацию и немедленно обновите target.txt.",
"refresh_description": "Обновить список приложений и список исключений.",
"select_deselect": "Выбрать и отменить выбор всех",
"select_description": "Выбрать или отменить выбор всех приложений в текущем интерфейсе.",
"select_denylist_description": "Доступно только в Magisk, выберите приложения, которые находятся в DenyList. Рекомендуется.",
"deselect_unnecessary_description": "Ненужные категории: модули Xposed, менеджеры root, приложения, связанные с root, и общие приложения, которые никогда не проверяют статус загрузчика. Этот параметр требует подключения к интернету.",
"set_keybox": "Установить AOSP и действующий Keybox",
"set_aosp_keybox_description": "Замените tricky store keybox.xml. AOSP keybox будет заменен, если не будет найден действующий keybox. Опция с действующим keybox требует подключения к интернету.",
"set_verified_boot_hash_description": "Получите значение verifiedBootHash из Key Attestation Demo. Исправьте аномальное состояние загрузки, сбросив ro.boot.vbmeta.digest.",
"module_name_line1": "Tricky Addon",
"module_name_line2": "Обновить список целей",
"by": "от ",
"telegram_channel": "Канал в Telegram",
"github": "GitHub",
"disclaimer": "Этот WebUI не является частью 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": "Verified Boot Hash успешно сохранен",
"boot_hash_set_error": "Не удалось обновить Verified Boot Hash",
"saved_and_updated": "Конфигурация и target.txt обновлены",
"saved_not_updated": "Конфигурация сохранена, но не удалось обновить список целей",
"save_error": "Не удалось сохранить конфигурацию",
"uninstall_prompt": "WebUI будет удален после перезагрузки",
"uninstall_failed": "Не удалось удалить WebUI",
"new_update": "Доступно новое обновление!"
}

View File

@@ -0,0 +1,52 @@
{
"title": "Tricky Addon - I-update ang Target List",
"search_placeholder": "Maghanap",
"save_and_update_button": "I-save at I-update",
"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",
"refresh": "I-refresh",
"select_all": "Piliin Lahat",
"deselect_all": "Huwag Pumili ng Lahat",
"select_denylist": "Piliin mula sa DenyList",
"deselect_unnecessary": "Huwag Pumili ng Hindi Kinakailangan",
"set_aosp_keybox": "I-set ang AOSP Keybox",
"set_valid_keybox": "I-set ang Valid Keybox",
"set_verified_boot_hash": "I-set ang Verified Boot Hash",
"about": "Tungkol",
"help_instructions": "Mga Tagubilin",
"save_and_update_description": "I-save ang kasalukuyang configuration at i-update ang target.txt agad.",
"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.",
"select_denylist_description": "Available lang sa Magisk, piliin ang mga app na nasa DenyList. Inirerekomenda.",
"deselect_unnecessary_description": "Hindi kinakailangang kategorya: Xposed module, root manager, root-related apps, at mga karaniwang apps na hindi kailanman nire-refresh ang bootloader status. Nangangailangan ng koneksyon sa internet.",
"set_keybox": "I-set ang AOSP at Valid Keybox",
"set_aosp_keybox_description": "Palitan ang tricky store keybox.xml. Palitan ang AOSP keybox kung walang valid keybox. Nangangailangan ng koneksyon sa internet ang valid keybox option.",
"set_verified_boot_hash_description": "Kunin ang verifiedBootHash mula sa Key Attestation Demo. Ayusin ang abnormal na boot state sa pamamagitan ng pag-reset ng ro.boot.vbmeta.digest.",
"module_name_line1": "Tricky Addon",
"module_name_line2": "I-update ang Target List",
"by": "ni ",
"telegram_channel": "Telegram Channel",
"github": "GitHub",
"disclaimer": "Ang WebUI na ito ay hindi bahagi ng Tricky Store, HUWAG i-report sa may-akda ng Tricky Store kung makaranas ka ng anumang isyu.",
"acknowledgment": "Pagkilala",
"no_internet": "Pakitingnan ang iyong koneksyon sa Internet",
"aosp_key_set": "Matagumpay na na-set ang AOSP Keybox",
"key_set_error": "Nabigong i-update ang keybox",
"valid_key_set": "Matagumpay na na-set ang Valid Keybox",
"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",
"save_error": "Nabigong i-save ang config",
"uninstall_prompt": "Mawawala ang WebUI pagkatapos ng reboot",
"uninstall_failed": "Nabigong i-uninstall ang WebUI",
"new_update": "May bagong update na available!"
}

View File

@@ -0,0 +1,52 @@
{
"title": "TS插件 - 更新目标列表",
"search_placeholder": "搜索",
"save_and_update_button": "保存并更新",
"boot_hash_save_button": "保存",
"loading": "加载中...",
"boot_hash_input_placeholder": "在此粘贴您的哈希值",
"uninstall_webui": "卸载 WebUI",
"refresh": "刷新",
"select_all": "全选",
"deselect_all": "取消全选",
"select_denylist": "从排除列表中选择",
"deselect_unnecessary": "取消选择非必应用",
"set_aosp_keybox": "设置 AOSP 密钥",
"set_valid_keybox": "设置有效密钥",
"set_verified_boot_hash": "设置哈希值",
"about": "关于",
"help_instructions": "使用指南",
"save_and_update_description": "保存当前配置并立即更新目标列表target.txt。",
"refresh_description": "刷新应用列表和排除列表。",
"select_deselect": "全选 & 取消全选",
"select_description": "选择或取消选择当前界面中的所有应用。",
"select_denylist_description": "仅适用于 Magisk选择在排除列表中的应用。推荐使用。",
"deselect_unnecessary_description": "非必要分类Xposed 模块、root 管理器、与 root 相关的应用,以及从不检查 bootloader 状态的通用应用。此功能需连网使用。",
"set_keybox": "设置 AOSP & 有效密钥",
"set_aosp_keybox_description": "替换 Tricky Store 的密钥keybox.xml。如果没有有效密钥将替换为 AOSP 密钥。有效密钥选项需连网使用。",
"set_verified_boot_hash_description": "从 Key Attestation Demo 获取 verifiedBootHash哈希值。通过重置 ro.boot.vbmeta.digest 修复异常 boot 状态。",
"module_name_line1": "TS插件",
"module_name_line2": "更新目标列表",
"by": "作者:",
"telegram_channel": "TG频道",
"github": "GitHub",
"disclaimer": "此 WebUI 不是 Tricky Store 的一部分,遇到任何问题请勿向 Tricky Store 作者反馈。",
"acknowledgment": "特别鸣谢",
"no_internet": "请检查您的网络连接",
"aosp_key_set": "成功设置 AOSP 密钥",
"key_set_error": "更新密钥失败",
"valid_key_set": "成功设置有效密钥",
"no_valid_fallback": "未找到有效密钥,已替换为 AOSP 密钥。",
"boot_hash_set": "哈希值重置成功",
"boot_hash_set_error": "哈希值重置失败",
"saved_and_updated": "成功保存配置和更新目标列表",
"saved_not_updated": "配置已保存,但更新目标列表失败",
"save_error": "保存配置失败",
"uninstall_prompt": "WebUI 将在重启后被移除",
"uninstall_failed": "卸载 WebUI 失败",
"new_update": "发现新的版本!"
}

View File

@@ -0,0 +1,52 @@
{
"title": "TS插件 - 更新目標列表",
"search_placeholder": "搜尋",
"save_and_update_button": "保存並更新",
"boot_hash_save_button": "保存",
"loading": "加載中...",
"boot_hash_input_placeholder": "在此粘貼您的哈希值",
"uninstall_webui": "卸載 WebUI",
"refresh": "刷新",
"select_all": "全選",
"deselect_all": "取消全選",
"select_denylist": "從排除列表中選擇",
"deselect_unnecessary": "取消選擇非必應用",
"set_aosp_keybox": "設置 AOSP 密鑰",
"set_valid_keybox": "設置有效密鑰",
"set_verified_boot_hash": "設置哈希值",
"about": "關於",
"help_instructions": "使用指南",
"save_and_update_description": "保存當前配置並立即更新目標列表target.txt。",
"refresh_description": "刷新應用列表和排除列表。",
"select_deselect": "全選 & 取消全選",
"select_description": "選擇或取消選擇當前界面中的所有應用。",
"select_denylist_description": "僅適用於 Magisk選擇在排除列表中的應用。推薦使用。",
"deselect_unnecessary_description": "非必要分類Xposed 模塊、root 管理器、與 root 相關的應用,以及從不檢查 bootloader 狀態的通用應用。此功能需連網使用。",
"set_keybox": "設置 AOSP & 有效密鑰",
"set_aosp_keybox_description": "替換 Tricky Store 的密鑰keybox.xml。如果沒有有效密鑰將替換為 AOSP 密鑰。有效密鑰選項需連網使用。",
"set_verified_boot_hash_description": "從 Key Attestation Demo 獲取 verifiedBootHash哈希值。通過重置 ro.boot.vbmeta.digest 修復異常 boot 狀態。",
"module_name_line1": "TS插件",
"module_name_line2": "更新目標列表",
"by": "作者:",
"telegram_channel": "TG頻道",
"github": "GitHub",
"disclaimer": "此 WebUI 不是 Tricky Store 的一部分,遇到任何問題請勿向 Tricky Store 作者反饋。",
"acknowledgment": "特別鳴謝",
"no_internet": "請檢查您的網路連接",
"aosp_key_set": "成功設置 AOSP 密鑰",
"key_set_error": "更新密鑰失敗",
"valid_key_set": "成功設置有效密鑰",
"no_valid_fallback": "未找到有效密鑰,已替換為 AOSP 密鑰。",
"boot_hash_set": "哈希值重置成功",
"boot_hash_set_error": "哈希值重置失敗",
"saved_and_updated": "成功保存配置和更新目標列表",
"saved_not_updated": "配置已保存,但更新目標列表失敗",
"save_error": "保存配置失敗",
"uninstall_prompt": "WebUI 將在重啟後被移除",
"uninstall_failed": "卸載 WebUI 失敗",
"new_update": "發現新的版本!"
}

View File

@@ -6,44 +6,92 @@ body {
overflow: hidden;
}
.title-container {
.header {
display: flex;
align-items: center;
justify-content: space-between;
position: fixed;
top: 0;
height: 40px;
width: calc(100% - 17px);
width: 100%;
background-color: #F5F5F5;
transition: transform 0.3s ease;
z-index: 1000;
z-index: 1100;
}
#title {
font-size: 18px;
font-size: 16.5px;
font-weight: bold;
padding-left: 10px;
}
.no-connection {
padding-bottom: 2px;
display: none;
align-items: center;
position: relative;
margin-right: 0px;
color: #7E7E7E;
}
.no-connection .wifi-icon {
width: 20px;
height: 20px;
margin-right: 5px;
width: 22px;
height: 22px;
filter: invert(0.6) sepia(0) saturate(0) hue-rotate(180deg) brightness(0.8) contrast(1);
}
.language-dropdown {
position: relative;
display: inline-block;
margin-right: 15px;
}
.language-button {
background: none;
border: none;
font-size: 23px;
color: #333;
}
.language-menu {
display: flex;
padding: 5px;
flex-direction: column;
position: absolute;
right: 0;
background-color: #fff;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
z-index: 2000;
border: 1px solid #ccc;
border-radius: 8px;
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: opacity 0.2s ease, transform 0.2s ease, visibility 0.2s ease;
}
.language-menu.show {
display: block;
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.language-option {
padding: 10px;
text-align: left;
background: none;
border: none;
width: 100%;
font-size: 16px;
color: #333;
width: auto;
white-space: nowrap;
}
.help-button {
margin-right: auto;
padding: 0 10px;
background: none;
border: none;
font-size: 24px;
font-size: 22px;
align-items: center;
justify-content: center;
}
@@ -75,7 +123,7 @@ body {
.help-menu {
position: relative;
width: 75vw;
max-width: 600px;
max-width: 800px;
background-color: white;
padding: 0 10px;
border-radius: 15px;
@@ -110,7 +158,7 @@ body {
.help-content ul li {
font-weight: bold;
font-size: 17px;
font-size: 18px;
}
.help-content ul ul li {
@@ -128,6 +176,153 @@ body {
color: inherit;
}
.boot-hash-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1200;
justify-content: center;
align-items: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.2s ease, visibility 0.2s ease;
}
.boot-hash-card {
position: fixed;
top: 30%;
left: 50%;
transform: translate(-50%, -50%);
width: 80vw;
max-width: 600px;
background-color: #fff;
border-radius: 18px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.2);
z-index: 1200;
padding: 20px;
display: none;
flex-direction: column;
gap: 15px;
opacity: 0;
transition: opacity 0.2s ease;
}
.boot-hash-overlay.show {
visibility: visible;
opacity: 1;
}
.boot-hash-card.show {
display: flex;
opacity: 1;
}
.input-box {
width: calc(100% - 20px);
height: 100px;
resize: none;
padding: 9px;
font-size: 16px;
background-color: #FFF;
border: 1px solid #ccc;
border-radius: 10px;
}
.button-container {
display: flex;
justify-content: flex-start;
}
.boot-hash-save-button {
padding: 10px 20px;
border: none;
border-radius: 38px;
font-size: 18px;
background-color: #007bff;
color: white;
margin-left: auto;
}
.about-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background-color: rgba(0, 0, 0, 0.5);
z-index: 1100;
display: none;
justify-content: center;
align-items: center;
opacity: 0;
transition: opacity 0.2s ease;
}
.about-menu {
position: fixed;
top: 50%;
left: 50%;
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);
opacity: 0;
display: flex;
flex-direction: column;
gap: 15px;
transition: opacity 0.2s ease;
}
.close-about {
position: absolute;
top: 15px;
right: 12px;
background: none;
border: none;
font-size: 18px;
color: #ccc;
}
.about-content p {
margin: 0;
font-size: 16px;
text-align: left;
}
.about-content p[data-i18n="module_name_line1"] {
font-size: 26px;
}
.about-content p[data-i18n="module_name_line2"] {
font-size: 22px;
}
.about-content p span[data-i18n="by"] {
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="acknowledgment"] {
font-size: 18px;
text-align: left;
}
.about-content p:not([data-i18n]) {
font-size: 16px;
}
#apps-list {
margin-top: 100px;
}
@@ -257,7 +452,7 @@ body {
.menu-options li {
cursor: default;
padding: 15px 12px;
padding: 13px 12px;
text-align: left;
}
@@ -348,13 +543,14 @@ body {
display: flex;
justify-content: center;
position: fixed;
bottom: -50px;
bottom: -70px;
left: 50%;
transform: translateX(-50%);
z-index: 3;
}
.floating-btn {
flex-shrink: 0;
background-color: #007bff;
border: none;
box-shadow: 0 4px 8px #0003;
@@ -372,19 +568,50 @@ body {
}
.loading {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
color: #6E6E6E;
display: flex;
justify-content: center;
align-items: center;
height: calc(100vh - 164px);
font-size: 24px;
z-index: 1000;
}
.acknowledgment {
color: #6E6E6E;
padding: 20px;
text-align: center;
font-size: 14px;
.footer {
padding: 25px;
position: relative;
}
.uninstall-container {
padding: 10px 10px;
position: absolute;
right: 15px;
top: 50%;
transform: translateY(-50%);
display: flex;
align-items: center;
border-radius: 8px;
background-color: #B10000;
}
.uninstall-container i {
margin-right: 5px;
font-size: 18px;
color: #fff;
}
.uninstall-container span {
font-size: 16px;
font-weight: bold;
color: #fff;
}
.uninstall-container.hidden-uninstall {
display: none;
}
@media (prefers-color-scheme: dark) {
@@ -393,15 +620,20 @@ body {
color: #eee;
}
.title-container {
.header {
background-color: #121212;
}
.language-button,
.language-option,
.input-box,
.help-button {
color: #fff;
}
.help-menu,
.about-menu,
.boot-hash-card,
.card,
.search-input,
.search-card {
@@ -416,6 +648,8 @@ body {
color: white;
}
.language-menu,
.input-box,
.menu-options,
#menu-button {
background-color: #343434;

View File

@@ -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",
@@ -56,22 +56,14 @@
"package-name": "xzr.konabess"
},
{
"name": "KsuWebUI",
"name": "KSUWebUI",
"package-name": "io.github.a13e300.ksuwebui"
},
{
"name": "ShortX",
"package-name": "tornaco.apps.shortx"
}
]
},
{
"info": "General app that won't detect bootloader",
"apps": [
{
"name": "Scene",
"package-name": "com.omarea.vtools"
},
{
"name": "Swift Backup",
"package-name": "org.swiftapps.swiftbackup"
@@ -88,6 +80,10 @@
"name": "Google Slides",
"package-name": "com.google.android.apps.docs.editors.slides"
},
{
"name": "Keep Notes",
"package-name": "com.google.android.keep"
},
{
"name": "Google Maps",
"package-name": "com.google.android.apps.maps"
@@ -103,6 +99,18 @@
{
"name": "Chrome",
"package-name": "com.android.chrome"
},
{
"name": "YouTube",
"package-name": "com.google.android.youtube"
},
{
"name": "YouTube Music",
"package-name": "com.google.android.apps.youtube.music"
},
{
"name": "Speedtest",
"package-name": "org.zwanoo.android.speedtest"
}
]
}

View File

@@ -1,6 +1,6 @@
{
"versionCode": 240,
"version": "v2.4",
"zipUrl": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/download/v2.3/TrickyAddonModule-v2.3.zip",
"changelog": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/refs/heads/master/changelog.md"
"versionCode": 250,
"version": "v2.5",
"zipUrl": "https://github.com/KOWX712/Tricky-Addon-Update-Target-List/releases/download/v2.6/TrickyAddonModule-v2.6.zip",
"changelog": "https://raw.githubusercontent.com/KOWX712/Tricky-Addon-Update-Target-List/main/changelog.md"
}