diff options
author | Suchi Amalapurapu <asuchitra@google.com> | 2010-03-23 15:02:13 -0700 |
---|---|---|
committer | Suchi Amalapurapu <asuchitra@google.com> | 2010-03-23 15:17:52 -0700 |
commit | 6f58b1b426b8c466881ad038f40b57e2f8dcca9d (patch) | |
tree | 3d32cd2a5ffe6dffe044c44b259fa0b127b07af9 /src/com/android/settings/deviceinfo/Memory.java | |
parent | 28bcb47ef7659d68223f837f17549ba80aa89ab1 (diff) | |
download | packages_apps_Settings-6f58b1b426b8c466881ad038f40b57e2f8dcca9d.tar.gz packages_apps_Settings-6f58b1b426b8c466881ad038f40b57e2f8dcca9d.tar.bz2 packages_apps_Settings-6f58b1b426b8c466881ad038f40b57e2f8dcca9d.zip |
The getStorageUsers only returns list of storage users accessing the sdcard.
We also have to check if applications on sdcard are currently running.
Change-Id: I4b6478bc834e956f963735f69829c5ba4c7fb8c2
Diffstat (limited to 'src/com/android/settings/deviceinfo/Memory.java')
-rw-r--r-- | src/com/android/settings/deviceinfo/Memory.java | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/src/com/android/settings/deviceinfo/Memory.java b/src/com/android/settings/deviceinfo/Memory.java index fa217ad5c..1f7f29de2 100644 --- a/src/com/android/settings/deviceinfo/Memory.java +++ b/src/com/android/settings/deviceinfo/Memory.java @@ -16,6 +16,7 @@ package com.android.settings.deviceinfo; +import android.app.ActivityManager; import android.app.AlertDialog; import android.app.Dialog; import android.content.BroadcastReceiver; @@ -24,6 +25,9 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.DialogInterface.OnCancelListener; +import android.content.pm.ApplicationInfo; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; import android.content.res.Resources; import android.os.Bundle; import android.os.Handler; @@ -46,6 +50,9 @@ import android.widget.Toast; import com.android.settings.R; import java.io.File; +import java.util.HashSet; +import java.util.List; +import java.util.Set; public class Memory extends PreferenceActivity implements OnCancelListener { private static final String TAG = "Memory"; @@ -215,32 +222,52 @@ public class Memory extends PreferenceActivity implements OnCancelListener { showDialog(id); } - private void unmount() { - // Check if the sdcard is being accessed by other processes - // and let the user decide if the sdcard should be ejected. - String extStoragePath = Environment. - getExternalStorageDirectory().toString(); + private boolean hasAppsAccessingStorage() throws RemoteException { + String extStoragePath = Environment.getExternalStorageDirectory().toString(); IMountService mountService = getMountService(); - int stUsers[] = null; + boolean showPidDialog = false; + int stUsers[] = mountService.getStorageUsers(extStoragePath); + if (stUsers != null && stUsers.length > 0) { + return true; + } + ActivityManager am = (ActivityManager)getSystemService(Context.ACTIVITY_SERVICE); + PackageManager pm = getPackageManager(); + List<ActivityManager.RunningAppProcessInfo> runningApps = am.getRunningAppProcesses(); + if (runningApps != null && runningApps.size() > 0) { + for (ActivityManager.RunningAppProcessInfo app : runningApps) { + if (app.pkgList == null) { + continue; + } + for (String pkg : app.pkgList) { + try { + ApplicationInfo info = pm.getApplicationInfo(pkg, 0); + if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) { + return true; + } + } catch (NameNotFoundException e) { + } + } + } + } + return false; + } + + private void unmount() { + // Check if external media is in use. try { - stUsers = mountService.getStorageUsers(extStoragePath); + if (hasAppsAccessingStorage()) { + if (localLOGV) Log.i(TAG, "Do have storage users accessing media"); + // Present dialog to user + showDialogInner(DLG_CONFIRM_UNMOUNT); + } else { + doUnmount(true); + } } catch (RemoteException e) { // Very unlikely. But present an error dialog anyway Log.e(TAG, "Is MountService running?"); showDialogInner(DLG_ERROR_UNMOUNT); } - if (stUsers != null && stUsers.length > 0) { - if (localLOGV) Log.i(TAG, "Do have storage users accessing " - + extStoragePath); - for (int pid : stUsers) { - if (localLOGV) Log.i(TAG, pid + " accessing file on sdcard"); - } - // Present dialog to user - showDialogInner(DLG_CONFIRM_UNMOUNT); - } else { - doUnmount(true); - } -} + } private void mount() { IMountService mountService = getMountService(); |