OSDN Git Service

Bug 4539424: confirmation dialog always shown
[android-x86/packages-apps-Settings.git] / src / com / android / settings / deviceinfo / Memory.java
index 955e578..db60c37 100644 (file)
@@ -21,14 +21,12 @@ import android.app.Dialog;
 import android.content.BroadcastReceiver;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.content.DialogInterface.OnCancelListener;
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.content.res.Resources;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.IBinder;
-import android.os.Parcelable;
 import android.os.RemoteException;
 import android.os.ServiceManager;
 import android.os.storage.IMountService;
@@ -43,7 +41,7 @@ import android.widget.Toast;
 import com.android.settings.R;
 import com.android.settings.SettingsPreferenceFragment;
 
-public class Memory extends SettingsPreferenceFragment implements OnCancelListener {
+public class Memory extends SettingsPreferenceFragment {
     private static final String TAG = "MemorySettings";
 
     private static final int DLG_CONFIRM_UNMOUNT = 1;
@@ -51,9 +49,10 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
 
     private Resources mResources;
 
-    // The mountToggle Preference that has been clicked.
-    // The click event will be discarded if this value is not null. Reset to null after (un)mount.
-    private Preference mClickedMountToggle;
+    // The mountToggle Preference that has last been clicked.
+    // Assumes no two successive unmount event on 2 different volumes are performed before the first
+    // one's preference is disabled
+    private Preference mLastClickedMountToggle;
     private String mClickedMountPoint;
     
     // Access using getMountService()
@@ -76,23 +75,17 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
 
         mResources = getResources();
 
-        try {
-            IMountService mountService = IMountService.Stub.asInterface(ServiceManager
-                    .getService("mount"));
-            Parcelable[] volumes = mountService.getVolumeList();
-            int length = volumes.length;
-            mStorageVolumePreferenceCategories = new StorageVolumePreferenceCategory[length];
-            for (int i = 0; i < length; i++) {
-                StorageVolume storageVolume = (StorageVolume) volumes[i];
-                StorageVolumePreferenceCategory storagePreferenceCategory =
-                    new StorageVolumePreferenceCategory(getActivity(), mResources, storageVolume,
-                            i == 0); // The first volume is the primary volume
-                mStorageVolumePreferenceCategories[i] = storagePreferenceCategory;
-                getPreferenceScreen().addPreference(storagePreferenceCategory);
-                storagePreferenceCategory.init();
-            }
-        } catch (Exception e) {
-            Log.e(TAG, "couldn't talk to MountService", e);
+        StorageVolume[] storageVolumes = mStorageManager.getVolumeList();
+        int length = storageVolumes.length;
+        mStorageVolumePreferenceCategories = new StorageVolumePreferenceCategory[length];
+        for (int i = 0; i < length; i++) {
+            StorageVolume storageVolume = storageVolumes[i];
+            StorageVolumePreferenceCategory storagePreferenceCategory =
+                new StorageVolumePreferenceCategory(getActivity(), mResources, storageVolume,
+                        mStorageManager, i == 0); // The first volume is the primary volume
+            mStorageVolumePreferenceCategories[i] = storagePreferenceCategory;
+            getPreferenceScreen().addPreference(storagePreferenceCategory);
+            storagePreferenceCategory.init();
         }
     }
 
@@ -117,7 +110,7 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
                     " to " + newState);
             for (int i = 0; i < mStorageVolumePreferenceCategories.length; i++) {
                 StorageVolumePreferenceCategory svpc = mStorageVolumePreferenceCategories[i];
-                if (path.equals(svpc.getMountPoint())) {
+                if (path.equals(svpc.getStorageVolume().getPath())) {
                     svpc.onStorageStateChanged();
                     break;
                 }
@@ -164,13 +157,13 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
                 return true;
             }
 
-            boolean mountToggleClicked = svpc.mountToggleClicked(preference);
-            if (mountToggleClicked && mClickedMountToggle == null) {
-                mClickedMountToggle = preference;
-                mClickedMountPoint = svpc.getMountPoint();
-                String state = svpc.getStorageVolumeState();
-                if (state.equals(Environment.MEDIA_MOUNTED) ||
-                        state.equals(Environment.MEDIA_MOUNTED_READ_ONLY)) {
+            if (svpc.mountToggleClicked(preference)) {
+                mLastClickedMountToggle = preference;
+                final StorageVolume storageVolume = svpc.getStorageVolume();
+                mClickedMountPoint = storageVolume.getPath();
+                String state = mStorageManager.getVolumeState(storageVolume.getPath());
+                if (Environment.MEDIA_MOUNTED.equals(state) ||
+                        Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
                     unmount();
                 } else {
                     mount();
@@ -214,32 +207,19 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
         return null;
     }
 
-    @Override
-    protected void showDialog(int id) {
-        super.showDialog(id);
-
-        switch (id) {
-            case DLG_CONFIRM_UNMOUNT:
-            case DLG_ERROR_UNMOUNT:
-                setOnCancelListener(this);
-                break;
-        }
-    }
-
     private void doUnmount() {
         // Present a toast here
         Toast.makeText(getActivity(), R.string.unmount_inform_text, Toast.LENGTH_SHORT).show();
         IMountService mountService = getMountService();
         try {
-            mClickedMountToggle.setEnabled(false);
-            mClickedMountToggle.setTitle(mResources.getString(R.string.sd_ejecting_title));
-            mClickedMountToggle.setSummary(mResources.getString(R.string.sd_ejecting_summary));
+            mLastClickedMountToggle.setEnabled(false);
+            mLastClickedMountToggle.setTitle(mResources.getString(R.string.sd_ejecting_title));
+            mLastClickedMountToggle.setSummary(mResources.getString(R.string.sd_ejecting_summary));
             mountService.unmountVolume(mClickedMountPoint, true);
         } catch (RemoteException e) {
             // Informative dialog to user that unmount failed.
             showDialogInner(DLG_ERROR_UNMOUNT);
         }
-        mClickedMountToggle = null;
     }
 
     private void showDialogInner(int id) {
@@ -263,7 +243,8 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
             return true;
         }
         */
-        return false;
+        // Better safe than sorry. Assume the storage is used to ask for confirmation.
+        return true;
     }
 
     private void unmount() {
@@ -279,7 +260,6 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
             // Very unlikely. But present an error dialog anyway
             Log.e(TAG, "Is MountService running?");
             showDialogInner(DLG_ERROR_UNMOUNT);
-            mClickedMountToggle = null;
         }
     }
 
@@ -294,10 +274,5 @@ public class Memory extends SettingsPreferenceFragment implements OnCancelListen
         } catch (RemoteException ex) {
             // Not much can be done
         }
-        mClickedMountToggle = null;
-    }
-
-    public void onCancel(DialogInterface dialog) {
-        mClickedMountToggle = null;
     }
 }