Loading core/java/android/appwidget/AppWidgetHostView.java +31 −50 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -433,7 +436,6 @@ public class AppWidgetHostView extends FrameLayout { } applyContent(content, recycled, exception); updateContentDescription(mInfo); } private void applyContent(View content, boolean recycled, Exception exception) { Loading @@ -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. Loading Loading @@ -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); Loading services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +51 −41 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)) { switch (action) { case Intent.ACTION_CONFIGURATION_CHANGED: onConfigurationChanged(); } else if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { break; case Intent.ACTION_MANAGED_PROFILE_AVAILABLE: case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE: 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); 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; } } }; Loading Loading @@ -378,14 +382,20 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku boolean changed = false; boolean componentsModified = false; String pkgList[] = null; if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 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; } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { // Follow through case Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE: pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); added = false; } else { break; default: { Uri uri = intent.getData(); if (uri == null) { return; Loading @@ -398,6 +408,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku added = Intent.ACTION_PACKAGE_ADDED.equals(action); changed = Intent.ACTION_PACKAGE_CHANGED.equals(action); } } if (pkgList == null || pkgList.length == 0) { return; } Loading Loading @@ -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++) { Loading Loading @@ -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); } } Loading Loading
core/java/android/appwidget/AppWidgetHostView.java +31 −50 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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); } } Loading @@ -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); Loading @@ -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; } Loading Loading @@ -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); Loading Loading @@ -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); } Loading Loading @@ -433,7 +436,6 @@ public class AppWidgetHostView extends FrameLayout { } applyContent(content, recycled, exception); updateContentDescription(mInfo); } private void applyContent(View content, boolean recycled, Exception exception) { Loading @@ -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. Loading Loading @@ -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); Loading
services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +51 −41 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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)) { switch (action) { case Intent.ACTION_CONFIGURATION_CHANGED: onConfigurationChanged(); } else if (Intent.ACTION_MANAGED_PROFILE_AVAILABLE.equals(action) || Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE.equals(action)) { break; case Intent.ACTION_MANAGED_PROFILE_AVAILABLE: case Intent.ACTION_MANAGED_PROFILE_UNAVAILABLE: 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); 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; } } }; Loading Loading @@ -378,14 +382,20 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku boolean changed = false; boolean componentsModified = false; String pkgList[] = null; if (Intent.ACTION_EXTERNAL_APPLICATIONS_AVAILABLE.equals(action)) { 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; } else if (Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE.equals(action)) { // Follow through case Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE: pkgList = intent.getStringArrayExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST); added = false; } else { break; default: { Uri uri = intent.getData(); if (uri == null) { return; Loading @@ -398,6 +408,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku added = Intent.ACTION_PACKAGE_ADDED.equals(action); changed = Intent.ACTION_PACKAGE_CHANGED.equals(action); } } if (pkgList == null || pkgList.length == 0) { return; } Loading Loading @@ -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++) { Loading Loading @@ -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); } } Loading