v2.0.0
Built on top of Obtainium v1.4.0
🧭 Overview
Builds on the existing ObtainX UI/UX foundation with a set of net-new features, improvements to existing ones, and internal refactors. Core additions include bulk import from installed apps, inline app editing, skip version, on-demand only mode, a regex assist dialog, a dedicated additional options page, and a reworked Add App flow.
✨ Net-New Features
- Bulk Import from Device — new multi-step wizard (selectstores → select installed apps → scan stores → review results) embedded directly in the Add App tab;
BulkImportServicehandles package-to-source resolution with a persistentBulkScanCachethat survives sessions - Skip Version — defer a specific release on the app detail page without marking the app as updated; works alongside the new version-clarity states
- On-Demand Only mode — mark an app so it's hidden from the main list and only checked when you explicitly open it or visit the On-Demand screen
- RegEx Assist dialog — context-sensitive helper accessible from any regex-capable field on both the add-app and additional options flows; guides through building filters without knowing regex syntax
- Additional Options page — dedicated full-screen page for per-app advanced settings, extracted from the inline overflow; accessible from both add-app and the detail page edit flow
🔧 Feature Updates
- Add App page unified into one screen — URL, Search, and From Device are now three tabs on a single
SegmentedButton; no separate pages or bottom sheets for core interactions - Inline edit on the app detail page — edit tracking settings and icon directly from the detail page without navigating away; unsaved-changes guard on back with keep/discard/save options
- 5-second undo after delete scoped to deferred removals —
RemoveAppsWithModalResultcarriesdeferredUndoAppIds; snackbar undo only offered when removal was actually deferred (not when app was uninstalled in the same step) - APKMirror release title collection — improved candidate gathering for release title detection (up to 40 candidates, deduped), making version matching more reliable
- Version clarity states —
versionOrderIsUnclear()detects when two version strings can't be reliably ranked (e.g. commit hashes vs semver); surfaces a dedicated "unclear" status with Skip/Check actions instead of a false update or false up-to-date; tab badge counts include uncertain-update apps - Search result inline filter — after a search in the Add App tab, a filter bar narrows displayed results by title/source without re-running the query
⚙️ General Optimizations
FaviconCachepersistence — two-layer memory + disk cache (<cacheDir>/favicons/) means source favicons survive app restarts and aren't re-fetched on every launchStoreSourceIconsextracted — bundled icon asset mapping moved to its own class; used consistently across the bulk import flow and search resultsGeneratedFormcard wrapping —wrapFormSectionsInCardsflag groups form sections into app-page-style cards; used in the add-app and additional options flows for visual consistencyBulkAddWidgetas reusable component — bulk flow state extracted from the page intoBulkAddWidget;BulkAddAppsPageis now a thin wrapper preserving backward compat for any existing push routesonWindowFocusChangedinstall detection —MainActivityuses focus-regain signal to detect when the system installer was dismissed, replacing the previous approachapp_package_formats.dartextracted — APK/XAPK/ZIP format logic moved to its own file
🖼️ Screenshots
TBD