diff options
Diffstat (limited to 'services/java/com/android/server/pm/PackageManagerService.java')
| -rw-r--r-- | services/java/com/android/server/pm/PackageManagerService.java | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index e20cd02dc551..3501e4791265 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -7728,6 +7728,80 @@ public class PackageManagerService extends IPackageManager.Stub { return ret; } + private final class ClearStorageConnection implements ServiceConnection { + IMediaContainerService mContainerService; + + @Override + public void onServiceConnected(ComponentName name, IBinder service) { + synchronized (this) { + mContainerService = IMediaContainerService.Stub.asInterface(service); + notifyAll(); + } + } + + @Override + public void onServiceDisconnected(ComponentName name) { + } + } + + private void clearExternalStorageDataSync(String packageName, boolean allData) { + final boolean mounted; + if (Environment.isExternalStorageEmulated()) { + mounted = true; + } else { + final String status = Environment.getExternalStorageState(); + + mounted = status.equals(Environment.MEDIA_MOUNTED) + || status.equals(Environment.MEDIA_MOUNTED_READ_ONLY); + } + + if (!mounted) { + return; + } + + final Intent containerIntent = new Intent().setComponent(DEFAULT_CONTAINER_COMPONENT); + ClearStorageConnection conn = new ClearStorageConnection(); + if (mContext.bindService(containerIntent, conn, Context.BIND_AUTO_CREATE)) { + try { + long timeout = SystemClock.uptimeMillis() + 5000; + synchronized (conn) { + long now = SystemClock.uptimeMillis(); + while (conn.mContainerService == null && now < timeout) { + try { + conn.wait(timeout - now); + } catch (InterruptedException e) { + } + } + } + if (conn.mContainerService == null) { + return; + } + final File externalCacheDir = Environment + .getExternalStorageAppCacheDirectory(packageName); + try { + conn.mContainerService.clearDirectory(externalCacheDir.toString()); + } catch (RemoteException e) { + } + if (allData) { + final File externalDataDir = Environment + .getExternalStorageAppDataDirectory(packageName); + try { + conn.mContainerService.clearDirectory(externalDataDir.toString()); + } catch (RemoteException e) { + } + final File externalMediaDir = Environment + .getExternalStorageAppMediaDirectory(packageName); + try { + conn.mContainerService.clearDirectory(externalMediaDir.toString()); + } catch (RemoteException e) { + } + } + } finally { + mContext.unbindService(conn); + } + } + } + @Override public void clearApplicationUserData(final String packageName, final IPackageDataObserver observer, final int userId) { @@ -7742,6 +7816,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mInstallLock) { succeeded = clearApplicationUserDataLI(packageName, userId); } + clearExternalStorageDataSync(packageName, true); if (succeeded) { // invoke DeviceStorageMonitor's update method to clear any notifications DeviceStorageMonitorService dsm = (DeviceStorageMonitorService) @@ -7815,6 +7890,7 @@ public class PackageManagerService extends IPackageManager.Stub { synchronized (mInstallLock) { succeded = deleteApplicationCacheFilesLI(packageName, userId); } + clearExternalStorageDataSync(packageName, false); if(observer != null) { try { observer.onRemoveCompleted(packageName, succeded); |
