Adding getManagedUserBadgedDrawableForDensity() to PackageManager.

It allows badging an image regardless of of the user (no
user id parameter). The styling for managed users is applied.

This is useful for new cases where the existing functions
wouldn't badge the icon, but we need it.

Bug: 25192539
Change-Id: I2fd2f226f626fb2e6cda1cfe072013350e12b41c
This commit is contained in:
Vadim Tryshev
2016-02-18 15:41:21 -08:00
parent 60b7bcc614
commit 66ae66a7f7
5 changed files with 68 additions and 17 deletions

View File

@@ -1092,6 +1092,14 @@ public class ApplicationPackageManager extends PackageManager {
return getApplicationLogo(getApplicationInfo(packageName, sDefaultFlags));
}
@Override
public Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
int badgeDensity) {
Drawable badgeDrawable = getDrawableForDensity(
com.android.internal.R.drawable.ic_corp_badge, badgeDensity);
return getBadgedDrawable(drawable, badgeDrawable, badgeLocation, true);
}
@Override
public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
final int badgeResId = getBadgeResIdForUser(user.getIdentifier());
@@ -1114,24 +1122,27 @@ public class ApplicationPackageManager extends PackageManager {
@Override
public Drawable getUserBadgeForDensity(UserHandle user, int density) {
return getManagedProfileIconForDensity(user, density,
com.android.internal.R.drawable.ic_corp_badge);
return getManagedProfileIconForDensity(user, com.android.internal.R.drawable.ic_corp_badge,
density);
}
@Override
public Drawable getUserBadgeForDensityNoBackground(UserHandle user, int density) {
return getManagedProfileIconForDensity(user, density,
com.android.internal.R.drawable.ic_corp_badge_no_background);
return getManagedProfileIconForDensity(user,
com.android.internal.R.drawable.ic_corp_badge_no_background, density);
}
private Drawable getManagedProfileIconForDensity(UserHandle user, int density,
int drawableId) {
private Drawable getDrawableForDensity(int drawableId, int density) {
if (density <= 0) {
density = mContext.getResources().getDisplayMetrics().densityDpi;
}
return Resources.getSystem().getDrawableForDensity(drawableId, density);
}
private Drawable getManagedProfileIconForDensity(UserHandle user, int drawableId, int density) {
UserInfo userInfo = getUserIfProfile(user.getIdentifier());
if (userInfo != null && userInfo.isManagedProfile()) {
if (density <= 0) {
density = mContext.getResources().getDisplayMetrics().densityDpi;
}
return Resources.getSystem().getDrawableForDensity(drawableId, density);
return getDrawableForDensity(drawableId, density);
}
return null;
}

View File

@@ -4338,6 +4338,32 @@ public abstract class PackageManager {
public abstract Drawable getApplicationLogo(String packageName)
throws NameNotFoundException;
/**
* Returns a managed-user-style badged copy of the given drawable allowing the user to
* distinguish it from the original drawable.
* The caller can specify the location in the bounds of the drawable to be
* badged where the badge should be applied as well as the density of the
* badge to be used.
* <p>
* If the original drawable is a BitmapDrawable and the backing bitmap is
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
* is performed in place and the original drawable is returned.
* </p>
*
* @param drawable The drawable to badge.
* @param badgeLocation Where in the bounds of the badged drawable to place
* the badge. If it's {@code null}, the badge is applied on top of the entire
* drawable being badged.
* @param badgeDensity The optional desired density for the badge as per
* {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
* the density of the display is used.
* @return A drawable that combines the original drawable and a badge as
* determined by the system.
* @hide
*/
public abstract Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
int badgeDensity);
/**
* If the target user is a managed profile of the calling user or if the
* target user is the caller and is itself a managed profile, then this
@@ -4367,17 +4393,17 @@ public abstract class PackageManager {
* badge to be used.
* <p>
* If the original drawable is a BitmapDrawable and the backing bitmap is
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the bading
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
* is performed in place and the original drawable is returned.
* </p>
*
* @param drawable The drawable to badge.
* @param user The target user.
* @param badgeLocation Where in the bounds of the badged drawable to place
* the badge. If not provided, the badge is applied on top of the entire
* the badge. If it's {@code null}, the badge is applied on top of the entire
* drawable being badged.
* @param badgeDensity The optional desired density for the badge as per
* {@link android.util.DisplayMetrics#densityDpi}. If not provided,
* {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
* the density of the display is used.
* @return A drawable that combines the original drawable and a badge as
* determined by the system.

View File

@@ -1658,7 +1658,7 @@ public class UserManager {
* android.graphics.drawable.Drawable, UserHandle, android.graphics.Rect, int)}.
* <p>
* If the original drawable is a BitmapDrawable and the backing bitmap is
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the bading
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
* is performed in place and the original drawable is returned.
* </p>
*
@@ -1681,17 +1681,17 @@ public class UserManager {
* badge to be used.
* <p>
* If the original drawable is a BitmapDrawable and the backing bitmap is
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the bading
* mutable as per {@link android.graphics.Bitmap#isMutable()}, the badging
* is performed in place and the original drawable is returned.
* </p>
*
* @param badgedDrawable The drawable to badge.
* @param user The target user.
* @param badgeLocation Where in the bounds of the badged drawable to place
* the badge. If not provided, the badge is applied on top of the entire
* the badge. If it's {@code null}, the badge is applied on top of the entire
* drawable being badged.
* @param badgeDensity The optional desired density for the badge as per
* {@link android.util.DisplayMetrics#densityDpi}. If not provided,
* {@link android.util.DisplayMetrics#densityDpi}. If it's not positive,
* the density of the display is used.
* @return A drawable that combines the original drawable and a badge as
* determined by the system.

View File

@@ -518,6 +518,14 @@ public class MockPackageManager extends PackageManager {
throw new UnsupportedOperationException();
}
/** @hide */
@Override
public Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
int badgeDensity) {
throw new UnsupportedOperationException();
}
@Override
public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
throw new UnsupportedOperationException();

View File

@@ -483,6 +483,12 @@ public class BridgePackageManager extends PackageManager {
return null;
}
@Override
public Drawable getManagedUserBadgedDrawable(Drawable drawable, Rect badgeLocation,
int badgeDensity) {
return null;
}
@Override
public Drawable getUserBadgedIcon(Drawable icon, UserHandle user) {
return null;