diff options
9 files changed, 58 insertions, 22 deletions
diff --git a/core/java/android/accounts/AccountManagerService.java b/core/java/android/accounts/AccountManagerService.java index 7a9f285..a075bd7 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 a74a268..9e8ab2c 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 679cf1a..2fbcf3f 100644 --- a/core/java/android/os/Environment.java +++ b/core/java/android/os/Environment.java @@ -104,6 +104,17 @@ public class Environment { } /** + * 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 <code>true</code> if Encrypted File System feature is enabled, <code>false</code> * if disabled. diff --git a/core/java/com/android/internal/widget/LockSettingsService.java b/core/java/com/android/internal/widget/LockSettingsService.java index 350e006..4ecbd16 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 79dabee..57ab921 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 a7a583c..8cf273d 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 643e937..b8a37cf 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 68b594a..5f10d44 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 492158d..a13c16e 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) { |