private void removeUserStateLocked(final int userHandle) { // Cleanup package manager settings mPm.cleanUpUserLILPw(userHandle); // Remove this user from the list mUsers.remove(userHandle); // Have user ID linger for several seconds to let external storage VFS // cache entries expire. This must be greater than the 'entry_valid' // timeout used by the FUSE daemon. mHandler.postDelayed( new Runnable() { @Override public void run() { synchronized (mPackagesLock) { mRemovingUserIds.delete(userHandle); } } }, MINUTE_IN_MILLIS); // Remove user file AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + ".xml")); userFile.delete(); // Update the user list writeUserListLocked(); updateUserIdsLocked(); removeDirectoryRecursive(Environment.getUserSystemDirectory(userHandle)); }
@Override public UserInfo createUser(String name, int flags) { checkManageUsersPermission("Only the system can create users"); final long ident = Binder.clearCallingIdentity(); final UserInfo userInfo; try { synchronized (mInstallLock) { synchronized (mPackagesLock) { if (isUserLimitReachedLocked()) return null; int userId = getNextAvailableIdLocked(); userInfo = new UserInfo(userId, name, null, flags); File userPath = new File(mBaseUserPath, Integer.toString(userId)); userInfo.serialNumber = mNextSerialNumber++; long now = System.currentTimeMillis(); userInfo.creationTime = (now > EPOCH_PLUS_30_YEARS) ? now : 0; userInfo.partial = true; Environment.getUserSystemDirectory(userInfo.id).mkdirs(); mUsers.put(userId, userInfo); writeUserListLocked(); writeUserLocked(userInfo); mPm.createNewUserLILPw(userId, userPath); userInfo.partial = false; writeUserLocked(userInfo); updateUserIdsLocked(); } } if (userInfo != null) { Intent addedIntent = new Intent(Intent.ACTION_USER_ADDED); addedIntent.putExtra(Intent.EXTRA_USER_HANDLE, userInfo.id); mContext.sendBroadcastAsUser( addedIntent, UserHandle.ALL, android.Manifest.permission.MANAGE_USERS); } } finally { Binder.restoreCallingIdentity(ident); } return userInfo; }
public class WallpaperBackupHelper extends FileBackupHelperBase implements BackupHelper { private static final boolean DEBUG = false; private static final String STAGE_FILE = (new File(Environment.getUserSystemDirectory(0), "wallpaper-tmp")).getAbsolutePath(); private static final String TAG = "WallpaperBackupHelper"; public static final String WALLPAPER_IMAGE = (new File(Environment.getUserSystemDirectory(0), "wallpaper")).getAbsolutePath(); public static final String WALLPAPER_IMAGE_KEY = "/data/data/com.android.settings/files/wallpaper"; public static final String WALLPAPER_INFO = (new File(Environment.getUserSystemDirectory(0), "wallpaper_info.xml")).getAbsolutePath(); public static final String WALLPAPER_INFO_KEY = "/data/system/wallpaper_info.xml"; Context mContext; double mDesiredMinHeight; double mDesiredMinWidth; String mFiles[]; String mKeys[]; public WallpaperBackupHelper(Context context, String as[], String as1[]) { super(context); mContext = context; mFiles = as; mKeys = as1; WallpaperManager wallpapermanager = (WallpaperManager) context.getSystemService("wallpaper"); mDesiredMinWidth = wallpapermanager.getDesiredMinimumWidth(); mDesiredMinHeight = wallpapermanager.getDesiredMinimumHeight(); if (mDesiredMinWidth <= 0.0D || mDesiredMinHeight <= 0.0D) { Display display = ((WindowManager) context.getSystemService("window")).getDefaultDisplay(); Point point = new Point(); display.getSize(point); mDesiredMinWidth = point.x; mDesiredMinHeight = point.y; } } public void performBackup( ParcelFileDescriptor parcelfiledescriptor, BackupDataOutput backupdataoutput, ParcelFileDescriptor parcelfiledescriptor1) { performBackup_checked( parcelfiledescriptor, backupdataoutput, parcelfiledescriptor1, mFiles, mKeys); } public void restoreEntity(BackupDataInputStream backupdatainputstream) { String s = backupdatainputstream.getKey(); if (isKeyInList(s, mKeys)) if (s.equals("/data/data/com.android.settings/files/wallpaper")) { File file = new File(STAGE_FILE); if (writeFile(file, backupdatainputstream)) { android.graphics.BitmapFactory.Options options = new android.graphics.BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeFile(STAGE_FILE, options); double d = mDesiredMinWidth / (double) options.outWidth; double d1 = mDesiredMinHeight / (double) options.outHeight; if (d > 0.0D && d < 1.3300000000000001D && d1 > 0.0D && d1 < 1.3300000000000001D) { file.renameTo(new File(WALLPAPER_IMAGE)); } else { file.delete(); return; } } } else if (s.equals("/data/system/wallpaper_info.xml")) { writeFile(new File(WALLPAPER_INFO), backupdatainputstream); return; } } public volatile void writeNewStateDescription(ParcelFileDescriptor parcelfiledescriptor) { super.writeNewStateDescription(parcelfiledescriptor); } }