v1.81.1 — Auto Freeze & Freezer Redesign
Pre-release build
🆕 New Features
Auto Freeze
- Auto Freeze on screen lock via a dynamic
BroadcastReceiver— apps in the Freezer list are frozen automatically when the device locks - Auto-freeze checks the Keyguard device lock state before executing, preventing spurious triggers
- Auto-freeze runs concurrently and releases the broadcast receiver immediately after dispatch
startObservingis now idempotent, preventing flow collector leaks on repeated calls
Freezer — Redesigned
- Completely rewritten
FreezerScreenwithLazyVerticalGridlayout, FAB to add apps, multi-select header, and a snackbar for frozen-app prompts - New
FreezerRepositorybacked by Room (FreezerEntity,FreezerDao) — database bumped to v3 with auto-migration from v2 FreezerViewModelrewritten with curated-list semantics: freeze/unfreeze all, multi-select removal, single-app actions, andFreezerPromptsnackbar for apps frozen outside the Freezer list- Bulk freeze/unfreeze operations now run in parallel via
async/awaitAll - Multi-select now toggles selection on tap (instead of opening the info dialog), with a floating
FreezerSelectToolBox(Freeze, Unfreeze, Remove, Share, Uninstall) - FAB hides automatically when multi-select is active
- Search bar and list/grid view switcher added to
FreezerScreen - Apps in both the grid and
ManageFreezerSheetare sorted alphabetically by name
Freezer Quick Settings Tile
- New
FreezerTileServiceQuick Settings tile for one-tap freeze from the notification shade - Tile state refreshes after freeze; uses a
longRunningScopeto ensure operations complete even if the tile is dismissed - Detailed localized toast messages for success and partial failure states
Freezer Settings
- New
FreezerSettingsSheetwith a confirmation dialog for the "Unfreeze All" action - View mode (list/grid) selector with localized label
Permission Manager
- New
PermissionManagerScreenwith grant/revoke support backed byPermissionRepository - Shows permission labels, sensitive badges, protection level, and description
- Input sanitization via regex validation for
packageNameandpermissionNamein shell command gateways (Root, Shizuku, Dhizuku) - Protection level masking with
PROTECTION_MASK_BASEbefore comparisons - App icon loaded asynchronously on the IO dispatcher in the top bar
App Info Details Screen
- New dedicated tabbed
AppInfoDetailsScreenwith: SHA-256 signature fingerprint, permission labels, system settings action, and component search - Error and action feedback messages localized via
UiText
Manage Freezer Sheet
ConnectedButtonGrouptoggles between User and System apps- Sheet expands to full height on search focus (fixes soft keyboard covering content)
- Keyboard insets handled correctly via
WindowInsets.imeunion
🔄 Changes & Refactors
Navigation — Navigation 3
- Full migration to AndroidX Navigation 3 (
v1.1.2) - Type-safe serializable
ThorRoutekeys,NavigationState, andNavigatorhelpers NavDisplayhandles both tab and child screen navigation- Bottom navigation bar animates and hides on non-top-level destinations
- Fade-only transitions (200 ms) replace slide + fade, halving layout cost
Dependency Injection — Koin Annotations
- Migrated from manual Koin DSL to Koin Annotations + Koin Compiler
- Repositories/gateways
@Single, use cases@Factory, ViewModels@KoinViewModel - Single
@Moduleclass with@ComponentScanreplaces all manual module wiring androidx-startupdependency removed
Performance
AppListViewModelandFreezerViewModelhoisted toMainScreen— tab switches no longer recreate ViewModels- Local UI state updated immediately after app management actions
- Coil migrated to a global singleton
ImageLoader AppInfostability optimized to enable Compose list recomposition skipping
UI / UX
FreezerPromptSnackbarreplaces the default snackbar: themed card withprimaryContainericon badge, app name,FilledTonalButton, slide-up/fade animation, and 4 s auto-dismissModalBottomSheetcontainer color updated tosurfaceContainerLowacrossAppInfoDialog,AppList, andFreezerSettingsSheetPermissionManagerScreenlayout refined: increasedmaxLines,titleSmall/labelSmalltypography,weight(1f, fill = false)for sensitive badge priority- Replaced deprecated
ScrollableTabRowwithSecondaryScrollableTabRow FloatingActionButtonmoved toScaffoldparameter inFreezerScreenfor standard positioning- "Reinstall All" in
MainScreennow goes throughcheckAndProcessActionfor confirmation
Localization
- Comprehensive string resources for Permission Manager and Quick Settings Tile in: 🇬🇧 English, 🇸🇦 Arabic, 🇪🇸 Spanish, 🇫🇷 French, 🇨🇳 Simplified Chinese
- Hardcoded Freezer strings extracted to
strings.xmlwith translations - Action messages migrated to the new
UiTextsealed class
🏗️ Infrastructure
UiText Sealed Class
- New
UiTextabstraction (DynamicString/StringResource) for resolving strings in both Compose and non-UI contexts - Custom
equals/hashCodeonStringResourcehandlesvarargformatting args correctly
Database
- Room schema bumped to v3 with auto-migration from v2
- Manual migration (v1 → v2) adds the
isSuspendedcolumn to theappstable - Destructive migration enabled only in debug builds; explicit migrations enforced in production
Security & Manifest
BootReceivermarkedexported=falsecontent://URI scheme added to the file-based intent filter
Build & Tooling
- Koin compiler plugin added with strict safety checks
androidx.compose.material:material-icons-extendeddependency added- Project JDK updated from
jbr-21tocorretto-21 .gitignoreupdated:/.superpowers,/.antigravitycli,CLAUDE.md
🐛 Bug Fixes
- Multi-select tapping a Freezer app now toggles selection instead of opening the info dialog
selectedPackageNamestored asrememberSaveablefor configuration-change safetyFreezerPromptSnackbarposition fixed — now appears at the bottom of the screen- Repository entry removed before unfreeze in
toggleManagedto prevent stale state grantPermission/revokePermissionwrapped intry-catchto safely returnResult- Freezer operations no longer silently drop
Result— partial failure counts are reported observeAppswrapped intry-catchsoisLoadingclears and an error is shown on upstream failuresManageFreezerSheetfixed: user and system apps now combined correctly (was showing empty system apps list)- QS tile state refreshes correctly after
onClickfreeze - GLES decoding, localizations, application ID check, and datetime format fixes in
AppInfoDetailsScreen