Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0de20143 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

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
parent 512bb7e2
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -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: -->
+90 −35
Original line number Diff line number Diff line
@@ -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,7 +95,63 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
        @Override
        protected void onPostExecute(Exception e) {
            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(
                StorageWizardFormatConfirm.EXTRA_FORGET_UUID);
        if (!TextUtils.isEmpty(forgetUuid)) {
@@ -108,21 +170,14 @@ public class StorageWizardFormatProgress extends StorageWizardBase {
        }

        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());
            startActivity(intent);
        } 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());
            startActivity(intent);
        }
        finishAffinity();

            } else {
                Log.e(TAG, "Failed to partition", e);
                Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
                finishAffinity();
            }
        }
    }
}