Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 04b9aab9 authored by Makoto Onuki's avatar Makoto Onuki
Browse files

ShortcutManager: Implement get-drawable APIs

Bug 28594168

Change-Id: I750e800b59dca56877ba78baac808aff93acd19d
parent 05e0a9f3
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -9510,8 +9510,8 @@ package android.content.pm {
  public class LauncherApps {
    method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
    method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+2 −2
Original line number Diff line number Diff line
@@ -9863,8 +9863,8 @@ package android.content.pm {
  public class LauncherApps {
    method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
    method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+2 −2
Original line number Diff line number Diff line
@@ -9522,8 +9522,8 @@ package android.content.pm {
  public class LauncherApps {
    ctor public LauncherApps(android.content.Context);
    method public java.util.List<android.content.pm.LauncherActivityInfo> getActivityList(java.lang.String, android.os.UserHandle);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(int);
    method public android.graphics.drawable.Drawable getShortcutBadgedIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.graphics.drawable.Drawable getShortcutIconDrawable(android.content.pm.ShortcutInfo, int);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(android.content.pm.ShortcutInfo);
    method public android.os.ParcelFileDescriptor getShortcutIconFd(java.lang.String, java.lang.String, android.os.UserHandle);
    method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+60 −6
Original line number Diff line number Diff line
@@ -24,7 +24,12 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager.ApplicationInfoFlags;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.Handler;
@@ -35,8 +40,10 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
import android.os.UserManager;
import android.util.DisplayMetrics;
import android.util.Log;

import java.io.IOException;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.ArrayList;
@@ -566,14 +573,61 @@ public class LauncherApps {
        }
    }

    /** TODO Javadoc  (not implemented yet) */
    public Drawable getShortcutIconDrawable(int density) {
        throw new RuntimeException("TODO not implemented yet");
    /**
     * Returns the icon for this shortcut, without any badging for the profile.
     *
     * @param density The preferred density of the icon, zero for default density. Use
     * density DPI values from {@link DisplayMetrics}.
     * @see #getShortcutBadgedIconDrawable(ShortcutInfo, int)
     * @see DisplayMetrics
     * @return The drawable associated with the shortcut.
     */
    public Drawable getShortcutIconDrawable(@NonNull ShortcutInfo shortcut, int density) {
        if (shortcut.hasIconFile()) {
            final ParcelFileDescriptor pfd = getShortcutIconFd(shortcut);
            if (pfd == null) {
                return null;
            }
            try {
                final Bitmap bmp = BitmapFactory.decodeFileDescriptor(pfd.getFileDescriptor());
                return (bmp == null) ? null : new BitmapDrawable(mContext.getResources(), bmp);
            } finally {
                try {
                    pfd.close();
                } catch (IOException ignore) {
                }
            }
        } else if (shortcut.hasIconResource()) {
            try {
                final int resId = shortcut.getIconResourceId();
                if (resId == 0) {
                    return null; // Shouldn't happen but just in case.
                }
                final ApplicationInfo ai = getApplicationInfo(shortcut.getPackage(),
                        /* flags =*/ 0, shortcut.getUserHandle());
                final Resources res = mContext.getPackageManager().getResourcesForApplication(ai);
                return res.getDrawableForDensity(resId, density);
            } catch (NameNotFoundException | Resources.NotFoundException e) {
                return null;
            }
        } else {
            return null; // Has no icon.
        }
    }

    /**
     * Returns the shortcut icon with badging appropriate for the profile.
     *
     * @param density Optional density for the icon, or 0 to use the default density. Use
     * {@link DisplayMetrics} for DPI values.
     * @see DisplayMetrics
     * @return A badged icon for the shortcut.
     */
    public Drawable getShortcutBadgedIconDrawable(ShortcutInfo shortcut, int density) {
        final Drawable originalIcon = getShortcutIconDrawable(shortcut, density);

    /** TODO Javadoc  (not implemented yet) */
    public Drawable getShortcutBadgedIconDrawable(int density) {
        throw new RuntimeException("TODO not implemented yet");
        return (originalIcon == null) ? null : mContext.getPackageManager().getUserBadgedIcon(
                originalIcon, shortcut.getUserHandle());
    }

    /**