Merge "Fix widget restore flow" into rvc-dev am: 7973854504

Change-Id: Ia7d3c4ee302a11653ee4ec11f86efabb8c28e5c7
This commit is contained in:
Automerger Merge Worker
2020-02-25 19:32:41 +00:00
5 changed files with 62 additions and 61 deletions

View File

@@ -8189,6 +8189,7 @@ package android.appwidget {
field public static final String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth"; field public static final String OPTION_APPWIDGET_MAX_WIDTH = "appWidgetMaxWidth";
field public static final String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight"; field public static final String OPTION_APPWIDGET_MIN_HEIGHT = "appWidgetMinHeight";
field public static final String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth"; field public static final String OPTION_APPWIDGET_MIN_WIDTH = "appWidgetMinWidth";
field public static final String OPTION_APPWIDGET_RESTORE_COMPLETED = "appWidgetRestoreCompleted";
} }
public class AppWidgetProvider extends android.content.BroadcastReceiver { public class AppWidgetProvider extends android.content.BroadcastReceiver {

View File

@@ -181,6 +181,16 @@ public class AppWidgetManager {
*/ */
public static final String EXTRA_APPWIDGET_ID = "appWidgetId"; public static final String EXTRA_APPWIDGET_ID = "appWidgetId";
/**
* A bundle extra that contains whether or not an app has finished restoring a widget.
* <p> After restore, the app should set OPTION_APPWIDGET_RESTORE_COMPLETED to true on its
* widgets followed by calling {@link #updateAppWidget} to update the views.
*
* @see #updateAppWidgetOptions(int, Bundle)
*/
public static final String OPTION_APPWIDGET_RESTORE_COMPLETED = "appWidgetRestoreCompleted";
/** /**
* A bundle extra that contains the lower bound on the current width, in dips, of a widget instance. * A bundle extra that contains the lower bound on the current width, in dips, of a widget instance.
*/ */

View File

@@ -200,6 +200,9 @@ public class AppWidgetProvider extends BroadcastReceiver {
* provider can immediately generate new RemoteViews suitable for its newly-restored set * provider can immediately generate new RemoteViews suitable for its newly-restored set
* of instances. * of instances.
* *
* <p>In addition, you should set {@link AppWidgetManager#OPTION_APPWIDGET_RESTORE_COMPLETED}
* to true indicate if a widget has been restored successfully from the provider's side.
*
* {@more} * {@more}
* *
* @param context * @param context

View File

@@ -36,4 +36,5 @@ message WidgetProto {
optional int32 minHeight = 7; optional int32 minHeight = 7;
optional int32 maxWidth = 8; optional int32 maxWidth = 8;
optional int32 maxHeight = 9; optional int32 maxHeight = 9;
optional bool restoreCompleted = 10;
} }

View File

@@ -794,6 +794,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
proto.write(WidgetProto.PROVIDER_PACKAGE, widget.provider.id.componentName.getPackageName()); proto.write(WidgetProto.PROVIDER_PACKAGE, widget.provider.id.componentName.getPackageName());
proto.write(WidgetProto.PROVIDER_CLASS, widget.provider.id.componentName.getClassName()); proto.write(WidgetProto.PROVIDER_CLASS, widget.provider.id.componentName.getClassName());
if (widget.options != null) { if (widget.options != null) {
proto.write(WidgetProto.RESTORE_COMPLETED,
widget.options.getBoolean(AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED));
proto.write(WidgetProto.MIN_WIDTH, proto.write(WidgetProto.MIN_WIDTH,
widget.options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, 0)); widget.options.getInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH, 0));
proto.write(WidgetProto.MIN_HEIGHT, proto.write(WidgetProto.MIN_HEIGHT,
@@ -2509,7 +2511,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
out.endTag(null, "h"); out.endTag(null, "h");
} }
private static void serializeAppWidget(XmlSerializer out, Widget widget) throws IOException { private static void serializeAppWidget(XmlSerializer out, Widget widget,
boolean saveRestoreCompleted) throws IOException {
out.startTag(null, "g"); out.startTag(null, "g");
out.attribute(null, "id", Integer.toHexString(widget.appWidgetId)); out.attribute(null, "id", Integer.toHexString(widget.appWidgetId));
out.attribute(null, "rid", Integer.toHexString(widget.restoredId)); out.attribute(null, "rid", Integer.toHexString(widget.restoredId));
@@ -2528,10 +2531,50 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
out.attribute(null, "max_height", Integer.toHexString((maxHeight > 0) ? maxHeight : 0)); out.attribute(null, "max_height", Integer.toHexString((maxHeight > 0) ? maxHeight : 0));
out.attribute(null, "host_category", Integer.toHexString(widget.options.getInt( out.attribute(null, "host_category", Integer.toHexString(widget.options.getInt(
AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY))); AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY)));
if (saveRestoreCompleted) {
boolean restoreCompleted = widget.options.getBoolean(
AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED);
out.attribute(null, "restore_completed", Boolean.toString(restoreCompleted));
}
} }
out.endTag(null, "g"); out.endTag(null, "g");
} }
private static Bundle parseWidgetIdOptions(XmlPullParser parser) {
Bundle options = new Bundle();
String restoreCompleted = parser.getAttributeValue(null, "restore_completed");
if (restoreCompleted != null) {
options.putBoolean(AppWidgetManager.OPTION_APPWIDGET_RESTORE_COMPLETED,
Boolean.valueOf(restoreCompleted));
}
String minWidthString = parser.getAttributeValue(null, "min_width");
if (minWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH,
Integer.parseInt(minWidthString, 16));
}
String minHeightString = parser.getAttributeValue(null, "min_height");
if (minHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT,
Integer.parseInt(minHeightString, 16));
}
String maxWidthString = parser.getAttributeValue(null, "max_width");
if (maxWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH,
Integer.parseInt(maxWidthString, 16));
}
String maxHeightString = parser.getAttributeValue(null, "max_height");
if (maxHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT,
Integer.parseInt(maxHeightString, 16));
}
String categoryString = parser.getAttributeValue(null, "host_category");
if (categoryString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
Integer.parseInt(categoryString, 16));
}
return options;
}
@Override @Override
public List<String> getWidgetParticipants(int userId) { public List<String> getWidgetParticipants(int userId) {
return mBackupRestoreController.getWidgetParticipants(userId); return mBackupRestoreController.getWidgetParticipants(userId);
@@ -3064,7 +3107,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
if (widget.host.getUserId() != userId) { if (widget.host.getUserId() != userId) {
continue; continue;
} }
serializeAppWidget(out, widget); serializeAppWidget(out, widget, true);
} }
Iterator<Pair<Integer, String>> it = mPackagesWithBindWidgetPermission.iterator(); Iterator<Pair<Integer, String>> it = mPackagesWithBindWidgetPermission.iterator();
@@ -3203,34 +3246,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
String restoredIdString = parser.getAttributeValue(null, "rid"); String restoredIdString = parser.getAttributeValue(null, "rid");
widget.restoredId = (restoredIdString == null) ? 0 widget.restoredId = (restoredIdString == null) ? 0
: Integer.parseInt(restoredIdString, 16); : Integer.parseInt(restoredIdString, 16);
widget.options = parseWidgetIdOptions(parser);
Bundle options = new Bundle();
String minWidthString = parser.getAttributeValue(null, "min_width");
if (minWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH,
Integer.parseInt(minWidthString, 16));
}
String minHeightString = parser.getAttributeValue(null, "min_height");
if (minHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT,
Integer.parseInt(minHeightString, 16));
}
String maxWidthString = parser.getAttributeValue(null, "max_width");
if (maxWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH,
Integer.parseInt(maxWidthString, 16));
}
String maxHeightString = parser.getAttributeValue(null, "max_height");
if (maxHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT,
Integer.parseInt(maxHeightString, 16));
}
String categoryString = parser.getAttributeValue(null, "host_category");
if (categoryString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
Integer.parseInt(categoryString, 16));
}
widget.options = options;
final int hostTag = Integer.parseInt(parser.getAttributeValue( final int hostTag = Integer.parseInt(parser.getAttributeValue(
null, "h"), 16); null, "h"), 16);
@@ -4382,7 +4398,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
if (widget.host.isInPackageForUser(backedupPackage, userId) if (widget.host.isInPackageForUser(backedupPackage, userId)
|| (provider != null || (provider != null
&& provider.isInPackageForUser(backedupPackage, userId))) { && provider.isInPackageForUser(backedupPackage, userId))) {
serializeAppWidget(out, widget); serializeAppWidget(out, widget, false);
} }
} }
@@ -4815,36 +4831,6 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
|| widget.provider.getUserId() == userId); || widget.provider.getUserId() == userId);
} }
private Bundle parseWidgetIdOptions(XmlPullParser parser) {
Bundle options = new Bundle();
String minWidthString = parser.getAttributeValue(null, "min_width");
if (minWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_WIDTH,
Integer.parseInt(minWidthString, 16));
}
String minHeightString = parser.getAttributeValue(null, "min_height");
if (minHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MIN_HEIGHT,
Integer.parseInt(minHeightString, 16));
}
String maxWidthString = parser.getAttributeValue(null, "max_width");
if (maxWidthString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_WIDTH,
Integer.parseInt(maxWidthString, 16));
}
String maxHeightString = parser.getAttributeValue(null, "max_height");
if (maxHeightString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_MAX_HEIGHT,
Integer.parseInt(maxHeightString, 16));
}
String categoryString = parser.getAttributeValue(null, "host_category");
if (categoryString != null) {
options.putInt(AppWidgetManager.OPTION_APPWIDGET_HOST_CATEGORY,
Integer.parseInt(categoryString, 16));
}
return options;
}
private int countPendingUpdates(ArrayList<RestoreUpdateRecord> updates) { private int countPendingUpdates(ArrayList<RestoreUpdateRecord> updates) {
int pending = 0; int pending = 0;
final int N = updates.size(); final int N = updates.size();