Commit Graph
10 Commits
Author SHA1 Message Date
bdeshiandClaude Sonnet 5 bb1a619b2d Add release/build tooling and README
- Real release build type: R8 shrinking + shrunk resources, with a keep
  rule for VeilHook specifically — LSPosed finds it by exact class name via
  the plaintext xposed_init asset, which R8 can't see, so obfuscating it
  would silently break module loading with no build error to point at why.
- Signing config that reads keystore.properties if present (gitignored,
  generated via scripts/generate-keystore.sh), falling back to debug
  signing otherwise so assembleRelease always produces something
  installable.
- scripts/release.sh builds and copies a version-stamped APK into dist/.
- GitHub Actions workflow building and publishing a release on any tag
  matching *.*.* (bare semver, e.g. 1.2.0 — no v prefix required), optionally
  using repo secrets for real release signing in CI.
- README covering setup, the feature table, and the DenyList gotcha.

No native code in this module, so a single APK already covers every
architecture — no per-ABI splitting needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 3ee56ac6e6 Drop manual package-name entry now that auto-detection covers it
If an app is genuinely scoped in LSPosed, Veil already picks it up on its
own. If it isn't scoped, typing its package name here wouldn't do anything
anyway — the hook never runs in that process. The manual entry field was
redundant either way.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 a5f8c04cbb Modernize settings UI with Material Components, DayNight theme, and app icon
The screen was built entirely from raw android.widget.* views with no
theme applied at all, so it never had a chance to follow system dark/light
mode and looked dated regardless. Adds AppCompat + Material Components,
switches SettingsActivity to AppCompatActivity with a Theme.Material3.
DayNight theme, and rebuilds the screen with Material widgets (cards,
chips for the hidden-packages list, proper text fields).

Also adds a launcher icon (previously none): a vector adaptive icon, a
moon-like disc partially eclipsed by a diagonal veil in the background
color — no image tool involved, just XML.

Also renames the per-app "Remove" button to "Apply defaults (hide
everything)" — "Remove" read as removing the app from the list, not
resetting it to defaults, which is all it actually does.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 1a9c9f41bd Add auto-discovery of LSPosed-scoped apps via ContentProvider
Manually re-typing a package name Veil already got injected into was
redundant work. The hook now reports "I got loaded into package X" to a
small ContentProvider in Veil's own app the moment a scoped app's process
starts (found via hooking Application#attach for a reliable early Context),
which records it to SharedPreferences. Veil's settings screen lists the
union of explicitly configured apps and auto-detected ones, tagging the
latter so it's clear they haven't been customized yet.

No persistent service: the OS starts Veil's process on demand for each
call() and can kill it again right after, same footprint as everything
else in this module.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 bda331df4e Reduce per-process hook overhead for resource-constrained devices
Every scoped app's cold start pays whatever cost the hook installation
itself takes, so it's the one place worth trimming here — there's no
standing service or background work anywhere else in the module.

Previously any enabled feature caused both Settings.Secure and
Settings.Global to get hooked with the full combined key set, even though
each key only ever lives on one of them (accessibility/mock-location keys
are Secure-only, adb/dev-options keys are Global-only). Splitting the key
maps by actual canonical class means an app that only needs e.g. ADB+dev-
options hidden skips hooking Settings.Secure entirely, roughly halving the
reflective hook-install calls for that case.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 8e8b63c534 Add in-app help and troubleshooting panel
Collapsible panel on the settings screen covering what came up debugging
this against a real target app: the KernelSU "Umount modules" / DenyList
conflict that silently blocks Zygisk injection, checking a separate Zygisk
implementation's own DenyList, needing a force-stop + relaunch (not a full
reboot) after config changes, and using LSPosed's verbose logging to confirm
injection actually happened.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 26b84c0539 Clarify settings screen with per-feature explanations
Checkbox labels like "Accessibility services" read as status, not action —
unclear whether checking it meant "hide this" or something else. Replaces
the flat label map with a label + one-line description per feature, and
adds a short caption on each app card spelling out what checking a box
actually does.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 21:46:16 +06:00
bdeshiandClaude Sonnet 5 19f422ef63 Rename hook class to VeilHook; add root/manager-app hiding and build-tag spoofing
Renamed since the module hides more than accessibility state now — hook class
and app display name become VeilHook/Veil (the module already lived under the
space.bdeshi.veil namespace).

Two new features, same per-app toggle model as everything else:

- Root/manager apps: hides packages in a configurable shared list (default
  KernelSU + Magisk) from PackageManager's getPackageInfo/getApplicationInfo/
  getInstalledPackages/getInstalledApplications.
- Build tags/type: overwrites Build.TAGS/Build.TYPE to release-keys/user for
  the hooked process, hiding the test-keys/userdebug markers apps sometimes
  check for.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:57:29 +06:00
bdeshiandClaude Sonnet 5 cf250a97cb Add per-app configurable settings screen
Replaces "hide everything for every scoped app" with per-package, per-feature
toggles, backed by SharedPreferences the hook reads via XSharedPreferences.
A package with no explicit entry still gets every feature hidden, keeping
prior behavior as the default.

Adds a launcher activity so the settings screen is directly reachable.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 20:55:08 +06:00
bdeshiandClaude Sonnet 5 ee49924cd0 Working MVP: hide accessibility, ADB, and dev-debug state from LSPosed-scoped apps
LSPosed module that hooks AccessibilityManager and Settings.Secure/Global
(getString/getStringForUser/getInt/getIntForUser) inside whatever app
process LSPosed injects it into, so that process sees no accessibility
services and no adb/wifi-debugging flags enabled. Target apps are chosen
via the module's scope list in LSPosed Manager, not in-app config.

Confirmed working against a real target app on-device; it previously
refused to launch with an accessibility service active and now starts
normally with the module enabled and scoped to it. Required disabling
KernelSU's "umount modules" option for that app, since it otherwise blocks
Zygisk (and therefore LSPosed) from injecting into the process at all.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-06 15:59:31 +06:00