diff --git a/OWNERS b/OWNERS index 2d7a014ce9..4fd6a503f0 100644 --- a/OWNERS +++ b/OWNERS @@ -5,36 +5,12 @@ # adamcohen@google.com -alexchau@google.com -andonian@google.com -awickham@google.com -brdayauon@google.com -brianji@google.com captaincole@google.com -charlander@google.com -fbaron@google.com -ganjam@google.com -hwwang@google.com hyunyoungs@google.com -jagrutdesai@google.com -jeremysim@google.com -jiuyu@google.com -jonmiranda@google.com -kylim@google.com -patmanning@google.com -peanutbutter@google.com -pinyaoting@google.com -randypfohl@google.com -saumyaprakash@google.com -sihua@google.com sunnygoyal@google.com -tracyzhou@google.com -tsuharesu@google.com twickham@google.com vadimt@google.com -victortulias@google.com winsonc@google.com -xuqiu@google.com per-file FeatureFlags.java, globs = set noparent per-file FeatureFlags.java = sunnygoyal@google.com, winsonc@google.com, adamcohen@google.com, hyunyoungs@google.com, captaincole@google.com diff --git a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java index c165750db8..9bcc80405d 100644 --- a/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java +++ b/quickstep/src/com/android/launcher3/taskbar/FallbackTaskbarUIController.java @@ -77,13 +77,14 @@ public class FallbackTaskbarUIController extends TaskbarUIController { /** * Creates an animation to animate the taskbar for the given state (but does not start it). - * Currently this animation just force stashes the taskbar in Overview. */ public Animator createAnimToRecentsState(RecentsState toState, long duration) { - boolean useStashedLauncherState = toState.hasOverviewActions(); - boolean stashedLauncherState = - useStashedLauncherState && FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get() - && toState == RecentsState.MODAL_TASK; + // Force stash the taskbar in overview modal state or when going home. + boolean useStashedLauncherState = + toState.hasOverviewActions() || toState == RecentsState.HOME; + boolean stashedLauncherState = useStashedLauncherState && ( + (FeatureFlags.ENABLE_GRID_ONLY_OVERVIEW.get() && toState == RecentsState.MODAL_TASK) + || toState == RecentsState.HOME); TaskbarStashController stashController = mControllers.taskbarStashController; // Set both FLAG_IN_STASHED_LAUNCHER_STATE and FLAG_IN_APP to ensure the state is respected. // For all other states, just use the current stashed-in-app setting (e.g. if long clicked). diff --git a/quickstep/src/com/android/launcher3/uioverrides/flags/FlagsFactory.java b/quickstep/src/com/android/launcher3/uioverrides/flags/FlagsFactory.java index 888cc9d63a..f748e8a3e8 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/flags/FlagsFactory.java +++ b/quickstep/src/com/android/launcher3/uioverrides/flags/FlagsFactory.java @@ -46,7 +46,7 @@ public class FlagsFactory { private static final String TAG = "FlagsFactory"; private static final FlagsFactory INSTANCE = new FlagsFactory(); - private static final boolean FLAG_AUTO_APPLY_ENABLED = false; + private static final boolean FLAG_AUTO_APPLY_ENABLED = true; public static final String FLAGS_PREF_NAME = "featureFlags"; public static final String NAMESPACE_LAUNCHER = "launcher"; diff --git a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java index d2f9294c5b..214679acbe 100644 --- a/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java +++ b/quickstep/src/com/android/launcher3/uioverrides/states/OverviewState.java @@ -75,9 +75,17 @@ public class OverviewState extends LauncherState { @Override public ScaleAndTranslation getWorkspaceScaleAndTranslation(Launcher launcher) { RecentsView recentsView = launcher.getOverviewPanel(); - float workspacePageHeight = launcher.getDeviceProfile().getCellLayoutHeight(); recentsView.getTaskSize(sTempRect); - float scale = (float) sTempRect.height() / workspacePageHeight; + float scale; + DeviceProfile deviceProfile = launcher.getDeviceProfile(); + if (deviceProfile.isTwoPanels) { + // In two panel layout, width does not include both panels or space between them, so + // use height instead. We do not use height for handheld, as cell layout can be + // shorter than a task and we want the workspace to scale down to task size. + scale = (float) sTempRect.height() / deviceProfile.getCellLayoutHeight(); + } else { + scale = (float) sTempRect.width() / deviceProfile.getCellLayoutWidth(); + } float parallaxFactor = 0.5f; return new ScaleAndTranslation(scale, 0, -getDefaultSwipeHeight(launcher) * parallaxFactor); } diff --git a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java index 1b05fd272d..84f6b5514f 100644 --- a/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java +++ b/quickstep/src/com/android/quickstep/OrientationTouchTransformer.java @@ -33,6 +33,7 @@ import android.view.Surface; import com.android.launcher3.R; import com.android.launcher3.testing.shared.ResourceUtils; +import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.DisplayController.Info; import com.android.launcher3.util.NavigationMode; import com.android.launcher3.util.window.CachedDisplayInfo; @@ -119,7 +120,7 @@ class OrientationTouchTransformer { } void setNavigationMode(NavigationMode newMode, Info info, Resources newRes) { - if (DEBUG) { + if (enableLog()) { Log.d(TAG, "setNavigationMode new: " + newMode + " oldMode: " + mMode + " " + this); } if (mMode == newMode) { @@ -206,7 +207,7 @@ class OrientationTouchTransformer { * Ok to call multiple times. */ private void resetSwipeRegions(Info region) { - if (DEBUG) { + if (enableLog()) { Log.d(TAG, "clearing all regions except rotation: " + mCachedDisplayInfo.rotation); } @@ -230,9 +231,11 @@ class OrientationTouchTransformer { } private OrientationRectF createRegionForDisplay(Info display) { - if (DEBUG) { + if (enableLog()) { Log.d(TAG, "creating rotation region for: " + mCachedDisplayInfo.rotation - + " with mode: " + mMode + " displayRotation: " + display.rotation); + + " with mode: " + mMode + " displayRotation: " + display.rotation + + " displaySize: " + display.currentSize + + " navBarHeight: " + mNavBarGesturalHeight); } Point size = display.currentSize; @@ -296,9 +299,8 @@ class OrientationTouchTransformer { } boolean touchInValidSwipeRegions(float x, float y) { - if (DEBUG) { - Log.d(TAG, "touchInValidSwipeRegions " + x + "," + y + " in " - + mLastRectTouched + " this: " + this); + if (enableLog()) { + Log.d(TAG, "touchInValidSwipeRegions " + x + "," + y + " in " + mLastRectTouched); } if (mLastRectTouched != null) { return mLastRectTouched.contains(x, y); @@ -357,11 +359,17 @@ class OrientationTouchTransformer { } case ACTION_POINTER_DOWN: case ACTION_DOWN: { + if (enableLog()) { + Log.d(TAG, "ACTION_DOWN mLastRectTouched: " + mLastRectTouched); + } if (mLastRectTouched != null) { return; } for (OrientationRectF rect : mSwipeTouchRegions.values()) { + if (enableLog()) { + Log.d(TAG, "ACTION_DOWN rect: " + rect); + } if (rect == null) { continue; } @@ -376,7 +384,7 @@ class OrientationTouchTransformer { mQuickStepStartingRotation = mLastRectTouched.getRotation(); resetSwipeRegions(); } - if (DEBUG) { + if (enableLog()) { Log.d(TAG, "set active region: " + rect); } return; @@ -387,6 +395,10 @@ class OrientationTouchTransformer { } } + private boolean enableLog() { + return DEBUG || TestProtocol.sDebugTracing; + } + public void dump(PrintWriter pw) { pw.println("OrientationTouchTransformerState: "); pw.println(" currentActiveRotation=" + getCurrentActiveRotation()); diff --git a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java index 2bbfa28e54..b8e573a0e8 100644 --- a/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java +++ b/quickstep/src/com/android/quickstep/inputconsumers/TaskbarStashInputConsumer.java @@ -54,6 +54,7 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { private final float mScreenWidth; private final int mTaskbarNavThreshold; + private final int mTaskbarNavThresholdY; private final boolean mIsTaskbarAllAppsOpen; private boolean mHasPassedTaskbarNavThreshold; @@ -75,6 +76,8 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { Resources res = context.getResources(); mUnstashArea = res.getDimensionPixelSize(R.dimen.taskbar_unstash_input_area); mTaskbarNavThreshold = res.getDimensionPixelSize(R.dimen.taskbar_nav_threshold); + mTaskbarNavThresholdY = taskbarActivityContext.getDeviceProfile().heightPx + - mTaskbarNavThreshold; mIsTaskbarAllAppsOpen = mTaskbarActivityContext != null && mTaskbarActivityContext.isTaskbarAllAppsOpen(); @@ -165,7 +168,7 @@ public class TaskbarStashInputConsumer extends DelegateInputConsumer { } if (dY < 0) { - dY = -OverScroll.dampedScroll(-dY, mTaskbarNavThreshold); + dY = -OverScroll.dampedScroll(-dY, mTaskbarNavThresholdY); if (mTransitionCallback != null && !mIsTaskbarAllAppsOpen) { mTransitionCallback.onActionMove(dY); } diff --git a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java index 2a8bfa269d..ad11b7e953 100644 --- a/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java +++ b/quickstep/src/com/android/quickstep/util/BaseUnfoldMoveFromCenterAnimator.java @@ -86,6 +86,7 @@ public abstract class BaseUnfoldMoveFromCenterAnimator implements TransitionProg } private void clearRegisteredViews() { + restoreClippings(); mMoveFromCenterAnimation.clearRegisteredViews(); mOriginalClipChildren.clear(); diff --git a/src/com/android/launcher3/BubbleTextView.java b/src/com/android/launcher3/BubbleTextView.java index 801b740ca1..865edcd3d1 100644 --- a/src/com/android/launcher3/BubbleTextView.java +++ b/src/com/android/launcher3/BubbleTextView.java @@ -665,8 +665,9 @@ public class BubbleTextView extends TextView implements ItemInfoUpdateReceiver, getPaddingBottom()); } // only apply two line for all_apps - if (FeatureFlags.ENABLE_TWOLINE_ALLAPPS.get() && (mLastOriginalText != null) - && (mDisplay == DISPLAY_ALL_APPS)) { + if (((FeatureFlags.ENABLE_TWOLINE_ALLAPPS.get() && mDisplay == DISPLAY_ALL_APPS) + || (FeatureFlags.ENABLE_TWOLINE_DEVICESEARCH.get() + && mDisplay == DISPLAY_SEARCH_RESULT)) && (mLastOriginalText != null)) { CharSequence modifiedString = modifyTitleToSupportMultiLine( MeasureSpec.getSize(widthMeasureSpec) - getCompoundPaddingLeft() - getCompoundPaddingRight(), diff --git a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java index 8fbe997995..895020301a 100644 --- a/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java +++ b/src/com/android/launcher3/allapps/ActivityAllAppsContainerView.java @@ -19,6 +19,7 @@ import static com.android.launcher3.allapps.ActivityAllAppsContainerView.Adapter import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_COUNT; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_TAP_ON_PERSONAL_TAB; import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_ALLAPPS_TAP_ON_WORK_TAB; +import static com.android.launcher3.testing.shared.TestProtocol.WORK_TAB_MISSING; import static com.android.launcher3.util.ScrollableLayoutManager.PREDICTIVE_BACK_MIN_SCALE; import android.animation.Animator; @@ -73,6 +74,7 @@ import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.keyboard.FocusedItemDecorator; import com.android.launcher3.model.StringCache; import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.ItemInfoMatcher; import com.android.launcher3.util.Themes; import com.android.launcher3.views.ActivityContext; @@ -183,7 +185,12 @@ public class ActivityAllAppsContainerView mNavBarScrimPaint = new Paint(); mNavBarScrimPaint.setColor(Themes.getAttrColor(context, R.attr.allAppsNavBarScrimColor)); - mAllAppsStore.addUpdateListener(this::onAppsUpdated); + AllAppsStore.OnUpdateListener onAppsUpdated = this::onAppsUpdated; + if (TestProtocol.sDebugTracing) { + Log.d(WORK_TAB_MISSING, "ActivityAllAppsContainer#init registeringListener: " + + onAppsUpdated); + } + mAllAppsStore.addUpdateListener(onAppsUpdated); mActivityContext.addOnDeviceProfileChangeListener(this); // This is a focus listener that proxies focus from a view into the list view. This is to @@ -809,6 +816,10 @@ public class ActivityAllAppsContainerView private void onAppsUpdated() { mHasWorkApps = Stream.of(mAllAppsStore.getApps()).anyMatch(mWorkManager.getMatcher()); + if (TestProtocol.sDebugTracing) { + Log.d(WORK_TAB_MISSING, "ActivityAllAppsContainerView#onAppsUpdated hasWorkApps: " + + mHasWorkApps + " allApps: " + mAllAppsStore.getApps().length); + } if (!isSearching()) { rebindAdapters(); if (mHasWorkApps) { diff --git a/src/com/android/launcher3/allapps/AllAppsStore.java b/src/com/android/launcher3/allapps/AllAppsStore.java index 7bc3eecfea..a977b3a2d9 100644 --- a/src/com/android/launcher3/allapps/AllAppsStore.java +++ b/src/com/android/launcher3/allapps/AllAppsStore.java @@ -18,7 +18,9 @@ package com.android.launcher3.allapps; import static com.android.launcher3.model.data.AppInfo.COMPONENT_KEY_COMPARATOR; import static com.android.launcher3.model.data.AppInfo.EMPTY_ARRAY; import static com.android.launcher3.model.data.ItemInfoWithIcon.FLAG_SHOW_DOWNLOAD_PROGRESS_MASK; +import static com.android.launcher3.testing.shared.TestProtocol.WORK_TAB_MISSING; +import android.util.Log; import android.view.View; import android.view.ViewGroup; @@ -27,6 +29,7 @@ import androidx.annotation.Nullable; import com.android.launcher3.BubbleTextView; import com.android.launcher3.model.data.AppInfo; import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageUserKey; @@ -119,6 +122,9 @@ public class AllAppsStore { return; } for (OnUpdateListener listener : mUpdateListeners) { + if (TestProtocol.sDebugTracing) { + Log.d(WORK_TAB_MISSING, "AllAppsStore#notifyUpdate listener: " + listener); + } listener.onAppsUpdated(); } } diff --git a/src/com/android/launcher3/allapps/WorkProfileManager.java b/src/com/android/launcher3/allapps/WorkProfileManager.java index e02fa2ae06..bf36e02dad 100644 --- a/src/com/android/launcher3/allapps/WorkProfileManager.java +++ b/src/com/android/launcher3/allapps/WorkProfileManager.java @@ -25,6 +25,7 @@ import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCH import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_HAS_SHORTCUT_PERMISSION; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_CHANGE_PERMISSION; import static com.android.launcher3.model.BgDataModel.Callbacks.FLAG_QUIET_MODE_ENABLED; +import static com.android.launcher3.testing.shared.TestProtocol.WORK_TAB_MISSING; import static com.android.launcher3.util.Executors.UI_HELPER_EXECUTOR; import android.os.Build; @@ -47,6 +48,7 @@ import com.android.launcher3.allapps.BaseAllAppsAdapter.AdapterItem; import com.android.launcher3.config.FeatureFlags; import com.android.launcher3.logging.StatsLogManager; import com.android.launcher3.model.data.ItemInfo; +import com.android.launcher3.testing.shared.TestProtocol; import com.android.launcher3.workprofile.PersonalWorkSlidingTabStrip; import java.lang.annotation.Retention; @@ -143,6 +145,10 @@ public class WorkProfileManager implements PersonalWorkSlidingTabStrip.OnActiveP } private void updateCurrentState(@WorkProfileState int currentState) { + if (TestProtocol.sDebugTracing) { + Log.d(WORK_TAB_MISSING, "WorkProfileManager#updateCurrentState: " + + currentState, new Throwable()); + } mCurrentState = currentState; if (getAH() != null) { getAH().mAppsList.updateAdapterItems(); @@ -161,6 +167,10 @@ public class WorkProfileManager implements PersonalWorkSlidingTabStrip.OnActiveP * Creates and attaches for profile toggle button to {@link ActivityAllAppsContainerView} */ public boolean attachWorkModeSwitch() { + if (TestProtocol.sDebugTracing) { + Log.d(WORK_TAB_MISSING, "ActivityAllAppsContainerView#attachWorkModeSwitch " + + "mWorkModeSwitch: " + mWorkModeSwitch); + } if (!mAllApps.getAppsStore().hasModelFlag( FLAG_HAS_SHORTCUT_PERMISSION | FLAG_QUIET_MODE_CHANGE_PERMISSION)) { Log.e(TAG, "unable to attach work mode switch; Missing required permissions"); diff --git a/src/com/android/launcher3/config/FeatureFlags.java b/src/com/android/launcher3/config/FeatureFlags.java index f03be0e193..a2f37120ac 100644 --- a/src/com/android/launcher3/config/FeatureFlags.java +++ b/src/com/android/launcher3/config/FeatureFlags.java @@ -348,7 +348,7 @@ public final class FeatureFlags { "ENABLE_APP_ICON_IN_INLINE_SHORTCUTS", false, "Show app icon for inline shortcut"); public static final BooleanFlag SHOW_DOT_PAGINATION = getDebugFlag(270395278, - "SHOW_DOT_PAGINATION", false, "Enable showing dot pagination in workspace"); + "SHOW_DOT_PAGINATION", true, "Enable showing dot pagination in workspace"); public static final BooleanFlag LARGE_SCREEN_WIDGET_PICKER = getDebugFlag(270395809, "LARGE_SCREEN_WIDGET_PICKER", false, "Enable new widget picker that takes " diff --git a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java index f036b3e397..c7db2ae9f9 100644 --- a/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java +++ b/tests/shared/com/android/launcher3/testing/shared/TestProtocol.java @@ -157,6 +157,7 @@ public final class TestProtocol { public static final String NPE_TRANSIENT_TASKBAR = "b/257549303"; public static final String FLAKY_BINDING = "b/270216650"; public static final String VIEW_AND_ACTIVITY_LEAKS = "b/260260325"; + public static final String WORK_TAB_MISSING = "b/243688989"; public static final String REQUEST_EMULATE_DISPLAY = "emulate-display"; public static final String REQUEST_STOP_EMULATE_DISPLAY = "stop-emulate-display"; diff --git a/tests/src/com/android/launcher3/ui/WorkProfileTest.java b/tests/src/com/android/launcher3/ui/WorkProfileTest.java index c7628ccd63..9eeea2425a 100644 --- a/tests/src/com/android/launcher3/ui/WorkProfileTest.java +++ b/tests/src/com/android/launcher3/ui/WorkProfileTest.java @@ -18,6 +18,7 @@ package com.android.launcher3.ui; import static com.android.launcher3.LauncherState.ALL_APPS; import static com.android.launcher3.LauncherState.NORMAL; import static com.android.launcher3.allapps.AllAppsStore.DEFER_UPDATES_TEST; +import static com.android.launcher3.testing.shared.TestProtocol.WORK_TAB_MISSING; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -65,8 +66,13 @@ public class WorkProfileTest extends AbstractLauncherUiTest { String[] tokens = output.split("\\s+"); mProfileUserId = Integer.parseInt(tokens[tokens.length - 1]); output = mDevice.executeShellCommand("am start-user " + mProfileUserId); + StringBuilder logStr = new StringBuilder().append("profileId: ").append(mProfileUserId); + for (String str : tokens) { + logStr.append(str).append("\n"); + } updateWorkProfileSetupSuccessful("am start-user", output); + Log.d(WORK_TAB_MISSING, "workProfileSuccessful? " + mWorkProfileSetupSuccessful); if (!mWorkProfileSetupSuccessful) { return; // no need to setup launcher since all tests will skip. } @@ -99,6 +105,7 @@ public class WorkProfileTest extends AbstractLauncherUiTest { private void waitForWorkTabSetup() { waitForLauncherCondition("Work tab not setup", launcher -> { if (launcher.getAppsView().getContentView() instanceof AllAppsPagedView) { + Log.d(WORK_TAB_MISSING, "Deferring AppsStore updates"); launcher.getAppsView().getAppsStore().enableDeferUpdates(DEFER_UPDATES_TEST); return true; }