Merge "Add comments to AppWidgetServiceImpl [Part 1]" into main
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index 76f6d17..4464c07 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -173,27 +173,35 @@
class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBackupProvider,
OnCrossProfileWidgetProvidersChangeListener {
+ // Name of the tag associated with the system logs generated by this service.
private static final String TAG = "AppWidgetServiceImpl";
-
+ // Simple flag to enable/disable debug logging.
private static final boolean DEBUG = Build.IS_DEBUGGABLE;
+ // String constants for XML schema migration related to changes in keyguard package.
private static final String OLD_KEYGUARD_HOST_PACKAGE = "android";
private static final String NEW_KEYGUARD_HOST_PACKAGE = "com.android.keyguard";
private static final int KEYGUARD_HOST_ID = 0x4b455947;
+ // Filename for app widgets state persisted on disk.
private static final String STATE_FILENAME = "appwidgets.xml";
+ // XML tag for widget size options of each individual widget when persisted on disk.
private static final String KEY_SIZES = "sizes";
+ // Minimum amount of time in millieconds before a widget is updated.
private static final int MIN_UPDATE_PERIOD = DEBUG ? 0 : 30 * 60 * 1000; // 30 minutes
+ // Default value of {@link Provider#tag} and {@link Host#tag}.
private static final int TAG_UNDEFINED = -1;
+ // Default uid of {@link ProviderId} when corresponding app haven't been installed yet.
private static final int UNKNOWN_UID = -1;
+ // Default return value when we can't find the parent of a given profileId.
private static final int UNKNOWN_USER_ID = -10;
- // Bump if the stored widgets need to be upgraded.
+ // Version of XML schema for app widgets. Bump if the stored widgets need to be upgraded.
private static final int CURRENT_VERSION = 1;
// Every widget update request is associated which an increasing sequence number. This is
@@ -205,9 +213,12 @@
Duration.ofHours(1).toMillis();
// Default max API calls per reset interval for generated preview API rate limiting.
private static final int DEFAULT_GENERATED_PREVIEW_MAX_CALLS_PER_INTERVAL = 2;
-
+ // XML attribute for widget ids that are pending deletion.
+ // See {@link Provider#pendingDeletedWidgetIds}.
private static final String PENDING_DELETED_IDS_ATTR = "pending_deleted_ids";
+ // Handles user and package related broadcasts.
+ // See {@link #registerBroadcastReceiver}
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
@@ -249,18 +260,27 @@
private final HashMap<Pair<Integer, FilterComparison>, HashSet<Integer>>
mRemoteViewsServicesAppWidgets = new HashMap<>();
+ // Synchronization lock for internal states in this service.
+ // TODO: Add GuardedBy annotation on states that need to be guarded.
private final Object mLock = new Object();
+ // Instances of actual widgets currently bound to each host.
private final ArrayList<Widget> mWidgets = new ArrayList<>();
+ // Information about the host apps that has one or more widgets bound to it.
private final ArrayList<Host> mHosts = new ArrayList<>();
+ // Information about the provider apps who indicates that they provide App Widgets
+ // in their manifest.
private final ArrayList<Provider> mProviders = new ArrayList<>();
-
+ // Pairs of (userId, packageName) which has explicit consent from user to
+ // hold the MODIFY_APPWIDGET_BIND_PERMISSIONS permission.
+ // See {@link AppWidgetManager#setBindAppWidgetPermission}
private final ArraySet<Pair<Integer, String>> mPackagesWithBindWidgetPermission =
new ArraySet<>();
-
+ // Ids of users whose widgets/provider/hosts have been loaded from disk.
private final SparseBooleanArray mLoadedUserIds = new SparseBooleanArray();
-
+ // Synchronization lock dedicated to {@link #mWidgetPackages}.
private final Object mWidgetPackagesLock = new Object();
+ // Set of packages that has at least one widget bounded by a host, keyed on userId.
private final SparseArray<ArraySet<String>> mWidgetPackages = new SparseArray<>();
private BackupRestoreController mBackupRestoreController;
@@ -280,18 +300,30 @@
private SecurityPolicy mSecurityPolicy;
+ // Handler to the background thread that saves states to disk.
private Handler mSaveStateHandler;
+ // Handler to the foreground thread that handles broadcasts related to user
+ // and package events, as well as various internal events within
+ // AppWidgetService.
private Handler mCallbackHandler;
-
+ // Map of user id to the next app widget id (monotonically increasing integer)
+ // that can be allocated for a new app widget.
+ // See {@link AppWidgetHost#allocateAppWidgetId}.
private final SparseIntArray mNextAppWidgetIds = new SparseIntArray();
-
+ // Indicates whether the device is running in safe mode.
private boolean mSafeMode;
+ // Load time validation of maximum memory can be used in widget bitmaps.
private int mMaxWidgetBitmapMemory;
+ // Feature flag that indicates whether
+ // {@link AppWidgetManager#ACTION_APPWIDGET_ENABLED} and
+ // {@linkAppWidgetManager#ACTION_APPWIDGET_UPDATE} are combined into a
+ // single broadcast.
private boolean mIsCombinedBroadcastEnabled;
// Mark widget lifecycle broadcasts as 'interactive'
private Bundle mInteractiveBroadcast;
-
+ // Counter that keeps track of how many times generated preview API are
+ // being called to ensure they are subject to rate limiting.
private ApiCounter mGeneratedPreviewsApiCounter;
AppWidgetServiceImpl(Context context) {