Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 983192df authored by Suchi Amalapurapu's avatar Suchi Amalapurapu Committed by Android (Google) Code Review
Browse files

Merge "The getStorageUsers only returns list of storage users accessing the...

Merge "The getStorageUsers only returns list of storage users accessing the sdcard. We also have to check if applications on sdcard are currently running."
parents 98d55dae 6f58b1b4
Loading
Loading
Loading
Loading
+46 −19
Original line number Diff line number Diff line
@@ -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,31 +222,51 @@ 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 {
            stUsers = mountService.getStorageUsers(extStoragePath);
        } catch (RemoteException e) {
            // Very unlikely. But present an error dialog anyway
            Log.e(TAG, "Is MountService running?");
            showDialogInner(DLG_ERROR_UNMOUNT);
                        ApplicationInfo info = pm.getApplicationInfo(pkg, 0);
                        if ((info.flags & ApplicationInfo.FLAG_EXTERNAL_STORAGE) != 0) {
                            return true;
                        }
                    } catch (NameNotFoundException e) {
                    }
        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");
                }
            }
        }
        return false;
    }

    private void unmount() {
        // Check if external media is in use.
        try {
           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);
        }
    }

    private void mount() {