From 6a0082b483eb487c44dec5e8855cf0e1ab92020b Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Sun, 5 Jul 2015 14:17:40 -0700 Subject: [PATCH 1/2] Handle missing migration source volume. Users can try migrating primary storage while the current location is missing/unmounted. Fail gracefully instead of runtime restarting. Bug: 21927076 Change-Id: I54b92487faf9e62d5d309734bf4c436a9259d156 --- .../android/settings/deviceinfo/MigrateEstimateTask.java | 5 +++++ .../settings/deviceinfo/StorageWizardMigrateConfirm.java | 8 ++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/deviceinfo/MigrateEstimateTask.java b/src/com/android/settings/deviceinfo/MigrateEstimateTask.java index 34a44ac8fb9..f959ef3dda4 100644 --- a/src/com/android/settings/deviceinfo/MigrateEstimateTask.java +++ b/src/com/android/settings/deviceinfo/MigrateEstimateTask.java @@ -81,6 +81,11 @@ public abstract class MigrateEstimateTask extends AsyncTask im final VolumeInfo privateVol = mContext.getPackageManager().getPrimaryStorageCurrentVolume(); final VolumeInfo emulatedVol = mStorage.findEmulatedForPrivate(privateVol); + if (emulatedVol == null) { + Log.w(TAG, "Failed to find current primary storage"); + return -1L; + } + final String path = emulatedVol.getPath().getAbsolutePath(); Log.d(TAG, "Estimating for current path " + path); diff --git a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java index 607cc6f5c1c..9439d941ec1 100644 --- a/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java +++ b/src/com/android/settings/deviceinfo/StorageWizardMigrateConfirm.java @@ -16,10 +16,13 @@ package com.android.settings.deviceinfo; +import static com.android.settings.deviceinfo.StorageSettings.TAG; + import android.content.Intent; import android.content.pm.PackageManager; import android.os.Bundle; import android.os.storage.VolumeInfo; +import android.util.Log; import com.android.settings.R; @@ -36,12 +39,13 @@ public class StorageWizardMigrateConfirm extends StorageWizardBase { mVolume = findFirstVolume(VolumeInfo.TYPE_PRIVATE); } - if (mVolume == null) { + final VolumeInfo sourceVol = getPackageManager().getPrimaryStorageCurrentVolume(); + if (sourceVol == null || mVolume == null) { + Log.d(TAG, "Missing either source or target volume"); finish(); return; } - final VolumeInfo sourceVol = getPackageManager().getPrimaryStorageCurrentVolume(); final String sourceDescrip = mStorage.getBestVolumeDescription(sourceVol); final String targetDescrip = mStorage.getBestVolumeDescription(mVolume); From 48751c1a5163ccf411009344f352abdf6e1b9684 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Sun, 5 Jul 2015 22:09:07 -0700 Subject: [PATCH 2/2] Fix some ordering, colors, and accessibility bugs. When adding preferences to public/private details screens, always add in-order when rebuilding. Hacky fix for broken summary text and eject image color tints. Fix crash when device rotated during partitioning. Set correct accessibility titles in all wizard steps. Bug: 22098044, 21376962 Change-Id: I68aff96cba497a91919cad8865722bc9cef7eaa7 --- res/layout/preference_storage_action.xml | 1 - res/layout/storage_summary.xml | 1 - .../deviceinfo/PrivateVolumeSettings.java | 35 ++++----- .../deviceinfo/PublicVolumeSettings.java | 19 +++-- .../deviceinfo/StorageSummaryPreference.java | 5 ++ .../deviceinfo/StorageVolumePreference.java | 2 +- .../deviceinfo/StorageWizardBase.java | 4 +- .../StorageWizardFormatProgress.java | 75 +++++++++++++------ 8 files changed, 91 insertions(+), 51 deletions(-) diff --git a/res/layout/preference_storage_action.xml b/res/layout/preference_storage_action.xml index 5a378713a8a..19d776324f9 100644 --- a/res/layout/preference_storage_action.xml +++ b/res/layout/preference_storage_action.xml @@ -30,7 +30,6 @@ android:layout_gravity="center" android:gravity="center" android:src="@drawable/ic_eject_24dp" - android:tint="?android:attr/textColorSecondary" android:background="?android:attr/selectableItemBackground" /> diff --git a/res/layout/storage_summary.xml b/res/layout/storage_summary.xml index 96a0ceedc71..35201e165b2 100644 --- a/res/layout/storage_summary.xml +++ b/res/layout/storage_summary.xml @@ -44,7 +44,6 @@ android:layout_height="wrap_content" android:textAlignment="viewStart" android:textAppearance="@android:style/TextAppearance.Material.Body1" - android:textColor="?android:attr/textColorSecondaryNoDisable" android:maxLines="10" /> { + @Override + public Object onRetainNonConfigurationInstance() { + return mTask; + } + + public static class PartitionTask extends AsyncTask { + public StorageWizardFormatProgress mActivity; + + private volatile int mProgress = 20; + private volatile long mInternalBench; private volatile long mPrivateBench; @Override protected Exception doInBackground(Void... params) { + final StorageWizardFormatProgress activity = mActivity; + final StorageManager storage = mActivity.mStorage; try { - if (mFormatPrivate) { - mStorage.partitionPrivate(mDisk.getId()); + if (activity.mFormatPrivate) { + storage.partitionPrivate(activity.mDisk.getId()); publishProgress(40); - mInternalBench = mStorage.benchmark(null); + mInternalBench = storage.benchmark(null); publishProgress(60); - final VolumeInfo privateVol = findFirstVolume(VolumeInfo.TYPE_PRIVATE); - mPrivateBench = mStorage.benchmark(privateVol.id); + final VolumeInfo privateVol = activity.findFirstVolume(VolumeInfo.TYPE_PRIVATE); + mPrivateBench = storage.benchmark(privateVol.id); } else { - mStorage.partitionPublic(mDisk.getId()); + storage.partitionPublic(activity.mDisk.getId()); } return null; } catch (Exception e) { @@ -91,16 +110,22 @@ public class StorageWizardFormatProgress extends StorageWizardBase { @Override protected void onProgressUpdate(Integer... progress) { - setCurrentProgress(progress[0]); + mProgress = progress[0]; + mActivity.setCurrentProgress(mProgress); + } + + public void setActivity(StorageWizardFormatProgress activity) { + mActivity = activity; + mActivity.setCurrentProgress(mProgress); } @Override protected void onPostExecute(Exception e) { - final Context context = StorageWizardFormatProgress.this; + final StorageWizardFormatProgress activity = mActivity; if (e != null) { Log.e(TAG, "Failed to partition", e); - Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show(); - finishAffinity(); + Toast.makeText(activity, e.getMessage(), Toast.LENGTH_LONG).show(); + activity.finishAffinity(); return; } @@ -110,22 +135,24 @@ public class StorageWizardFormatProgress extends StorageWizardBase { // TODO: refine this warning threshold if (mPrivateBench > 2000000000) { final SlowWarningFragment dialog = new SlowWarningFragment(); - dialog.show(getFragmentManager(), TAG_SLOW_WARNING); + dialog.show(activity.getFragmentManager(), TAG_SLOW_WARNING); } else { - onFormatFinished(); + activity.onFormatFinished(); } } } - public class SlowWarningFragment extends DialogFragment { + public static class SlowWarningFragment extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { final Context context = getActivity(); final AlertDialog.Builder builder = new AlertDialog.Builder(context); - final String descrip = mDisk.getDescription(); - final String genericDescip = getGenericDescription(mDisk); + final StorageWizardFormatProgress target = + (StorageWizardFormatProgress) getActivity(); + final String descrip = target.getDiskDescription(); + final String genericDescip = target.getGenericDiskDescription(); builder.setMessage(TextUtils.expandTemplate(getText(R.string.storage_wizard_slow_body), descrip, genericDescip)); @@ -142,11 +169,15 @@ public class StorageWizardFormatProgress extends StorageWizardBase { } } - private String getGenericDescription(DiskInfo disk) { + private String getDiskDescription() { + return mDisk.getDescription(); + } + + private String getGenericDiskDescription() { // TODO: move this directly to DiskInfo - if (disk.isSd()) { + if (mDisk.isSd()) { return getString(com.android.internal.R.string.storage_sd_card); - } else if (disk.isUsb()) { + } else if (mDisk.isUsb()) { return getString(com.android.internal.R.string.storage_usb_drive); } else { return null;