From 61f57379ca2c5b6290c8da7548fa17128f7ab24f Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Fri, 31 Aug 2012 12:12:28 -0700 Subject: [PATCH] Centralize the creation of the user system directory Environment.getUserSystemDirectory(int userId) Use it all relevant places that was hardcoding it. Also, wipe out the user's system directory when user is removed, otherwise old state might be transferred to a new user. Change-Id: I788ce9c4cf9624229e65efa7047bc0c019ccef0a --- .../android/accounts/AccountManagerService.java | 4 ++-- .../android/app/backup/WallpaperBackupHelper.java | 14 +++++++++++--- core/java/android/os/Environment.java | 11 +++++++++++ .../internal/widget/LockSettingsService.java | 7 +++++-- .../com/android/server/AppWidgetServiceImpl.java | 5 +++-- .../java/com/android/server/SystemBackupAgent.java | 8 ++++++-- .../android/server/WallpaperManagerService.java | 12 +++++------- services/java/com/android/server/pm/Settings.java | 7 +++---- .../com/android/server/pm/UserManagerService.java | 12 ++++++++++++ 9 files changed, 58 insertions(+), 22 deletions(-) diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 7a9f2859109ad..a075bd766f724 100644 --- a/core/java/android/accounts/AccountManagerService.java +++ b/core/java/android/accounts/AccountManagerService.java @@ -1879,7 +1879,7 @@ public class AccountManagerService private static String getDatabaseName(int userId) { File systemDir = Environment.getSystemSecureDirectory(); - File databaseFile = new File(systemDir, "users/" + userId + "/" + DATABASE_NAME); + File databaseFile = new File(Environment.getUserSystemDirectory(userId), DATABASE_NAME); if (userId == 0) { // Migrate old file, if it exists, to the new location. // Make sure the new file doesn't already exist. A dummy file could have been @@ -1888,7 +1888,7 @@ public class AccountManagerService File oldFile = new File(systemDir, DATABASE_NAME); if (oldFile.exists() && !databaseFile.exists()) { // Check for use directory; create if it doesn't exist, else renameTo will fail - File userDir = new File(systemDir, "users/" + userId); + File userDir = Environment.getUserSystemDirectory(userId); if (!userDir.exists()) { if (!userDir.mkdirs()) { throw new IllegalStateException("User dir cannot be created: " + userDir); diff --git a/core/java/android/app/backup/WallpaperBackupHelper.java b/core/java/android/app/backup/WallpaperBackupHelper.java index a74a2689c0be6..9e8ab2c5bfbbb 100644 --- a/core/java/android/app/backup/WallpaperBackupHelper.java +++ b/core/java/android/app/backup/WallpaperBackupHelper.java @@ -20,7 +20,9 @@ import android.app.WallpaperManager; import android.content.Context; import android.graphics.BitmapFactory; import android.graphics.Point; +import android.os.Environment; import android.os.ParcelFileDescriptor; +import android.os.UserHandle; import android.util.Slog; import android.view.Display; import android.view.WindowManager; @@ -39,8 +41,12 @@ public class WallpaperBackupHelper extends FileBackupHelperBase implements Backu // This path must match what the WallpaperManagerService uses // TODO: Will need to change if backing up non-primary user's wallpaper - public static final String WALLPAPER_IMAGE = "/data/system/users/0/wallpaper"; - public static final String WALLPAPER_INFO = "/data/system/users/0/wallpaper_info.xml"; + public static final String WALLPAPER_IMAGE = + new File(Environment.getUserSystemDirectory(UserHandle.USER_OWNER), + "wallpaper").getAbsolutePath(); + public static final String WALLPAPER_INFO = + new File(Environment.getUserSystemDirectory(UserHandle.USER_OWNER), + "wallpaper_info.xml").getAbsolutePath(); // Use old keys to keep legacy data compatibility and avoid writing two wallpapers public static final String WALLPAPER_IMAGE_KEY = "/data/data/com.android.settings/files/wallpaper"; @@ -50,7 +56,9 @@ public class WallpaperBackupHelper extends FileBackupHelperBase implements Backu // will be saved to this file from the restore stream, then renamed to the proper // location if it's deemed suitable. // TODO: Will need to change if backing up non-primary user's wallpaper - private static final String STAGE_FILE = "/data/system/users/0/wallpaper-tmp"; + private static final String STAGE_FILE = + new File(Environment.getUserSystemDirectory(UserHandle.USER_OWNER), + "wallpaper-tmp").getAbsolutePath(); Context mContext; String[] mFiles; diff --git a/core/java/android/os/Environment.java b/core/java/android/os/Environment.java index 679cf1aaef37c..2fbcf3fe29690 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -103,6 +103,17 @@ public class Environment { return MEDIA_STORAGE_DIRECTORY; } + /** + * Return the system directory for a user. This is for use by system services to store + * files relating to the user. This directory will be automatically deleted when the user + * is removed. + * + * @hide + */ + public static File getUserSystemDirectory(int userId) { + return new File(new File(getSystemSecureDirectory(), "users"), Integer.toString(userId)); + } + /** * Returns whether the Encrypted File System feature is enabled on the device or not. * @return true if Encrypted File System feature is enabled, false diff --git a/core/java/com/android/internal/widget/LockSettingsService.java b/core/java/com/android/internal/widget/LockSettingsService.java index 350e006d35950..4ecbd1609e760 100644 --- a/core/java/com/android/internal/widget/LockSettingsService.java +++ b/core/java/com/android/internal/widget/LockSettingsService.java @@ -23,6 +23,7 @@ import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.os.Binder; +import android.os.Environment; import android.os.RemoteException; import android.os.SystemProperties; import android.os.UserHandle; @@ -173,7 +174,8 @@ public class LockSettingsService extends ILockSettings.Stub { // Leave it in the same place for user 0 return dataSystemDirectory + LOCK_PATTERN_FILE; } else { - return dataSystemDirectory + "users/" + userId + "/" + LOCK_PATTERN_FILE; + return new File(Environment.getUserSystemDirectory(userId), LOCK_PATTERN_FILE) + .getAbsolutePath(); } } @@ -185,7 +187,8 @@ public class LockSettingsService extends ILockSettings.Stub { // Leave it in the same place for user 0 return dataSystemDirectory + LOCK_PASSWORD_FILE; } else { - return dataSystemDirectory + "users/" + userId + "/" + LOCK_PASSWORD_FILE; + return new File(Environment.getUserSystemDirectory(userId), LOCK_PASSWORD_FILE) + .getAbsolutePath(); } } diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index 79dabee4be6d8..57ab921f648f2 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -40,6 +40,7 @@ import android.graphics.Point; import android.net.Uri; import android.os.Binder; import android.os.Bundle; +import android.os.Environment; import android.os.IBinder; import android.os.RemoteException; import android.os.SystemClock; @@ -1634,11 +1635,11 @@ class AppWidgetServiceImpl { } static File getSettingsFile(int userId) { - return new File("/data/system/users/" + userId + "/" + SETTINGS_FILENAME); + return new File(Environment.getUserSystemDirectory(userId), SETTINGS_FILENAME); } AtomicFile savedStateFile() { - File dir = new File("/data/system/users/" + mUserId); + File dir = Environment.getUserSystemDirectory(mUserId); File settingsFile = getSettingsFile(mUserId); if (!settingsFile.exists() && mUserId == 0) { if (!dir.exists()) { diff --git a/services/java/com/android/server/SystemBackupAgent.java b/services/java/com/android/server/SystemBackupAgent.java index a7a583c918c7d..8cf273dee8cc8 100644 --- a/services/java/com/android/server/SystemBackupAgent.java +++ b/services/java/com/android/server/SystemBackupAgent.java @@ -24,8 +24,10 @@ import android.app.backup.FullBackup; import android.app.backup.FullBackupDataOutput; import android.app.backup.WallpaperBackupHelper; import android.content.Context; +import android.os.Environment; import android.os.ParcelFileDescriptor; import android.os.ServiceManager; +import android.os.UserHandle; import android.util.Slog; @@ -45,11 +47,13 @@ public class SystemBackupAgent extends BackupAgentHelper { private static final String WALLPAPER_INFO_FILENAME = "wallpaper_info.xml"; // TODO: Will need to change if backing up non-primary user's wallpaper - private static final String WALLPAPER_IMAGE_DIR = "/data/system/users/0"; + private static final String WALLPAPER_IMAGE_DIR = + Environment.getUserSystemDirectory(UserHandle.USER_OWNER).getAbsolutePath(); private static final String WALLPAPER_IMAGE = WallpaperBackupHelper.WALLPAPER_IMAGE; // TODO: Will need to change if backing up non-primary user's wallpaper - private static final String WALLPAPER_INFO_DIR = "/data/system/users/0"; + private static final String WALLPAPER_INFO_DIR = + Environment.getUserSystemDirectory(UserHandle.USER_OWNER).getAbsolutePath(); private static final String WALLPAPER_INFO = WallpaperBackupHelper.WALLPAPER_INFO; // Use old keys to keep legacy data compatibility and avoid writing two wallpapers private static final String WALLPAPER_IMAGE_KEY = WallpaperBackupHelper.WALLPAPER_IMAGE_KEY; diff --git a/services/java/com/android/server/WallpaperManagerService.java b/services/java/com/android/server/WallpaperManagerService.java index 643e937446c18..b8a37cf494f14 100644 --- a/services/java/com/android/server/WallpaperManagerService.java +++ b/services/java/com/android/server/WallpaperManagerService.java @@ -92,8 +92,6 @@ class WallpaperManagerService extends IWallpaperManager.Stub { * restarting it vs. just reverting to the static wallpaper. */ static final long MIN_WALLPAPER_CRASH_TIME = 10000; - - static final File WALLPAPER_BASE_DIR = new File("/data/system/users"); static final String WALLPAPER = "wallpaper"; static final String WALLPAPER_INFO = "wallpaper_info.xml"; @@ -395,12 +393,12 @@ class WallpaperManagerService extends IWallpaperManager.Stub { mIPackageManager = AppGlobals.getPackageManager(); mMonitor = new MyPackageMonitor(); mMonitor.register(context, null, true); - WALLPAPER_BASE_DIR.mkdirs(); - loadSettingsLocked(0); + getWallpaperDir(UserHandle.USER_OWNER).mkdirs(); + loadSettingsLocked(UserHandle.USER_OWNER); } private static File getWallpaperDir(int userId) { - return new File(WALLPAPER_BASE_DIR + "/" + userId); + return Environment.getUserSystemDirectory(userId); } @Override @@ -414,7 +412,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { public void systemReady() { if (DEBUG) Slog.v(TAG, "systemReady"); - WallpaperData wallpaper = mWallpaperMap.get(0); + WallpaperData wallpaper = mWallpaperMap.get(UserHandle.USER_OWNER); switchWallpaper(wallpaper); wallpaper.wallpaperObserver = new WallpaperObserver(wallpaper); wallpaper.wallpaperObserver.startWatching(); @@ -880,7 +878,7 @@ class WallpaperManagerService extends IWallpaperManager.Stub { } private static JournaledFile makeJournaledFile(int userId) { - final String base = getWallpaperDir(userId) + "/" + WALLPAPER_INFO; + final String base = new File(getWallpaperDir(userId), WALLPAPER_INFO).getAbsolutePath(); return new JournaledFile(new File(base), new File(base + ".tmp")); } diff --git a/services/java/com/android/server/pm/Settings.java b/services/java/com/android/server/pm/Settings.java index 68b594a1ce495..5f10d44d974df 100644 --- a/services/java/com/android/server/pm/Settings.java +++ b/services/java/com/android/server/pm/Settings.java @@ -745,13 +745,12 @@ final class Settings { } private File getUserPackagesStateFile(int userId) { - return new File(mSystemDir, - "users/" + userId + "/package-restrictions.xml"); + return new File(Environment.getUserSystemDirectory(userId), "package-restrictions.xml"); } private File getUserPackagesStateBackupFile(int userId) { - return new File(mSystemDir, - "users/" + userId + "/package-restrictions-backup.xml"); + return new File(Environment.getUserSystemDirectory(userId), + "package-restrictions-backup.xml"); } void writeAllUsersPackageRestrictionsLPr() { diff --git a/services/java/com/android/server/pm/UserManagerService.java b/services/java/com/android/server/pm/UserManagerService.java index 492158d53814f..a13c16e6d45f7 100644 --- a/services/java/com/android/server/pm/UserManagerService.java +++ b/services/java/com/android/server/pm/UserManagerService.java @@ -594,6 +594,7 @@ public class UserManagerService extends IUserManager.Stub { // Update the user list writeUserListLocked(); updateUserIdsLocked(); + removeDirectoryRecursive(Environment.getUserSystemDirectory(userHandle)); } } @@ -603,6 +604,17 @@ public class UserManagerService extends IUserManager.Stub { mContext.sendBroadcast(addedIntent, android.Manifest.permission.MANAGE_USERS); } + private void removeDirectoryRecursive(File parent) { + if (parent.isDirectory()) { + String[] files = parent.list(); + for (String filename : files) { + File child = new File(parent, filename); + removeDirectoryRecursive(child); + } + } + parent.delete(); + } + @Override public int getUserSerialNumber(int userHandle) { synchronized (mPackagesLock) {