github trinadhthatakula/Thor v1.81.1-dev-70
Dev Build v1.81.1 (70)

pre-release11 hours ago

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
  • startObserving is now idempotent, preventing flow collector leaks on repeated calls

Freezer — Redesigned

  • Completely rewritten FreezerScreen with LazyVerticalGrid layout, FAB to add apps, multi-select header, and a snackbar for frozen-app prompts
  • New FreezerRepository backed by Room (FreezerEntity, FreezerDao) — database bumped to v3 with auto-migration from v2
  • FreezerViewModel rewritten with curated-list semantics: freeze/unfreeze all, multi-select removal, single-app actions, and FreezerPrompt snackbar 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 ManageFreezerSheet are sorted alphabetically by name

Freezer Quick Settings Tile

  • New FreezerTileService Quick Settings tile for one-tap freeze from the notification shade
  • Tile state refreshes after freeze; uses a longRunningScope to ensure operations complete even if the tile is dismissed
  • Detailed localized toast messages for success and partial failure states

Freezer Settings

  • New FreezerSettingsSheet with a confirmation dialog for the "Unfreeze All" action
  • View mode (list/grid) selector with localized label

Permission Manager

  • New PermissionManagerScreen with grant/revoke support backed by PermissionRepository
  • Shows permission labels, sensitive badges, protection level, and description
  • Input sanitization via regex validation for packageName and permissionName in shell command gateways (Root, Shizuku, Dhizuku)
  • Protection level masking with PROTECTION_MASK_BASE before comparisons
  • App icon loaded asynchronously on the IO dispatcher in the top bar

App Info Details Screen

  • New dedicated tabbed AppInfoDetailsScreen with: SHA-256 signature fingerprint, permission labels, system settings action, and component search
  • Error and action feedback messages localized via UiText

Manage Freezer Sheet

  • ConnectedButtonGroup toggles between User and System apps
  • Sheet expands to full height on search focus (fixes soft keyboard covering content)
  • Keyboard insets handled correctly via WindowInsets.ime union

🔄 Changes & Refactors

Navigation — Navigation 3

  • Full migration to AndroidX Navigation 3 (v1.1.2)
  • Type-safe serializable ThorRoute keys, NavigationState, and Navigator helpers
  • NavDisplay handles 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 @Module class with @ComponentScan replaces all manual module wiring
  • androidx-startup dependency removed

Performance

  • AppListViewModel and FreezerViewModel hoisted to MainScreen — tab switches no longer recreate ViewModels
  • Local UI state updated immediately after app management actions
  • Coil migrated to a global singleton ImageLoader
  • AppInfo stability optimized to enable Compose list recomposition skipping

UI / UX

  • FreezerPromptSnackbar replaces the default snackbar: themed card with primaryContainer icon badge, app name, FilledTonalButton, slide-up/fade animation, and 4 s auto-dismiss
  • ModalBottomSheet container color updated to surfaceContainerLow across AppInfoDialog, AppList, and FreezerSettingsSheet
  • PermissionManagerScreen layout refined: increased maxLines, titleSmall/labelSmall typography, weight(1f, fill = false) for sensitive badge priority
  • Replaced deprecated ScrollableTabRow with SecondaryScrollableTabRow
  • FloatingActionButton moved to Scaffold parameter in FreezerScreen for standard positioning
  • "Reinstall All" in MainScreen now goes through checkAndProcessAction for 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.xml with translations
  • Action messages migrated to the new UiText sealed class

🏗️ Infrastructure

UiText Sealed Class

  • New UiText abstraction (DynamicString / StringResource) for resolving strings in both Compose and non-UI contexts
  • Custom equals/hashCode on StringResource handles vararg formatting args correctly

Database

  • Room schema bumped to v3 with auto-migration from v2
  • Manual migration (v1 → v2) adds the isSuspended column to the apps table
  • Destructive migration enabled only in debug builds; explicit migrations enforced in production

Security & Manifest

  • BootReceiver marked exported=false
  • content:// URI scheme added to the file-based intent filter

Build & Tooling

  • Koin compiler plugin added with strict safety checks
  • androidx.compose.material:material-icons-extended dependency added
  • Project JDK updated from jbr-21 to corretto-21
  • .gitignore updated: /.superpowers, /.antigravitycli, CLAUDE.md

🐛 Bug Fixes

  • Multi-select tapping a Freezer app now toggles selection instead of opening the info dialog
  • selectedPackageName stored as rememberSaveable for configuration-change safety
  • FreezerPromptSnackbar position fixed — now appears at the bottom of the screen
  • Repository entry removed before unfreeze in toggleManaged to prevent stale state
  • grantPermission/revokePermission wrapped in try-catch to safely return Result
  • Freezer operations no longer silently drop Result — partial failure counts are reported
  • observeApps wrapped in try-catch so isLoading clears and an error is shown on upstream failures
  • ManageFreezerSheet fixed: user and system apps now combined correctly (was showing empty system apps list)
  • QS tile state refreshes correctly after onClick freeze
  • GLES decoding, localizations, application ID check, and datetime format fixes in AppInfoDetailsScreen

Don't miss a new Thor release

NewReleases is sending notifications on new releases.