Merge "Prevent work profile widget DnD crash b/26079469" into ub-launcher3-burnaby-polish

This commit is contained in:
Hyunyoung Song
2016-03-01 19:58:44 +00:00
committed by Android (Google) Code Review
4 changed files with 32 additions and 12 deletions

View File

@@ -65,7 +65,7 @@ public class WidgetPreviewLoader {
private final Context mContext;
private final IconCache mIconCache;
private final UserManagerCompat mUserManager;
private final AppWidgetManagerCompat mManager;
private final AppWidgetManagerCompat mWidgetManager;
private final CacheDb mDb;
private final int mProfileBadgeMargin;
@@ -75,7 +75,7 @@ public class WidgetPreviewLoader {
public WidgetPreviewLoader(Context context, IconCache iconCache) {
mContext = context;
mIconCache = iconCache;
mManager = AppWidgetManagerCompat.getInstance(context);
mWidgetManager = AppWidgetManagerCompat.getInstance(context);
mUserManager = UserManagerCompat.getInstance(context);
mDb = new CacheDb(context);
mWorkerHandler = new Handler(LauncherModel.getWorkerLooper());
@@ -139,7 +139,7 @@ public class WidgetPreviewLoader {
// should cache the string builder
if (o instanceof LauncherAppWidgetProviderInfo) {
LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo) o;
return new WidgetCacheKey(info.provider, mManager.getUser(info), size);
return new WidgetCacheKey(info.provider, mWidgetManager.getUser(info), size);
} else {
ResolveInfo info = (ResolveInfo) o;
return new WidgetCacheKey(
@@ -193,7 +193,7 @@ public class WidgetPreviewLoader {
pkg = ((ResolveInfo) obj).activityInfo.packageName;
} else {
LauncherAppWidgetProviderInfo info = (LauncherAppWidgetProviderInfo) obj;
user = mManager.getUser(info);
user = mWidgetManager.getUser(info);
pkg = info.provider.getPackageName();
}
@@ -305,6 +305,17 @@ public class WidgetPreviewLoader {
}
}
/**
* Generates the widget preview from either the {@link AppWidgetManagerCompat} or cache
* and add badge at the bottom right corner.
*
* @param launcher
* @param info information about the widget
* @param maxPreviewWidth width of the preview on either workspace or tray
* @param preview bitmap that can be recycled
* @param preScaledWidthOut return the width of the returned bitmap
* @return
*/
public Bitmap generateWidgetPreview(Launcher launcher, LauncherAppWidgetProviderInfo info,
int maxPreviewWidth, Bitmap preview, int[] preScaledWidthOut) {
// Load the preview image if possible
@@ -312,7 +323,7 @@ public class WidgetPreviewLoader {
Drawable drawable = null;
if (info.previewImage != 0) {
drawable = mManager.loadPreview(info);
drawable = mWidgetManager.loadPreview(info);
if (drawable != null) {
drawable = mutateOnMainThread(drawable);
} else {
@@ -327,6 +338,7 @@ public class WidgetPreviewLoader {
int previewWidth;
int previewHeight;
Bitmap tileBitmap = null;
if (widgetPreviewExists) {
@@ -398,7 +410,7 @@ public class WidgetPreviewLoader {
float iconScale = Math.min((float) smallestSide / (appIconSize + 2 * minOffset), scale);
try {
Drawable icon = mManager.loadIcon(info, mIconCache);
Drawable icon = mWidgetManager.loadIcon(info, mIconCache);
if (icon != null) {
icon = mutateOnMainThread(icon);
int hoffset = (int) ((tileW - appIconSize * iconScale) / 2) + x;
@@ -408,11 +420,13 @@ public class WidgetPreviewLoader {
yoffset + (int) (appIconSize * iconScale));
icon.draw(c);
}
} catch (Resources.NotFoundException e) { }
} catch (Resources.NotFoundException e) {
}
c.setBitmap(null);
}
int imageWidth = Math.min(preview.getWidth(), previewWidth + mProfileBadgeMargin);
int imageHeight = Math.min(preview.getHeight(), previewHeight + mProfileBadgeMargin);
return mManager.getBadgeBitmap(info, preview, imageHeight);
return mWidgetManager.getBadgeBitmap(info, preview, imageWidth, imageHeight);
}
private Bitmap generateShortcutPreview(

View File

@@ -79,6 +79,6 @@ public abstract class AppWidgetManagerCompat {
public abstract Drawable loadIcon(LauncherAppWidgetProviderInfo info, IconCache cache);
public abstract Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap,
int imageHeight);
int imageWidth, int imageHeight);
}

View File

@@ -88,7 +88,7 @@ class AppWidgetManagerCompatV16 extends AppWidgetManagerCompat {
@Override
public Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap,
int imageHeight) {
int imageWidth, int imageHeight) {
return bitmap;
}
}

View File

@@ -107,18 +107,24 @@ class AppWidgetManagerCompatVL extends AppWidgetManagerCompat {
@Override
public Bitmap getBadgeBitmap(LauncherAppWidgetProviderInfo info, Bitmap bitmap,
int imageHeight) {
int imageWidth, int imageHeight) {
if (info.isCustomWidget || info.getProfile().equals(android.os.Process.myUserHandle())) {
return bitmap;
}
// Add a user badge in the bottom right of the image.
final Resources res = mContext.getResources();
final int badgeSize = res.getDimensionPixelSize(R.dimen.profile_badge_size);
final int badgeMinTop = res.getDimensionPixelSize(R.dimen.profile_badge_minimum_top);
// choose min between badge size defined for widget tray versus width, height of the image.
// Width, height of the image can be smaller than widget tray badge size when being dropped
// to the workspace.
final int badgeSize = Math.min(res.getDimensionPixelSize(R.dimen.profile_badge_size),
Math.min(imageWidth, imageHeight - badgeMinTop));
final Rect badgeLocation = new Rect(0, 0, badgeSize, badgeSize);
final int top = Math.max(imageHeight - badgeSize, badgeMinTop);
if (res.getConfiguration().getLayoutDirection() == View.LAYOUT_DIRECTION_RTL) {
badgeLocation.offset(0, top);
} else {