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

Commit 6f58b1b4 authored by Suchi Amalapurapu's avatar Suchi Amalapurapu
Browse files

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
parent 28bcb47e
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() {