diff options
-rw-r--r-- | res/values-land/dimens.xml | 3 | ||||
-rw-r--r-- | res/values/config.xml | 1 | ||||
-rw-r--r-- | res/values/dimens.xml | 3 | ||||
-rw-r--r-- | src/com/android/launcher3/BaseDraggingActivity.java | 19 | ||||
-rw-r--r-- | src/com/android/launcher3/DeviceProfile.java | 36 | ||||
-rw-r--r-- | src/com/android/launcher3/DropTargetBar.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/InvariantDeviceProfile.java | 8 | ||||
-rw-r--r-- | src/com/android/launcher3/Launcher.java | 9 | ||||
-rw-r--r-- | src/com/android/launcher3/Workspace.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/allapps/AllAppsGridAdapter.java | 9 | ||||
-rw-r--r-- | src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java | 4 | ||||
-rw-r--r-- | src/com/android/launcher3/model/AppLaunchTracker.java | 56 | ||||
-rw-r--r-- | src/com/android/launcher3/popup/SystemShortcut.java | 2 | ||||
-rw-r--r-- | src/com/android/launcher3/touch/ItemClickHandler.java | 29 | ||||
-rw-r--r-- | src/com/android/launcher3/views/OptionsPopupView.java | 2 | ||||
-rw-r--r-- | tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java | 2 | ||||
-rw-r--r-- | tests/tapl/com/android/launcher3/tapl/Widgets.java | 4 |
17 files changed, 138 insertions, 55 deletions
diff --git a/res/values-land/dimens.xml b/res/values-land/dimens.xml index b2f357565..bc658e483 100644 --- a/res/values-land/dimens.xml +++ b/res/values-land/dimens.xml @@ -27,9 +27,6 @@ <!-- Dynamic grid --> <dimen name="dynamic_grid_icon_drawable_padding">4dp</dimen> - <dimen name="dynamic_grid_cell_layout_padding">0dp</dimen> - <dimen name="dynamic_grid_cell_layout_bottom_padding">5.5dp</dimen> - <!-- Hotseat --> <dimen name="dynamic_grid_hotseat_side_padding">16dp</dimen> </resources> diff --git a/res/values/config.xml b/res/values/config.xml index 6bd01b579..4b68b5064 100644 --- a/res/values/config.xml +++ b/res/values/config.xml @@ -70,6 +70,7 @@ <string name="instant_app_resolver_class" translatable="false"></string> <string name="main_process_initializer_class" translatable="false"></string> <string name="system_shortcut_factory_class" translatable="false"></string> + <string name="app_launch_tracker_class" translatable="false"></string> <!-- Package name of the default wallpaper picker. --> <string name="wallpaper_picker_package" translatable="false"></string> diff --git a/res/values/dimens.xml b/res/values/dimens.xml index 04e4591be..7822e0547 100644 --- a/res/values/dimens.xml +++ b/res/values/dimens.xml @@ -22,13 +22,10 @@ <dimen name="dynamic_grid_edge_margin">8dp</dimen> <dimen name="dynamic_grid_page_indicator_line_height">1dp</dimen> <dimen name="dynamic_grid_icon_drawable_padding">8dp</dimen> - <dimen name="dynamic_grid_workspace_top_padding">8dp</dimen> - <dimen name="dynamic_grid_workspace_page_spacing">8dp</dimen> <!-- Minimum space between workspace and hotseat in spring loaded mode --> <dimen name="dynamic_grid_min_spring_loaded_space">8dp</dimen> <dimen name="dynamic_grid_cell_layout_padding">5.5dp</dimen> - <dimen name="dynamic_grid_cell_layout_bottom_padding">0dp</dimen> <dimen name="dynamic_grid_cell_padding_x">8dp</dimen> <!-- Hotseat --> diff --git a/src/com/android/launcher3/BaseDraggingActivity.java b/src/com/android/launcher3/BaseDraggingActivity.java index ff9dd131b..18599ac69 100644 --- a/src/com/android/launcher3/BaseDraggingActivity.java +++ b/src/com/android/launcher3/BaseDraggingActivity.java @@ -16,6 +16,8 @@ package com.android.launcher3; +import static com.android.launcher3.model.AppLaunchTracker.CONTAINER_SEARCH; + import android.app.ActivityOptions; import android.content.ActivityNotFoundException; import android.content.Intent; @@ -32,10 +34,13 @@ import android.widget.Toast; import com.android.launcher3.LauncherSettings.Favorites; import com.android.launcher3.compat.LauncherAppsCompat; +import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.shortcuts.DeepShortcutManager; import com.android.launcher3.uioverrides.DisplayRotationListener; import com.android.launcher3.uioverrides.WallpaperColorInfo; +import androidx.annotation.Nullable; + /** * Extension of BaseActivity allowing support for drag-n-drop */ @@ -148,7 +153,8 @@ public abstract class BaseDraggingActivity extends BaseActivity public abstract ActivityOptions getActivityLaunchOptions(View v); - public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { + public boolean startActivitySafely(View v, Intent intent, @Nullable ItemInfo item, + @Nullable String sourceContainer) { if (mIsSafeModeEnabled && !Utilities.isSystemApp(this, intent)) { Toast.makeText(this, R.string.safemode_shortcut_error, Toast.LENGTH_SHORT).show(); return false; @@ -169,13 +175,17 @@ public abstract class BaseDraggingActivity extends BaseActivity && !((ShortcutInfo) item).isPromise(); if (isShortcut) { // Shortcuts need some special checks due to legacy reasons. - startShortcutIntentSafely(intent, optsBundle, item); + startShortcutIntentSafely(intent, optsBundle, item, sourceContainer); } else if (user == null || user.equals(Process.myUserHandle())) { // Could be launching some bookkeeping activity startActivity(intent, optsBundle); + AppLaunchTracker.INSTANCE.get(this).onStartApp(intent.getComponent(), + Process.myUserHandle(), sourceContainer); } else { LauncherAppsCompat.getInstance(this).startActivityForProfile( intent.getComponent(), user, intent.getSourceBounds(), optsBundle); + AppLaunchTracker.INSTANCE.get(this).onStartApp(intent.getComponent(), user, + sourceContainer); } getUserEventDispatcher().logAppLaunch(v, intent); getStatsLogManager().logAppLaunch(v, intent); @@ -187,7 +197,8 @@ public abstract class BaseDraggingActivity extends BaseActivity return false; } - private void startShortcutIntentSafely(Intent intent, Bundle optsBundle, ItemInfo info) { + private void startShortcutIntentSafely(Intent intent, Bundle optsBundle, ItemInfo info, + @Nullable String sourceContainer) { try { StrictMode.VmPolicy oldPolicy = StrictMode.getVmPolicy(); try { @@ -202,6 +213,8 @@ public abstract class BaseDraggingActivity extends BaseActivity String packageName = intent.getPackage(); DeepShortcutManager.getInstance(this).startShortcut( packageName, id, intent.getSourceBounds(), optsBundle, info.user); + AppLaunchTracker.INSTANCE.get(this).onStartShortcut(packageName, id, info.user, + sourceContainer); } else { // Could be launching some bookkeeping activity startActivity(intent, optsBundle); diff --git a/src/com/android/launcher3/DeviceProfile.java b/src/com/android/launcher3/DeviceProfile.java index 7919d2935..6397e14ac 100644 --- a/src/com/android/launcher3/DeviceProfile.java +++ b/src/com/android/launcher3/DeviceProfile.java @@ -16,8 +16,6 @@ package com.android.launcher3; -import android.appwidget.AppWidgetHostView; -import android.content.ComponentName; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -70,9 +68,6 @@ public class DeviceProfile { public final int cellLayoutPaddingLeftRightPx; public final int cellLayoutBottomPaddingPx; public final int edgeMarginPx; - public final Rect defaultWidgetPadding; - public final int defaultPageSpacingPx; - private final int topWorkspacePadding; public float workspaceSpringLoadShrinkFactor; public final int workspaceSpringLoadedBottomSpace; @@ -177,26 +172,25 @@ public class DeviceProfile { : Configuration.ORIENTATION_PORTRAIT); res = context.getResources(); - - ComponentName cn = new ComponentName(context.getPackageName(), - this.getClass().getName()); - defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null); edgeMarginPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_edge_margin); desiredWorkspaceLeftRightMarginPx = isVerticalBarLayout() ? 0 : edgeMarginPx; + int cellLayoutPaddingLeftRightMultiplier = !isVerticalBarLayout() && isTablet ? PORTRAIT_TABLET_LEFT_RIGHT_PADDING_MULTIPLIER : 1; - cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier * - res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding); - cellLayoutBottomPaddingPx = - res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_bottom_padding); + int cellLayoutPadding = res.getDimensionPixelSize(R.dimen.dynamic_grid_cell_layout_padding); + if (isLandscape) { + cellLayoutPaddingLeftRightPx = 0; + cellLayoutBottomPaddingPx = cellLayoutPadding; + } else { + cellLayoutPaddingLeftRightPx = cellLayoutPaddingLeftRightMultiplier * cellLayoutPadding; + cellLayoutBottomPaddingPx = 0; + } + verticalDragHandleSizePx = res.getDimensionPixelSize( R.dimen.vertical_drag_handle_size); verticalDragHandleOverlapWorkspace = res.getDimensionPixelSize(R.dimen.vertical_drag_handle_overlap_workspace); - defaultPageSpacingPx = - res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_page_spacing); - topWorkspacePadding = - res.getDimensionPixelSize(R.dimen.dynamic_grid_workspace_top_padding); + iconDrawablePaddingOriginalPx = res.getDimensionPixelSize(R.dimen.dynamic_grid_icon_drawable_padding); dropTargetBarSizePx = res.getDimensionPixelSize(R.dimen.dynamic_grid_drop_target_size); @@ -360,7 +354,7 @@ public class DeviceProfile { if (!isVerticalLayout) { int expectedWorkspaceHeight = availableHeightPx - hotseatBarSizePx - - verticalDragHandleSizePx - topWorkspacePadding; + - verticalDragHandleSizePx - edgeMarginPx; float minRequiredHeight = dropTargetBarSizePx + workspaceSpringLoadedBottomSpace; workspaceSpringLoadShrinkFactor = Math.min( res.getInteger(R.integer.config_workspaceSpringLoadShrinkPercentage) / 100.0f, @@ -471,15 +465,15 @@ public class DeviceProfile { ((inv.numColumns - 1) * cellWidthPx))); availablePaddingX = (int) Math.min(availablePaddingX, widthPx * MAX_HORIZONTAL_PADDING_PERCENT); - int availablePaddingY = Math.max(0, heightPx - topWorkspacePadding - paddingBottom + int availablePaddingY = Math.max(0, heightPx - edgeMarginPx - paddingBottom - (2 * inv.numRows * cellHeightPx) - hotseatBarTopPaddingPx - hotseatBarBottomPaddingPx); - padding.set(availablePaddingX / 2, topWorkspacePadding + availablePaddingY / 2, + padding.set(availablePaddingX / 2, edgeMarginPx + availablePaddingY / 2, availablePaddingX / 2, paddingBottom + availablePaddingY / 2); } else { // Pad the top and bottom of the workspace with search/hotseat bar sizes padding.set(desiredWorkspaceLeftRightMarginPx, - topWorkspacePadding, + edgeMarginPx, desiredWorkspaceLeftRightMarginPx, paddingBottom); } diff --git a/src/com/android/launcher3/DropTargetBar.java b/src/com/android/launcher3/DropTargetBar.java index d025a9b99..0543e8d71 100644 --- a/src/com/android/launcher3/DropTargetBar.java +++ b/src/com/android/launcher3/DropTargetBar.java @@ -104,7 +104,7 @@ public class DropTargetBar extends FrameLayout / (2 * (grid.inv.numColumns + 1))) + grid.edgeMarginPx; } else { - gap = grid.desiredWorkspaceLeftRightMarginPx - grid.defaultWidgetPadding.right; + gap = grid.desiredWorkspaceLeftRightMarginPx - grid.inv.defaultWidgetPadding.right; } lp.width = grid.availableWidthPx - 2 * gap; diff --git a/src/com/android/launcher3/InvariantDeviceProfile.java b/src/com/android/launcher3/InvariantDeviceProfile.java index f08130314..c4495c714 100644 --- a/src/com/android/launcher3/InvariantDeviceProfile.java +++ b/src/com/android/launcher3/InvariantDeviceProfile.java @@ -20,7 +20,9 @@ import static com.android.launcher3.config.FeatureFlags.APPLY_CONFIG_AT_RUNTIME; import static com.android.launcher3.Utilities.getDevicePrefs; import android.annotation.TargetApi; +import android.appwidget.AppWidgetHostView; import android.content.BroadcastReceiver; +import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; @@ -29,6 +31,7 @@ import android.content.res.Resources; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Point; +import android.graphics.Rect; import android.text.TextUtils; import android.util.AttributeSet; import android.util.DisplayMetrics; @@ -114,6 +117,7 @@ public class InvariantDeviceProfile { public DeviceProfile portraitProfile; public Point defaultWallpaperSize; + public Rect defaultWidgetPadding; private final ArrayList<OnIDPChangeListener> mChangeListeners = new ArrayList<>(); private ConfigMonitor mConfigMonitor; @@ -235,6 +239,10 @@ public class InvariantDeviceProfile { } else { defaultWallpaperSize = new Point(Math.max(smallSide * 2, largeSide), largeSide); } + + ComponentName cn = new ComponentName(context.getPackageName(), getClass().getName()); + defaultWidgetPadding = AppWidgetHostView.getDefaultPaddingForWidget(context, cn, null); + return closestProfile.name; } diff --git a/src/com/android/launcher3/Launcher.java b/src/com/android/launcher3/Launcher.java index f283a6c26..867001ab4 100644 --- a/src/com/android/launcher3/Launcher.java +++ b/src/com/android/launcher3/Launcher.java @@ -97,6 +97,7 @@ import com.android.launcher3.logging.FileLog; import com.android.launcher3.logging.StatsLogUtils; import com.android.launcher3.logging.UserEventDispatcher; import com.android.launcher3.logging.UserEventDispatcher.UserEventDelegate; +import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.model.ModelWriter; import com.android.launcher3.notification.NotificationListener; import com.android.launcher3.popup.PopupContainerWithArrow; @@ -694,7 +695,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { - startActivitySafely(v, intent, null); + startActivitySafely(v, intent, null, null); } else { // TODO: Show a snack bar with link to settings Toast.makeText(this, getString(R.string.msg_no_phone_permission, @@ -798,6 +799,7 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, getUserEventDispatcher().startSession(); UiFactory.onLauncherStateOrResumeChanged(this); + AppLaunchTracker.INSTANCE.get(this).onReturnedToHome(); } } @@ -1652,8 +1654,9 @@ public class Launcher extends BaseDraggingActivity implements LauncherExterns, } } - public boolean startActivitySafely(View v, Intent intent, ItemInfo item) { - boolean success = super.startActivitySafely(v, intent, item); + public boolean startActivitySafely(View v, Intent intent, ItemInfo item, + @Nullable String sourceContainer) { + boolean success = super.startActivitySafely(v, intent, item, sourceContainer); if (success && v instanceof BubbleTextView) { // This is set to the view that launched the activity that navigated the user away // from launcher. Since there is no callback for when the activity has finished diff --git a/src/com/android/launcher3/Workspace.java b/src/com/android/launcher3/Workspace.java index 720a69236..d05f91637 100644 --- a/src/com/android/launcher3/Workspace.java +++ b/src/com/android/launcher3/Workspace.java @@ -298,12 +298,12 @@ public class Workspace extends PagedView<WorkspacePageIndicator> if (grid.shouldFadeAdjacentWorkspaceScreens()) { // In landscape mode the page spacing is set to the default. - setPageSpacing(grid.defaultPageSpacingPx); + setPageSpacing(grid.edgeMarginPx); } else { // In portrait, we want the pages spaced such that there is no // overhang of the previous / next page into the current page viewport. // We assume symmetrical padding in portrait mode. - setPageSpacing(Math.max(grid.defaultPageSpacingPx, padding.left + 1)); + setPageSpacing(Math.max(grid.edgeMarginPx, padding.left + 1)); } int paddingLeftRight = grid.cellLayoutPaddingLeftRightPx; diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index 69b4bdb1d..3cfa0b1ec 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -32,6 +32,7 @@ import com.android.launcher3.Launcher; import com.android.launcher3.R; import com.android.launcher3.allapps.AlphabeticalAppsList.AdapterItem; import com.android.launcher3.compat.UserManagerCompat; +import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.touch.ItemClickHandler; import com.android.launcher3.touch.ItemLongClickListener; import com.android.launcher3.util.PackageManagerHelper; @@ -263,12 +264,8 @@ public class AllAppsGridAdapter extends RecyclerView.Adapter<AllAppsGridAdapter. case VIEW_TYPE_SEARCH_MARKET: View searchMarketView = mLayoutInflater.inflate(R.layout.all_apps_search_market, parent, false); - searchMarketView.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - mLauncher.startActivitySafely(v, mMarketSearchIntent, null); - } - }); + searchMarketView.setOnClickListener(v -> mLauncher.startActivitySafely( + v, mMarketSearchIntent, null, AppLaunchTracker.CONTAINER_SEARCH)); return new ViewHolder(searchMarketView); case VIEW_TYPE_ALL_APPS_DIVIDER: return new ViewHolder(mLayoutInflater.inflate( diff --git a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java index 91be504ef..4515dde25 100644 --- a/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java +++ b/src/com/android/launcher3/allapps/search/AllAppsSearchBarController.java @@ -28,6 +28,7 @@ import android.widget.TextView.OnEditorActionListener; import com.android.launcher3.ExtendedEditText; import com.android.launcher3.Launcher; import com.android.launcher3.Utilities; +import com.android.launcher3.model.AppLaunchTracker; import com.android.launcher3.util.ComponentKey; import com.android.launcher3.util.PackageManagerHelper; @@ -111,7 +112,8 @@ public class AllAppsSearchBarController return false; } return mLauncher.startActivitySafely(v, - PackageManagerHelper.getMarketSearchIntent(mLauncher, query), null); + PackageManagerHelper.getMarketSearchIntent(mLauncher, query), null, + AppLaunchTracker.CONTAINER_SEARCH); } @Override diff --git a/src/com/android/launcher3/model/AppLaunchTracker.java b/src/com/android/launcher3/model/AppLaunchTracker.java new file mode 100644 index 000000000..1613d47b9 --- /dev/null +++ b/src/com/android/launcher3/model/AppLaunchTracker.java @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2019 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.android.launcher3.model; + +import static com.android.launcher3.util.ResourceBasedOverride.Overrides.getObject; + +import android.content.ComponentName; +import android.os.UserHandle; + +import com.android.launcher3.R; +import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; +import com.android.launcher3.util.MainThreadInitializedObject; +import com.android.launcher3.util.ResourceBasedOverride; + +import androidx.annotation.Nullable; + +/** + * Callback for receiving various app launch events + */ +public class AppLaunchTracker implements ResourceBasedOverride { + + /** + * Derived from LauncherEvent proto. + * TODO: Use proper descriptive constants + */ + public static final String CONTAINER_DEFAULT = Integer.toString(ContainerType.WORKSPACE); + public static final String CONTAINER_ALL_APPS = Integer.toString(ContainerType.ALLAPPS); + public static final String CONTAINER_PREDICTIONS = Integer.toString(ContainerType.PREDICTION); + public static final String CONTAINER_SEARCH = Integer.toString(ContainerType.SEARCHRESULT); + + + public static final MainThreadInitializedObject<AppLaunchTracker> INSTANCE = + new MainThreadInitializedObject<>(c -> + getObject(AppLaunchTracker.class, c, R.string.app_launch_tracker_class)); + + public void onStartShortcut(String packageName, String shortcutId, UserHandle user, + @Nullable String container) { } + + public void onStartApp(ComponentName componentName, UserHandle user, + @Nullable String container) { } + + public void onReturnedToHome() { } +} diff --git a/src/com/android/launcher3/popup/SystemShortcut.java b/src/com/android/launcher3/popup/SystemShortcut.java index fdc1b39d7..e7b829261 100644 --- a/src/com/android/launcher3/popup/SystemShortcut.java +++ b/src/com/android/launcher3/popup/SystemShortcut.java @@ -195,7 +195,7 @@ public abstract class SystemShortcut<T extends BaseDraggingActivity> extends Ite return view -> { Intent intent = new PackageManagerHelper(view.getContext()).getMarketIntent( itemInfo.getTargetComponent().getPackageName()); - activity.startActivitySafely(view, intent, itemInfo); + activity.startActivitySafely(view, intent, itemInfo, null); AbstractFloatingView.closeAllOpenViews(activity); }; } diff --git a/src/com/android/launcher3/touch/ItemClickHandler.java b/src/com/android/launcher3/touch/ItemClickHandler.java index 52fef9f7d..363909002 100644 --- a/src/com/android/launcher3/touch/ItemClickHandler.java +++ b/src/com/android/launcher3/touch/ItemClickHandler.java @@ -22,6 +22,8 @@ import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SAFEMODE; import static com.android.launcher3.ItemInfoWithIcon.FLAG_DISABLED_SUSPENDED; import static com.android.launcher3.Launcher.REQUEST_BIND_PENDING_APPWIDGET; import static com.android.launcher3.Launcher.REQUEST_RECONFIGURE_APPWIDGET; +import static com.android.launcher3.model.AppLaunchTracker.CONTAINER_ALL_APPS; +import static com.android.launcher3.model.AppLaunchTracker.CONTAINER_DEFAULT; import android.app.AlertDialog; import android.content.Intent; @@ -48,6 +50,8 @@ import com.android.launcher3.util.PackageManagerHelper; import com.android.launcher3.widget.PendingAppWidgetHostView; import com.android.launcher3.widget.WidgetAddFlowHandler; +import androidx.annotation.Nullable; + /** * Class for handling clicks on workspace and all-apps items */ @@ -56,9 +60,13 @@ public class ItemClickHandler { /** * Instance used for click handling on items */ - public static final OnClickListener INSTANCE = ItemClickHandler::onClick; + public static final OnClickListener INSTANCE = getInstance(null); + + public static final OnClickListener getInstance(String sourceContainer) { + return v -> onClick(v, sourceContainer); + } - private static void onClick(View v) { + private static void onClick(View v, String sourceContainer) { // Make sure that rogue clicks don't get through while allapps is launching, or after the // view has detached (it's possible for this to happen if the view is removed mid touch). if (v.getWindowToken() == null) { @@ -72,13 +80,14 @@ public class ItemClickHandler { Object tag = v.getTag(); if (tag instanceof ShortcutInfo) { - onClickAppShortcut(v, (ShortcutInfo) tag, launcher); + onClickAppShortcut(v, (ShortcutInfo) tag, launcher, sourceContainer); } else if (tag instanceof FolderInfo) { if (v instanceof FolderIcon) { onClickFolderIcon(v); } } else if (tag instanceof AppInfo) { - startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher); + startAppShortcutOrInfoActivity(v, (AppInfo) tag, launcher, + sourceContainer == null ? CONTAINER_ALL_APPS: sourceContainer); } else if (tag instanceof LauncherAppWidgetInfo) { if (v instanceof PendingAppWidgetHostView) { onClickPendingWidget((PendingAppWidgetHostView) v, launcher); @@ -154,7 +163,7 @@ public class ItemClickHandler { private static void startMarketIntentForPackage(View v, Launcher launcher, String packageName) { ItemInfo item = (ItemInfo) v.getTag(); Intent intent = new PackageManagerHelper(launcher).getMarketIntent(packageName); - launcher.startActivitySafely(v, intent, item); + launcher.startActivitySafely(v, intent, item, null); } /** @@ -162,7 +171,8 @@ public class ItemClickHandler { * * @param v The view that was clicked. Must be a tagged with a {@link ShortcutInfo}. */ - public static void onClickAppShortcut(View v, ShortcutInfo shortcut, Launcher launcher) { + public static void onClickAppShortcut(View v, ShortcutInfo shortcut, Launcher launcher, + @Nullable String sourceContainer) { if (shortcut.isDisabled()) { final int disabledFlags = shortcut.runtimeStatusFlags & ShortcutInfo.FLAG_DISABLED_MASK; if ((disabledFlags & @@ -201,10 +211,11 @@ public class ItemClickHandler { } // Start activities - startAppShortcutOrInfoActivity(v, shortcut, launcher); + startAppShortcutOrInfoActivity(v, shortcut, launcher, sourceContainer); } - private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher) { + private static void startAppShortcutOrInfoActivity(View v, ItemInfo item, Launcher launcher, + @Nullable String sourceContainer) { Intent intent; if (item instanceof PromiseAppInfo) { PromiseAppInfo promiseAppInfo = (PromiseAppInfo) item; @@ -227,6 +238,6 @@ public class ItemClickHandler { intent.setPackage(null); } } - launcher.startActivitySafely(v, intent, item); + launcher.startActivitySafely(v, intent, item, sourceContainer); } } diff --git a/src/com/android/launcher3/views/OptionsPopupView.java b/src/com/android/launcher3/views/OptionsPopupView.java index e259cfea7..6a2f0ffa2 100644 --- a/src/com/android/launcher3/views/OptionsPopupView.java +++ b/src/com/android/launcher3/views/OptionsPopupView.java @@ -217,7 +217,7 @@ public class OptionsPopupView extends ArrowPopup if (!TextUtils.isEmpty(pickerPackage)) { intent.setPackage(pickerPackage); } - return launcher.startActivitySafely(v, intent, null); + return launcher.startActivitySafely(v, intent, null, null); } public static class OptionItem { diff --git a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java index fbb4f5115..68b16d6db 100644 --- a/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java +++ b/tests/src/com/android/launcher3/ui/widget/BindWidgetTest.java @@ -145,7 +145,7 @@ public class BindWidgetTest extends AbstractLauncherUiTest { assertFalse(mDevice.findObject(new UiSelector().description(info.label)).exists()); } - @Test + @Test @Ignore public void testPendingWidget_autoRestored() { // A non-restored widget with no config screen gets restored automatically. LauncherAppWidgetProviderInfo info = TestViewHelpers.findWidgetProvider(this, false); diff --git a/tests/tapl/com/android/launcher3/tapl/Widgets.java b/tests/tapl/com/android/launcher3/tapl/Widgets.java index b6938d6bc..2de53c3f5 100644 --- a/tests/tapl/com/android/launcher3/tapl/Widgets.java +++ b/tests/tapl/com/android/launcher3/tapl/Widgets.java @@ -36,6 +36,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { public void flingForward() { try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "want to fling forward in widgets")) { + LauncherInstrumentation.log("Widgets.flingForward enter"); final UiObject2 widgetsContainer = verifyActiveContainer(); widgetsContainer.setGestureMargin(100); widgetsContainer.fling(Direction.DOWN, @@ -43,6 +44,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer("flung forward")) { verifyActiveContainer(); } + LauncherInstrumentation.log("Widgets.flingForward exit"); } } @@ -52,6 +54,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { public void flingBackward() { try (LauncherInstrumentation.Closable c = mLauncher.addContextLayer( "want to fling backwards in widgets")) { + LauncherInstrumentation.log("Widgets.flingBackward enter"); final UiObject2 widgetsContainer = verifyActiveContainer(); widgetsContainer.setGestureMargin(100); widgetsContainer.fling(Direction.UP, @@ -60,6 +63,7 @@ public final class Widgets extends LauncherInstrumentation.VisibleContainer { try (LauncherInstrumentation.Closable c1 = mLauncher.addContextLayer("flung back")) { verifyActiveContainer(); } + LauncherInstrumentation.log("Widgets.flingBackward exit"); } } |