Merge "Don\'t back up wallpapers that we\'ve been told not to" into nyc-dev

am: 665189f

* commit '665189f92646d34bf02082120cba3c62aa718770':
  Don't back up wallpapers that we've been told not to

Change-Id: I45d037436e349445f091a7dad5abad4b7421ad8e
This commit is contained in:
Christopher Tate
2016-04-20 22:13:17 +00:00
committed by android-build-merger
8 changed files with 320 additions and 62 deletions

View File

@@ -43,7 +43,8 @@ interface IWallpaperManager {
* new wallpaper content is ready to display.
*/
ParcelFileDescriptor setWallpaper(String name, in String callingPackage,
in Rect cropHint, out Bundle extras, int which, IWallpaperManagerCallback completion);
in Rect cropHint, boolean allowBackup, out Bundle extras, int which,
IWallpaperManagerCallback completion);
/**
* Set the live wallpaper. This only affects the system wallpaper.
@@ -124,6 +125,11 @@ interface IWallpaperManager {
*/
boolean isWallpaperSettingAllowed(in String callingPackage);
/*
* Backup: is the current system wallpaper image eligible for off-device backup?
*/
boolean isWallpaperBackupEligible(int userId);
/*
* Keyguard: register a callback for being notified that lock-state relevant
* wallpaper content has changed.

View File

@@ -1,5 +1,5 @@
/*
h * Copyright (C) 2009 The Android Open Source Project
* Copyright (C) 2009 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -875,7 +875,7 @@ public class WallpaperManager {
/* Set the wallpaper to the default values */
ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(
"res:" + resources.getResourceName(resid),
mContext.getOpPackageName(), null, result, which, completion);
mContext.getOpPackageName(), null, false, result, which, completion);
if (fd != null) {
FileOutputStream fos = null;
boolean ok = false;
@@ -985,7 +985,8 @@ public class WallpaperManager {
final WallpaperSetCompletion completion = new WallpaperSetCompletion();
try {
ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,
mContext.getOpPackageName(), visibleCropHint, result, which, completion);
mContext.getOpPackageName(), visibleCropHint, allowBackup,
result, which, completion);
if (fd != null) {
FileOutputStream fos = null;
try {
@@ -1102,7 +1103,8 @@ public class WallpaperManager {
final WallpaperSetCompletion completion = new WallpaperSetCompletion();
try {
ParcelFileDescriptor fd = sGlobals.mService.setWallpaper(null,
mContext.getOpPackageName(), visibleCropHint, result, which, completion);
mContext.getOpPackageName(), visibleCropHint, allowBackup,
result, which, completion);
if (fd != null) {
FileOutputStream fos = null;
try {
@@ -1565,6 +1567,25 @@ public class WallpaperManager {
}
}
/**
* Is the current system wallpaper eligible for backup?
*
* Only the OS itself may use this method.
* @hide
*/
public boolean isWallpaperBackupEligible() {
if (sGlobals.mService == null) {
Log.w(TAG, "WallpaperService not running");
return false;
}
try {
return sGlobals.mService.isWallpaperBackupEligible(mContext.getUserId());
} catch (RemoteException e) {
Log.e(TAG, "Exception querying wallpaper backup eligibility: " + e.getMessage());
}
return false;
}
// Private completion callback for setWallpaper() synchronization
private class WallpaperSetCompletion extends IWallpaperManagerCallback.Stub {
final CountDownLatch mLatch;

View File

@@ -76,26 +76,6 @@ public class SystemBackupAgent extends BackupAgentHelper {
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState) throws IOException {
// We only back up the data under the current "wallpaper" schema with metadata
IWallpaperManager wallpaper = (IWallpaperManager)ServiceManager.getService(
Context.WALLPAPER_SERVICE);
String[] files = new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO };
String[] keys = new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY };
if (wallpaper != null) {
try {
final String wallpaperName = wallpaper.getName();
if (wallpaperName != null && wallpaperName.length() > 0) {
// When the wallpaper has a name, back up the info by itself.
// TODO: Don't rely on the innards of the service object like this!
// TODO: Send a delete for any stored wallpaper image in this case?
files = new String[] { WALLPAPER_INFO };
keys = new String[] { WALLPAPER_INFO_KEY };
}
} catch (RemoteException re) {
Slog.e(TAG, "Couldn't get wallpaper name\n" + re);
}
}
addHelper(WALLPAPER_HELPER, new WallpaperBackupHelper(this, files, keys));
addHelper(SYNC_SETTINGS_HELPER, new AccountSyncSettingsBackupHelper(this));
addHelper(PREFERRED_HELPER, new PreferredActivityBackupHelper());
addHelper(NOTIFICATION_HELPER, new NotificationBackupHelper(this));
@@ -107,30 +87,20 @@ public class SystemBackupAgent extends BackupAgentHelper {
@Override
public void onFullBackup(FullBackupDataOutput data) throws IOException {
// At present we back up only the wallpaper
fullWallpaperBackup(data);
}
private void fullWallpaperBackup(FullBackupDataOutput output) {
// Back up the data files directly. We do them in this specific order --
// info file followed by image -- because then we need take no special
// steps during restore; the restore will happen properly when the individual
// files are restored piecemeal.
FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
WALLPAPER_INFO_DIR, WALLPAPER_INFO, output);
FullBackup.backupToTar(getPackageName(), FullBackup.ROOT_TREE_TOKEN, null,
WALLPAPER_IMAGE_DIR, WALLPAPER_IMAGE, output);
// At present we don't back up anything
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
throws IOException {
// Slot in a restore helper for the older wallpaper backup schema to support restore
// from devices still generating data in that format.
mWallpaperHelper = new WallpaperBackupHelper(this,
new String[] { WALLPAPER_IMAGE, WALLPAPER_INFO },
new String[] { WALLPAPER_IMAGE_KEY, WALLPAPER_INFO_KEY} );
addHelper(WALLPAPER_HELPER, mWallpaperHelper);
// On restore, we also support a previous data schema "system_files"
// On restore, we also support a long-ago wallpaper data schema "system_files"
addHelper("system_files", new WallpaperBackupHelper(this,
new String[] { WALLPAPER_IMAGE },
new String[] { WALLPAPER_IMAGE_KEY} ));

View File

@@ -0,0 +1,34 @@
#
# Copyright (C) 2016 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_PACKAGE_NAME := WallpaperBackup
LOCAL_CERTIFICATE := platform
LOCAL_PRIVILEGED_MODULE := false
include $(BUILD_PACKAGE)
########################
include $(call all-makefiles-under,$(LOCAL_PATH))

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
* Copyright (c) 2016 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.wallpaperbackup"
android:sharedUserId="android.uid.system" >
<application android:allowClearUserData="false"
android:process="system"
android:killAfterRestore="false"
android:allowBackup="true"
android:backupAgent=".WallpaperBackupAgent"
android:fullBackupOnly="true" >
</application>
</manifest>

View File

@@ -0,0 +1 @@
-keep class com.android.wallpaperbackup.WallpaperBackupAgent

View File

@@ -0,0 +1,164 @@
/*
* Copyright (C) 2016 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.wallpaperbackup;
import android.app.WallpaperManager;
import android.app.backup.BackupAgent;
import android.app.backup.BackupDataInput;
import android.app.backup.BackupDataOutput;
import android.app.backup.FullBackupDataOutput;
import android.content.Context;
import android.os.Environment;
import android.os.ParcelFileDescriptor;
import android.os.UserHandle;
import android.system.Os;
import android.util.Slog;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class WallpaperBackupAgent extends BackupAgent {
private static final String TAG = "WallpaperBackup";
private static final boolean DEBUG = false;
// NB: must be kept in sync with WallpaperManagerService but has no
// compile-time visiblity.
// Target filenames within the system's wallpaper directory
static final String WALLPAPER = "wallpaper_orig";
static final String WALLPAPER_INFO = "wallpaper_info.xml";
// Names of our local-data stage files/links
static final String IMAGE_STAGE = "wallpaper-stage";
static final String INFO_STAGE = "wallpaper-info-stage";
static final String EMPTY_SENTINEL = "empty";
private File mWallpaperInfo; // wallpaper metadata file
private File mWallpaperFile; // primary wallpaper image file
private WallpaperManager mWm;
@Override
public void onCreate() {
if (DEBUG) {
Slog.v(TAG, "onCreate()");
}
File wallpaperDir = Environment.getUserSystemDirectory(UserHandle.USER_SYSTEM);
mWallpaperInfo = new File(wallpaperDir, WALLPAPER_INFO);
mWallpaperFile = new File(wallpaperDir, WALLPAPER);
mWm = (WallpaperManager) getSystemService(Context.WALLPAPER_SERVICE);
}
@Override
public void onFullBackup(FullBackupDataOutput data) throws IOException {
// To avoid data duplication and disk churn, use links as the stage.
final File filesDir = getFilesDir();
final File infoStage = new File(filesDir, INFO_STAGE);
final File imageStage = new File (filesDir, IMAGE_STAGE);
final File empty = new File (filesDir, EMPTY_SENTINEL);
try {
// We always back up this 'empty' file to ensure that the absence of
// storable wallpaper imagery still produces a non-empty backup data
// stream, otherwise it'd simply be ignored in preflight.
FileOutputStream touch = new FileOutputStream(empty);
touch.close();
fullBackupFile(empty, data);
// only back up the wallpaper if we've been told it's allowed
if (mWm.isWallpaperBackupEligible()) {
if (DEBUG) {
Slog.v(TAG, "Wallpaper is backup-eligible; linking & writing");
}
Os.link(mWallpaperInfo.getCanonicalPath(), infoStage.getCanonicalPath());
fullBackupFile(infoStage, data);
Os.link(mWallpaperFile.getCanonicalPath(), imageStage.getCanonicalPath());
fullBackupFile(imageStage, data);
} else {
if (DEBUG) {
Slog.v(TAG, "Wallpaper not backup-eligible; writing no data");
}
}
} catch (Exception e) {
Slog.e(TAG, "Unable to back up wallpaper: " + e.getMessage());
} finally {
if (DEBUG) {
Slog.v(TAG, "Removing backup stage links");
}
infoStage.delete();
imageStage.delete();
}
}
// We use the default onRestoreFile() implementation that will recreate our stage files,
// then postprocess in onRestoreFinished() to move them on top of the live data.
//
// NOTE: this relies on our local files dir being on the same filesystem as the live
// system wallpaper data. If this is not the case then an actual copy operation will
// be needed.
@Override
public void onRestoreFinished() {
if (DEBUG) {
Slog.v(TAG, "onRestoreFinished()");
}
final File infoStage = new File(getFilesDir(), INFO_STAGE);
final File imageStage = new File (getFilesDir(), IMAGE_STAGE);
try {
// It is valid for the imagery to be absent; it means that we were not permitted
// to back up the original image on the source device.
if (imageStage.exists()) {
if (DEBUG) {
Slog.v(TAG, "Got restored wallpaper; renaming into place");
}
// Rename the image file into place last because that is the trigger for
// the wallpaper observer to generate a new crop/scale
Os.rename(infoStage.getCanonicalPath(), mWallpaperInfo.getCanonicalPath());
Os.rename(imageStage.getCanonicalPath(), mWallpaperFile.getCanonicalPath());
}
} catch (Exception e) {
Slog.e(TAG, "Unable to restore wallpaper: " + e.getMessage());
mWm.clearWallpaper(WallpaperManager.FLAG_SYSTEM, UserHandle.USER_SYSTEM);
} finally {
// These "should" not exist because of the renames, but make sure
// in case of errors/exceptions/etc.
if (DEBUG) {
Slog.v(TAG, "Removing restore stage files");
}
infoStage.delete();
imageStage.delete();
}
}
//
// Key/value API: abstract, so required, but not used
//
@Override
public void onBackup(ParcelFileDescriptor oldState, BackupDataOutput data,
ParcelFileDescriptor newState) throws IOException {
// Intentionally blank
}
@Override
public void onRestore(BackupDataInput data, int appVersionCode, ParcelFileDescriptor newState)
throws IOException {
// Intentionally blank
}
}

View File

@@ -34,7 +34,6 @@ import android.app.PendingIntent;
import android.app.WallpaperInfo;
import android.app.WallpaperManager;
import android.app.admin.DevicePolicyManager;
import android.app.backup.BackupManager;
import android.app.backup.WallpaperBackupHelper;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
@@ -61,6 +60,7 @@ import android.os.FileObserver;
import android.os.FileUtils;
import android.os.IBinder;
import android.os.IRemoteCallback;
import android.os.Process;
import android.os.ParcelFileDescriptor;
import android.os.RemoteCallbackList;
import android.os.RemoteException;
@@ -205,7 +205,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
if (path == null) {
return;
}
final boolean written = (event == CLOSE_WRITE || event == MOVED_TO);
final boolean moved = (event == MOVED_TO);
final boolean written = (event == CLOSE_WRITE || moved);
final File changedFile = new File(mWallpaperDir, path);
// System and system+lock changes happen on the system wallpaper input file;
@@ -224,13 +225,6 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
+ " written=" + written);
}
synchronized (mLock) {
if (sysWallpaperChanged || mWallpaperInfoFile.equals(changedFile)) {
// changing the wallpaper means we'll need to back up the new one
long origId = Binder.clearCallingIdentity();
BackupManager bm = new BackupManager(mContext);
bm.dataChanged();
Binder.restoreCallingIdentity(origId);
}
if (sysWallpaperChanged || lockWallpaperChanged) {
notifyCallbacksLocked(wallpaper);
if (wallpaper.wallpaperComponent == null
@@ -244,6 +238,14 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
if (DEBUG) {
Slog.v(TAG, "Wallpaper written; generating crop");
}
if (moved) {
// This is a restore, so generate the crop using any just-restored new
// crop guidelines, making sure to preserve our local dimension hints.
if (DEBUG) {
Slog.v(TAG, "moved-to, therefore restore; reloading metadata");
}
loadSettingsLocked(wallpaper.userId, true);
}
generateCrop(wallpaper);
if (DEBUG) {
Slog.v(TAG, "Crop done; invoking completion callback");
@@ -490,6 +492,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
*/
IWallpaperManagerCallback setComplete;
/**
* Is the OS allowed to back up this wallpaper imagery?
*/
boolean allowBackup;
/**
* Resource name if using a picture from the wallpaper gallery
*/
@@ -811,7 +818,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
mMonitor = new MyPackageMonitor();
mMonitor.register(context, null, UserHandle.ALL, true);
getWallpaperDir(UserHandle.USER_SYSTEM).mkdirs();
loadSettingsLocked(UserHandle.USER_SYSTEM);
loadSettingsLocked(UserHandle.USER_SYSTEM, false);
}
private static File getWallpaperDir(int userId) {
@@ -1024,7 +1031,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
wallpaper = mWallpaperMap.get(userId);
if (wallpaper == null) {
// Might need to bring it in the first time to establish our rewrite
loadSettingsLocked(userId);
loadSettingsLocked(userId, false);
wallpaper = mWallpaperMap.get(userId);
}
}
@@ -1102,7 +1109,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
WallpaperData wd = mWallpaperMap.get(user.id);
if (wd == null) {
// User hasn't started yet, so load her settings to peek at the wallpaper
loadSettingsLocked(user.id);
loadSettingsLocked(user.id, false);
wd = mWallpaperMap.get(user.id);
}
if (wd != null && name.equals(wd.name)) {
@@ -1235,7 +1242,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
if (wallpaper == null) {
// common case, this is the first lookup post-boot of the system or
// unified lock, so we bring up the saved state lazily now and recheck.
loadSettingsLocked(wallpaperUserId);
loadSettingsLocked(wallpaperUserId, false);
wallpaper = whichSet.get(wallpaperUserId);
if (wallpaper == null) {
return null;
@@ -1304,7 +1311,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
@Override
public ParcelFileDescriptor setWallpaper(String name, String callingPackage,
Rect cropHint, Bundle extras, int which, IWallpaperManagerCallback completion) {
Rect cropHint, boolean allowBackup, Bundle extras, int which,
IWallpaperManagerCallback completion) {
checkPermission(android.Manifest.permission.SET_WALLPAPER);
if ((which & (FLAG_LOCK|FLAG_SYSTEM)) == 0) {
@@ -1342,6 +1350,9 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
wallpaper.whichPending = which;
wallpaper.setComplete = completion;
wallpaper.cropHint.set(cropHint);
if ((which & FLAG_SYSTEM) != 0) {
wallpaper.allowBackup = allowBackup;
}
}
return pfd;
} finally {
@@ -1651,6 +1662,16 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
return !um.hasUserRestriction(UserManager.DISALLOW_SET_WALLPAPER);
}
@Override
public boolean isWallpaperBackupEligible(int userId) {
if (Binder.getCallingUid() != Process.SYSTEM_UID) {
throw new SecurityException("Only the system may call isWallpaperBackupEligible");
}
WallpaperData wallpaper = getWallpaperSafeLocked(userId, FLAG_SYSTEM);
return (wallpaper != null) ? wallpaper.allowBackup : false;
}
private static JournaledFile makeJournaledFile(int userId) {
final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath();
return new JournaledFile(new File(base), new File(base + ".tmp"));
@@ -1721,6 +1742,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
out.attribute(null, "component",
wallpaper.wallpaperComponent.flattenToShortString());
}
if (wallpaper.allowBackup) {
out.attribute(null, "backup", "true");
}
out.endTag(null, tag);
}
@@ -1764,7 +1790,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
if (wallpaper == null) {
// common case, this is the first lookup post-boot of the system or
// unified lock, so we bring up the saved state lazily now and recheck.
loadSettingsLocked(userId);
loadSettingsLocked(userId, false);
wallpaper = whichSet.get(userId);
// if it's still null here, this is a lock-only operation and there is not
// yet a lock-only wallpaper set for this user, so we need to establish
@@ -1788,7 +1814,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
return wallpaper;
}
private void loadSettingsLocked(int userId) {
private void loadSettingsLocked(int userId, boolean keepDimensionHints) {
if (DEBUG) Slog.v(TAG, "loadSettingsLocked");
JournaledFile journal = makeJournaledFile(userId);
@@ -1801,6 +1827,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
WallpaperData wallpaper = mWallpaperMap.get(userId);
if (wallpaper == null) {
wallpaper = new WallpaperData(userId, WALLPAPER, WALLPAPER_CROP);
wallpaper.allowBackup = true;
mWallpaperMap.put(userId, wallpaper);
if (!wallpaper.cropExists()) {
generateCrop(wallpaper);
@@ -1819,7 +1846,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
String tag = parser.getName();
if ("wp".equals(tag)) {
// Common to system + lock wallpapers
parseWallpaperAttributes(parser, wallpaper);
parseWallpaperAttributes(parser, wallpaper, keepDimensionHints);
// A system wallpaper might also be a live wallpaper
String comp = parser.getAttributeValue(null, "component");
@@ -1848,7 +1875,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
WALLPAPER_LOCK_ORIG, WALLPAPER_LOCK_CROP);
mLockWallpaperMap.put(userId, lockWallpaper);
}
parseWallpaperAttributes(parser, lockWallpaper);
parseWallpaperAttributes(parser, lockWallpaper, false);
}
}
} while (type != XmlPullParser.END_DOCUMENT);
@@ -1909,7 +1936,8 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
}
}
private void parseWallpaperAttributes(XmlPullParser parser, WallpaperData wallpaper) {
private void parseWallpaperAttributes(XmlPullParser parser, WallpaperData wallpaper,
boolean keepDimensionHints) {
final String idString = parser.getAttributeValue(null, "id");
if (idString != null) {
final int id = wallpaper.wallpaperId = Integer.parseInt(idString);
@@ -1920,9 +1948,11 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
wallpaper.wallpaperId = makeWallpaperIdLocked();
}
wallpaper.width = Integer.parseInt(parser.getAttributeValue(null, "width"));
wallpaper.height = Integer.parseInt(parser
.getAttributeValue(null, "height"));
if (!keepDimensionHints) {
wallpaper.width = Integer.parseInt(parser.getAttributeValue(null, "width"));
wallpaper.height = Integer.parseInt(parser
.getAttributeValue(null, "height"));
}
wallpaper.cropHint.left = getAttributeInt(parser, "cropLeft", 0);
wallpaper.cropHint.top = getAttributeInt(parser, "cropTop", 0);
wallpaper.cropHint.right = getAttributeInt(parser, "cropRight", 0);
@@ -1932,6 +1962,7 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
wallpaper.padding.right = getAttributeInt(parser, "paddingRight", 0);
wallpaper.padding.bottom = getAttributeInt(parser, "paddingBottom", 0);
wallpaper.name = parser.getAttributeValue(null, "name");
wallpaper.allowBackup = "true".equals(parser.getAttributeValue(null, "backup"));
}
private int getMaximumSizeDimension() {
@@ -1952,9 +1983,10 @@ public class WallpaperManagerService extends IWallpaperManager.Stub {
WallpaperData wallpaper = null;
boolean success = false;
synchronized (mLock) {
loadSettingsLocked(UserHandle.USER_SYSTEM);
loadSettingsLocked(UserHandle.USER_SYSTEM, false);
wallpaper = mWallpaperMap.get(UserHandle.USER_SYSTEM);
wallpaper.wallpaperId = makeWallpaperIdLocked(); // always bump id at restore
wallpaper.allowBackup = true; // by definition if it was restored
if (wallpaper.nextWallpaperComponent != null
&& !wallpaper.nextWallpaperComponent.equals(mImageWallpaper)) {
if (!bindWallpaperComponentLocked(wallpaper.nextWallpaperComponent, false, false,