* scrolling
* removed logging from the scrolling part in pagedview
* added toggle for infinite scrolling
* strings
* scrolling preferences moved
* string fix
- Categorize apps using flowerpot and organize into folders
- Add blocking loading dialog during categorization process
- Prevent user cancellation during workspace setup
- Auto-add newly installed apps to appropriate folders
- closes : #5846
* fix: Window Insets crashes on less than Android 11
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
* Apply suggestion from @validcube
---------
Signed-off-by: Pun Butrach <pun.butrach@gmail.com>
* feat(ui): Add toggle to disable search bar background in app drawer
* Fix double opacity on the Search Bar's background
- Before, the Search Bar added another -possibly transparent- layer on top of the already existing app drawer background.
- This adds a toggle to disable the double-opacity
- It is made so it is non regressive
Fixes#4158
* style(strings): Fixed inconsistency
* Fix foldable device layout issue on Pixel 9 Pro Fold
- Enable two-panel layout for all multi-display devices (foldables)
- Previously required both isTablet && isMultiDisplay conditions
- Foldable devices may not meet 600dp tablet width threshold when unfolded
- This ensures proper layout utilization of available screen space
Fixes#5920
* Fix app drawer icon scaling when home screen icons are resized
- Prevent home screen icon scale from affecting app drawer layout
- When mIsScalableGrid is true, use separate scaling for app drawer elements
- This fixes the 'zoomed out' appearance in app drawer when home screen
icons are scaled to 120% or higher
- App drawer now maintains independent sizing from home screen
Fixes#5912
* Remove code comments from fixes
- Clean up code by removing explanatory comments
- Keep changes minimal and focused
This commit completes the work started in the search refactor by migrating all remaining legacy file/media permission checks to the new, centralized `FileAccessManager`.
Previously, features like the wallpaper preview and backup system used the side-effect based permission model that created a poor user experience, especially on modern Android versions.
This change unifies all file and media access logic under the new, observable `StateFlow`-based system. This includes:
- Refactoring the wallpaper drawable access logic to correctly handle the various states of media permissions on Android 13+. This is disabled by default on Play Store builds, due to lack of `MANAGE_EXTERNAL_STORAGE` permission.
- Updating the backup/restore system to use the new manager.
- Updating the blur wallpaper feature to use the new manager.
- Migrating the OTA update check to use the new manager.
- Replacing the "Notification Dots" permission bottom sheet with the new, simpler `PermissionDialog` for UI consistency.
Credit-to: @lebao3105 for the initial analysis of the wallpaper permission issue.
Fixes#5632Fixes#5676
Introducing the home screen layout feature! Now, users have the ability to personalize their experience by disabling the app drawer and arranging apps directly on their home screen.
- closes : #4323
https://github.com/GrapheneOS/os-issue-tracker/issues/2601
I did not find any issue reported upstream, but I can confirm that this
bug exists on Moto App Launcher (the launcher on Motorola's devices),
which seems to imply this is a bug in AOSP itself. I had asked
@agnostic-apollo about this is a bug, and he said that this is a bug in
Android's libraries itself
- Introduced "Caddy" functionality to organize apps within the app drawer.
- Allows grouping of applications for better accessibility and user experience.
- Serves as a foundational feature for enhancing app drawer usability.
* feat: Allow re-arranging popup menu items
* Refactor draggable preferences
* Refactor options pop-up drag and drop view
- Move to new screen
- Separate preview and options
This commit addresses a NullPointerException that occurs when updating
widget options in the WidgetSizes class. The fix includes:
- Adding null checks for sizeOptions and currentOptions
- Comparing new sizes with current sizes before updating
- Catching and logging exceptions during widget option updates
- Returning null from getWidgetSizeOptions if it fails to create a valid Bundle
These changes should resolve the "Attempt to invoke virtual method 'void
android.os.Bundle.putAll(android.os.Bundle)' on a null object reference" error
and improve the robustness of widget size updates.
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.os.Bundle.putAll(android.os.Bundle)' on a null object reference
at android.os.Parcel.createExceptionOrNull(Parcel.java:3075)
at android.os.Parcel.createException(Parcel.java:3053)
at android.os.Parcel.readException(Parcel.java:3036)
at android.os.Parcel.readException(Parcel.java:2978)
at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.updateAppWidgetOptions(IAppWidgetService.java:1017)
at android.appwidget.AppWidgetManager.updateAppWidgetOptions(AppWidgetManager.java:727)
at com.android.launcher3.widget.util.WidgetSizes.lambda$updateWidgetSizeRangesAsync$0(Unknown Source:31)
at com.android.launcher3.widget.util.WidgetSizes.a(Unknown Source:0)
at ba.a.run(Unknown Source:10)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:230)
at android.os.Looper.loop(Looper.java:319)
at android.os.HandlerThread.run(HandlerThread.java:67)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.appwidget.AppWidgetServiceImpl.updateAppWidgetOptions(AppWidgetServiceImpl.java:2193)
at com.android.internal.appwidget.IAppWidgetService$Stub.onTransact(IAppWidgetService.java:500)
at android.os.Binder.execTransactInternal(Binder.java:1375)
at android.os.Binder.execTransact(Binder.java:1311)
- Adding null checks before calling methods on mWidgetHost
- Ensuring the listening flag is always updated, even if an exception occurs
This should resolve the "java.lang.NullPointerException: Attempt to read from
field 'com.android.server.appwidget.AppWidgetServiceImpl$ProviderId'" error
and improve overall stability when dealing with widgets
error: Uncaught exception
java.lang.RuntimeException: Unable to stop activity {app.lawnchair.nightly/app.lawnchair.LawnchairLauncher}: java.lang.NullPointerException: Attempt to read from field 'com.android.server.appwidget.AppWidgetServiceImpl$ProviderId com.android.server.appwidget.AppWidgetServiceImpl$Provider.id' on a null object reference in method 'android.util.SparseArray com.android.server.appwidget.AppWidgetServiceImpl$Host.getWidgetUids()'
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5484)
at android.app.ActivityThread.performStopActivityInner(ActivityThread.java:5456)
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5525)
at android.app.servertransaction.StopActivityItem.execute(StopActivityItem.java:43)
at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:45)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:176)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2423)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loopOnce(Looper.java:233)
at android.os.Looper.loop(Looper.java:334)
at android.app.ActivityThread.main(ActivityThread.java:8348)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:582)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1065)
Caused by: java.lang.NullPointerException: Attempt to read from field 'com.android.server.appwidget.AppWidgetServiceImpl$ProviderId com.android.server.appwidget.AppWidgetServiceImpl$Provider.id' on a null object reference in method 'android.util.SparseArray com.android.server.appwidget.AppWidgetServiceImpl$Host.getWidgetUids()'
at android.os.Parcel.createExceptionOrNull(Parcel.java:2446)
at android.os.Parcel.createException(Parcel.java:2424)
at android.os.Parcel.readException(Parcel.java:2407)
at android.os.Parcel.readException(Parcel.java:2349)
at com.android.internal.appwidget.IAppWidgetService$Stub$Proxy.stopListening(IAppWidgetService.java:792)
at android.appwidget.AppWidgetHost.stopListening(AppWidgetHost.java:274)
at com.android.launcher3.widget.LauncherWidgetHolder.stopListening(Unknown Source:2)
at com.android.launcher3.widget.LauncherWidgetHolder.setShouldListenFlag(Unknown Source:40)
at com.android.launcher3.widget.LauncherWidgetHolder.setActivityStarted(Unknown Source:1)
at com.android.launcher3.Launcher.onStop(Unknown Source:25)
at android.app.Instrumentation.callActivityOnStop(Instrumentation.java:1496)
at android.app.Activity.performStop(Activity.java:8599)
at android.app.ActivityThread.callActivityOnStop(ActivityThread.java:5476)
... 14 more
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.appwidget.AppWidgetServiceImpl$Host.getWidgetUids(AppWidgetServiceImpl.java:4444)
at com.android.server.appwidget.AppWidgetServiceImpl.stopListening(AppWidgetServiceImpl.java:866)
at com.android.internal.appwidget.IAppWidgetService$Stub.onTransact(IAppWidgetService.java:311)
at android.os.Binder.execTransactInternal(Binder.java:1179)
at android.os.Binder.execTransact(Binder.java:1143)