Polish search result icons

SearchResultIconRow consumes a loaded ItemInfoWithIcon from its child SearchResult and updates other siblings with itemInfo.

preview: https://drive.google.com/file/d/1ijZsR5Q6M0DeZdlRJWpRb4AKmmTLBElY/view?usp=sharing
Change-Id: Ibb3fb697494749fd2e886dcdaa93241767a65944
This commit is contained in:
Samuel Fufa 2020-11-09 15:58:21 -06:00
parent a204de7d12
commit 81de07e405
3 changed files with 50 additions and 42 deletions

View File

@ -30,8 +30,6 @@ import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.UiThread;
import com.android.launcher3.BubbleTextView;
import com.android.launcher3.Launcher;
import com.android.launcher3.LauncherAppState;
@ -49,6 +47,8 @@ import com.android.launcher3.util.ComponentKey;
import com.android.systemui.plugins.shared.SearchTarget;
import com.android.systemui.plugins.shared.SearchTargetEvent;
import java.util.function.Consumer;
/**
* A {@link BubbleTextView} representing a single cell result in AllApps
*/
@ -61,7 +61,6 @@ public class SearchResultIcon extends BubbleTextView implements
public static final String TARGET_TYPE_HERO_APP = "hero_app";
public static final String TARGET_TYPE_SHORTCUT = "shortcut";
public static final String TARGET_TYPE_REMOTE_ACTION = "remote_action";
public static final String TARGET_TYPE_SUGGEST = "suggest";
public static final String REMOTE_ACTION_SHOULD_START = "should_start_for_result";
public static final String REMOTE_ACTION_TOKEN = "action_token";
@ -73,6 +72,7 @@ public class SearchResultIcon extends BubbleTextView implements
private final Launcher mLauncher;
private SearchTarget mSearchTarget;
private Consumer<ItemInfoWithIcon> mOnItemInfoChanged;
public SearchResultIcon(Context context) {
this(context, null, 0);
@ -98,6 +98,15 @@ public class SearchResultIcon extends BubbleTextView implements
mLauncher.getDeviceProfile().allAppsCellHeightPx));
}
/**
* Applies search target with a ItemInfoWithIcon consumer to be called after itemInfo is
* constructed
*/
public void applySearchTarget(SearchTarget searchTarget, Consumer<ItemInfoWithIcon> cb) {
mOnItemInfoChanged = cb;
applySearchTarget(searchTarget);
}
@Override
public void applySearchTarget(SearchTarget searchTarget) {
mSearchTarget = searchTarget;
@ -111,7 +120,6 @@ public class SearchResultIcon extends BubbleTextView implements
prepareUsingShortcutInfo(searchTarget.getShortcutInfos().get(0));
break;
case TARGET_TYPE_REMOTE_ACTION:
case TARGET_TYPE_SUGGEST:
prepareUsingRemoteAction(searchTarget.getRemoteAction(),
searchTarget.getExtras().getString(REMOTE_ACTION_TOKEN),
searchTarget.getExtras().getBoolean(REMOTE_ACTION_SHOULD_START),
@ -124,53 +132,45 @@ public class SearchResultIcon extends BubbleTextView implements
AllAppsStore appsStore = mLauncher.getAppsView().getAppsStore();
AppInfo appInfo = appsStore.getApp(new ComponentKey(componentName, userHandle));
applyFromApplicationInfo(appInfo);
notifyItemInfoChanged(appInfo);
}
private void prepareUsingShortcutInfo(ShortcutInfo shortcutInfo) {
WorkspaceItemInfo workspaceItemInfo = new WorkspaceItemInfo(shortcutInfo, getContext());
applyFromWorkspaceItem(workspaceItemInfo);
notifyItemInfoChanged(workspaceItemInfo);
LauncherAppState launcherAppState = LauncherAppState.getInstance(getContext());
MODEL_EXECUTOR.execute(() -> {
launcherAppState.getIconCache().getShortcutIcon(workspaceItemInfo, shortcutInfo);
reapplyItemInfoAsync(workspaceItemInfo);
MAIN_EXECUTOR.post(() -> applyFromWorkspaceItem(workspaceItemInfo));
});
}
private void prepareUsingRemoteAction(RemoteAction remoteAction, String token, boolean start,
boolean useIconToBadge) {
RemoteActionItemInfo itemInfo = new RemoteActionItemInfo(remoteAction, token, start);
notifyItemInfoChanged(itemInfo);
UI_HELPER_EXECUTOR.post(() -> {
// If the Drawable from the remote action is not AdaptiveBitmap, styling will not
// work.
try (LauncherIcons li = LauncherIcons.obtain(getContext())) {
Drawable d = itemInfo.getRemoteAction().getIcon().loadDrawable(getContext());
BitmapInfo bitmap = li.createBadgedIconBitmap(d, itemInfo.user,
Build.VERSION.SDK_INT);
applyFromRemoteActionInfo(itemInfo);
if (!loadIconFromResource()) {
UI_HELPER_EXECUTOR.post(() -> {
// If the Drawable from the remote action is not AdaptiveBitmap, styling will not
// work.
try (LauncherIcons li = LauncherIcons.obtain(getContext())) {
Drawable d = itemInfo.getRemoteAction().getIcon().loadDrawable(getContext());
BitmapInfo bitmap = li.createBadgedIconBitmap(d, itemInfo.user,
Build.VERSION.SDK_INT);
if (useIconToBadge) {
BitmapInfo placeholder = li.createIconBitmap(
itemInfo.getRemoteAction().getTitle().toString().substring(0, 1),
bitmap.color);
itemInfo.bitmap = li.badgeBitmap(placeholder.icon, bitmap);
} else {
itemInfo.bitmap = bitmap;
}
reapplyItemInfoAsync(itemInfo);
if (useIconToBadge) {
BitmapInfo placeholder = li.createIconBitmap(
itemInfo.getRemoteAction().getTitle().toString().substring(0, 1),
bitmap.color);
itemInfo.bitmap = li.badgeBitmap(placeholder.icon, bitmap);
} else {
itemInfo.bitmap = bitmap;
}
});
}
}
MAIN_EXECUTOR.post(() -> applyFromRemoteActionInfo(itemInfo));
});
}
@UiThread
void reapplyItemInfoAsync(ItemInfoWithIcon itemInfoWithIcon) {
MAIN_EXECUTOR.post(() -> reapplyItemInfo(itemInfoWithIcon));
}
@Override
public void handleSelection(int eventType) {
mLauncher.getItemOnClickListener().onClick(this);
@ -208,7 +208,10 @@ public class SearchResultIcon extends BubbleTextView implements
return false;
}
protected boolean loadIconFromResource() {
return false;
private void notifyItemInfoChanged(ItemInfoWithIcon itemInfoWithIcon) {
if (mOnItemInfoChanged != null) {
mOnItemInfoChanged.accept(itemInfoWithIcon);
mOnItemInfoChanged = null;
}
}
}

View File

@ -46,6 +46,7 @@ import com.android.systemui.plugins.shared.SearchTargetEvent;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* A full width representation of {@link SearchResultIcon} with a secondary label and inline
@ -53,7 +54,7 @@ import java.util.List;
*/
public class SearchResultIconRow extends LinearLayout implements
AllAppsSearchBarController.SearchTargetHandler, View.OnClickListener,
View.OnLongClickListener {
View.OnLongClickListener, Consumer<ItemInfoWithIcon> {
public static final int MAX_SHORTCUTS_COUNT = 2;
@ -95,6 +96,7 @@ public class SearchResultIconRow extends LinearLayout implements
mShortcutViews[1] = findViewById(R.id.shortcut_1);
mResultIcon.getLayoutParams().height = iconSize;
mResultIcon.getLayoutParams().width = iconSize;
mResultIcon.setTextVisibility(false);
for (BubbleTextView bubbleTextView : mShortcutViews) {
ViewGroup.LayoutParams lp = bubbleTextView.getLayoutParams();
lp.width = iconSize;
@ -113,9 +115,7 @@ public class SearchResultIconRow extends LinearLayout implements
@Override
public void applySearchTarget(SearchTarget searchTarget) {
mSearchTarget = searchTarget;
mResultIcon.applySearchTarget(searchTarget);
mResultIcon.setTextVisibility(false);
mTitleView.setText(mResultIcon.getText());
mResultIcon.applySearchTarget(searchTarget, this);
String itemType = searchTarget.getItemType();
boolean showDesc = itemType.equals(SearchResultIcon.TARGET_TYPE_SHORTCUT);
mDescriptionView.setVisibility(showDesc ? VISIBLE : GONE);
@ -138,6 +138,11 @@ public class SearchResultIconRow extends LinearLayout implements
}
}
@Override
public void accept(ItemInfoWithIcon itemInfoWithIcon) {
mTitleView.setText(itemInfoWithIcon.title);
}
private void showInlineShortcuts(List<ShortcutInfo> infos) {
if (infos == null) return;
ArrayList<Pair<ShortcutInfo, ItemInfoWithIcon>> shortcuts = new ArrayList<>();

View File

@ -28,6 +28,7 @@ import com.android.launcher3.R;
*/
public class SearchResultSuggestion extends SearchResultIcon {
public static final String TARGET_TYPE_SUGGEST = "suggest";
private final Drawable mCustomIcon;
public SearchResultSuggestion(Context context) {
@ -55,8 +56,7 @@ public class SearchResultSuggestion extends SearchResultIcon {
}
@Override
protected boolean loadIconFromResource() {
setIcon(mCustomIcon);
return true;
protected void setIcon(Drawable icon) {
super.setIcon(mCustomIcon);
}
}