Warn user when adopted device is slow.

For now, warn user if benchmark takes longer than a simple threshold
of 2 seconds.

Bug: 21172095
Change-Id: I6d43ee93ac2ff669115519e6a856f8c314915a47
This commit is contained in:
Jeff Sharkey
2015-05-19 11:22:33 -07:00
parent 512bb7e2e3
commit 0de2014380
2 changed files with 96 additions and 35 deletions

View File

@@ -2451,6 +2451,12 @@
<!-- Title of wizard button offering to cancel move [CHAR LIMIT=32] -->
<string name="storage_wizard_move_progress_cancel">Cancel move</string>
<!-- Title of wizard step prompting user to start data migration [CHAR LIMIT=32] -->
<string name="storage_wizard_slow_body">This <xliff:g id="name" example="SD card">^1</xliff:g> appears to be slow.
\n\nYou can continue, but apps moved to this location may stutter and data transfers may take a long time.
\n\nConsider using a faster <xliff:g id="name" example="SD card">^1</xliff:g> for better performance.
</string>
<!-- Phone info screen, section titles: -->
<string name="battery_status_title">Battery status</string>
<!-- Phone info screen, section titles: -->

View File

@@ -18,7 +18,11 @@ package com.android.settings.deviceinfo;
import static com.android.settings.deviceinfo.StorageSettings.TAG;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.DialogFragment;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
@@ -33,6 +37,8 @@ import com.android.internal.util.Preconditions;
import com.android.settings.R;
public class StorageWizardFormatProgress extends StorageWizardBase {
private static final String TAG_SLOW_WARNING = "slow_warning";
private boolean mFormatPrivate;
@Override
@@ -56,6 +62,9 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
}
public class PartitionTask extends AsyncTask<Void, Integer, Exception> {
private volatile long mInternalBench;
private volatile long mPrivateBench;
@Override
protected Exception doInBackground(Void... params) {
try {
@@ -63,15 +72,12 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
mStorage.partitionPrivate(mDisk.getId());
publishProgress(40);
final long internalBench = mStorage.benchmark(null);
mInternalBench = mStorage.benchmark(null);
publishProgress(60);
final VolumeInfo privateVol = findFirstVolume(VolumeInfo.TYPE_PRIVATE);
final long privateBench = mStorage.benchmark(privateVol.id);
mPrivateBench = mStorage.benchmark(privateVol.id);
// TODO: plumb through to user when below threshold
final float pct = (float) internalBench / (float) privateBench;
Log.d(TAG, "New volume is " + pct + "x the speed of internal");
} else {
mStorage.partitionPublic(mDisk.getId());
}
@@ -89,40 +95,89 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
@Override
protected void onPostExecute(Exception e) {
final Context context = StorageWizardFormatProgress.this;
if (e == null) {
final String forgetUuid = getIntent().getStringExtra(
StorageWizardFormatConfirm.EXTRA_FORGET_UUID);
if (!TextUtils.isEmpty(forgetUuid)) {
mStorage.forgetVolume(forgetUuid);
}
final boolean offerMigrate;
if (mFormatPrivate) {
// Offer to migrate only if storage is currently internal
final VolumeInfo privateVol = getPackageManager()
.getPrimaryStorageCurrentVolume();
offerMigrate = (privateVol != null
&& VolumeInfo.ID_PRIVATE_INTERNAL.equals(privateVol.getId()));
} else {
offerMigrate = false;
}
if (offerMigrate) {
final Intent intent = new Intent(context, StorageWizardMigrate.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent);
} else {
final Intent intent = new Intent(context, StorageWizardReady.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent);
}
finishAffinity();
} else {
if (e != null) {
Log.e(TAG, "Failed to partition", e);
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
finishAffinity();
return;
}
final float pct = (float) mInternalBench / (float) mPrivateBench;
Log.d(TAG, "New volume is " + pct + "x the speed of internal");
// TODO: refine this warning threshold
if (mPrivateBench > 2000000000) {
final SlowWarningFragment dialog = new SlowWarningFragment();
dialog.show(getFragmentManager(), TAG_SLOW_WARNING);
} else {
onFormatFinished();
}
}
}
public 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);
builder.setMessage(TextUtils.expandTemplate(getText(R.string.storage_wizard_slow_body),
descrip, genericDescip));
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
final StorageWizardFormatProgress target =
(StorageWizardFormatProgress) getActivity();
target.onFormatFinished();
}
});
return builder.create();
}
}
private String getGenericDescription(DiskInfo disk) {
// TODO: move this directly to DiskInfo
if (disk.isSd()) {
return getString(com.android.internal.R.string.storage_sd_card);
} else if (disk.isUsb()) {
return getString(com.android.internal.R.string.storage_usb_drive);
} else {
return null;
}
}
private void onFormatFinished() {
final String forgetUuid = getIntent().getStringExtra(
StorageWizardFormatConfirm.EXTRA_FORGET_UUID);
if (!TextUtils.isEmpty(forgetUuid)) {
mStorage.forgetVolume(forgetUuid);
}
final boolean offerMigrate;
if (mFormatPrivate) {
// Offer to migrate only if storage is currently internal
final VolumeInfo privateVol = getPackageManager()
.getPrimaryStorageCurrentVolume();
offerMigrate = (privateVol != null
&& VolumeInfo.ID_PRIVATE_INTERNAL.equals(privateVol.getId()));
} else {
offerMigrate = false;
}
if (offerMigrate) {
final Intent intent = new Intent(this, StorageWizardMigrate.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent);
} else {
final Intent intent = new Intent(this, StorageWizardReady.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent);
}
finishAffinity();
}
}