diff options
author | Samuel Fufa <sfufa@google.com> | 2020-09-03 09:42:54 -0700 |
---|---|---|
committer | Samuel Fufa <sfufa@google.com> | 2020-09-08 13:24:46 -0700 |
commit | 7aa577d8836c624abd876ff3914b14c232cca860 (patch) | |
tree | 97e5fb996a65d47872e8a241862cf323f2f708e3 | |
parent | b0277191f386b0fb5eeaaff9cbcf1854676f1da3 (diff) | |
download | Launcher3-7aa577d8836c624abd876ff3914b14c232cca860.tar.gz |
Show independent shortcuts from Hero view
Test: Manual
Screenshot: https://screenshot.googleplex.com/6iQGEZADXf9PtWz
Bug: 165320033
Change-Id: Ib8db1fc34da4adc39f3bec5557223a1e283380dd
4 files changed, 154 insertions, 3 deletions
diff --git a/res/layout/search_result_shortcut.xml b/res/layout/search_result_shortcut.xml new file mode 100644 index 0000000000..c350c973da --- /dev/null +++ b/res/layout/search_result_shortcut.xml @@ -0,0 +1,42 @@ +<?xml version="1.0" encoding="utf-8"?><!-- Copyright (C) 2020 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. +--> +<com.android.launcher3.views.SearchResultShortcut xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:launcher="http://schemas.android.com/apk/res-auto" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="center_vertical" + android:padding="@dimen/dynamic_grid_edge_margin"> + + <com.android.launcher3.BubbleTextView + android:id="@+id/bubble_text" + style="@style/BaseIcon" + android:drawablePadding="@dimen/dynamic_grid_icon_drawable_padding" + android:gravity="start|center_vertical" + android:textAlignment="viewStart" + android:textColor="?android:attr/textColorPrimary" + android:textSize="16sp" + android:layout_height="wrap_content" + launcher:iconDisplay="hero_app" + launcher:layoutHorizontal="true" /> + + <View + android:id="@+id/icon" + android:layout_width="@dimen/deep_shortcut_icon_size" + android:layout_height="@dimen/deep_shortcut_icon_size" + android:layout_gravity="start|center_vertical" + android:background="@drawable/ic_deepshortcut_placeholder" /> + +</com.android.launcher3.views.SearchResultShortcut>
\ No newline at end of file diff --git a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java index da161ac1cc..ad6aa63371 100644 --- a/src/com/android/launcher3/allapps/AllAppsGridAdapter.java +++ b/src/com/android/launcher3/allapps/AllAppsGridAdapter.java @@ -89,6 +89,8 @@ public class AllAppsGridAdapter extends public static final int VIEW_TYPE_SEARCH_SLICE = 1 << 9; + public static final int VIEW_TYPE_SEARCH_SHORTCUT = 1 << 10; + // Common view type masks public static final int VIEW_TYPE_MASK_DIVIDER = VIEW_TYPE_ALL_APPS_DIVIDER; public static final int VIEW_TYPE_MASK_ICON = VIEW_TYPE_ICON; @@ -179,7 +181,8 @@ public class AllAppsGridAdapter extends || viewType == VIEW_TYPE_SEARCH_HERO_APP || viewType == VIEW_TYPE_SEARCH_ROW_WITH_BUTTON || viewType == VIEW_TYPE_SEARCH_SLICE - || viewType == VIEW_TYPE_SEARCH_ROW; + || viewType == VIEW_TYPE_SEARCH_ROW + || viewType == VIEW_TYPE_SEARCH_SHORTCUT; } } @@ -426,6 +429,9 @@ public class AllAppsGridAdapter extends case VIEW_TYPE_SEARCH_SLICE: return new ViewHolder(mLayoutInflater.inflate( R.layout.search_result_slice, parent, false)); + case VIEW_TYPE_SEARCH_SHORTCUT: + return new ViewHolder(mLayoutInflater.inflate( + R.layout.search_result_shortcut, parent, false)); default: throw new RuntimeException("Unexpected view type"); } @@ -468,6 +474,7 @@ public class AllAppsGridAdapter extends case VIEW_TYPE_SEARCH_ROW_WITH_BUTTON: case VIEW_TYPE_SEARCH_HERO_APP: case VIEW_TYPE_SEARCH_ROW: + case VIEW_TYPE_SEARCH_SHORTCUT: PayloadResultHandler payloadResultView = (PayloadResultHandler) holder.itemView; payloadResultView.applyAdapterInfo( (AdapterItemWithPayload) mApps.getAdapterItems().get(position)); diff --git a/src/com/android/launcher3/views/SearchResultShortcut.java b/src/com/android/launcher3/views/SearchResultShortcut.java new file mode 100644 index 0000000000..a402719e76 --- /dev/null +++ b/src/com/android/launcher3/views/SearchResultShortcut.java @@ -0,0 +1,98 @@ +/* + * Copyright (C) 2020 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.views; + +import static com.android.launcher3.util.Executors.MODEL_EXECUTOR; + +import android.content.Context; +import android.content.pm.ShortcutInfo; +import android.util.AttributeSet; +import android.view.View; +import android.view.ViewGroup; +import android.widget.FrameLayout; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; + +import com.android.launcher3.BubbleTextView; +import com.android.launcher3.DeviceProfile; +import com.android.launcher3.Launcher; +import com.android.launcher3.LauncherAppState; +import com.android.launcher3.R; +import com.android.launcher3.allapps.AllAppsGridAdapter; +import com.android.launcher3.allapps.search.AllAppsSearchBarController; +import com.android.launcher3.model.data.WorkspaceItemInfo; +import com.android.launcher3.touch.ItemClickHandler; +import com.android.systemui.plugins.shared.SearchTarget; + +/** + * A view representing a stand alone shortcut search result + */ +public class SearchResultShortcut extends FrameLayout implements + AllAppsSearchBarController.PayloadResultHandler<SearchTarget> { + + BubbleTextView mBubbleTextView; + View mIconView; + + public SearchResultShortcut(@NonNull Context context) { + super(context); + } + + public SearchResultShortcut(@NonNull Context context, + @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public SearchResultShortcut(@NonNull Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + Launcher launcher = Launcher.getLauncher(getContext()); + DeviceProfile grid = launcher.getDeviceProfile(); + mIconView = findViewById(R.id.icon); + ViewGroup.LayoutParams iconParams = mIconView.getLayoutParams(); + iconParams.height = grid.allAppsIconSizePx; + iconParams.width = grid.allAppsIconSizePx; + mBubbleTextView = findViewById(R.id.bubble_text); + setOnClickListener(v -> handleSelection()); + } + + @Override + public void applyAdapterInfo( + AllAppsGridAdapter.AdapterItemWithPayload<SearchTarget> adapterItemWithPayload) { + SearchTarget payload = adapterItemWithPayload.getPayload(); + ShortcutInfo si = payload.shortcuts.get(0); + WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(si, getContext()); + mBubbleTextView.applyFromWorkspaceItem(workspaceItemInfo); + mIconView.setBackground(mBubbleTextView.getIcon()); + LauncherAppState launcherAppState = LauncherAppState.getInstance(getContext()); + MODEL_EXECUTOR.execute(() -> { + launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, si); + mBubbleTextView.applyFromWorkspaceItem(workspaceItemInfo); + mIconView.setBackground(mBubbleTextView.getIcon()); + }); + adapterItemWithPayload.setSelectionHandler(this::handleSelection); + } + + private void handleSelection() { + ItemClickHandler.onClickAppShortcut(this, (WorkspaceItemInfo) mBubbleTextView.getTag(), + Launcher.getLauncher(getContext())); + } +} diff --git a/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java b/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java index 913fc0ed7c..c6b8300499 100644 --- a/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java +++ b/src_plugins/com/android/systemui/plugins/shared/SearchTarget.java @@ -31,7 +31,9 @@ public class SearchTarget implements Comparable<SearchTarget> { DETAIL(2), ROW(3), ROW_WITH_BUTTON(4), - SLICE(5); + SLICE(5), + SHORTCUT(6), + PEOPLE(7); private final int mId; ViewType(int id) { @@ -48,7 +50,9 @@ public class SearchTarget implements Comparable<SearchTarget> { SETTINGS_ROW(1, "Settings", ViewType.ROW), SETTINGS_SLICE(2, "Settings", ViewType.SLICE), APP(3, "", ViewType.TOP_HIT), - APP_HERO(4, "", ViewType.HERO); + APP_HERO(4, "", ViewType.HERO), + SHORTCUT(5, "Shortcuts", ViewType.SHORTCUT), + PEOPLE(6, "People", ViewType.PEOPLE); private final int mId; private final String mTitle; |