summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2017-10-24 16:14:12 -0700
committerSunny Goyal <sunnygoyal@google.com>2017-10-25 10:25:45 -0700
commit7241abd5849f8a5634de510559635399a2e205cd (patch)
tree6773ace0cbf2cae5b1ef6a4fc320a5c720a6e01d
parentb74d064019a79d82b53f051f0a7986717faae62d (diff)
Removing some system binder calls in AppWidgetHostView
> Using the AppWidgetProviderInfo for applicationInfo instead of getting it from packageNamager > Sending ProviderInfo update when the package is suspended/unsuspended so that the provider info on client side is always up-to-date Bug: 67865199 Test: Manually tested on device Change-Id: Id44facc30b4c3cc01e155eba9feeb541997fc816
-rw-r--r--core/java/android/appwidget/AppWidgetHostView.java81
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java92
2 files changed, 82 insertions, 91 deletions
diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java
index dc9970a7ca42..ab0eb92e1726 100644
--- a/core/java/android/appwidget/AppWidgetHostView.java
+++ b/core/java/android/appwidget/AppWidgetHostView.java
@@ -19,8 +19,6 @@ package android.appwidget;
import android.content.ComponentName;
import android.content.Context;
import android.content.pm.ApplicationInfo;
-import android.content.pm.LauncherApps;
-import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources;
import android.graphics.Color;
@@ -66,11 +64,8 @@ public class AppWidgetHostView extends FrameLayout {
// When we're inflating the initialLayout for a AppWidget, we only allow
// views that are allowed in RemoteViews.
- static final LayoutInflater.Filter sInflaterFilter = new LayoutInflater.Filter() {
- public boolean onLoadClass(Class clazz) {
- return clazz.isAnnotationPresent(RemoteViews.RemoteView.class);
- }
- };
+ private static final LayoutInflater.Filter INFLATER_FILTER =
+ (clazz) -> clazz.isAnnotationPresent(RemoteViews.RemoteView.class);
Context mContext;
Context mRemoteContext;
@@ -136,13 +131,19 @@ public class AppWidgetHostView extends FrameLayout {
mAppWidgetId = appWidgetId;
mInfo = info;
+ // We add padding to the AppWidgetHostView if necessary
+ Rect padding = getDefaultPadding();
+ setPadding(padding.left, padding.top, padding.right, padding.bottom);
+
// 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
- Rect padding = getDefaultPaddingForWidget(mContext, info.provider, null);
- setPadding(padding.left, padding.top, padding.right, padding.bottom);
- updateContentDescription(info);
+ String description = info.loadLabel(getContext().getPackageManager());
+ if ((info.providerInfo.applicationInfo.flags & ApplicationInfo.FLAG_SUSPENDED) != 0) {
+ description = Resources.getSystem().getString(
+ com.android.internal.R.string.suspended_widget_accessibility, description);
+ }
+ setContentDescription(description);
}
}
@@ -164,23 +165,23 @@ public class AppWidgetHostView extends FrameLayout {
*/
public static Rect getDefaultPaddingForWidget(Context context, ComponentName component,
Rect padding) {
- PackageManager packageManager = context.getPackageManager();
- ApplicationInfo appInfo;
+ ApplicationInfo appInfo = null;
+ try {
+ appInfo = context.getPackageManager().getApplicationInfo(component.getPackageName(), 0);
+ } catch (NameNotFoundException e) {
+ // if we can't find the package, ignore
+ }
+ return getDefaultPaddingForWidget(context, appInfo, padding);
+ }
+ private static Rect getDefaultPaddingForWidget(Context context, ApplicationInfo appInfo,
+ Rect padding) {
if (padding == null) {
padding = new Rect(0, 0, 0, 0);
} else {
padding.set(0, 0, 0, 0);
}
-
- try {
- appInfo = packageManager.getApplicationInfo(component.getPackageName(), 0);
- } catch (NameNotFoundException e) {
- // if we can't find the package, return 0 padding
- return padding;
- }
-
- if (appInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
+ if (appInfo != null && appInfo.targetSdkVersion >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) {
Resources r = context.getResources();
padding.left = r.getDimensionPixelSize(com.android.internal.
R.dimen.default_app_widget_padding_left);
@@ -194,6 +195,11 @@ public class AppWidgetHostView extends FrameLayout {
return padding;
}
+ private Rect getDefaultPadding() {
+ return getDefaultPaddingForWidget(mContext,
+ mInfo == null ? null : mInfo.providerInfo.applicationInfo, null);
+ }
+
public int getAppWidgetId() {
return mAppWidgetId;
}
@@ -284,10 +290,7 @@ public class AppWidgetHostView extends FrameLayout {
newOptions = new Bundle();
}
- Rect padding = new Rect();
- if (mInfo != null) {
- padding = getDefaultPaddingForWidget(mContext, mInfo.provider, padding);
- }
+ Rect padding = getDefaultPadding();
float density = getResources().getDisplayMetrics().density;
int xPaddingDips = (int) ((padding.left + padding.right) / density);
@@ -361,7 +364,7 @@ public class AppWidgetHostView extends FrameLayout {
* initial layout.
*/
void resetAppWidget(AppWidgetProviderInfo info) {
- mInfo = info;
+ setAppWidget(mAppWidgetId, info);
mViewMode = VIEW_MODE_NOINIT;
updateAppWidget(null);
}
@@ -433,7 +436,6 @@ public class AppWidgetHostView extends FrameLayout {
}
applyContent(content, recycled, exception);
- updateContentDescription(mInfo);
}
private void applyContent(View content, boolean recycled, Exception exception) {
@@ -460,27 +462,6 @@ public class AppWidgetHostView extends FrameLayout {
}
}
- private void updateContentDescription(AppWidgetProviderInfo info) {
- if (info != null) {
- LauncherApps launcherApps = getContext().getSystemService(LauncherApps.class);
- ApplicationInfo appInfo = null;
- try {
- appInfo = launcherApps.getApplicationInfo(
- info.provider.getPackageName(), 0, info.getProfile());
- } catch (NameNotFoundException e) {
- // ignore -- use null.
- }
- if (appInfo != null &&
- (appInfo.flags & ApplicationInfo.FLAG_SUSPENDED) != 0) {
- setContentDescription(
- Resources.getSystem().getString(
- com.android.internal.R.string.suspended_widget_accessibility, info.label));
- } else {
- setContentDescription(info.label);
- }
- }
- }
-
private void inflateAsync(RemoteViews remoteViews) {
// Prepare a local reference to the remote Context so we're ready to
// inflate any requested LayoutParams.
@@ -614,7 +595,7 @@ public class AppWidgetHostView extends FrameLayout {
LayoutInflater inflater = (LayoutInflater)
theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater = inflater.cloneInContext(theirContext);
- inflater.setFilter(sInflaterFilter);
+ inflater.setFilter(INFLATER_FILTER);
AppWidgetManager manager = AppWidgetManager.getInstance(mContext);
Bundle options = manager.getAppWidgetOptions(mAppWidgetId);
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 76e77825b227..6c154389526f 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -107,8 +107,6 @@ import com.android.server.LocalServices;
import com.android.server.WidgetBackupProvider;
import com.android.server.policy.IconUtilities;
-import libcore.io.IoUtils;
-
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlSerializer;
@@ -174,21 +172,27 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
Slog.i(TAG, "Received broadcast: " + action + " on user " + userId);
}
- if (Intent.ACTION_CONFIGURATION_CHANGED.equals(action)) {
- onConfigurationChanged();
- } else if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action)
- || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) {
- synchronized (mLock) {
- reloadWidgetsMaskedState(userId);
- }
- } else if (Intent.ACTION_PACKAGES_SUSPENDED.equals(action)) {
- String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
- updateWidgetPackageSuspensionMaskedState(packages, true, getSendingUserId());
- } else if (Intent.ACTION_PACKAGES_UNSUSPENDED.equals(action)) {
- String[] packages = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
- updateWidgetPackageSuspensionMaskedState(packages, false, getSendingUserId());
- } else {
- onPackageBroadcastReceived(intent, userId);
+ switch (action) {
+ case Intent.ACTION_CONFIGURATION_CHANGED:
+ onConfigurationChanged();
+ break;
+ case Intent.ACTION_MANAGED_PROFILE_AVAILABLE:
+ case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE:
+ synchronized (mLock) {
+ reloadWidgetsMaskedState(userId);
+ }
+ break;
+ case Intent.ACTION_PACKAGES_SUSPENDED:
+ onPackageBroadcastReceived(intent, getSendingUserId());
+ updateWidgetPackageSuspensionMaskedState(intent, true, getSendingUserId());
+ break;
+ case Intent.ACTION_PACKAGES_UNSUSPENDED:
+ onPackageBroadcastReceived(intent, getSendingUserId());
+ updateWidgetPackageSuspensionMaskedState(intent, false, getSendingUserId());
+ break;
+ default:
+ onPackageBroadcastReceived(intent, getSendingUserId());
+ break;
}
}
};
@@ -378,25 +382,32 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
boolean changed = false;
boolean componentsModified = false;
- String pkgList[] = null;
- if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) {
- pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
- added = true;
- } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) {
- pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
- added = false;
- } else {
- Uri uri = intent.getData();
- if (uri == null) {
- return;
- }
- String pkgName = uri.getSchemeSpecificPart();
- if (pkgName == null) {
- return;
+ final String pkgList[];
+ switch (action) {
+ case Intent.ACTION_PACKAGES_SUSPENDED:
+ case Intent.ACTION_PACKAGES_UNSUSPENDED:
+ pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ changed = true;
+ break;
+ case Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE:
+ added = true;
+ // Follow through
+ case Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE:
+ pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
+ break;
+ default: {
+ Uri uri = intent.getData();
+ if (uri == null) {
+ return;
+ }
+ String pkgName = uri.getSchemeSpecificPart();
+ if (pkgName == null) {
+ return;
+ }
+ pkgList = new String[] { pkgName };
+ added = Intent.ACTION_PACKAGE_ADDED.equals(action);
+ changed = Intent.ACTION_PACKAGE_CHANGED.equals(action);
}
- pkgList = new String[] { pkgName };
- added = Intent.ACTION_PACKAGE_ADDED.equals(action);
- changed = Intent.ACTION_PACKAGE_CHANGED.equals(action);
}
if (pkgList == null || pkgList.length == 0) {
return;
@@ -516,12 +527,13 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
/**
* Incrementally update the masked state due to package suspension state.
*/
- private void updateWidgetPackageSuspensionMaskedState(String[] packagesArray, boolean suspended,
+ private void updateWidgetPackageSuspensionMaskedState(Intent intent, boolean suspended,
int profileId) {
+ String[] packagesArray = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST);
if (packagesArray == null) {
return;
}
- Set<String> packages = new ArraySet<String>(Arrays.asList(packagesArray));
+ Set<String> packages = new ArraySet<>(Arrays.asList(packagesArray));
synchronized (mLock) {
final int N = mProviders.size();
for (int i = 0; i < N; i++) {
@@ -2630,11 +2642,9 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
// No file written for this user - nothing to do.
AtomicFile file = getSavedStateFile(profileId);
- try {
- FileInputStream stream = file.openRead();
+ try (FileInputStream stream = file.openRead()) {
version = readProfileStateFromFileLocked(stream, profileId, loadedWidgets);
- IoUtils.closeQuietly(stream);
- } catch (FileNotFoundException e) {
+ } catch (IOException e) {
Slog.w(TAG, "Failed to read state: " + e);
}
}