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;
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;
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()
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();
}
}
" 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;
}
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();
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) {
return true;
}
*/
- return false;
+ // Better safe than sorry. Assume the storage is used to ask for confirmation.
+ return true;
}
private void unmount() {
// Very unlikely. But present an error dialog anyway
Log.e(TAG, "Is MountService running?");
showDialogInner(DLG_ERROR_UNMOUNT);
- mClickedMountToggle = null;
}
}
} catch (RemoteException ex) {
// Not much can be done
}
- mClickedMountToggle = null;
- }
-
- public void onCancel(DialogInterface dialog) {
- mClickedMountToggle = null;
}
}