diff options
Diffstat (limited to 'src/com/android/launcher3/WorkspaceItemInfo.java')
-rw-r--r-- | src/com/android/launcher3/WorkspaceItemInfo.java | 198 |
1 files changed, 198 insertions, 0 deletions
diff --git a/src/com/android/launcher3/WorkspaceItemInfo.java b/src/com/android/launcher3/WorkspaceItemInfo.java new file mode 100644 index 000000000..d0e887311 --- /dev/null +++ b/src/com/android/launcher3/WorkspaceItemInfo.java @@ -0,0 +1,198 @@ +/* + * Copyright (C) 2008 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; + +import android.content.ComponentName; +import android.content.Context; +import android.content.Intent; +import android.text.TextUtils; + +import com.android.launcher3.LauncherSettings.Favorites; +import com.android.launcher3.icons.IconCache; +import com.android.launcher3.shortcuts.ShortcutInfoCompat; +import com.android.launcher3.util.ContentWriter; + +/** + * Represents a launchable icon on the workspaces and in folders. + */ +public class WorkspaceItemInfo extends ItemInfoWithIcon { + + public static final int DEFAULT = 0; + + /** + * The shortcut was restored from a backup and it not ready to be used. This is automatically + * set during backup/restore + */ + public static final int FLAG_RESTORED_ICON = 1; + + /** + * The icon was added as an auto-install app, and is not ready to be used. This flag can't + * be present along with {@link #FLAG_RESTORED_ICON}, and is set during default layout + * parsing. + */ + public static final int FLAG_AUTOINSTALL_ICON = 2; //0B10; + + /** + * The icon is being installed. If {@link #FLAG_RESTORED_ICON} or {@link #FLAG_AUTOINSTALL_ICON} + * is set, then the icon is either being installed or is in a broken state. + */ + public static final int FLAG_INSTALL_SESSION_ACTIVE = 4; // 0B100; + + /** + * Indicates that the widget restore has started. + */ + public static final int FLAG_RESTORE_STARTED = 8; //0B1000; + + /** + * Web UI supported. + */ + public static final int FLAG_SUPPORTS_WEB_UI = 16; //0B10000; + + /** + * The intent used to start the application. + */ + public Intent intent; + + /** + * If isShortcut=true and customIcon=false, this contains a reference to the + * shortcut icon as an application's resource. + */ + public Intent.ShortcutIconResource iconResource; + + /** + * A message to display when the user tries to start a disabled shortcut. + * This is currently only used for deep shortcuts. + */ + public CharSequence disabledMessage; + + public int status; + + /** + * The installation progress [0-100] of the package that this shortcut represents. + */ + private int mInstallProgress; + + public WorkspaceItemInfo() { + itemType = LauncherSettings.Favorites.ITEM_TYPE_SHORTCUT; + } + + public WorkspaceItemInfo(WorkspaceItemInfo info) { + super(info); + title = info.title; + intent = new Intent(info.intent); + iconResource = info.iconResource; + status = info.status; + mInstallProgress = info.mInstallProgress; + } + + /** TODO: Remove this. It's only called by ApplicationInfo.makeWorkspaceItem. */ + public WorkspaceItemInfo(AppInfo info) { + super(info); + title = Utilities.trim(info.title); + intent = new Intent(info.intent); + } + + /** + * Creates a {@link WorkspaceItemInfo} from a {@link ShortcutInfoCompat}. + */ + public WorkspaceItemInfo(ShortcutInfoCompat shortcutInfo, Context context) { + user = shortcutInfo.getUserHandle(); + itemType = Favorites.ITEM_TYPE_DEEP_SHORTCUT; + updateFromDeepShortcutInfo(shortcutInfo, context); + } + + @Override + public void onAddToDatabase(ContentWriter writer) { + super.onAddToDatabase(writer); + writer.put(Favorites.TITLE, title) + .put(Favorites.INTENT, getIntent()) + .put(Favorites.RESTORED, status); + + if (!usingLowResIcon()) { + writer.putIcon(iconBitmap, user); + } + if (iconResource != null) { + writer.put(Favorites.ICON_PACKAGE, iconResource.packageName) + .put(Favorites.ICON_RESOURCE, iconResource.resourceName); + } + } + + @Override + public Intent getIntent() { + return intent; + } + + public boolean hasStatusFlag(int flag) { + return (status & flag) != 0; + } + + + public final boolean isPromise() { + return hasStatusFlag(FLAG_RESTORED_ICON | FLAG_AUTOINSTALL_ICON); + } + + public boolean hasPromiseIconUi() { + return isPromise() && !hasStatusFlag(FLAG_SUPPORTS_WEB_UI); + } + + public int getInstallProgress() { + return mInstallProgress; + } + + public void setInstallProgress(int progress) { + mInstallProgress = progress; + status |= FLAG_INSTALL_SESSION_ACTIVE; + } + + public void updateFromDeepShortcutInfo(ShortcutInfoCompat shortcutInfo, Context context) { + // {@link ShortcutInfoCompat#getActivity} can change during an update. Recreate the intent + intent = shortcutInfo.makeIntent(); + title = shortcutInfo.getShortLabel(); + + CharSequence label = shortcutInfo.getLongLabel(); + if (TextUtils.isEmpty(label)) { + label = shortcutInfo.getShortLabel(); + } + contentDescription = context.getPackageManager().getUserBadgedLabel(label, user); + if (shortcutInfo.isEnabled()) { + runtimeStatusFlags &= ~FLAG_DISABLED_BY_PUBLISHER; + } else { + runtimeStatusFlags |= FLAG_DISABLED_BY_PUBLISHER; + } + disabledMessage = shortcutInfo.getDisabledMessage(); + } + + /** Returns the WorkspaceItemInfo id associated with the deep shortcut. */ + public String getDeepShortcutId() { + return itemType == Favorites.ITEM_TYPE_DEEP_SHORTCUT ? + getIntent().getStringExtra(ShortcutInfoCompat.EXTRA_SHORTCUT_ID) : null; + } + + @Override + public ComponentName getTargetComponent() { + ComponentName cn = super.getTargetComponent(); + if (cn == null && (itemType == Favorites.ITEM_TYPE_SHORTCUT + || hasStatusFlag(FLAG_SUPPORTS_WEB_UI))) { + // Legacy shortcuts and promise icons with web UI may not have a componentName but just + // a packageName. In that case create a dummy componentName instead of adding additional + // check everywhere. + String pkg = intent.getPackage(); + return pkg == null ? null : new ComponentName(pkg, IconCache.EMPTY_CLASS_NAME); + } + return cn; + } +} |