diff --git a/.gitignore b/.gitignore index 76b0820..1ae238c 100644 --- a/.gitignore +++ b/.gitignore @@ -38,6 +38,10 @@ ATK_*.log *.tmp /tmp/ +# Raw font source dump (bundled fonts already live in frontend/src/assets/fonts/) +/DotGothic16,Geist_Pixel,Gugi,Orbitron,Playfair_Display,etc/ +/DotGothic16,Geist_Pixel,Gugi,Orbitron,Playfair_Display,etc.zip + # ── PROPRIETARY — Logcat visual map. NEVER publish to GitHub. ── # (Builds into the shipped binary as obfuscated JS + native Go; source stays private.) /proprietary/ diff --git a/README.md b/README.md index 3495a0a..2342b57 100644 --- a/README.md +++ b/README.md @@ -143,34 +143,72 @@ sudo apt install scrcpy | 🖥️ **Screen Mirror** | Live mirror and full control via scrcpy; detachable and recordable | | 📊 **Dashboard** | Device info, wireless ADB, reboot controls | | 📁 **File Explorer** | Browse the device and your computer, push and pull, image viewer | -| 📦 **Package Manager** | Install, uninstall, enable, disable, pull APK, plus **privileged removal of protected system apps without root** | -| 🔎 **APK Audit** | Static APK security audit: perms, trackers, certs, rule findings | +| 📦 **Package Manager** | Install, uninstall, enable, disable, restore, pull APK, plus **privileged removal of protected system apps without root**. Correctly shows packages disabled/uninstalled by other tools (e.g. Canta/Shizuku) instead of hiding them, with a state filter (Enabled/Disabled/Uninstalled) | +| 📲 **APK Installer** | Batch-install APKs from a folder or hand-picked files, with live per-file progress and select all/none | | 🧹 **Debloater** | 5,362 packages across Samsung, Xiaomi, Google, and 11 more OEMs | +| 💻 **Shell Terminal** | adb shell and host, command library, export session | | 📡 **Live Logcat + System Map** | Real-time log streaming, plus a live, interactive map of system behaviour across subsystems | -| 🕵️ **App Inspector** | Permissions, components, certs, SSL-pinning check | +| 🕵️ **App Inspector** | Permissions, components, certs, SSL-pinning check, plus a 0–100 **privacy score** from a DEX tracker/ad-SDK scan | +| 🚀 **Intent Lab** | List an app's launchable activities from `dumpsys` and start them with one click, plus a free-form implicit-intent launcher — reach hidden settings screens | +| 🔎 **APK Audit** | Static APK security audit: perms, trackers, certs, rule findings | | 🔐 **Certificate Manager** | Install and remove user CAs for HTTPS interception | | 💾 **Device Backup** | `adb backup` with app selection and restore | | 🎚️ **Prop Editor** | Read and write all 300+ system properties | -| 💻 **Shell Terminal** | adb shell and host, command library, export session | | 🧰 **Utilities** | 631 one-click commands across 50+ categories | | ⚡ **Flasher** | Fastboot, live-boot, Magisk root, firmware download | +| 💿 **GSI Loader** | Boot a Generic System Image via **DSU** (temporary, no unlock/wipe) or a danger-gated **permanent fastboot flash**, with a Treble/ABI/VNDK compatibility pre-check | > [!TIP] -> Hide any module you don't use from **Settings → Sidebar Features**. Theme -> (Dark, Catppuccin Frappé, Latte) and sidebar position (left, top, bottom) are -> configurable too. +> Hide any module you don't use from **Settings → Sidebar Features**. 26 theme +> palettes — Dark, Catppuccin Frappé/Latte/Mocha/Macchiato, Dracula, Gruvbox +> Material, Nord, Tokyo Night, Solarized, Rosé Pine, Everforest, and more — +> plus a custom accent/text colour, 8 bundled display fonts, adjustable font +> size, and sidebar position (left, top, bottom) are all configurable too. A +> system tray icon (Linux) lets ATK keep running in the background instead of +> quitting. --- -## ✨ What's new +## ✨ What's new in v1.3.0 -- 📡 **Live System Map**: turn logcat into a live, interactive map of system behaviour across subsystems *(see below)*. -- 🧹 **Debloater database grew from 2,157 to 5,362 packages**, with a **privileged uninstall of protected system apps without root** and a one-click **restore**. -- 🧰 **Utilities expanded to 631 one-click commands** across 50+ categories. -- 🎨 **Themes**: Dark, Catppuccin **Frappé**, and **Latte**. Dismissible safety banners. -- 🔎 **APK Audit** exports to **JSON, CSV, SARIF**, with an in-app APK explorer. -- 📦 **Smarter package ops**: combined *Disable + Uninstall*, a *disabled* badge, and verify-then-escalate so removals stick. -- 🔌 **Offline-capable UI**: fonts are self-hosted, with no runtime CDN fetches. +- 🖥️ **System tray** (Linux): closing the window now offers **Minimize to + Tray** instead of only Quit, with a tray menu to show/hide the window or + quit for good. +- 📲 **APK Installer**: a new module to batch-install APKs from a folder or + hand-picked files, with live per-file progress and select all/none. +- 📦 **Package visibility fix**: Packages and App Inspector were silently + hiding any package disabled/uninstalled by tools like Canta or Shizuku + (`pm uninstall --user 0` doesn't fully remove it, just hides it from a plain + package list). They now show correctly, with a state filter + (Enabled/Disabled/Uninstalled) and per-row Restore/Enable/Disable/Uninstall. +- 🎨 **6 more theme palettes** — Nord, Tokyo Night, Solarized Dark/Light, Rosé + Pine, Everforest (26 total) — plus a custom text colour, 8 bundled display + fonts, and an adjustable base font size, all in Settings → Appearance. +- 🖱️ **Sidebar polish**: a horizontal (top/bottom) sidebar now shrinks label + text progressively as the window narrows instead of showing a scrollbar, + and a touchpad-triggered stuck-scrollbar-drag bug is fixed. + +
+Previous release (v1.2.0) + +- 💿 **GSI Loader**: boot a Generic System Image via **DSU** (temporary guest OS) + or a danger-gated **permanent fastboot flash**, with a built-in compatibility + pre-check. +- 🚀 **Intent Lab**: list and launch an app's exported activities from `dumpsys`, + plus a free-form implicit-intent launcher, to reach hidden settings screens. +- 🕵️ **Privacy & Tracker Scanner**: a 0–100 privacy score and A–F grade for any + app, from an offline DEX tracker/ad-SDK scan, built into App Inspector. +- 🔒 **App Lock**: password-protect the app and gate destructive actions + (flashing, permanent GSI install) behind a separate danger-unlock. +- 🎨 **~14 new theme palettes** — Dracula, Catppuccin Mocha/Macchiato, Gruvbox + Material, C64, Adventure Time, and more. +- 🧹 **Debloater**: unmatched device packages now show as **Unknown** instead of + disappearing from the list. +- 🔐 **Security**: fixed a path-injection issue in the local file viewer, and + bumped several dependencies with known CVEs (`x/image`, `x/net`, `vite`, + `postcss`, `esbuild`). + +
--- @@ -254,6 +292,28 @@ Browse factory images: https://developers.google.com/android/images --- +## 💿 GSI Loader + +Boot a Generic System Image (GSI) two different ways, each with its own risk +profile. + +| Mode | What it does | +|---|---| +| **DSU (Temporary)** | Loads the GSI as a guest OS via Android's Dynamic System Updates. No bootloader unlock, no data wipe — reboot to return to your normal system | +| **GSI Flasher (Permanent)** | Fastboot-flashes the GSI to the system partition. Destructive: wipes userdata, needs an unlocked bootloader. Danger-gated behind App Lock | + +Both modes run a **compatibility pre-check** first — Treble enablement, CPU ABI, +VNDK isolation, and Android version — so you know whether a GSI is even viable +on the connected device before you commit to either path. You supply the GSI +image file (ATK doesn't fetch these — see Android Flash Tool / ci.android.com). + +> [!IMPORTANT] +> The permanent flash path wipes user data and requires an unlocked bootloader. +> It's gated behind App Lock's danger-unlock, same as other destructive flash +> operations. + +--- + ## 🔎 APK Audit A static security audit of any APK, whether a browsed file or an app pulled off @@ -295,6 +355,7 @@ Coverage: Samsung · Xiaomi · OnePlus/Oppo · Huawei · Sony · Motorola · LG > - **No bundled binaries.** ATK resolves `adb`, `fastboot`, and `scrcpy` from your PATH. Settings shows each binary's path and SHA-256 to verify against Google's published checksums. > - **No host shell string-building.** Host commands use `exec.Command(binary, args…)` (direct `execve`, no shell). Paths sent to the *device* shell are quoted, so filenames with spaces or special characters stay safe. > - **Input validation.** ATK validates package names, partitions, IPs, and remote paths. Fastboot flash uses a partition allowlist. Destructive flash and bootloader actions confirm first. +> - **App Lock.** Optionally password-protect the app itself, with a separate danger-unlock required for destructive actions (permanent flashing, permanent GSI install, wiping). --- @@ -303,12 +364,12 @@ Coverage: Samsung · Xiaomi · OnePlus/Oppo · Huawei · Sony · Motorola · LG **Prerequisites on Ubuntu/Debian** ```bash sudo apt install -y build-essential pkg-config libgtk-3-dev \ - libwebkit2gtk-4.1-dev libayatana-appindicator3-dev adb fastboot + libwebkit2gtk-4.1-dev adb fastboot -# Go 1.23 -wget https://go.dev/dl/go1.23.0.linux-amd64.tar.gz +# Go 1.25+ (required by go.mod) +wget https://go.dev/dl/go1.25.0.linux-amd64.tar.gz sudo rm -rf /usr/local/go -sudo tar -C /usr/local -xzf go1.23.0.linux-amd64.tar.gz +sudo tar -C /usr/local -xzf go1.25.0.linux-amd64.tar.gz echo 'export PATH=$PATH:/usr/local/go/bin:$HOME/go/bin' >> ~/.bashrc source ~/.bashrc diff --git a/RELEASE_NOTES_v1.1.0.md b/RELEASE_NOTES_v1.1.0.md deleted file mode 100644 index 33d02e7..0000000 --- a/RELEASE_NOTES_v1.1.0.md +++ /dev/null @@ -1,45 +0,0 @@ -# ATK v1.1.0 — the Live System Map release - -The all-in-one, OEM-style Android toolkit for power users, security researchers, -and bug hunters — now with a **first-of-its-kind real-time debugging engine**. - -## ⭐ Headline — Live System Map -Turn the raw logcat firehose into a **live, interactive map of what your phone is -actually doing**. A real-time engine unifies system-level telemetry from many -subsystems into a single live relational model — processes, services, tags and -components become nodes; launches, crashes, ANRs, kills, signals and -graphics/audio events become edges; every event flows source → destination. - -- 🌐 Multiple render modes — crisp 2D graph, neon flow view, 3D hierarchical tree -- 🧩 Layouts — force-directed, hub boxes, radial-by-importance, geometric -- 🌊 Trackable flows — follow individual events between subsystems -- 🚨 Auto-surfacing of crashes / ANRs / errors + your own keyword watch-rules -- 🎯 Focus tools — isolate a node, watchlist, severity/kind filters, timeline, baseline diff -- 🎥 Capture & export the packet stream for offline analysis - -## ✨ What's new -- 📡 **Live System Map** — the flagship real-time visualization (above). -- 🧹 **Debloater database 2,157 → 5,362 packages** (Samsung, Xiaomi, Google + 11 more OEMs). -- 🔓 **Privileged uninstall of protected system apps — without root**, plus one-click **restore**. -- 🧰 **Utilities expanded to 631 one-click commands** across 50+ categories. -- 🔎 **APK Audit** — static security audit (perms, trackers, certs, CWE/MASVS rule findings) with an in-app APK explorer and **JSON · CSV · SARIF** export. -- 🎨 **Themes** — Dark, Catppuccin **Frappé** & **Latte**; configurable sidebar; dismissible safety banners. -- 📦 **Smarter package ops** — combined *Disable + Uninstall*, a *disabled* badge, and verify-then-escalate so removals actually stick. -- 🔌 **Fully offline-capable UI** — self-hosted fonts, no runtime CDN fetches. -- 🖼️ New app icon. - -## 📦 Install (Linux) -**Debian / Ubuntu:** -```bash -sudo dpkg -i atk_1.1.0_amd64.deb -``` -Requirements: `adb`, `fastboot`, `libgtk-3-0`, `libwebkit2gtk-4.1-0` -(`scrcpy` only needed for the Screen Mirror module). - -Other distros: build from source — see the README. - -> ⚠️ Linux only. No bundled binaries — ATK uses *your* system `adb`/`fastboot`/`scrcpy`. - -## 🙏 Credits -Built on the open-source community — scrcpy, Magisk, Universal Android Debloater, -Wails, Lucide, and more. Full attributions and licenses are in the README. GPL-3.0. diff --git a/RELEASE_NOTES_v1.2.0.md b/RELEASE_NOTES_v1.2.0.md new file mode 100644 index 0000000..25d3750 --- /dev/null +++ b/RELEASE_NOTES_v1.2.0.md @@ -0,0 +1,58 @@ +# ATK v1.2.0 + +Six new tools, a big theming pass, and a security cleanup. + +## ✨ What's new +- 💿 **GSI Loader** — boot a Generic System Image two ways: **DSU** (temporary + guest OS, no unlock/wipe, reboot to reclean) or a **permanent fastboot flash** + (danger-gated, requires unlocked bootloader). Built-in compatibility pre-check + (Treble, ABI, VNDK isolation) before either path. +- 🚀 **Intent Lab** — list an app's launchable (exported) activities straight from + `dumpsys` and start them with one click, plus a free-form implicit-intent + launcher. Reach hidden settings menus and internal screens that never show up + on the launcher. +- 📥 **Firmware** — download and SHA-verify firmware images for a device + codename, right from the app. +- 📱 **Screen Mirror** — scrcpy integration: start/stop mirroring and grab + screenshots without leaving ATK. +- 🧙 **Magisk integration** — install Magisk, extract/patch boot images, and + manage installed modules (list, toggle, remove) in one panel. +- 🕵️ **Privacy & Tracker Scanner** — scans an app's DEX bytecode for known + tracker/analytics/ad SDK signatures, cross-references dangerous permissions, + and derives a 0–100 privacy score with an A–F grade. Fully offline, no + network calls. +- 🔒 **App Lock** — password-protect the app and gate destructive actions + (flashing, permanent GSI install, etc.) behind a separate danger-unlock. +- 🔓 **Privileged uninstall, no root** — removes protected system apps via a + bundled Android helper, with one-click restore. +- 🎨 **~14 new theme palettes** (Dracula, Catppuccin Mocha/Macchiato, + Gruvbox Material, C64, Adventure Time, and more), on top of the existing + Dark/Frappé/Latte. +- 🧹 **Debloater**: device packages with no UAD database match now show as + **Unknown/Uncategorized** instead of silently disappearing from the list. +- 🔎 **APK Audit**: entry viewer now has syntax-highlighted code display instead + of a plain text dump. + +## 🔐 Security +- Fixed a path-injection issue in the local file viewer (CodeQL + `go/path-injection`) — the resolved path is now validated as a real, regular + file before being served. +- Dependency bumps: `golang.org/x/image` and `golang.org/x/net` (DoS fixes), + `vite`, `postcss`, and `esbuild` (dev-tooling only, not shipped in the + built app). + +## 📦 Install (Linux) +**Debian / Ubuntu:** +```bash +sudo dpkg -i atk_1.2.0_amd64.deb +``` +Requirements: `adb`, `fastboot`, `libgtk-3-0`, `libwebkit2gtk-4.1-0` +(`scrcpy` only needed for the Screen Mirror module). + +Other distros: build from source — see the README. + +> ⚠️ Linux only. No bundled binaries — ATK uses *your* system `adb`/`fastboot`/`scrcpy`. + +## 🙏 Credits +Built on the open-source community — scrcpy, Magisk, Universal Android Debloater, +Wails, Lucide, and more. Full attributions and licenses are in the README. GPL-3.0. diff --git a/app.go b/app.go index 338b84a..1734c26 100644 --- a/app.go +++ b/app.go @@ -60,6 +60,11 @@ type FileEntry struct { type PackageInfo struct { PackageName string `json:"packageName"` IsEnabled bool `json:"isEnabled"` + // IsInstalled is false when the package is present on the system image but + // uninstalled for user 0 (e.g. via `pm uninstall --user 0`, which is what + // Canta/Shizuku do to "remove" a system app). Such packages are still on + // disk and show up in `pm list packages -u`, but not in the plain listing. + IsInstalled bool `json:"isInstalled"` } // AdbConfig holds user-configurable ADB settings @@ -84,6 +89,10 @@ type App struct { // app-lock "require password for destructive actions" session window dangerMu sync.Mutex dangerUntil time.Time + + // window visibility, tracked for the tray's show/hide toggle + windowMu sync.Mutex + windowShown bool } // NewApp creates a new App instance @@ -97,8 +106,10 @@ func NewApp() *App { // Startup is called when the app starts func (a *App) Startup(ctx context.Context) { a.ctx = ctx + a.windowShown = true // Frameless windows can open off-centre on some WMs; centre on launch. runtime.WindowCenter(ctx) + initTray(a) } // Shutdown is called when the app is closing — tidy up spawned child processes @@ -111,4 +122,57 @@ func (a *App) Shutdown(ctx context.Context) { if !detached { a.StopScrcpy() } + closeTray() +} + +// ShowWindow restores the main window - used by the tray's "Show ATK" / +// left-click action and by the frontend's "Minimize to tray" quit dialog. +func (a *App) ShowWindow() { + a.windowMu.Lock() + a.windowShown = true + a.windowMu.Unlock() + runtime.WindowShow(a.ctx) + runtime.WindowUnminimise(a.ctx) +} + +// HideWindow parks the window (app keeps running, reachable from the tray). +func (a *App) HideWindow() { + a.windowMu.Lock() + a.windowShown = false + a.windowMu.Unlock() + runtime.WindowHide(a.ctx) +} + +// ToggleWindow shows the window if hidden, hides it if shown - the tray's +// left-click / "Show ATK" menu action. +func (a *App) ToggleWindow() { + a.windowMu.Lock() + shown := a.windowShown + a.windowMu.Unlock() + if shown { + a.HideWindow() + } else { + a.ShowWindow() + } +} + +// TrayAvailable reports whether a real system tray icon was registered (e.g. +// false on Linux if no StatusNotifierWatcher/AppIndicator host is running). +// The frontend uses this to decide whether "Minimize to tray" is even a +// sensible option to offer in the close-confirmation dialog. +func (a *App) TrayAvailable() bool { + return trayAvailable() +} + +// QuitApp fully quits ATK (not just the window) - used by both the tray's +// "Quit ATK" menu item and the frontend's close-confirmation dialog. +func (a *App) QuitApp() { + runtime.Quit(a.ctx) +} + +// OpenURL opens a link in the user's default system browser. A bare isn't reliable inside the embedded webview - this is +// Wails' supported way to hand off to the OS. +func (a *App) OpenURL(url string) { + runtime.BrowserOpenURL(a.ctx, url) } diff --git a/assets/atk-tray-symbolic.svg b/assets/atk-tray-symbolic.svg new file mode 100644 index 0000000..6f6c1ff --- /dev/null +++ b/assets/atk-tray-symbolic.svg @@ -0,0 +1 @@ + diff --git a/assets/tray_icon.ico b/assets/tray_icon.ico new file mode 100644 index 0000000..5f3729f Binary files /dev/null and b/assets/tray_icon.ico differ diff --git a/assets/tray_icon.png b/assets/tray_icon.png new file mode 100644 index 0000000..d56c38f Binary files /dev/null and b/assets/tray_icon.png differ diff --git a/assets/tray_icon_template.png b/assets/tray_icon_template.png new file mode 100644 index 0000000..f8ce508 Binary files /dev/null and b/assets/tray_icon_template.png differ diff --git a/backend_apkinstaller.go b/backend_apkinstaller.go new file mode 100644 index 0000000..882489b --- /dev/null +++ b/backend_apkinstaller.go @@ -0,0 +1,118 @@ +package main + +import ( + "fmt" + "os" + "path/filepath" + "sort" + "strings" + + "github.com/wailsapp/wails/v2/pkg/runtime" +) + +// ApkFileInfo describes one APK found in a chosen folder, for the batch +// installer's checklist. +type ApkFileInfo struct { + Path string `json:"path"` + Name string `json:"name"` + Size int64 `json:"size"` +} + +// ListApksInFolder scans a folder (non-recursive) for .apk files. +func (a *App) ListApksInFolder(folderPath string) ([]ApkFileInfo, error) { + entries, err := os.ReadDir(folderPath) + if err != nil { + return nil, fmt.Errorf("could not read folder: %w", err) + } + + var apks []ApkFileInfo + for _, e := range entries { + if e.IsDir() || !strings.EqualFold(filepath.Ext(e.Name()), ".apk") { + continue + } + info, err := e.Info() + if err != nil { + continue + } + apks = append(apks, ApkFileInfo{ + Path: filepath.Join(folderPath, e.Name()), + Name: e.Name(), + Size: info.Size(), + }) + } + sort.Slice(apks, func(i, j int) bool { return apks[i].Name < apks[j].Name }) + return apks, nil +} + +// StatApkFiles builds ApkFileInfo entries for explicitly chosen APK paths +// (from the multi-file picker), so manual selection and folder scans feed the +// same checklist shape. Unreadable paths are silently skipped. +func (a *App) StatApkFiles(paths []string) ([]ApkFileInfo, error) { + out := make([]ApkFileInfo, 0, len(paths)) + for _, p := range paths { + info, err := os.Stat(p) + if err != nil || info.IsDir() { + continue + } + out = append(out, ApkFileInfo{Path: p, Name: info.Name(), Size: info.Size()}) + } + return out, nil +} + +// InstallApksWithProgress installs each APK in order (adb install -r), +// emitting apkinstall:progress events so the UI can show a live per-file +// checklist rather than one opaque spinner. Cancellable via CancelOperation. +func (a *App) InstallApksWithProgress(paths []string) (string, error) { + if len(paths) == 0 { + return "", fmt.Errorf("no APKs selected") + } + + ctx, cancel := a.beginCancellableOp(0) + defer cancel() + + total := len(paths) + var ok, fail int + var details strings.Builder + + for i, p := range paths { + name := baseName(p) + // Keyed by full path (not just fileName) - two selected APKs from + // different folders can share a filename, and the path is what's + // actually unique in the frontend's checklist. + runtime.EventsEmit(a.ctx, "apkinstall:progress", map[string]interface{}{ + "current": i + 1, "total": total, "path": p, "fileName": name, "status": "installing", + }) + + output, err := a.runCommandContext(ctx, "adb", "install", "-r", p) + status, msg := "success", "" + switch { + case err != nil: + status = "failed" + msg = err.Error() + case strings.Contains(output, "Failure"): + status = "failed" + msg = strings.TrimSpace(output) + } + + if status == "success" { + ok++ + } else { + fail++ + details.WriteString(fmt.Sprintf("• %s: %s\n", name, msg)) + } + runtime.EventsEmit(a.ctx, "apkinstall:progress", map[string]interface{}{ + "current": i + 1, "total": total, "path": p, "fileName": name, "status": status, "message": msg, + }) + + if strings.Contains(msg, "cancelled") { + break + } + } + runtime.EventsEmit(a.ctx, "apkinstall:done", nil) + + summary := fmt.Sprintf("Installed %d of %d APK(s).", ok, total) + if fail > 0 { + summary += fmt.Sprintf(" Failed: %d\n%s", fail, details.String()) + } + return summary, nil +} diff --git a/dialog_service.go b/dialog_service.go index 6c124f2..0f2f0aa 100644 --- a/dialog_service.go +++ b/dialog_service.go @@ -78,6 +78,33 @@ func (a *App) SelectDirectoryForPull() (string, error) { return path, err } +// SelectApkFolder opens a native directory picker for a folder of APKs to +// batch-install. +func (a *App) SelectApkFolder() (string, error) { + path, err := zenity.SelectFile( + zenity.Title("Select a folder of APKs"), + zenity.Directory(), + ) + if err == zenity.ErrCanceled { + return "", nil + } + return path, err +} + +// SelectMultipleApkFiles opens a native multi-file picker filtered to APKs. +func (a *App) SelectMultipleApkFiles() ([]string, error) { + paths, err := zenity.SelectFileMultiple( + zenity.Title("Select APKs to install"), + zenity.FileFilters{ + {Name: "APK files", Patterns: []string{"*.apk"}, CaseFold: true}, + }, + ) + if err == zenity.ErrCanceled { + return nil, nil + } + return paths, err +} + // SelectFileWithFilter opens a file picker with custom file type filters. func (a *App) SelectFileWithFilter(title string, patterns []string) (string, error) { filters := []zenity.FileFilter{ diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 index edfbbde..1ef7d15 100755 --- a/frontend/package.json.md5 +++ b/frontend/package.json.md5 @@ -1 +1 @@ -bfb47127747332de1e5119ef153cca76 \ No newline at end of file +5044e767932c804d924f539d25c7ab46 \ No newline at end of file diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 8ee6283..ddcc4e2 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -5,10 +5,12 @@ import TitleBar from './components/layout/TitleBar' import DismissibleBanner from './components/DismissibleBanner' import LockGate from './components/LockGate' import DangerGate from './components/DangerGate' +import QuitGate from './components/QuitGate' import ViewDashboard from './components/views/ViewDashboard' import ViewFiles from './components/views/ViewFiles' import ViewScreenMirror from './components/views/ViewScreenMirror' import ViewPackages from './components/views/ViewPackages' +import ViewApkInstaller from './components/views/ViewApkInstaller' import ViewDebloater from './components/views/ViewDebloater' import ViewShell from './components/views/ViewShell' import ViewLogcat from './components/views/ViewLogcat' @@ -55,6 +57,7 @@ export default function App() { case 'files': return case 'mirror': return case 'packages': return + case 'apkinstaller': return case 'debloater': return case 'shell': return case 'logcat': return @@ -88,6 +91,7 @@ export default function App() { return (
+
{sidebarPos !== 'bottom' && sidebar} diff --git a/frontend/src/assets/fonts/DotGothic16-Regular.ttf b/frontend/src/assets/fonts/DotGothic16-Regular.ttf new file mode 100644 index 0000000..6634bc1 Binary files /dev/null and b/frontend/src/assets/fonts/DotGothic16-Regular.ttf differ diff --git a/frontend/src/assets/fonts/GeistPixel-Regular-VariableFont_ELSH.ttf b/frontend/src/assets/fonts/GeistPixel-Regular-VariableFont_ELSH.ttf new file mode 100644 index 0000000..017376d Binary files /dev/null and b/frontend/src/assets/fonts/GeistPixel-Regular-VariableFont_ELSH.ttf differ diff --git a/frontend/src/assets/fonts/Gugi-Regular.ttf b/frontend/src/assets/fonts/Gugi-Regular.ttf new file mode 100644 index 0000000..b500dbf Binary files /dev/null and b/frontend/src/assets/fonts/Gugi-Regular.ttf differ diff --git a/frontend/src/assets/fonts/Orbitron-VariableFont_wght.ttf b/frontend/src/assets/fonts/Orbitron-VariableFont_wght.ttf new file mode 100644 index 0000000..7d0d5e0 Binary files /dev/null and b/frontend/src/assets/fonts/Orbitron-VariableFont_wght.ttf differ diff --git a/frontend/src/assets/fonts/PlayfairDisplay-VariableFont_wght.ttf b/frontend/src/assets/fonts/PlayfairDisplay-VariableFont_wght.ttf new file mode 100644 index 0000000..b8d2d2c Binary files /dev/null and b/frontend/src/assets/fonts/PlayfairDisplay-VariableFont_wght.ttf differ diff --git a/frontend/src/assets/fonts/PressStart2P-Regular.ttf b/frontend/src/assets/fonts/PressStart2P-Regular.ttf new file mode 100644 index 0000000..2442aff Binary files /dev/null and b/frontend/src/assets/fonts/PressStart2P-Regular.ttf differ diff --git a/frontend/src/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf b/frontend/src/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf new file mode 100644 index 0000000..2c6cc59 Binary files /dev/null and b/frontend/src/assets/fonts/SpaceGrotesk-VariableFont_wght.ttf differ diff --git a/frontend/src/assets/fonts/VT323-Regular.ttf b/frontend/src/assets/fonts/VT323-Regular.ttf new file mode 100644 index 0000000..6aec599 Binary files /dev/null and b/frontend/src/assets/fonts/VT323-Regular.ttf differ diff --git a/frontend/src/assets/fonts/licenses/DotGothic16-OFL.txt b/frontend/src/assets/fonts/licenses/DotGothic16-OFL.txt new file mode 100644 index 0000000..7c6649c --- /dev/null +++ b/frontend/src/assets/fonts/licenses/DotGothic16-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The DotGothic16 Project Authors (https://github.com/fontworks-fonts/DotGothic16) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Geist_Pixel-OFL.txt b/frontend/src/assets/fonts/licenses/Geist_Pixel-OFL.txt new file mode 100644 index 0000000..eb4e73e --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Geist_Pixel-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2026 The Geist Project Authors (https://github.com/vercel/geist-font) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Gugi-OFL.txt b/frontend/src/assets/fonts/licenses/Gugi-OFL.txt new file mode 100644 index 0000000..e1a5e7a --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Gugi-OFL.txt @@ -0,0 +1,93 @@ +Copyright (c) 2017 by TAE System & Typefaces Co.. All rights reserved. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Orbitron-OFL.txt b/frontend/src/assets/fonts/licenses/Orbitron-OFL.txt new file mode 100644 index 0000000..01f6fab --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Orbitron-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2018 The Orbitron Project Authors (https://github.com/theleagueof/orbitron), with Reserved Font Name: "Orbitron" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Playfair_Display-OFL.txt b/frontend/src/assets/fonts/licenses/Playfair_Display-OFL.txt new file mode 100644 index 0000000..3f1f22a --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Playfair_Display-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2017 The Playfair Display Project Authors (https://github.com/clauseggers/Playfair-Display), with Reserved Font Name "Playfair Display" + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Press_Start_2P-OFL.txt b/frontend/src/assets/fonts/licenses/Press_Start_2P-OFL.txt new file mode 100644 index 0000000..70041e1 --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Press_Start_2P-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2012 The Press Start 2P Project Authors (cody@zone38.net), with Reserved Font Name "Press Start 2P". + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/Space_Grotesk-OFL.txt b/frontend/src/assets/fonts/licenses/Space_Grotesk-OFL.txt new file mode 100644 index 0000000..014b75d --- /dev/null +++ b/frontend/src/assets/fonts/licenses/Space_Grotesk-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2020 The Space Grotesk Project Authors (https://github.com/floriankarsten/space-grotesk) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/licenses/VT323-OFL.txt b/frontend/src/assets/fonts/licenses/VT323-OFL.txt new file mode 100644 index 0000000..e229272 --- /dev/null +++ b/frontend/src/assets/fonts/licenses/VT323-OFL.txt @@ -0,0 +1,93 @@ +Copyright 2011, The VT323 Project Authors (peter.hull@oikoi.com) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://openfontlicense.org + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/components/QuitGate.tsx b/frontend/src/components/QuitGate.tsx new file mode 100644 index 0000000..5f220ee --- /dev/null +++ b/frontend/src/components/QuitGate.tsx @@ -0,0 +1,55 @@ +import { useEffect, useState } from 'react' +import { LogOut, Minus, X } from 'lucide-react' +import { HideWindow, QuitApp, TrayAvailable } from '../lib/wails' +import { _registerQuitHost } from '../lib/quitgate' + +// Modal shown when the title bar's close button is clicked. Mirrors +// Frequency's close dialog: offer Minimize-to-tray (default) alongside Quit, +// rather than one silently winning. "Minimize to tray" only shows up if a +// tray icon actually registered (TrayAvailable) - otherwise there'd be no way +// back to the window. +export default function QuitGate() { + const [open, setOpen] = useState(false) + const [trayOk, setTrayOk] = useState(false) + + useEffect(() => _registerQuitHost(() => { + TrayAvailable().then(setTrayOk).catch(() => setTrayOk(false)) + setOpen(true) + }), []) + + if (!open) return null + + const close = () => setOpen(false) + const minimize = () => { close(); HideWindow() } + const quit = () => { close(); QuitApp() } + + return ( +
{ if (e.target === e.currentTarget) close() }} + > +
+
+

Close ATK?

+ +
+

+ {trayOk + ? 'ATK can keep running in the background and stay reachable from the tray, or quit completely.' + : 'No tray icon is available on this system, so closing quits ATK completely.'} +

+
+ + {trayOk && ( + + )} + +
+
+
+ ) +} diff --git a/frontend/src/components/layout/Sidebar.tsx b/frontend/src/components/layout/Sidebar.tsx index 24caea1..6063507 100644 --- a/frontend/src/components/layout/Sidebar.tsx +++ b/frontend/src/components/layout/Sidebar.tsx @@ -1,5 +1,5 @@ import { - LayoutDashboard, FolderOpen, Package, Terminal, + LayoutDashboard, FolderOpen, Package, PackagePlus, Terminal, Zap, Wrench, Settings, Shield, ScrollText, Search, Lock, Archive, SlidersHorizontal, ScanSearch, MonitorSmartphone, Rocket, HardDriveDownload } from 'lucide-react' @@ -22,6 +22,7 @@ const navItems: NavItem[] = [ { view: 'files', icon: , label: 'Files' }, { view: 'mirror', icon: , label: 'Screen Mirror' }, { view: 'packages', icon: , label: 'Packages' }, + { view: 'apkinstaller', icon: , label: 'APK Installer' }, { view: 'debloater', icon: , label: 'Debloater' }, { view: 'shell', icon: , label: 'Shell' }, { view: 'logcat', icon: , label: 'Logcat', dividerBefore: true }, @@ -36,6 +37,10 @@ const navItems: NavItem[] = [ { view: 'gsiloader', icon: , label: 'GSI Loader' }, ] +// Floor for progressive label shrinking in the horizontal sidebar - below +// this, text becomes illegible, so labels hide outright instead. +const MIN_LABEL_SCALE = 0.65 + interface DragProps { onDragStart: (e: React.DragEvent) => void onDragOver: (e: React.DragEvent) => void @@ -51,6 +56,19 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels const [hidden, setHidden] = useState(getHiddenViews()) useEffect(() => onHiddenViewsChange(setHidden), []) + // When horizontal (top/bottom sidebar), labels can make the row wider than + // the window - rather than forcing a horizontal scrollbar, shrink label text + // progressively as space gets tight (labelScale 1 -> MIN_LABEL_SCALE), and + // only hide labels outright once even minimum-size text wouldn't fit. + // `measureRef` is an offscreen clone always rendered WITH full-size labels + // at natural width; comparing its scrollWidth against the real nav's + // clientWidth (which itself doesn't change as labelScale changes) avoids + // the flip-flop you'd get measuring the visible, already-shrunk row. + const navRef = useRef(null) + const measureRef = useRef(null) + const [labelScale, setLabelScale] = useState(1) + const effectiveShowLabels = showLabels && (!horizontal || labelScale > 0) + // Drag-to-reorder (dock style). Saved order first, then any new defaults. const [order, setOrder] = useState(getNavOrder()) const dragRef = useRef(null) @@ -70,6 +88,21 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels const visibleItems = ordered.filter(i => !hidden.includes(i.view)) + useEffect(() => { + if (!horizontal || !showLabels) { setLabelScale(1); return } + const nav = navRef.current + const measure = measureRef.current + if (!nav || !measure) return + const check = () => { + const ratio = measure.scrollWidth > 0 ? nav.clientWidth / measure.scrollWidth : 1 + setLabelScale(ratio >= 1 ? 1 : ratio >= MIN_LABEL_SCALE ? ratio : 0) + } + check() + const ro = new ResizeObserver(check) + ro.observe(nav) + return () => ro.disconnect() + }, [horizontal, showLabels, visibleItems]) + const handleDrop = (target: string) => { const from = dragRef.current dragRef.current = null @@ -89,8 +122,8 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels position === 'left' ? 'border-r' : position === 'top' ? 'border-b' : 'border-t' const asideCls = horizontal - ? `${showLabels ? 'h-[68px]' : 'h-[52px]'} w-full flex flex-row items-center bg-bg-surface ${edgeBorder} border-bg-border shrink-0` - : `${showLabels ? 'w-[84px]' : 'w-[52px]'} flex flex-col bg-bg-surface ${edgeBorder} border-bg-border shrink-0` + ? `${effectiveShowLabels ? 'h-[68px]' : 'h-[52px]'} w-full flex flex-row items-center bg-bg-surface ${edgeBorder} border-bg-border shrink-0` + : `${effectiveShowLabels ? 'w-[84px]' : 'w-[52px]'} flex flex-col bg-bg-surface ${edgeBorder} border-bg-border shrink-0` const navCls = horizontal ? 'flex-1 flex flex-row items-center justify-center gap-0.5 px-1 overflow-x-auto' @@ -102,13 +135,19 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels ? 'px-1 h-full flex items-center border-l border-bg-border shrink-0' : 'p-1 pb-1.5 border-t border-bg-border shrink-0' - const btnSizing = !showLabels + const btnSizing = !effectiveShowLabels ? 'w-8 h-8' : horizontal - ? 'flex-col gap-1 px-2 py-1.5 min-w-[3.25rem] h-full justify-center' + ? 'flex-col gap-1 px-2 py-1.5 h-full justify-center' : 'flex-col gap-1 px-1 py-1.5 w-full' - const labelCls = `text-[10px] leading-tight text-center ${horizontal ? 'whitespace-nowrap' : ''}` + const labelCls = `leading-tight text-center ${horizontal ? 'whitespace-nowrap' : ''}` + + // Horizontal-only: button width and label font-size both track labelScale, + // so shrinking text actually reclaims row space instead of just looking smaller. + const btnStyle: React.CSSProperties | undefined = + horizontal && effectiveShowLabels ? { minWidth: `${3.25 * labelScale}rem` } : undefined + const labelStyle: React.CSSProperties = { fontSize: `${10 * labelScale}px` } const renderButton = (view: View | 'settings', icon: React.ReactNode, label: string, drag?: DragProps) => { const active = activeView === view @@ -122,6 +161,7 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels onDragEnd={drag?.onDragEnd} onClick={() => onViewChange(view as View)} title={label} + style={btnStyle} className={` flex items-center justify-center rounded transition-all duration-150 relative ${btnSizing} @@ -134,7 +174,7 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels `} > {icon} - {showLabels && {label}} + {effectiveShowLabels && {label}} {active && ( horizontal ? @@ -146,7 +186,25 @@ export default function Sidebar({ activeView, onViewChange, position, showLabels return (