From 5d5f3405204ecb5045edc756fde71c97d10bcda4 Mon Sep 17 00:00:00 2001 From: Adam Cohen Date: Fri, 30 Sep 2011 15:02:43 -0700 Subject: [PATCH] Adding default padding to AppWidgetHostView for widgets >= API level 14 Change-Id: Idbbeafba664847f01393bb0c6102f774390380d5 --- .../android/appwidget/AppWidgetHostView.java | 52 +++++++++++++++++++ core/res/res/values/dimens.xml | 6 +++ 2 files changed, 58 insertions(+) diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 960d7fbba7e1d..761c7eb0863ca 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -16,13 +16,17 @@ package android.appwidget; +import android.content.ComponentName; import android.content.Context; +import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.content.pm.PackageManager.NameNotFoundException; +import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; +import android.os.Build; import android.os.Parcel; import android.os.Parcelable; import android.os.SystemClock; @@ -107,6 +111,54 @@ public class AppWidgetHostView extends FrameLayout { public void setAppWidget(int appWidgetId, AppWidgetProviderInfo info) { mAppWidgetId = appWidgetId; mInfo = info; + + // Sometimes the AppWidgetManager returns a null AppWidgetProviderInfo object for + // a widget, eg. for some widgets in safe mode. + if (info != null) { + // We add padding to the AppWidgetHostView if necessary + Padding padding = getPaddingForWidget(info.provider); + setPadding(padding.left, padding.top, padding.right, padding.bottom); + } + } + + private static class Padding { + int left = 0; + int right = 0; + int top = 0; + int bottom = 0; + } + + /** + * As of ICE_CREAM_SANDWICH we are automatically adding padding to widgets targeting + * ICE_CREAM_SANDWICH and higher. The new widget design guidelines strongly recommend + * that widget developers do not add extra padding to their widgets. This will help + * achieve consistency among widgets. + */ + private Padding getPaddingForWidget(ComponentName component) { + PackageManager packageManager = mContext.getPackageManager(); + Padding p = new Padding(); + ApplicationInfo appInfo; + + try { + appInfo = packageManager.getApplicationInfo(component.getPackageName(), 0); + } catch (Exception e) { + // if we can't find the package, return 0 padding + return p; + } + + if (appInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) { + Resources r = getResources(); + p.left = r.getDimensionPixelSize(com.android.internal. + R.dimen.default_app_widget_padding_left); + p.right = r.getDimensionPixelSize(com.android.internal. + R.dimen.default_app_widget_padding_right); + p.top = r.getDimensionPixelSize(com.android.internal. + R.dimen.default_app_widget_padding_top); + p.bottom = r.getDimensionPixelSize(com.android.internal. + R.dimen.default_app_widget_padding_bottom); + } + + return p; } public int getAppWidgetId() { diff --git a/core/res/res/values/dimens.xml b/core/res/res/values/dimens.xml index 1cd39117c450b..dfd8306c0bc59 100644 --- a/core/res/res/values/dimens.xml +++ b/core/res/res/values/dimens.xml @@ -183,4 +183,10 @@ 80dp + + + 8dp + 8dp + 8dp + 8dp