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] --> <!-- Title of wizard button offering to cancel move [CHAR LIMIT=32] -->
<string name="storage_wizard_move_progress_cancel">Cancel move</string> <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: --> <!-- Phone info screen, section titles: -->
<string name="battery_status_title">Battery status</string> <string name="battery_status_title">Battery status</string>
<!-- Phone info screen, section titles: --> <!-- 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 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.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Bundle; import android.os.Bundle;
@@ -33,6 +37,8 @@ import com.android.internal.util.Preconditions;
import com.android.settings.R; import com.android.settings.R;
public class StorageWizardFormatProgress extends StorageWizardBase { public class StorageWizardFormatProgress extends StorageWizardBase {
private static final String TAG_SLOW_WARNING = "slow_warning";
private boolean mFormatPrivate; private boolean mFormatPrivate;
@Override @Override
@@ -56,6 +62,9 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
} }
public class PartitionTask extends AsyncTask<Void, Integer, Exception> { public class PartitionTask extends AsyncTask<Void, Integer, Exception> {
private volatile long mInternalBench;
private volatile long mPrivateBench;
@Override @Override
protected Exception doInBackground(Void... params) { protected Exception doInBackground(Void... params) {
try { try {
@@ -63,15 +72,12 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
mStorage.partitionPrivate(mDisk.getId()); mStorage.partitionPrivate(mDisk.getId());
publishProgress(40); publishProgress(40);
final long internalBench = mStorage.benchmark(null); mInternalBench = mStorage.benchmark(null);
publishProgress(60); publishProgress(60);
final VolumeInfo privateVol = findFirstVolume(VolumeInfo.TYPE_PRIVATE); 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 { } else {
mStorage.partitionPublic(mDisk.getId()); mStorage.partitionPublic(mDisk.getId());
} }
@@ -89,7 +95,63 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
@Override @Override
protected void onPostExecute(Exception e) { protected void onPostExecute(Exception e) {
final Context context = StorageWizardFormatProgress.this; final Context context = StorageWizardFormatProgress.this;
if (e == null) { 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( final String forgetUuid = getIntent().getStringExtra(
StorageWizardFormatConfirm.EXTRA_FORGET_UUID); StorageWizardFormatConfirm.EXTRA_FORGET_UUID);
if (!TextUtils.isEmpty(forgetUuid)) { if (!TextUtils.isEmpty(forgetUuid)) {
@@ -108,21 +170,14 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
} }
if (offerMigrate) { if (offerMigrate) {
final Intent intent = new Intent(context, StorageWizardMigrate.class); final Intent intent = new Intent(this, StorageWizardMigrate.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId()); intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent); startActivity(intent);
} else { } else {
final Intent intent = new Intent(context, StorageWizardReady.class); final Intent intent = new Intent(this, StorageWizardReady.class);
intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId()); intent.putExtra(DiskInfo.EXTRA_DISK_ID, mDisk.getId());
startActivity(intent); startActivity(intent);
} }
finishAffinity(); finishAffinity();
} else {
Log.e(TAG, "Failed to partition", e);
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
finishAffinity();
}
}
} }
} }