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:
@@ -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: -->
|
||||||
|
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user