lawnchair icon indicating copy to clipboard operation
lawnchair copied to clipboard

[BUG] Surface Duo: app drawer crash if animations disabled

Open chewiebrian opened this issue 2 years ago • 1 comments

Describe the bug

Hi, I have found a bug with the app drawer animation on my Surface Duo (Android 11). I have completely disabled animations on the developer settings, and if I use only one screen swiping up to open the app drawer produces an exception. Strangely, it works if I use two screens or landscape mode.

Stacktrace:

Lawnchair bug report 5 may. 2022 15:33:54
version: 12.0.0 Dev (cc9735b) (120005)
commit: cc9735b
build.brand: surface
build.device: duo
build.display: 2022.115.10
build.fingerprint: surface/duo/duo:11/2022.115.10/202201150010:user/release-keys
build.hardware: surfaceduo
build.id: 2022.115.10
build.manufacturer: Microsoft
build.model: Surface Duo
build.product: duo
build.type: user
version.codename: REL
version.incremental: 202201150010
version.release: 11
version.sdk_int: 30
display.density_dpi: 340

error: Uncaught exception

java.lang.IllegalArgumentException: Animators cannot have negative duration: -506
	at android.animation.ValueAnimator.setDuration(ValueAnimator.java:598)
	at android.animation.ObjectAnimator.setDuration(ObjectAnimator.java:910)
	at android.animation.ObjectAnimator.setDuration(ObjectAnimator.java:71)
	at com.android.launcher3.anim.PendingAnimation.add(PendingAnimation.java:72)
	at com.android.launcher3.anim.PendingAnimation.add(PendingAnimation.java:68)
	at com.android.launcher3.allapps.AllAppsTransitionController.setStateWithAnimation(AllAppsTransitionController.java:169)
	at com.android.launcher3.allapps.AllAppsTransitionController.setStateWithAnimation(AllAppsTransitionController.java:58)
	at com.android.launcher3.statemanager.StateManager.createAnimationToNewWorkspaceInternal(StateManager.java:317)
	at com.android.launcher3.statemanager.StateManager.createAnimationToNewWorkspace(StateManager.java:308)
	at com.android.launcher3.uioverrides.touchcontrollers.PortraitStatesTouchController.initCurrentAnimation(PortraitStatesTouchController.java:197)
	at com.android.launcher3.uioverrides.touchcontrollers.NoButtonNavbarToOverviewTouchController.initCurrentAnimation(NoButtonNavbarToOverviewTouchController.java:102)
	at com.android.launcher3.touch.AbstractStateChangeTouchController.reinitCurrentAnimation(AbstractStateChangeTouchController.java:169)
	at com.android.launcher3.touch.AbstractStateChangeTouchController.onDragStart(AbstractStateChangeTouchController.java:189)
	at com.android.launcher3.uioverrides.touchcontrollers.NoButtonNavbarToOverviewTouchController.onDragStart(NoButtonNavbarToOverviewTouchController.java:112)
	at com.android.launcher3.touch.SingleAxisSwipeDetector.reportDragStartInternal(SingleAxisSwipeDetector.java:173)
	at com.android.launcher3.touch.BaseSwipeDetector.reportDragStart(BaseSwipeDetector.java:245)
	at com.android.launcher3.touch.BaseSwipeDetector.setState(BaseSwipeDetector.java:217)
	at com.android.launcher3.touch.BaseSwipeDetector.onTouchEvent(BaseSwipeDetector.java:174)
	at com.android.launcher3.touch.AbstractStateChangeTouchController.onControllerTouchEvent(AbstractStateChangeTouchController.java:135)
	at com.android.launcher3.touch.AbstractStateChangeTouchController.onControllerInterceptTouchEvent(AbstractStateChangeTouchController.java:117)
	at com.android.launcher3.uioverrides.touchcontrollers.PortraitStatesTouchController.onControllerInterceptTouchEvent(PortraitStatesTouchController.java:247)
	at com.android.launcher3.views.BaseDragLayer.findControllerToHandleTouch(BaseDragLayer.java:186)
	at com.android.launcher3.views.BaseDragLayer.findActiveController(BaseDragLayer.java:196)
	at com.android.launcher3.views.BaseDragLayer.onInterceptTouchEvent(BaseDragLayer.java:166)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2664)
	at com.android.launcher3.views.BaseDragLayer.dispatchTouchEvent(BaseDragLayer.java:303)
	at com.android.launcher3.dragndrop.DragLayer.dispatchTouchEvent(DragLayer.java:214)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:3118)
	at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:2799)
	at com.android.internal.policy.DecorView.superDispatchTouchEvent(DecorView.java:503)
	at com.android.internal.policy.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1922)
	at android.app.Activity.dispatchTouchEvent(Activity.java:4125)
	at com.android.launcher3.Launcher.dispatchTouchEvent(Launcher.java:1948)
	at com.android.internal.policy.DecorView.dispatchTouchEvent(DecorView.java:461)
	at android.view.View.dispatchPointerEvent(View.java:14582)
	at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:6135)
	at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:5938)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5429)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5486)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5452)
	at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:5604)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5460)
	at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:5661)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5433)
	at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:5486)
	at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:5452)
	at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:5460)
	at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:5433)
	at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:8213)
	at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:8150)
	at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:8111)
	at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:8391)
	at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:220)
	at android.view.InputEventReceiver.nativeConsumeBatchedInputEvents(Native Method)
	at android.view.InputEventReceiver.consumeBatchedInputEvents(InputEventReceiver.java:200)
	at android.view.ViewRootImpl.doConsumeBatchedInput(ViewRootImpl.java:8348)
	at android.view.ViewRootImpl$ConsumeBatchedInputRunnable.run(ViewRootImpl.java:8430)
	at android.view.Choreographer$CallbackRecord.run(Choreographer.java:972)
	at android.view.Choreographer.doCallbacks(Choreographer.java:796)
	at android.view.Choreographer.doFrame(Choreographer.java:724)
	at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:957)
	at android.os.Handler.handleCallback(Handler.java:938)
	at android.os.Handler.dispatchMessage(Handler.java:99)
	at android.os.Looper.loop(Looper.java:223)
	at android.app.ActivityThread.main(ActivityThread.java:7724)
	at java.lang.reflect.Method.invoke(Native Method)
	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

As a workaround, I have traced the negative value the Animator is receiving as being generated by method AllAppsTransitionController.getShiftRange(). If I return the absolute value everything works perfectly, altought I don't know if that change has any collateral effect:

public class AllAppsTransitionController
        implements StateHandler<LauncherState>, OnDeviceProfileChangeListener {

...

    public float getShiftRange() {
        //return mShiftRange;
        return Math.abs(mShiftRange);
    }

...

}

Steps to reproduce

Steps to reproduce the behavior:

  1. Make sure the device is using only one screen in portrait mode.
  2. Disable all animations on Settings > System > Developer settings.
  3. Open Lawnchair and swipe up to see all your apps. It should crash and restart.

Expected behavior

The app drawer is opened.

Screenshots

No response

Device information

  • Device: Surface Duo
  • OS: Android 11
  • App version: 12.0.0 Alpha 5

Additional context

No response

chewiebrian avatar May 05 '22 13:05 chewiebrian

This issue is stale because it has been open for 90 days with no activity. Remove stale label or comment or this will be closed in 7 days.

github-actions[bot] avatar Aug 22 '22 21:08 github-actions[bot]

Just an update to this.

Opening (specifically) it no longer crashes the launcher with the latest test release. I am able to open it, configure settings, and interact with the desktop.

When I attempt to open the app drawer however, same crash error type.

Hammerfest avatar Oct 17 '22 19:10 Hammerfest

This issue is stale because it has been open for 90 days with no activity. Remove stale label or comment or this will be closed in 7 days.

github-actions[bot] avatar Jan 16 '23 00:01 github-actions[bot]

This issue was closed because it has been stale for 7 days with no activity.

github-actions[bot] avatar Jan 24 '23 00:01 github-actions[bot]