diff options
8 files changed, 234 insertions, 37 deletions
diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java index c8b04e3..7e7207f 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeForget.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeForget.java @@ -16,6 +16,12 @@ package com.android.settings.deviceinfo; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; +import android.content.Context; +import android.content.DialogInterface; import android.os.Bundle; import android.os.storage.StorageManager; import android.os.storage.VolumeRecord; @@ -32,6 +38,8 @@ import com.android.settings.InstrumentedFragment; import com.android.settings.R; public class PrivateVolumeForget extends InstrumentedFragment { + private static final String TAG_FORGET_CONFIRM = "forget_confirm"; + private VolumeRecord mRecord; @Override @@ -60,9 +68,46 @@ public class PrivateVolumeForget extends InstrumentedFragment { private final OnClickListener mConfirmListener = new OnClickListener() { @Override public void onClick(View v) { - final StorageManager storage = getActivity().getSystemService(StorageManager.class); - storage.forgetVolume(mRecord.getFsUuid()); - getActivity().finish(); + ForgetConfirmFragment.show(PrivateVolumeForget.this, mRecord.getFsUuid()); } }; + + private static class ForgetConfirmFragment extends DialogFragment { + public static void show(Fragment parent, String fsUuid) { + final Bundle args = new Bundle(); + args.putString(VolumeRecord.EXTRA_FS_UUID, fsUuid); + + final ForgetConfirmFragment dialog = new ForgetConfirmFragment(); + dialog.setArguments(args); + dialog.setTargetFragment(parent, 0); + dialog.show(parent.getFragmentManager(), TAG_FORGET_CONFIRM); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + final StorageManager storage = context.getSystemService(StorageManager.class); + + final String fsUuid = getArguments().getString(VolumeRecord.EXTRA_FS_UUID); + final VolumeRecord record = storage.findRecordByUuid(fsUuid); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setTitle(TextUtils.expandTemplate( + getText(R.string.storage_internal_forget_confirm_title), record.getNickname())); + builder.setMessage(TextUtils.expandTemplate( + getText(R.string.storage_internal_forget_confirm), record.getNickname())); + + builder.setPositiveButton(R.string.storage_menu_forget, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + storage.forgetVolume(fsUuid); + getActivity().finish(); + } + }); + builder.setNegativeButton(R.string.cancel, null); + + return builder.create(); + } + } } diff --git a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java index 7cefe4a..9944c08 100644 --- a/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java +++ b/src/com/android/settings/deviceinfo/PrivateVolumeSettings.java @@ -173,6 +173,8 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment { screen.removeAll(); if (!mVolume.isMountedReadable()) { + Log.d(TAG, "Leaving details fragment due to state " + mVolume.getState()); + finish(); return; } @@ -288,6 +290,8 @@ public class PrivateVolumeSettings extends SettingsPreferenceFragment { format.setVisible(true); } + format.setTitle(R.string.storage_menu_format_public); + // Only offer to migrate when not current storage final VolumeInfo privateVol = getActivity().getPackageManager() .getPrimaryStorageCurrentVolume(); diff --git a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java index 44c60e9..677a99b 100644 --- a/src/com/android/settings/deviceinfo/PublicVolumeSettings.java +++ b/src/com/android/settings/deviceinfo/PublicVolumeSettings.java @@ -16,6 +16,8 @@ package com.android.settings.deviceinfo; +import static com.android.settings.deviceinfo.StorageSettings.TAG; + import android.content.Context; import android.content.Intent; import android.net.Uri; @@ -29,6 +31,7 @@ import android.preference.Preference; import android.preference.PreferenceScreen; import android.provider.DocumentsContract; import android.text.format.Formatter; +import android.util.Log; import com.android.internal.logging.MetricsLogger; import com.android.internal.util.Preconditions; @@ -61,8 +64,8 @@ public class PublicVolumeSettings extends SettingsPreferenceFragment { private Preference mMount; private Preference mUnmount; - private Preference mFormat; - private Preference mFormatInternal; + private Preference mFormatPublic; + private Preference mFormatPrivate; private long mTotalSize; private long mAvailSize; @@ -106,8 +109,8 @@ public class PublicVolumeSettings extends SettingsPreferenceFragment { mMount = buildAction(R.string.storage_menu_mount); mUnmount = buildAction(R.string.storage_menu_unmount); - mFormat = buildAction(R.string.storage_menu_format); - mFormatInternal = buildAction(R.string.storage_menu_format_private); + mFormatPublic = buildAction(R.string.storage_menu_format); + mFormatPrivate = buildAction(R.string.storage_menu_format_private); } public void update() { @@ -118,6 +121,12 @@ public class PublicVolumeSettings extends SettingsPreferenceFragment { screen.removeAll(); + if (!mVolume.isMountedReadable()) { + Log.d(TAG, "Leaving details fragment due to state " + mVolume.getState()); + finish(); + return; + } + if (mVolume.isMountedReadable()) { screen.addPreference(mGraph); screen.addPreference(mTotal); @@ -142,9 +151,9 @@ public class PublicVolumeSettings extends SettingsPreferenceFragment { if (mVolume.isMountedReadable()) { screen.addPreference(mUnmount); } - screen.addPreference(mFormat); + screen.addPreference(mFormatPublic); if (mDisk.isAdoptable()) { - screen.addPreference(mFormatInternal); + screen.addPreference(mFormatPrivate); } } @@ -196,12 +205,12 @@ public class PublicVolumeSettings extends SettingsPreferenceFragment { new MountTask(context, mVolume).execute(); } else if (pref == mUnmount) { new UnmountTask(context, mVolume).execute(); - } else if (pref == mFormat) { + } else if (pref == mFormatPublic) { final Intent intent = new Intent(context, StorageWizardFormatConfirm.class); intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId()); intent.putExtra(StorageWizardFormatConfirm.EXTRA_FORMAT_PRIVATE, false); startActivity(intent); - } else if (pref == mFormatInternal) { + } else if (pref == mFormatPrivate) { final Intent intent = new Intent(context, StorageWizardFormatConfirm.class); intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId()); intent.putExtra(StorageWizardFormatConfirm.EXTRA_FORMAT_PRIVATE, true); diff --git a/src/com/android/settings/deviceinfo/StorageSettings.java b/src/com/android/settings/deviceinfo/StorageSettings.java index b5b3841..546c716 100644 --- a/src/com/android/settings/deviceinfo/StorageSettings.java +++ b/src/com/android/settings/deviceinfo/StorageSettings.java @@ -16,20 +16,26 @@ package com.android.settings.deviceinfo; +import android.app.AlertDialog; +import android.app.Dialog; +import android.app.DialogFragment; +import android.app.Fragment; import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; import android.os.AsyncTask; import android.os.Bundle; import android.os.UserManager; +import android.os.storage.DiskInfo; import android.os.storage.StorageEventListener; import android.os.storage.StorageManager; import android.os.storage.VolumeInfo; +import android.os.storage.VolumeRecord; import android.preference.Preference; import android.preference.PreferenceCategory; import android.preference.PreferenceScreen; +import android.text.TextUtils; import android.util.Log; -import android.view.Menu; -import android.view.MenuInflater; -import android.view.MenuItem; import android.widget.Toast; import com.android.internal.logging.MetricsLogger; @@ -50,8 +56,10 @@ import java.util.List; public class StorageSettings extends SettingsPreferenceFragment implements Indexable { static final String TAG = "StorageSettings"; + private static final String TAG_VOLUME_UNMOUNTED = "volume_unmounted"; + private static final String TAG_DISK_INIT = "disk_init"; + // TODO: badging to indicate devices running low on storage - // TODO: show currently ejected private volumes private UserManager mUserManager; private StorageManager mStorageManager; @@ -127,6 +135,33 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index } } + // Show missing private volumes + final List<VolumeRecord> recs = mStorageManager.getVolumeRecords(); + for (VolumeRecord rec : recs) { + if (rec.getType() == VolumeInfo.TYPE_PRIVATE + && mStorageManager.findVolumeByUuid(rec.getFsUuid()) == null) { + final Preference pref = new Preference(context); + pref.setKey(rec.getFsUuid()); + pref.setTitle(rec.getNickname()); + pref.setSummary(com.android.internal.R.string.ext_media_status_missing); + pref.setIcon(R.drawable.ic_settings_storage); + mInternalCategory.addPreference(pref); + } + } + + // Show unsupported disks to give a chance to init + final List<DiskInfo> disks = mStorageManager.getDisks(); + for (DiskInfo disk : disks) { + if (disk.volumeCount == 0 && disk.size > 0) { + final Preference pref = new Preference(context); + pref.setKey(disk.getId()); + pref.setTitle(disk.getDescription()); + pref.setSummary(com.android.internal.R.string.ext_media_status_unsupported); + pref.setIcon(R.drawable.ic_sim_sd); + mExternalCategory.addPreference(pref); + } + } + if (mInternalCategory.getPreferenceCount() > 0) { getPreferenceScreen().addPreference(mInternalCategory); } @@ -150,29 +185,51 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index @Override public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference pref) { - final String volId = pref.getKey(); - final VolumeInfo vol = mStorageManager.findVolumeById(volId); - if (vol == null) { - return false; + final String key = pref.getKey(); + if (pref instanceof StorageVolumePreference) { + // Picked a normal volume + final VolumeInfo vol = mStorageManager.findVolumeById(key); - } else if (vol.getType() == VolumeInfo.TYPE_PRIVATE) { - final Bundle args = new Bundle(); - args.putString(VolumeInfo.EXTRA_VOLUME_ID, volId); - startFragment(this, PrivateVolumeSettings.class.getCanonicalName(), - -1, 0, args); - return true; - - } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) { - if (vol.isMountedReadable()) { - startActivity(vol.buildBrowseIntent()); + if (vol.getState() == VolumeInfo.STATE_UNMOUNTED) { + VolumeUnmountedFragment.show(this, vol.getId()); return true; - } else { + } else if (vol.getState() == VolumeInfo.STATE_UNMOUNTABLE) { + DiskInitFragment.show(this, R.string.storage_dialog_unmountable, vol.getDiskId()); + return true; + } + + if (vol.getType() == VolumeInfo.TYPE_PRIVATE) { final Bundle args = new Bundle(); - args.putString(VolumeInfo.EXTRA_VOLUME_ID, volId); - startFragment(this, PublicVolumeSettings.class.getCanonicalName(), + args.putString(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); + startFragment(this, PrivateVolumeSettings.class.getCanonicalName(), -1, 0, args); return true; + + } else if (vol.getType() == VolumeInfo.TYPE_PUBLIC) { + if (vol.isMountedReadable()) { + startActivity(vol.buildBrowseIntent()); + return true; + } else { + final Bundle args = new Bundle(); + args.putString(VolumeInfo.EXTRA_VOLUME_ID, vol.getId()); + startFragment(this, PublicVolumeSettings.class.getCanonicalName(), + -1, 0, args); + return true; + } } + + } else if (key.startsWith("disk:")) { + // Picked an unsupported disk + DiskInitFragment.show(this, R.string.storage_dialog_unsupported, key); + return true; + + } else { + // Picked a missing private volume + final Bundle args = new Bundle(); + args.putString(VolumeRecord.EXTRA_FS_UUID, key); + startFragment(this, PrivateVolumeForget.class.getCanonicalName(), + R.string.storage_menu_forget, 0, args); + return true; } return false; @@ -250,6 +307,81 @@ public class StorageSettings extends SettingsPreferenceFragment implements Index } } + private static class VolumeUnmountedFragment extends DialogFragment { + public static void show(Fragment parent, String volumeId) { + final Bundle args = new Bundle(); + args.putString(VolumeInfo.EXTRA_VOLUME_ID, volumeId); + + final VolumeUnmountedFragment dialog = new VolumeUnmountedFragment(); + dialog.setArguments(args); + dialog.setTargetFragment(parent, 0); + dialog.show(parent.getFragmentManager(), TAG_VOLUME_UNMOUNTED); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + final StorageManager sm = context.getSystemService(StorageManager.class); + + final String volumeId = getArguments().getString(VolumeInfo.EXTRA_VOLUME_ID); + final VolumeInfo vol = sm.findVolumeById(volumeId); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(TextUtils.expandTemplate( + getText(R.string.storage_dialog_unmounted), vol.getDisk().getDescription())); + + builder.setPositiveButton(R.string.storage_menu_mount, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + new MountTask(context, vol).execute(); + } + }); + builder.setNegativeButton(R.string.cancel, null); + + return builder.create(); + } + } + + private static class DiskInitFragment extends DialogFragment { + public static void show(Fragment parent, int resId, String diskId) { + final Bundle args = new Bundle(); + args.putInt(Intent.EXTRA_TEXT, resId); + args.putString(DiskInfo.EXTRA_DISK_ID, diskId); + + final DiskInitFragment dialog = new DiskInitFragment(); + dialog.setArguments(args); + dialog.setTargetFragment(parent, 0); + dialog.show(parent.getFragmentManager(), TAG_DISK_INIT); + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getActivity(); + final StorageManager sm = context.getSystemService(StorageManager.class); + + final int resId = getArguments().getInt(Intent.EXTRA_TEXT); + final String diskId = getArguments().getString(DiskInfo.EXTRA_DISK_ID); + final DiskInfo disk = sm.findDiskById(diskId); + + final AlertDialog.Builder builder = new AlertDialog.Builder(context); + builder.setMessage(TextUtils.expandTemplate(getText(resId), disk.getDescription())); + + builder.setPositiveButton(R.string.storage_menu_set_up, + new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + final Intent intent = new Intent(context, StorageWizardInit.class); + intent.putExtra(DiskInfo.EXTRA_DISK_ID, diskId); + startActivity(intent); + } + }); + builder.setNegativeButton(R.string.cancel, null); + + return builder.create(); + } + } + /** * Enable indexing of searchable data */ diff --git a/src/com/android/settings/deviceinfo/StorageVolumePreference.java b/src/com/android/settings/deviceinfo/StorageVolumePreference.java index 852aa39..e122bf8 100644 --- a/src/com/android/settings/deviceinfo/StorageVolumePreference.java +++ b/src/com/android/settings/deviceinfo/StorageVolumePreference.java @@ -50,9 +50,12 @@ public class StorageVolumePreference extends Preference { if (volume.isMountedReadable()) { // TODO: move statfs() to background thread final File path = volume.getPath(); - final String free = Formatter.formatFileSize(context, path.getFreeSpace()); + final long usedBytes = path.getTotalSpace() - path.getFreeSpace(); + final String used = Formatter.formatFileSize(context, usedBytes); final String total = Formatter.formatFileSize(context, path.getTotalSpace()); - setSummary(context.getString(R.string.storage_volume_summary, free, total)); + setSummary(context.getString(R.string.storage_volume_summary, used, total)); + } else { + setSummary(volume.getStateDescription()); } // TODO: better icons diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java index 874dc2c..b35b8ec 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java +++ b/src/com/android/settings/deviceinfo/StorageWizardFormatConfirm.java @@ -20,7 +20,6 @@ import android.content.Intent; import android.os.Bundle; import android.os.storage.DiskInfo; -import com.android.internal.util.Preconditions; import com.android.settings.R; public class StorageWizardFormatConfirm extends StorageWizardBase { diff --git a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java index df2adfd..75d1758 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java +++ b/src/com/android/settings/deviceinfo/StorageWizardFormatProgress.java @@ -33,7 +33,6 @@ import android.util.Log; import android.view.View; import android.widget.Toast; -import com.android.internal.util.Preconditions; import com.android.settings.R; public class StorageWizardFormatProgress extends StorageWizardBase { diff --git a/src/com/android/settings/deviceinfo/StorageWizardInit.java b/src/com/android/settings/deviceinfo/StorageWizardInit.java index 61dfaaf..b0211bf 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardInit.java +++ b/src/com/android/settings/deviceinfo/StorageWizardInit.java @@ -24,7 +24,6 @@ import android.widget.CompoundButton; import android.widget.CompoundButton.OnCheckedChangeListener; import android.widget.RadioButton; -import com.android.internal.util.Preconditions; import com.android.settings.R; public class StorageWizardInit extends StorageWizardBase { @@ -56,6 +55,13 @@ public class StorageWizardInit extends StorageWizardBase { mRadioExternal.getCompoundPaddingRight(), 0); getNextButton().setEnabled(false); + + if (!mDisk.isAdoptable()) { + // If not adoptable, we only have one choice + mRadioExternal.setChecked(true); + onNavigateNext(); + finish(); + } } private final OnCheckedChangeListener mRadioListener = new OnCheckedChangeListener() { |