Merge "Fix widget restore flow" into rvc-dev am: 7973854504
Change-Id: I0a08e4de896c13034ca4c5349b470a469d1fb5df
This commit is contained in:
@@ -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 {
|
||||||
|
|||||||
@@ -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.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
Reference in New Issue
Block a user