From 5e27c021ac3a808590989a3c17910870d6cc7e6d Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Thu, 28 Oct 2021 11:21:47 -0700 Subject: [PATCH 1/5] Check if RemoteAnimationTargets apps are present * Before the refactor to use RemoteTargetGluer, we only set the preview if the runningTaskTarget wasn't null, that check got removed during the refactor. * Why that check was there to begin with is a bit of a mystery, sadly Fixes: 199658495 Change-Id: I053fac0fa0eee0979dff651c01287d04d06298e6 --- .../android/quickstep/RemoteTargetGluer.java | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java index 825abedead..5f2b49d07f 100644 --- a/quickstep/src/com/android/quickstep/RemoteTargetGluer.java +++ b/quickstep/src/com/android/quickstep/RemoteTargetGluer.java @@ -17,7 +17,6 @@ package com.android.quickstep; import android.content.Context; -import android.util.Log; import androidx.annotation.Nullable; @@ -33,8 +32,6 @@ import com.android.systemui.shared.system.RemoteAnimationTargetCompat; * {@link TaskViewSimulator} */ public class RemoteTargetGluer { - private static final String TAG = "RemoteTargetGluer"; - private RemoteTargetHandle[] mRemoteTargetHandles; private SplitConfigurationOptions.StagedSplitBounds mStagedSplitBounds; @@ -94,25 +91,18 @@ public class RemoteTargetGluer { public RemoteTargetHandle[] assignTargetsForSplitScreen(RemoteAnimationTargets targets) { int[] splitIds = LauncherSplitScreenListener.INSTANCE.getNoCreate() .getRunningSplitTaskIds(); - Log.d(TAG, "splitIds length: " + splitIds.length - + " targetAppsLength: " + targets.apps.length - + " remoteHandlesLength: " + mRemoteTargetHandles.length); - if (splitIds.length == 0 && mRemoteTargetHandles.length > 1) { - // There's a chance that between the creation of this class and assigning targets, - // LauncherSplitScreenListener may have received callback that removes split - mRemoteTargetHandles = new RemoteTargetHandle[]{mRemoteTargetHandles[0]}; - Log.w(TAG, "splitTaskIds changed between creation and assignment"); - } RemoteAnimationTargetCompat primaryTaskTarget; RemoteAnimationTargetCompat secondaryTaskTarget; if (mRemoteTargetHandles.length == 1) { // If we're not in split screen, the splitIds count doesn't really matter since we - // should always hit this case. Right now there's no use case for multiple app targets - // without being in split screen - primaryTaskTarget = targets.apps[0]; + // should always hit this case. mRemoteTargetHandles[0].mTransformParams.setTargetSet(targets); - mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(primaryTaskTarget, null); + if (targets.apps.length > 0) { + // Unclear why/when target.apps length == 0, but it sure does happen :( + primaryTaskTarget = targets.apps[0]; + mRemoteTargetHandles[0].mTaskViewSimulator.setPreview(primaryTaskTarget, null); + } } else { // split screen primaryTaskTarget = targets.findTask(splitIds[0]); From da02250c2957048c5b0ea0f802a5c61330ef46f1 Mon Sep 17 00:00:00 2001 From: Jon Miranda Date: Mon, 1 Nov 2021 14:24:43 -0700 Subject: [PATCH 2/5] Adding screen record for a flake Test: presubmit Bug: 202735477 Change-Id: I4e1d2bc3650e2f52767f57e9b00c9c2bf7974489 --- tests/src/com/android/launcher3/ui/WorkProfileTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tests/src/com/android/launcher3/ui/WorkProfileTest.java b/tests/src/com/android/launcher3/ui/WorkProfileTest.java index 41cdf0feef..27a23757d6 100644 --- a/tests/src/com/android/launcher3/ui/WorkProfileTest.java +++ b/tests/src/com/android/launcher3/ui/WorkProfileTest.java @@ -32,6 +32,7 @@ import com.android.launcher3.allapps.WorkAdapterProvider; import com.android.launcher3.allapps.WorkEduCard; import com.android.launcher3.allapps.WorkProfileManager; import com.android.launcher3.tapl.LauncherInstrumentation; +import com.android.launcher3.util.rule.ScreenRecordRule.ScreenRecord; import org.junit.After; import org.junit.Before; @@ -86,6 +87,7 @@ public class WorkProfileTest extends AbstractLauncherUiTest { } @Test + @ScreenRecord // b/202735477 public void workTabExists() { mDevice.pressHome(); waitForLauncherCondition("Launcher didn't start", Objects::nonNull); From 97d64ea8a1b681e44b757dd3ae9f6f28bcb55512 Mon Sep 17 00:00:00 2001 From: Vinit Nayak Date: Mon, 1 Nov 2021 13:08:14 -0700 Subject: [PATCH 3/5] Align OverviewActionsView for 3 button taskbar Bug: 189807374 Change-Id: I028ae31b98e28bc372f0148a28755d067fe50678 --- .../taskbar/NavbarButtonsViewController.java | 16 ++++---- .../quickstep/views/OverviewActionsView.java | 38 +++++++++++++++++-- .../android/quickstep/views/RecentsView.java | 2 +- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java index 11349bba87..02caad561d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java +++ b/quickstep/src/com/android/launcher3/taskbar/NavbarButtonsViewController.java @@ -226,6 +226,14 @@ public class NavbarButtonsViewController { mPropertyHolders.forEach(StatePropertyHolder::endAnimation); } + public void onDestroy() { + mPropertyHolders.clear(); + mControllers.rotationButtonController.unregisterListeners(); + if (mFloatingRotationButton != null) { + mFloatingRotationButton.hide(); + } + } + private void initButtons(ViewGroup navContainer, ViewGroup endContainer, TaskbarNavButtonController navButtonController) { @@ -422,14 +430,6 @@ public class NavbarButtonsViewController { return mFloatingRotationButtonBounds.contains((int) ev.getX(), (int) ev.getY()); } - public void onDestroy() { - mPropertyHolders.clear(); - mControllers.rotationButtonController.unregisterListeners(); - if (mFloatingRotationButton != null) { - mFloatingRotationButton.hide(); - } - } - private class RotationButtonListener implements RotationButton.RotationButtonUpdatesCallback { @Override public void onVisibilityChanged(boolean isVisible) { diff --git a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java index 76d3591325..16c3c7f9e9 100644 --- a/quickstep/src/com/android/quickstep/views/OverviewActionsView.java +++ b/quickstep/src/com/android/quickstep/views/OverviewActionsView.java @@ -16,6 +16,8 @@ package com.android.quickstep.views; +import static com.android.quickstep.SysUINavigationMode.Mode.THREE_BUTTONS; + import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; @@ -30,6 +32,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.DeviceProfile; import com.android.launcher3.Insettable; import com.android.launcher3.R; +import com.android.launcher3.uioverrides.ApiWrapper; import com.android.launcher3.util.MultiValueAlpha; import com.android.launcher3.util.MultiValueAlpha.AlphaProperty; import com.android.quickstep.SysUINavigationMode; @@ -146,7 +149,7 @@ public class OverviewActionsView extends FrameLayo public void setInsets(Rect insets) { mInsets.set(insets); updateVerticalMargin(SysUINavigationMode.getMode(getContext())); - updateHorizontalPadding(); + updatePaddingAndTranslations(); } public void updateHiddenFlags(@ActionsHiddenFlags int visibilityFlags, boolean enable) { @@ -189,8 +192,37 @@ public class OverviewActionsView extends FrameLayo return mMultiValueAlpha.getProperty(INDEX_FULLSCREEN_ALPHA); } - private void updateHorizontalPadding() { - setPadding(mInsets.left, 0, mInsets.right, 0); + /** + * Aligns OverviewActionsView vertically with and offsets horizontal position based on + * 3 button nav container in taskbar. + */ + private void updatePaddingAndTranslations() { + boolean alignFor3ButtonTaskbar = mDp.isTaskbarPresent && + SysUINavigationMode.getMode(getContext()) == THREE_BUTTONS; + if (alignFor3ButtonTaskbar) { + // Add extra horizontal spacing + int additionalPadding = ApiWrapper.getHotseatEndOffset(getContext()); + if (isLayoutRtl()) { + setPadding(mInsets.left + additionalPadding, 0, mInsets.right, 0); + } else { + setPadding(mInsets.left, 0, mInsets.right + additionalPadding, 0); + } + + // Align vertically, using taskbar height + mDp.taskbarOffsetY() to guestimate + // where the button nav top is + View startActionView = findViewById(R.id.action_buttons); + int marginBottom = getOverviewActionsBottomMarginPx( + SysUINavigationMode.getMode(getContext()), mDp); + int actionsTop = (mDp.heightPx - marginBottom - mInsets.bottom); + int navTop = mDp.heightPx - (mDp.taskbarSize + mDp.getTaskbarOffsetY()); + int transY = navTop - actionsTop + + ((mDp.taskbarSize - startActionView.getHeight()) / 2); + setTranslationY(transY); + } else { + setPadding(mInsets.left, 0, mInsets.right, 0); + setTranslationX(0); + setTranslationY(0); + } } /** Updates vertical margins for different navigation mode or configuration changes. */ diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index 1a3bfa9958..d825fada57 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -1094,7 +1094,7 @@ public abstract class RecentsView Date: Tue, 2 Nov 2021 13:11:05 +0000 Subject: [PATCH 4/5] Add logging of draw / DeviceProfile params for a crash Bug: 203530620 Test: manual Change-Id: I376157ee3f688b16a05b59a0093f06519533f6c7 --- .../widget/DeferredAppWidgetHostView.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java b/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java index 9c32e421e6..57f8bc7717 100644 --- a/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java +++ b/src/com/android/launcher3/widget/DeferredAppWidgetHostView.java @@ -16,6 +16,7 @@ package com.android.launcher3.widget; +import android.annotation.SuppressLint; import android.appwidget.AppWidgetProviderInfo; import android.content.Context; import android.graphics.Canvas; @@ -30,6 +31,9 @@ import android.widget.RemoteViews; import com.android.launcher3.R; +import java.io.PrintWriter; +import java.io.StringWriter; + /** * A widget host views created while the host has not bind to the system service. */ @@ -75,8 +79,22 @@ public class DeferredAppWidgetHostView extends LauncherAppWidgetHostView { && mSetupTextLayout.getWidth() == availableWidth) { return; } - mSetupTextLayout = new StaticLayout(info.label, mPaint, availableWidth, - Layout.Alignment.ALIGN_CENTER, 1, 0, true); + try { + mSetupTextLayout = new StaticLayout(info.label, mPaint, availableWidth, + Layout.Alignment.ALIGN_CENTER, 1, 0, true); + } catch (IllegalArgumentException e) { + @SuppressLint("DrawAllocation") StringWriter stringWriter = new StringWriter(); + @SuppressLint("DrawAllocation") PrintWriter printWriter = new PrintWriter(stringWriter); + mActivity.getDeviceProfile().dump(/*prefix=*/"", printWriter); + printWriter.flush(); + String message = "b/203530620 " + + "- availableWidth: " + availableWidth + + ", getMeasuredWidth: " + getMeasuredWidth() + + ", getPaddingLeft: " + getPaddingLeft() + + ", getPaddingRight: " + getPaddingRight() + + ", deviceProfile: " + stringWriter.toString(); + throw new IllegalArgumentException(message, e); + } } @Override From 08c3e8f52603b4228ec747435c5a3d464ecb4f35 Mon Sep 17 00:00:00 2001 From: Alina Zaidi Date: Mon, 1 Nov 2021 19:36:41 +0000 Subject: [PATCH 5/5] Use equals() to compare UserHandle when building LauncherAtom#ItemInfo. Bug: 204756057 Test: Manually verified correct behave through logs Change-Id: Ic314e38978893984bac89988bfc3229a21d0214e --- src/com/android/launcher3/model/data/ItemInfo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/com/android/launcher3/model/data/ItemInfo.java b/src/com/android/launcher3/model/data/ItemInfo.java index 97398de3ff..b72f462a27 100644 --- a/src/com/android/launcher3/model/data/ItemInfo.java +++ b/src/com/android/launcher3/model/data/ItemInfo.java @@ -373,7 +373,7 @@ public class ItemInfo { protected LauncherAtom.ItemInfo.Builder getDefaultItemInfoBuilder() { LauncherAtom.ItemInfo.Builder itemBuilder = LauncherAtom.ItemInfo.newBuilder(); - itemBuilder.setIsWork(user != Process.myUserHandle()); + itemBuilder.setIsWork(!Process.myUserHandle().equals(user)); return itemBuilder; }