fix: A lot of stuff

This commit is contained in:
Pun Butrach
2026-01-10 20:48:21 +07:00
parent 9b279fc53a
commit 7a5699e721
29 changed files with 146 additions and 438 deletions
@@ -251,8 +251,8 @@ class LawnchairLauncher : QuickstepLauncher() {
out.add(SearchBarStateHandler(this))
}
override fun getSupportedShortcuts(): Stream<SystemShortcut.Factory<*>> = Stream.concat(
super.getSupportedShortcuts(),
override fun getSupportedShortcuts(container: Int): Stream<SystemShortcut.Factory<*>> = Stream.concat(
super.getSupportedShortcuts(container),
Stream.concat(
Stream.of(LawnchairShortcut.UNINSTALL, LawnchairShortcut.CUSTOMIZE),
if (LawnchairApp.isRecentsEnabled) Stream.of(LawnchairShortcut.PAUSE_APPS) else Stream.empty(),
@@ -282,20 +282,20 @@ class LawnchairLauncher : QuickstepLauncher() {
}
}
override fun bindItems(items: List<ItemInfo>, forceAnimateIcons: Boolean) {
fun bindItems(items: List<ItemInfo>, forceAnimateIcons: Boolean) {
val inflatedItems = items.map { i ->
Pair.create(
i,
itemInflater?.inflateItem(
i,
modelWriter,
null,
),
)
}.toList()
bindInflatedItems(inflatedItems, if (forceAnimateIcons) AnimatorSet() else null)
}
override fun handleGestureContract(intent: Intent?) {
override fun handleGestureContract(intent: Intent) {
if (!LawnchairApp.isRecentsEnabled) {
val gnc = GestureNavContract.fromIntent(intent)
if (gnc != null) {
@@ -11,6 +11,7 @@ import app.lawnchair.search.adapter.SearchTargetCompat
import app.lawnchair.search.adapter.SearchTargetCompat.Companion.RESULT_TYPE_APPLICATION
import app.lawnchair.search.adapter.SearchTargetCompat.Companion.RESULT_TYPE_SHORTCUT
import com.android.app.search.LayoutType.CALCULATOR
import com.android.app.search.LayoutType.EDUCARD
import com.android.app.search.LayoutType.EMPTY_DIVIDER
import com.android.app.search.LayoutType.EMPTY_STATE
import com.android.app.search.LayoutType.HORIZONTAL_MEDIUM_TEXT
@@ -18,6 +19,7 @@ import com.android.app.search.LayoutType.ICON_HORIZONTAL_TEXT
import com.android.app.search.LayoutType.ICON_SINGLE_VERTICAL_TEXT
import com.android.app.search.LayoutType.ICON_SLICE
import com.android.app.search.LayoutType.PEOPLE_TILE
import com.android.app.search.LayoutType.PLAY_PLACEHOLDER
import com.android.app.search.LayoutType.SEARCH_SETTINGS
import com.android.app.search.LayoutType.SMALL_ICON_HORIZONTAL_TEXT
import com.android.app.search.LayoutType.TEXT_HEADER
@@ -179,6 +181,8 @@ sealed class LawnchairSearchAlgorithm(
layoutType == CALCULATOR && calculator.isNotEmpty() -> normalBackground
layoutType == EMPTY_STATE -> transparentBackground
layoutType == SEARCH_SETTINGS -> transparentBackground
// layoutType == PLAY_PLACEHOLDER -> transparentBackground
// layoutType == EDUCARD -> transparentBackground
isFirst && isLast -> normalBackground
isFirst -> topBackground
isLast -> bottomBackground
@@ -11,15 +11,13 @@ import android.view.ViewGroup.LayoutParams.WRAP_CONTENT
import android.view.WindowManager
import android.widget.FrameLayout
import androidx.annotation.UiThread
import androidx.annotation.WorkerThread
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.LauncherAppState
import com.android.launcher3.R
import com.android.launcher3.graphics.LauncherPreviewRenderer
import com.android.launcher3.model.BgDataModel
import com.android.launcher3.preview.LauncherPreviewRenderer
import com.android.launcher3.util.ComponentKey
import com.android.launcher3.util.Executors.MAIN_EXECUTOR
import com.android.launcher3.util.Executors.MODEL_EXECUTOR
import com.android.launcher3.util.RunnableList
import com.android.launcher3.util.Themes
import com.android.launcher3.widget.LauncherWidgetHolder
@@ -31,7 +29,7 @@ class LauncherPreviewView(
context: Context,
private val idp: InvariantDeviceProfile,
private val dummySmartspace: Boolean = false,
private val dummyInsets: Boolean = false,
private val dummyInsets: Boolean = false, // Note: New Renderer calculates insets internally based on Context
private val appContext: Context = context.applicationContext,
) : FrameLayout(context) {
@@ -70,48 +68,61 @@ class LauncherPreviewView(
destroyed = true
onDestroyCallbacks.executeAllAndDestroy()
removeAllViews()
// Note: The new LauncherPreviewRenderer manages its own lifecycle observer via the Context.
// If the Renderer exposes a close/destroy method in the future, call it here to prevent Model callback leaks.
}
private fun loadAsync() {
MODEL_EXECUTOR.execute(this::loadModelData)
}
// The new Renderer requires the LauncherModel to be passed in,
// and it handles the loading callbacks internally.
val model = LauncherAppState.getInstance(appContext).model
@WorkerThread
private fun loadModelData() {
val widgetHostId = LauncherWidgetHolder.APPWIDGET_HOST_ID
LauncherAppState.getInstance(appContext).model.loadAsync { dataModel ->
if (dataModel != null) {
MAIN_EXECUTOR.execute {
val display = appContext.getSystemService(WindowManager::class.java).defaultDisplay
val themeContext = ContextThemeWrapper(context, Themes.getActivityThemeRes(context))
// Create the renderer on the Main Thread (it initializes handlers)
// Workspace.FIRST_SCREEN_ID is typically 0
val workspaceScreenId = 0
val themeRes = Themes.getActivityThemeRes(context)
val inflationContext = themeContext.createDisplayContext(display)
renderView(inflationContext, dataModel, widgetHostId, null)
}
// We use the current context. The Renderer extends BaseContext,
// so it will wrap this context internally.
val renderer = LauncherPreviewRenderer(
context,
workspaceScreenId,
null, // Wallpaper colors
model,
themeRes
)
/*
pE-TODO(QPR1/Collision-Gemini3Pro): MIGRATION NOTE
The new LauncherPreviewRenderer provided is the AOSP upstream version.
It does not yet have the Lawnchair methods 'setWorkspaceSearchContainer'.
To support 'dummySmartspace', you must re-apply the Lawnchair patch to
com.android.launcher3.preview.LauncherPreviewRenderer.java:
1. Add field: private int mWorkspaceSearchContainer = R.layout.qsb_preview;
2. Add method: public void setWorkspaceSearchContainer(int resId) { mWorkspaceSearchContainer = resId; }
3. Use 'mWorkspaceSearchContainer' inside 'bindCompleteModel' when inflating the QSB.
*/
if (dummySmartspace) {
// renderer.setWorkspaceSearchContainer(R.layout.smartspace_widget_placeholder)
}
// The renderer exposes a CompletableFuture that completes when the model is bound and view is measured
renderer.initialRender.thenAcceptAsync({ view ->
if (destroyed) return@thenAcceptAsync
if (view != null) {
configureAndAttachView(view)
} else {
onReadyCallbacks.executeAllAndDestroy()
Log.e("LauncherPreviewView", "Model loading failed")
Log.e("LauncherPreviewView", "Model loading failed or View is null")
}
}
}, MAIN_EXECUTOR)
}
@UiThread
private fun renderView(
inflationContext: Context,
dataModel: BgDataModel,
widgetHostId: Int,
widgetProviderInfoMap: Map<ComponentKey, AppWidgetProviderInfo>?,
) {
if (destroyed) {
return
}
val renderer = LauncherPreviewRenderer(inflationContext, idp, widgetHostId, null, null)
if (dummySmartspace) {
renderer.setWorkspaceSearchContainer(R.layout.smartspace_widget_placeholder)
}
val view = renderer.getRenderedView(dataModel, widgetProviderInfoMap)
private fun configureAndAttachView(view: View) {
updateScale(view)
view.pivotX = if (layoutDirection == LAYOUT_DIRECTION_RTL) view.measuredWidth.toFloat() else 0f
view.pivotY = 0f
@@ -128,7 +139,8 @@ class LauncherPreviewView(
}
private fun updateScale(view: View) {
// This aspect scales the view to fit in the surface and centers it
if (view.measuredWidth == 0 || view.measuredHeight == 0) return
val scale: Float = min(
measuredWidth / view.measuredWidth.toFloat(),
measuredHeight / view.measuredHeight.toFloat(),
@@ -109,7 +109,7 @@ public abstract class BaseWindowInterface extends
@Override
public boolean isLauncherOverlayShowing() {
if (!RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()) {
if (!RecentsWindowFlags.enableLauncherOverviewInWindow) {
return false;
}
Launcher launcher = Launcher.ACTIVITY_TRACKER.getCreatedContext();
@@ -257,4 +257,4 @@ public abstract class BaseWindowInterface extends
});
}
}
}
}
@@ -1,318 +1 @@
package com.android.quickstep;
import static android.view.Display.DEFAULT_DISPLAY;
import static com.android.launcher3.taskbar.TaskbarThresholdUtils.getFromNavThreshold;
import static com.android.launcher3.util.Executors.MAIN_EXECUTOR;
import android.content.Context;
import android.content.res.Resources;
import android.os.Bundle;
import android.view.WindowInsets;
import androidx.annotation.Nullable;
import com.android.launcher3.R;
import com.android.launcher3.taskbar.TaskbarActivityContext;
import com.android.launcher3.testing.TestInformationHandler;
import com.android.launcher3.testing.shared.TestProtocol;
import com.android.launcher3.util.DisplayController;
import com.android.quickstep.util.GroupTask;
import com.android.quickstep.util.LayoutUtils;
import com.android.quickstep.util.TISBindHelper;
import com.android.quickstep.views.RecentsView;
import com.android.quickstep.views.RecentsViewContainer;
import com.android.systemui.shared.recents.model.Task;
import com.android.wm.shell.shared.bubbles.DeviceConfig;
import java.util.ArrayList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import java.util.function.Consumer;
import java.util.function.Function;
public class QuickstepTestInformationHandler extends TestInformationHandler {
protected final Context mContext;
public QuickstepTestInformationHandler(Context context) {
mContext = context;
}
@Override
public Bundle call(String method, String arg, @Nullable Bundle extras) {
final Bundle response = new Bundle();
switch (method) {
case TestProtocol.REQUEST_RECENT_TASKS_LIST: {
ArrayList<String> taskBaseIntentComponents = new ArrayList<>();
CountDownLatch latch = new CountDownLatch(1);
RecentsModel.INSTANCE.get(mContext).getTasks((taskGroups) -> {
for (GroupTask group : taskGroups) {
for (Task t : group.getTasks()) {
taskBaseIntentComponents.add(
t.key.baseIntent.getComponent().flattenToString());
}
}
latch.countDown();
});
try {
latch.await(2, TimeUnit.SECONDS);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
response.putStringArrayList(TestProtocol.TEST_INFO_RESPONSE_FIELD,
taskBaseIntentComponents);
return response;
}
case TestProtocol.REQUEST_HOME_TO_OVERVIEW_SWIPE_HEIGHT: {
final float swipeHeight =
LayoutUtils.getDefaultSwipeHeight(mContext, mDeviceProfile);
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
return response;
}
case TestProtocol.REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT: {
final float swipeHeight = mDeviceProfile.getDeviceProperties().getHeightPx() / 2f;
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD, (int) swipeHeight);
return response;
}
case TestProtocol.REQUEST_GET_OVERVIEW_TASK_SIZE: {
return getUIProperty(Bundle::putParcelable,
recentsViewContainer ->
recentsViewContainer.<RecentsView<?, ?>>getOverviewPanel()
.getLastComputedTaskSize(),
this::getRecentsViewContainer);
}
case TestProtocol.REQUEST_GET_OVERVIEW_GRID_TASK_SIZE: {
return getUIProperty(Bundle::putParcelable,
recentsViewContainer ->
recentsViewContainer.<RecentsView<?, ?>>getOverviewPanel()
.getLastComputedGridTaskSize(),
this::getRecentsViewContainer);
}
case TestProtocol.REQUEST_GET_OVERVIEW_PAGE_SPACING: {
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
mDeviceProfile.getOverviewProfile().getPageSpacing());
return response;
}
case TestProtocol.REQUEST_GET_BUBBLE_BAR_DROP_TARGET_SIZE: {
int dimenResId = DeviceConfig.isSmallTablet(mContext)
? R.dimen.drag_zone_bubble_fold : R.dimen.drag_zone_bubble_tablet;
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
mContext.getResources().getDimensionPixelSize(dimenResId));
return response;
}
case TestProtocol.REQUEST_GET_OVERVIEW_CURRENT_PAGE_INDEX: {
return getLauncherUIProperty(Bundle::putInt,
launcher -> launcher.<RecentsView>getOverviewPanel().getCurrentPage());
}
case TestProtocol.REQUEST_GET_OVERVIEW_FIRST_TASKVIEW_INDEX: {
return getLauncherUIProperty(Bundle::putInt,
launcher ->
launcher.<RecentsView<?, ?>>getOverviewPanel()
.getFirstTaskViewIndex());
}
case TestProtocol.REQUEST_HAS_TIS: {
response.putBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD, true);
return response;
}
case TestProtocol.REQUEST_UNSTASH_TASKBAR_IF_STASHED:
runOnTISBinder(tisBinder -> {
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext()
.unstashTaskbarIfStashed();
});
return response;
case TestProtocol.REQUEST_TASKBAR_FROM_NAV_THRESHOLD: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
getFromNavThreshold(resources, mDeviceProfile));
return response;
}
case TestProtocol.REQUEST_STASHED_TASKBAR_SCALE: {
runOnTISBinder(tisBinder -> {
response.putFloat(TestProtocol.TEST_INFO_RESPONSE_FIELD,
tisBinder.getTaskbarManager()
.getCurrentActivityContext()
.getStashedTaskbarScale());
});
return response;
}
case TestProtocol.REQUEST_TASKBAR_ALL_APPS_TOP_PADDING: {
return getTISBinderUIProperty(Bundle::putInt, tisBinder ->
tisBinder.getTaskbarManager()
.getCurrentActivityContext()
.getTaskbarAllAppsTopPadding());
}
case TestProtocol.REQUEST_TASKBAR_APPS_LIST_SCROLL_Y: {
return getTISBinderUIProperty(Bundle::putInt, tisBinder ->
tisBinder.getTaskbarManager()
.getCurrentActivityContext()
.getTaskbarAllAppsScroll());
}
case TestProtocol.REQUEST_ENABLE_BLOCK_TIMEOUT:
runOnTISBinder(tisBinder -> {
enableBlockingTimeout(tisBinder, true);
});
return response;
case TestProtocol.REQUEST_DISABLE_BLOCK_TIMEOUT:
runOnTISBinder(tisBinder -> {
enableBlockingTimeout(tisBinder, false);
});
return response;
case TestProtocol.REQUEST_ENABLE_TRANSIENT_TASKBAR:
enableTransientTaskbar(true);
return response;
case TestProtocol.REQUEST_DISABLE_TRANSIENT_TASKBAR:
enableTransientTaskbar(false);
return response;
case TestProtocol.REQUEST_SHELL_DRAG_READY:
response.putBoolean(TestProtocol.TEST_INFO_RESPONSE_FIELD,
SystemUiProxy.INSTANCE.get(mContext).isDragAndDropReady());
return response;
case TestProtocol.REQUEST_REFRESH_OVERVIEW_TARGET:
runOnTISBinder(TouchInteractionService.TISBinder::refreshOverviewTargetForTest);
return response;
case TestProtocol.REQUEST_RECREATE_TASKBAR:
// Allow null-pointer to catch illegal states.
runOnTISBinder(tisBinder -> tisBinder.getTaskbarManager().recreateTaskbars());
return response;
case TestProtocol.REQUEST_TASKBAR_IME_DOCKED:
return getTISBinderUIProperty(Bundle::putBoolean, tisBinder ->
tisBinder.getTaskbarManager()
.getCurrentActivityContext().isImeDocked());
case TestProtocol.REQUEST_UNSTASH_BUBBLE_BAR_IF_STASHED:
runOnTISBinder(tisBinder -> {
// Allow null-pointer to catch illegal states.
tisBinder.getTaskbarManager().getCurrentActivityContext()
.unstashBubbleBarIfStashed();
});
return response;
case TestProtocol.REQUEST_INJECT_FAKE_TRACKPAD:
runOnTISBinder(tisBinder -> tisBinder.injectFakeTrackpadForTesting());
return response;
case TestProtocol.REQUEST_EJECT_FAKE_TRACKPAD:
runOnTISBinder(tisBinder -> tisBinder.ejectFakeTrackpadForTesting());
return response;
case TestProtocol.REQUEST_TASKBAR_PRIMARY_DISPLAY_ID: {
return getTISBinderUIProperty(Bundle::putInt, tisBinder ->
tisBinder.getTaskbarManager().getPrimaryDisplayId());
}
case TestProtocol.REQUEST_DISMISS_MAGNETIC_DETACH_THRESHOLD: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
resources.getDimensionPixelSize(R.dimen.task_dismiss_detach_threshold));
return response;
}
case TestProtocol.REQUEST_TASKBAR_ACTION_CORNER_PADDING: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
resources.getDimensionPixelSize(
R.dimen.transient_taskbar_action_corner_padding));
return response;
}
case TestProtocol.REQUEST_TASKBAR_UNSTASHED_INPUT_AREA: {
final Resources resources = mContext.getResources();
response.putInt(TestProtocol.TEST_INFO_RESPONSE_FIELD,
resources.getDimensionPixelSize(
R.dimen.taskbar_unstash_input_area));
return response;
}
}
return super.call(method, arg, extras);
}
@Override
protected WindowInsets getWindowInsets() {
RecentsViewContainer container = getRecentsViewContainer();
WindowInsets insets = container == null || container.getRootView() == null
? null : container.getRootView().getRootWindowInsets();
return insets == null ? super.getWindowInsets() : insets;
}
@Nullable
private RecentsViewContainer getRecentsViewContainer() {
// TODO (b/400647896): support per-display container in e2e tests
BaseContainerInterface<?, ?> containerInterface = OverviewComponentObserver.INSTANCE.get(
mContext)
.getContainerInterface(DEFAULT_DISPLAY);
if (containerInterface != null) {
return containerInterface.getCreatedContainer();
} else {
return null;
}
}
@Override
protected boolean isLauncherInitialized() {
return super.isLauncherInitialized() && SystemUiProxy.INSTANCE.get(mContext).isActive();
}
private void enableBlockingTimeout(
TouchInteractionService.TISBinder tisBinder, boolean enable) {
TaskbarActivityContext context = tisBinder.getTaskbarManager().getCurrentActivityContext();
if (context == null) {
return;
}
context.enableBlockingTimeoutDuringTests(enable);
}
private void enableTransientTaskbar(boolean enable) {
DisplayController.INSTANCE.get(mContext).enableTransientTaskbarForTests(enable);
}
/**
* Runs the given command on the UI thread, after ensuring we are connected to
* TouchInteractionService.
*/
protected void runOnTISBinder(Consumer<TouchInteractionService.TISBinder> connectionCallback) {
try {
CountDownLatch countDownLatch = new CountDownLatch(1);
TISBindHelper helper = MAIN_EXECUTOR.submit(() ->
new TISBindHelper(mContext, tisBinder -> {
connectionCallback.accept(tisBinder);
countDownLatch.countDown();
})).get();
countDownLatch.await();
MAIN_EXECUTOR.execute(helper::onDestroy);
} catch (ExecutionException | InterruptedException e) {
throw new RuntimeException(e);
}
}
private <T> Bundle getTISBinderUIProperty(
BundleSetter<T> bundleSetter, Function<TouchInteractionService.TISBinder, T> provider) {
Bundle response = new Bundle();
runOnTISBinder(tisBinder -> bundleSetter.set(
response,
TestProtocol.TEST_INFO_RESPONSE_FIELD,
provider.apply(tisBinder)));
return response;
}
}
// LC: No-op
@@ -158,6 +158,7 @@ public class RecentTasksList {
mSysUiProxy.registerRecentTasksListener(recentTasksListener);
tracker.addCloseable(
() -> mSysUiProxy.unregisterRecentTasksListener(recentTasksListener));
}
// We may receive onRunningTaskAppeared events later for tasks which have already been
// included in the list returned by mSysUiProxy.getRunningTasks(), or may receive
@@ -234,7 +234,7 @@ public class AppPairsController {
if (delegate == null) {
return;
}
if (RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()) {
if (RecentsWindowFlags.enableLauncherOverviewInWindow) {
PerDisplayRepository<RecentsWindowManager> recentsWindowManagerRepository =
RecentsWindowManager.REPOSITORY_INSTANCE.get(mContext.asContext());
recentsWindowManagerRepository.get(gtv.getDisplayId())
@@ -142,6 +142,7 @@ import com.android.internal.jank.Cuj;
import com.android.launcher3.AbstractFloatingView;
import com.android.launcher3.BaseActivity.MultiWindowModeChangedListener;
import com.android.launcher3.BuildConfig;
import com.android.launcher3.BuildConfigs;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Insettable;
import com.android.launcher3.PagedView;
@@ -6711,7 +6712,7 @@ public abstract class RecentsView<
*/
public void addOnScrollChangedListener(OnScrollChangedListener listener) {
if (mScrollListeners.contains(listener)) {
if (BuildConfig.IS_STUDIO_BUILD) {
if (BuildConfigs.IS_STUDIO_BUILD) {
throw new IllegalStateException(
"Should not add duplicated OnScrollChangedListener");
} else {
@@ -63,7 +63,7 @@ public abstract class AbstractQuickStepTest
@Override
protected void onLauncherActivityClose(QuickstepLauncher launcher) {
super.onLauncherActivityClose(launcher);
if (RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()) {
if (RecentsWindowFlags.enableLauncherOverviewInWindow) {
executeOnRecentsWindowIfPresent(RecentsWindowManager::cleanupRecentsWindow);
}
RecentsView recentsView = launcher.getOverviewPanel();
@@ -111,7 +111,7 @@ public abstract class AbstractQuickStepTest
@Override
protected boolean isInState(Supplier<LauncherState> state) {
if (!TestHelpers.isInLauncherProcess()) return true;
if (!RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()
if (!RecentsWindowFlags.enableLauncherOverviewInWindow
|| !hasEquivalentRecentsState(state.get())) {
return super.isInState(state);
}
@@ -124,7 +124,7 @@ public abstract class AbstractQuickStepTest
protected void waitForState(
boolean forInitialization, String message, Supplier<LauncherState> state) {
if (!TestHelpers.isInLauncherProcess()) return;
if (!RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()
if (!RecentsWindowFlags.enableLauncherOverviewInWindow
|| !hasEquivalentRecentsState(state.get())
|| (forInitialization
&& RecentsWindowManager.getRecentsWindowTracker().getCreatedContext() == null)) {
@@ -140,7 +140,7 @@ public abstract class AbstractQuickStepTest
@Nullable
protected RecentsView getOverviewPanel() {
if (!TestHelpers.isInLauncherProcess()) return null;
if (!RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue()) {
if (!RecentsWindowFlags.enableLauncherOverviewInWindow) {
return super.getOverviewPanel();
}
return getFromRecentsWindowIfPresent(RecentsWindowManager::getOverviewPanel);
@@ -149,7 +149,7 @@ public abstract class AbstractQuickStepTest
@Override
protected boolean useNullOverview() {
return super.useNullOverview()
&& !RecentsWindowFlags.enableLauncherOverviewInWindow.isTrue();
&& !RecentsWindowFlags.enableLauncherOverviewInWindow;
}
protected void assertTestActivityIsRunning(int activityNumber, String message) {
+4
View File
@@ -101,4 +101,8 @@
<!-- View tag key used to store SpringAnimation data. -->
<item type="id" name="spring_animation_tag" />
<!-- LC: Fix build issues -->
<item type="id" name="left_indicator_arrow"/>
<item type="id" name="right_indicator_arrow"/>
</resources>
@@ -302,7 +302,6 @@ public class AppWidgetResizeFrame extends AbstractFloatingView implements View.O
LauncherAppWidgetInfo widgetInfoOnView = (LauncherAppWidgetInfo) mWidgetView.getTag();
// Only show resize handles for the directions in which resizing is possible.
InvariantDeviceProfile idp = LauncherAppState.getIDP(cellLayout.getContext());
// on font / display change, the dp/px size of a cell changes, which means, existing spans
// may be invalid. User should be able to resize to the correct widget size.
+6 -9
View File
@@ -51,6 +51,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.core.content.res.ResourcesCompat;
import app.lawnchair.DeviceProfileOverrides.TextFactors;
import com.android.launcher3.CellLayout.ContainerType;
import com.android.launcher3.DevicePaddings.DevicePadding;
@@ -467,8 +468,8 @@ public class DeviceProfile {
.firstBlocking(preferenceManager2.getPageIndicatorHeightFactor());
workspacePageIndicatorHeight *= (int) pageIndicatorHeightFactor;
mWorkspacePageIndicatorOverlapWorkspace = res
.getDimensionPixelSize(R.dimen.workspace_page_indicator_overlap_workspace);
// mWorkspacePageIndicatorOverlapWorkspace = res
// .getDimensionPixelSize(R.dimen.workspace_page_indicator_overlap_workspace);
if (!mIsResponsiveGrid) {
TypedArray cellStyle;
@@ -501,11 +502,6 @@ public class DeviceProfile {
HotseatMode hotseatMode = PreferenceExtensionsKt.firstBlocking(preferenceManager2.getHotseatMode());
boolean isQsbEnable = hotseatMode.getLayoutResourceId() != R.layout.empty_view;
hotseatQsbHeight = isQsbEnable ? res.getDimensionPixelSize(R.dimen.qsb_widget_height) : 0;
hotseatQsbShadowHeight = res.getDimensionPixelSize(R.dimen.qsb_shadow_height);
hotseatQsbVisualHeight = isQsbEnable ? hotseatQsbHeight - 2 * hotseatQsbShadowHeight : 0;
numShownHotseatIcons = displayOptionSpec.numShownHotseatIcons;
mHotseatColumnSpan = inv.numColumns;
@@ -545,7 +541,8 @@ public class DeviceProfile {
shouldApplyWidePortraitDimens,
isVerticalBarLayout(),
mResponsiveHotseatSpec,
workspacePageIndicatorHeight
workspacePageIndicatorHeight,
hotseatMode
);
// Whether QSB might be inline in appropriate orientation (e.g. landscape).
@@ -1399,7 +1396,7 @@ public class DeviceProfile {
}
var allAppLeftRightMarginMultiplier = PreferenceExtensionsKt
.firstBlocking(preferenceManager2.getDrawerLeftRightMarginFactor());
var marginMultiplier = allAppLeftRightMarginMultiplier * (!isTablet ? 100 : 2);
var marginMultiplier = allAppLeftRightMarginMultiplier * (!getDeviceProperties().isTablet() ? 100 : 2);
allAppsLeftRightMargin = (int) (allAppsLeftRightMargin * marginMultiplier);
// todo fix how drawer padding values are calculated in responsive grid type
@@ -72,8 +72,8 @@ public class LauncherRootView extends InsettableFrameLayout {
private void setUpBlur(Context context) {
var display = mStatefulContainer.getDeviceProfile();
int width = display.widthPx;
int height = display.heightPx;
int width = display.getDeviceProperties().getWidthPx();
int height = display.getDeviceProperties().getHeightPx();
var wallpaper = getScaledWallpaperDrawable(width, height);
if (wallpaper == null) {
@@ -71,7 +71,7 @@ public class MainProcessInitializer implements ResourceBasedOverride {
BitmapCreationCheck.startTracking(context);
}
if (DEBUG_STRICT_MODE || (BuildConfig.IS_STUDIO_BUILD && enableStrictMode())) {
if (DEBUG_STRICT_MODE || (BuildConfigs.IS_STUDIO_BUILD && enableStrictMode())) {
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
@@ -87,7 +87,7 @@ public class MainProcessInitializer implements ResourceBasedOverride {
.build());
}
if (BuildConfig.IS_DEBUG_DEVICE && FeatureFlags.NOTIFY_CRASHES.get()) {
if (BuildConfigs.IS_DEBUG_DEVICE && FeatureFlags.NOTIFY_CRASHES.get()) {
final String notificationChannelId = "com.android.launcher3.Debug";
final String notificationChannelName = "Debug";
final String notificationTag = "Debug";
+2 -2
View File
@@ -171,7 +171,7 @@ public final class Utilities {
* @deprecated Use {@link BuildConfig#IS_DEBUG_DEVICE} directly
*/
@Deprecated
public static final boolean IS_DEBUG_DEVICE = BuildConfig.IS_DEBUG_DEVICE;
public static final boolean IS_DEBUG_DEVICE = BuildConfigs.IS_DEBUG_DEVICE;
public static final int TRANSLATE_UP = 0;
public static final int TRANSLATE_DOWN = 1;
@@ -1101,7 +1101,7 @@ public final class Utilities {
* <p>Debug devices by default include -eng and -userdebug builds, but not -user builds.
*/
public static void debugLog(String tag, String message) {
if (BuildConfig.IS_DEBUG_DEVICE) {
if (BuildConfigs.IS_DEBUG_DEVICE) {
Log.d(tag, message);
}
}
+2 -2
View File
@@ -656,7 +656,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
* Initializes and binds the first page
*/
public void bindAndInitFirstWorkspaceScreen() {
if (!BuildConfig.QSB_ON_FIRST_SCREEN) {
if (!BuildConfigs.QSB_ON_FIRST_SCREEN) {
mFirstPagePinnedItem = null;
return;
}
@@ -1094,7 +1094,7 @@ public class Workspace<T extends View & PageIndicator> extends PagedView<T>
int id = mWorkspaceScreens.keyAt(i);
CellLayout cl = mWorkspaceScreens.valueAt(i);
// FIRST_SCREEN_ID can never be removed.
if ((!BuildConfig.QSB_ON_FIRST_SCREEN || id > FIRST_SCREEN_ID)
if ((!BuildConfigs.QSB_ON_FIRST_SCREEN || id > FIRST_SCREEN_ID)
&& cl.getShortcutsAndWidgets().getChildCount() == 0) {
removeScreens.add(id);
}
@@ -412,7 +412,7 @@ public class AlphabeticalAppsList<T extends Context & ActivityContext> implement
position++;
}
} else {
if (Flags.privateSpaceAppInstallerButton()) {
if (Flags.enablePrivateSpace()) {
mPrivateProviderManager.addPrivateSpaceInstallAppButton(mAdapterItems);
position++;
}
@@ -16,10 +16,15 @@
package com.android.launcher3.deviceprofile
import android.content.Context
import android.content.res.Resources
import androidx.compose.ui.platform.LocalContext
import app.lawnchair.hotseat.HotseatMode
import app.lawnchair.preferences2.PreferenceManager2
import com.android.launcher3.InvariantDeviceProfile
import com.android.launcher3.R
import com.android.launcher3.responsive.CalculatedHotseatSpec
import com.patrykmichalik.opto.core.firstBlocking
// Remaining hotseat properties
// int numShownHotseatIcons - updates multiple times
@@ -58,6 +63,7 @@ data class HotseatProfile(
isVerticalBarLayout: Boolean,
responsiveHotseatSpec: CalculatedHotseatSpec?,
workspacePageIndicatorHeight: Int,
hotseatMode: HotseatMode,
): HotseatProfile {
val areNavButtonsInline = isTaskbarPresent && !deviceProperties.isGestureMode
var inlineNavButtonsEndSpacingPx = 0
@@ -76,7 +82,7 @@ data class HotseatProfile(
val springLoadedHotseatBarTopMarginPx =
if (shouldApplyWidePortraitDimens)
res.getDimensionPixelSize(
R.dimen.spring_loaded_hotseat_top_margin_wide_portrait
R.dimen.spring_loaded_hotseat_top_margin_wide_portrait,
)
else res.getDimensionPixelSize(R.dimen.spring_loaded_hotseat_top_margin)
val hotseatBarEdgePaddingPx =
@@ -85,11 +91,16 @@ data class HotseatProfile(
responsiveHotseatSpec != null -> responsiveHotseatSpec.edgePadding
else -> workspacePageIndicatorHeight
}
val isQsbEnable = hotseatMode.layoutResourceId != R.layout.empty_view
val hotseatBarWorkspaceSpacePx =
if (responsiveHotseatSpec != null) 0
else res.getDimensionPixelSize(R.dimen.dynamic_grid_hotseat_side_padding)
val hotseatQsbHeight = res.getDimensionPixelSize(R.dimen.qsb_widget_height)
val hotseatQsbHeight =
if (isQsbEnable) res.getDimensionPixelSize(R.dimen.qsb_widget_height) else 0
val hotseatQsbShadowHeight = res.getDimensionPixelSize(R.dimen.qsb_shadow_height)
val hotseatQsbVisualHeight =
if (isQsbEnable) hotseatQsbHeight - 2 * hotseatQsbShadowHeight else 0
return HotseatProfile(
areNavButtonsInline = areNavButtonsInline,
@@ -101,7 +112,7 @@ data class HotseatProfile(
barWorkspaceSpacePx = hotseatBarWorkspaceSpacePx,
qsbHeight = hotseatQsbHeight,
qsbShadowHeight = hotseatQsbShadowHeight,
qsbVisualHeight = hotseatQsbHeight - 2 * hotseatQsbShadowHeight,
qsbVisualHeight = hotseatQsbVisualHeight,
minIconSpacePx = res.getDimensionPixelSize(R.dimen.min_hotseat_icon_space),
minQsbWidthPx = res.getDimensionPixelSize(R.dimen.min_hotseat_qsb_width),
maxIconSpacePx =
@@ -210,7 +210,7 @@ public class FolderIcon extends FrameLayout implements FloatingIconViewCompanion
icon.mFolderName.setCompoundDrawablePadding(0);
FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams) icon.mFolderName.getLayoutParams();
if (folderInfo.container == ItemInfo.NO_ID) {
lp.topMargin = grid.allAppsIconSizePx + grid.allAppsIconDrawablePaddingPx;
lp.topMargin = grid.getAllAppsProfile().getIconSizePx() + grid.getAllAppsProfile().getIconDrawablePaddingPx();
icon.mBackground = new PreviewBackground(activity.getDragLayer().getContext());
} else {
lp.topMargin = grid.iconSizePx + grid.iconDrawablePaddingPx;
@@ -15,7 +15,7 @@
*/
package com.android.launcher3.graphics;
import static com.android.launcher3.BuildConfig.IS_DEBUG_DEVICE;
import static com.android.launcher3.BuildConfigs.IS_DEBUG_DEVICE;
import static com.android.launcher3.preview.PreviewSurfaceRenderer.KEY_BITMAP_GENERATION_DELAY_MS;
import static com.android.launcher3.preview.PreviewSurfaceRenderer.KEY_VIEW_HEIGHT;
import static com.android.launcher3.preview.PreviewSurfaceRenderer.KEY_VIEW_WIDTH;
+2 -19
View File
@@ -50,7 +50,6 @@ import androidx.core.util.Pair;
import com.android.launcher3.Flags;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherFiles;
import com.android.launcher3.Utilities;
import com.android.launcher3.dagger.ApplicationContext;
import com.android.launcher3.dagger.LauncherAppSingleton;
@@ -88,8 +87,6 @@ import java.util.stream.Stream;
import javax.inject.Inject;
import javax.inject.Named;
import app.lawnchair.icons.LawnchairIconProvider;
/**
* Cache of application icons. Icons can be made from any thread.
*/
@@ -117,20 +114,6 @@ public class IconCache extends BaseIconCache {
private int mPendingIconRequestCount = 0;
// Lawnchair: Apply 3p icon pack
public IconCache(Context context, InvariantDeviceProfile idp, LauncherIcons.IconPool iconPool, DaggerSingletonTracker lifecycle) {
this(
context,
idp,
LauncherFiles.APP_ICONS_DB,
UserCache.INSTANCE.get(context),
new LawnchairIconProvider(context),
InstallSessionHelper.INSTANCE.get(context),
iconPool,
lifecycle
);
}
@Inject
public IconCache(
@ApplicationContext Context context,
@@ -151,7 +134,7 @@ public class IconCache extends BaseIconCache {
mInstallSessionHelper = installSessionHelper;
mIconPool = iconPool;
mInstantAppResolver = InstantAppResolver.newInstance(context);
mInstantAppResolver = instantAppResolver;
mWidgetCategoryBitmapInfos = new SparseArray<>();
mCancelledTask = new CancellableTask(() -> null, MAIN_EXECUTOR, c -> { });
@@ -176,7 +159,7 @@ public class IconCache extends BaseIconCache {
mInstallSessionHelper = installSessionHelper;
mIconPool = iconPool;
mInstantAppResolver = instantAppResolver;
mInstantAppResolver = InstantAppResolver.newInstance(context);
mWidgetCategoryBitmapInfos = new SparseArray<>();
mCancelledTask = new CancellableTask(() -> null, MAIN_EXECUTOR, c -> { });
@@ -37,6 +37,7 @@ import androidx.annotation.NonNull;
import com.android.launcher3.AutoInstallsLayout;
import com.android.launcher3.AutoInstallsLayout.LayoutParserCallback;
import com.android.launcher3.BuildConfig;
import com.android.launcher3.BuildConfigs;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.Utilities;
@@ -16,7 +16,7 @@
package com.android.launcher3.model;
import static com.android.launcher3.BuildConfig.QSB_ON_FIRST_SCREEN;
import static com.android.launcher3.BuildConfigs.QSB_ON_FIRST_SCREEN;
import static com.android.launcher3.GridType.GRID_TYPE_NON_ONE_GRID;
import static com.android.launcher3.GridType.GRID_TYPE_ONE_GRID;
import static com.android.launcher3.InvariantDeviceProfile.TYPE_TABLET;
@@ -44,6 +44,7 @@ import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import com.android.launcher3.BuildConfig;
import com.android.launcher3.BuildConfigs;
import com.android.launcher3.Flags;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherModel;
@@ -645,7 +646,7 @@ public class LoaderCursor extends CursorWrapper {
if (!mOccupied.containsKey(item.screenId)) {
GridOccupancy screen = new GridOccupancy(countX + 1, countY + 1);
if (item.screenId == Workspace.FIRST_SCREEN_ID && BuildConfig.QSB_ON_FIRST_SCREEN) {
if (item.screenId == Workspace.FIRST_SCREEN_ID && BuildConfigs.QSB_ON_FIRST_SCREEN) {
// Mark the first X columns (X is width of the search container) in the first row as
// occupied (if the feature is enabled) in order to account for the search
// container.
@@ -52,13 +52,13 @@ import com.android.launcher3.LauncherPrefs;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.LauncherSettings.Favorites;
import com.android.launcher3.Utilities;
import com.android.launcher3.graphics.LauncherPreviewRenderer;
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger;
import com.android.launcher3.backuprestore.LauncherRestoreEventLogger.RestoreError;
import com.android.launcher3.dagger.ApplicationContext;
import com.android.launcher3.dagger.LauncherAppSingleton;
import com.android.launcher3.logging.FileLog;
import com.android.launcher3.pm.UserCache;
import com.android.launcher3.preview.PreviewContext;
import com.android.launcher3.provider.LauncherDbUtils;
import com.android.launcher3.provider.LauncherDbUtils.SQLiteTransaction;
import com.android.launcher3.provider.RestoreDbTask;
@@ -617,7 +617,7 @@ public class ModelDbController {
public synchronized void loadDefaultFavoritesIfNecessary() {
createDbIfNotExists();
if (!(mContext instanceof LauncherPreviewRenderer.PreviewContext)) {
if (!(mContext instanceof PreviewContext)) {
LawnchairAppKt.getLawnchairApp(mContext).cleanUpDatabases();
}
@@ -20,6 +20,7 @@ import static com.android.launcher3.WorkspaceLayoutManager.FIRST_SCREEN_ID;
import android.util.LongSparseArray;
import com.android.launcher3.BuildConfig;
import com.android.launcher3.BuildConfigs;
import com.android.launcher3.InvariantDeviceProfile;
import com.android.launcher3.LauncherModel;
import com.android.launcher3.LauncherSettings;
@@ -49,6 +49,7 @@ import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import com.android.launcher3.BuildConfig;
import com.android.launcher3.BuildConfigs;
import com.android.launcher3.CellLayout;
import com.android.launcher3.DeviceProfile;
import com.android.launcher3.Hotseat;
@@ -326,7 +327,7 @@ public class LauncherPreviewRenderer extends BaseContext
populateHotseatPredictions(itemIdMap);
// Add first page QSB
if (BuildConfig.QSB_ON_FIRST_SCREEN) {
if (BuildConfigs.QSB_ON_FIRST_SCREEN) {
CellLayout firstScreen = mWorkspaceScreens.get(FIRST_SCREEN_ID);
if (firstScreen != null) {
View qsb = mHomeElementInflater.inflate(R.layout.qsb_preview, firstScreen, false);
@@ -31,7 +31,7 @@ public final class TestProtocol {
public static final String SEARCH_RESULT_COMPLETE = "SEARCH_RESULT_COMPLETE";
public static final String LAUNCHER_ACTIVITY_STOPPED_MESSAGE = "TAPL_LAUNCHER_ACTIVITY_STOPPED";
public static final String WALLPAPER_OPEN_ANIMATION_FINISHED_MESSAGE =
"TAPL_WALLPAPER_OPEN_ANIMATION_FINISHED";
"TAPL_WALLPAPER_OPEN_ANIMATION_FINISHED";
public static final int NORMAL_STATE_ORDINAL = 0;
public static final int SPRING_LOADED_STATE_ORDINAL = 1;
public static final int OVERVIEW_STATE_ORDINAL = 2;
@@ -81,16 +81,16 @@ public final class TestProtocol {
public static final String TEST_INFO_PARAM_CELL_SPAN = "cell-span";
public static final String REQUEST_HOME_TO_OVERVIEW_SWIPE_HEIGHT =
"home-to-overview-swipe-height";
"home-to-overview-swipe-height";
public static final String REQUEST_BACKGROUND_TO_OVERVIEW_SWIPE_HEIGHT =
"background-to-overview-swipe-height";
"background-to-overview-swipe-height";
public static final String REQUEST_HOME_TO_ALL_APPS_SWIPE_HEIGHT =
"home-to-all-apps-swipe-height";
"home-to-all-apps-swipe-height";
public static final String REQUEST_ICON_HEIGHT =
"icon-height";
"icon-height";
public static final String REQUEST_IS_LAUNCHER_INITIALIZED = "is-launcher-initialized";
public static final String REQUEST_IS_LAUNCHER_LAUNCHER_ACTIVITY_STARTED =
"is-launcher-activity-started";
"is-launcher-activity-started";
public static final String REQUEST_FREEZE_APP_LIST = "freeze-app-list";
public static final String REQUEST_UNFREEZE_APP_LIST = "unfreeze-app-list";
public static final String REQUEST_ENABLE_BLOCK_TIMEOUT = "enable-block-timeout";
@@ -122,22 +122,22 @@ public final class TestProtocol {
public static final String REQUEST_HOTSEAT_ICON_NAMES = "get-hotseat-icon-names";
public static final String REQUEST_IS_TABLET = "is-tablet";
public static final String REQUEST_IS_PREDICTIVE_BACK_SWIPE_ENABLED =
"is-predictive-back-swipe-enabled";
"is-predictive-back-swipe-enabled";
public static final String REQUEST_ENABLE_TASKBAR_NAVBAR_UNIFICATION =
"enable-taskbar-navbar-unification";
"enable-taskbar-navbar-unification";
public static final String REQUEST_TASKBAR_SHOWN_ON_HOME =
"taskbar-shown-on-home";
"taskbar-shown-on-home";
public static final String REQUEST_NUM_ALL_APPS_COLUMNS = "num-all-apps-columns";
public static final String REQUEST_IS_TWO_PANELS = "is-two-panel";
public static final String REQUEST_CELL_LAYOUT_BOARDER_HEIGHT = "cell-layout-boarder-height";
public static final String REQUEST_START_DRAG_THRESHOLD = "start-drag-threshold";
public static final String REQUEST_SHELL_DRAG_READY = "shell-drag-ready";
public static final String REQUEST_GET_ACTIVITIES_CREATED_COUNT =
"get-activities-created-count";
"get-activities-created-count";
public static final String REQUEST_GET_ACTIVITIES = "get-activities";
public static final String REQUEST_HAS_TIS = "has-touch-interaction-service";
public static final String REQUEST_TASKBAR_ALL_APPS_TOP_PADDING =
"taskbar-all-apps-top-padding";
"taskbar-all-apps-top-padding";
public static final String REQUEST_ALL_APPS_TOP_PADDING = "all-apps-top-padding";
public static final String REQUEST_ALL_APPS_BOTTOM_PADDING = "all-apps-bottom-padding";
public static final String REQUEST_REFRESH_OVERVIEW_TARGET = "refresh-overview-target";
@@ -147,15 +147,20 @@ public final class TestProtocol {
public static final String REQUEST_WORKSPACE_COLUMNS_ROWS = "workspace-columns-rows";
public static final String REQUEST_WORKSPACE_CURRENT_PAGE_INDEX =
"workspace-current-page-index";
"workspace-current-page-index";
public static final String REQUEST_HOTSEAT_CELL_CENTER = "hotseat-cell-center";
public static final String REQUEST_GET_OVERVIEW_TASK_SIZE = "get-overivew-task-size";
public static final String REQUEST_GET_OVERVIEW_GRID_TASK_SIZE = "get-overivew-grid-task-size";
public static final String REQUEST_GET_OVERVIEW_PAGE_SPACING = "get-overview-page-spacing";
public static final String REQUEST_GET_BUBBLE_BAR_DROP_TARGET_SIZE =
"request-get-bubble-bar-drop-target-size";
public static final String REQUEST_GET_OVERVIEW_CURRENT_PAGE_INDEX =
"get-overview-current-page-index";
"get-overview-current-page-index";
public static final String REQUEST_GET_OVERVIEW_FIRST_TASKVIEW_INDEX =
"get-overview-first-taskview-index";
public static final String REQUEST_GET_SPLIT_SELECTION_ACTIVE = "get-split-selection-active";
public static final String REQUEST_ENABLE_ROTATION = "enable_rotation";
public static final String REQUEST_MODEL_QUEUE_CLEARED = "model-queue-cleared";
@@ -169,16 +174,26 @@ public final class TestProtocol {
public static final String REQUEST_MOCK_SENSOR_ROTATION = "mock-sensor-rotation";
public static final String PERMANENT_DIAG_TAG = "TaplTarget";
public static final String ICON_MISSING = "b/282963545";
public static final String REQUEST_FLAG_ENABLE_GRID_ONLY_OVERVIEW = "enable-grid-only-overview";
public static final String REQUEST_IS_RECENTS_WINDOW_ENABLED = "recents-window-enabled";
public static final String REQUEST_UNSTASH_BUBBLE_BAR_IF_STASHED =
"unstash-bubble-bar-if-stashed";
"unstash-bubble-bar-if-stashed";
public static final String REQUEST_INJECT_FAKE_TRACKPAD = "inject-fake-trackpad";
public static final String REQUEST_EJECT_FAKE_TRACKPAD = "eject-fake-trackpad";
public static final String REQUEST_TASKBAR_PRIMARY_DISPLAY_ID = "taskbar-primary-display-id";
public static final String REQUEST_DISMISS_MAGNETIC_DETACH_THRESHOLD =
"dismiss-magnetic-detach-threshold";
public static final String REQUEST_TASKBAR_ACTION_CORNER_PADDING =
"taskbar-action-corner-padding";
public static final String REQUEST_TASKBAR_UNSTASHED_INPUT_AREA =
"taskbar-unstashed-input-area";
/** Logs {@link Log#d(String, String)} if {@link #sDebugTracing} is true. */
public static void testLogD(String tag, String message) {
if (!sDebugTracing) {
@@ -574,16 +574,10 @@ public abstract class BaseDragLayer<T extends Context & ActivityContext>
mSystemGestureRegion.set(gestureInsets.left, gestureInsets.top, gestureInsets.right,
gestureInsets.bottom);
if (mContainer.getDeviceProfile().isTaskbarPresent) {
// Ignore taskbar gesture insets to avoid interfering with TouchControllers.
// Ignore taskbar gesture insets to avoid interfering with TouchControllers.
mSystemGestureRegion.bottom = ResourceUtils.getNavbarSize(
ResourceUtils.NAVBAR_BOTTOM_GESTURE_SIZE, getResources());
}
mSystemGestureRegion.set(
Math.max(gestureInsets.left, imeInset.left),
Math.max(gestureInsets.top, imeInset.top),
Math.max(gestureInsets.right, imeInset.right),
Math.max(gestureInsetBottom, imeInset.bottom)
);
}
return super.dispatchApplyWindowInsets(insets);
}