blob: c6e5e8a98f8a25a313216917338ff2655982395e [file] [log] [blame]
/*
* Copyright (C) 2021 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.data;
import static com.android.launcher3.LauncherSettings.Favorites.EXTENDED_CONTAINERS;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.drawable.Icon;
import android.os.Process;
import android.os.UserHandle;
import androidx.annotation.Nullable;
import com.android.launcher3.LauncherAppState;
import com.android.launcher3.LauncherModel;
import com.android.launcher3.LauncherSettings;
import com.android.launcher3.icons.LauncherIcons;
import com.android.launcher3.logger.LauncherAtom.ItemInfo;
import com.android.launcher3.logger.LauncherAtom.SearchActionItem;
import com.android.launcher3.model.AllAppsList;
import com.android.launcher3.model.BaseModelUpdateTask;
import com.android.launcher3.model.BgDataModel;
/**
* Represents a SearchAction with in launcher
*/
public class SearchActionItemInfo extends ItemInfoWithIcon {
public static final int FLAG_SHOULD_START = 1 << 1;
public static final int FLAG_SHOULD_START_FOR_RESULT = FLAG_SHOULD_START | 1 << 2;
public static final int FLAG_BADGE_WITH_PACKAGE = 1 << 3;
public static final int FLAG_PRIMARY_ICON_FROM_TITLE = 1 << 4;
public static final int FLAG_BADGE_WITH_COMPONENT_NAME = 1 << 5;
public static final int FLAG_ALLOW_PINNING = 1 << 6;
public static final int FLAG_SEARCH_IN_APP = 1 << 7;
private String mFallbackPackageName;
private int mFlags = 0;
private Icon mIcon;
// If true title does not contain any personal info and eligible for logging.
private boolean mIsPersonalTitle;
private Intent mIntent;
private PendingIntent mPendingIntent;
public SearchActionItemInfo(Icon icon, String packageName, UserHandle user,
CharSequence title, boolean isPersonalTitle) {
mIsPersonalTitle = isPersonalTitle;
this.itemType = LauncherSettings.Favorites.ITEM_TYPE_SEARCH_ACTION;
this.user = user == null ? Process.myUserHandle() : user;
this.title = title;
this.container = EXTENDED_CONTAINERS;
mFallbackPackageName = packageName;
mIcon = icon;
}
private SearchActionItemInfo(SearchActionItemInfo info) {
super(info);
}
@Override
public void copyFrom(com.android.launcher3.model.data.ItemInfo info) {
super.copyFrom(info);
SearchActionItemInfo itemInfo = (SearchActionItemInfo) info;
this.mFallbackPackageName = itemInfo.mFallbackPackageName;
this.mIcon = itemInfo.mIcon;
this.mFlags = itemInfo.mFlags;
this.mIsPersonalTitle = itemInfo.mIsPersonalTitle;
}
/**
* Returns if multiple flags are all available.
*/
public boolean hasFlags(int flags) {
return (mFlags & flags) != 0;
}
public void setFlags(int flags) {
mFlags |= flags;
}
@Override
public Intent getIntent() {
return mIntent;
}
/**
* Setter for mIntent with assertion for null value mPendingIntent
*/
public void setIntent(Intent intent) {
if (mPendingIntent != null && intent != null) {
throw new RuntimeException(
"SearchActionItemInfo can only have either an Intent or a PendingIntent");
}
mIntent = intent;
}
public PendingIntent getPendingIntent() {
return mPendingIntent;
}
/**
* Setter of mPendingIntent with assertion for null value mIntent
*/
public void setPendingIntent(PendingIntent pendingIntent) {
if (mIntent != null && pendingIntent != null) {
throw new RuntimeException(
"SearchActionItemInfo can only have either an Intent or a PendingIntent");
}
mPendingIntent = pendingIntent;
}
@Nullable
public Icon getIcon() {
return mIcon;
}
@Override
public ItemInfoWithIcon clone() {
return new SearchActionItemInfo(this);
}
@Override
public ItemInfo buildProto(FolderInfo fInfo) {
SearchActionItem.Builder itemBuilder = SearchActionItem.newBuilder()
.setPackageName(mFallbackPackageName);
if (!mIsPersonalTitle) {
itemBuilder.setTitle(title.toString());
}
return getDefaultItemInfoBuilder()
.setSearchActionItem(itemBuilder)
.setContainerInfo(getContainerInfo())
.build();
}
/**
* Returns true if result supports drag/drop to home screen
*/
public boolean supportsPinning() {
return hasFlags(FLAG_ALLOW_PINNING) && getIntentPackageName() != null;
}
/**
* Creates a {@link WorkspaceItemInfo} coorsponding to search action to be stored in launcher db
*/
public WorkspaceItemInfo createWorkspaceItem(LauncherModel model) {
WorkspaceItemInfo info = new WorkspaceItemInfo();
info.title = title;
info.bitmap = bitmap;
info.intent = mIntent;
if (hasFlags(FLAG_SHOULD_START_FOR_RESULT)) {
info.options |= WorkspaceItemInfo.FLAG_START_FOR_RESULT;
}
model.enqueueModelUpdateTask(new BaseModelUpdateTask() {
@Override
public void execute(LauncherAppState app, BgDataModel dataModel, AllAppsList apps) {
model.updateAndBindWorkspaceItem(() -> {
PackageItemInfo pkgInfo = new PackageItemInfo(getIntentPackageName(), user);
app.getIconCache().getTitleAndIconForApp(pkgInfo, false);
try (LauncherIcons li = LauncherIcons.obtain(app.getContext())) {
info.bitmap = li.badgeBitmap(info.bitmap.icon, pkgInfo.bitmap);
}
return info;
});
}
});
return info;
}
@Nullable
private String getIntentPackageName() {
if (mIntent != null) {
if (mIntent.getPackage() != null) return mIntent.getPackage();
return mFallbackPackageName;
}
return null;
}
}