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

Commit e05c9230 authored by Steve McKay's avatar Steve McKay Committed by Android (Google) Code Review
Browse files

Merge "Delete confirmation and notification improvements." into nyc-dev

parents 49607029 7a3b8111
Loading
Loading
Loading
Loading
+9 −0
Original line number Diff line number Diff line
@@ -134,6 +134,8 @@
    <string name="copy_notification_title">Copying files</string>
    <!-- Title of the move notification [CHAR LIMIT=24] -->
    <string name="move_notification_title">Moving files</string>
    <!-- Title of the move notification [CHAR LIMIT=24] -->
    <string name="delete_notification_title">Deleting files</string>
    <!-- Text shown on the copy notification to indicate remaining time, in minutes [CHAR LIMIT=24] -->
    <string name="copy_remaining"><xliff:g id="duration" example="3 minutes">%s</xliff:g> left</string>
    <!-- Toast shown when a file copy is kicked off -->
@@ -206,4 +208,11 @@
    <string name="allow">Allow</string>
    <!-- Text in the button asking user to deny access to a given directory. -->
    <string name="deny">Deny</string>
    <!-- Dialog title shown to users when asking if they want to delete files (a confirmation). -->
    <string name="delete_confirmation_title">Delete files?</string>
    <!-- Dialog text shown to users when asking if they want to delete files (a confirmation). -->
    <plurals name="delete_confirmation_message">
        <item quantity="one">Are you sure you want to delete <xliff:g id="count" example="1">%1$d</xliff:g> file?</item>
        <item quantity="other">Are you sure you want to delete <xliff:g id="count" example="3">%1$d</xliff:g> files?</item>
    </plurals>
</resources>
+22 −41
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.annotation.IntDef;
import android.annotation.StringRes;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.AlertDialog;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
@@ -38,6 +39,7 @@ import android.app.LoaderManager.LoaderCallbacks;
import android.content.ClipData;
import android.content.ContentResolver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.Loader;
import android.database.Cursor;
@@ -149,9 +151,6 @@ public class DirectoryFragment extends Fragment

    private static final String TAG = "DirectoryFragment";
    private static final int LOADER_ID = 42;
    private static final int DELETE_UNDO_TIMEOUT = 5000;
    private static final int DELETE_JOB_DELAY = 5500;
    private static final int EMPTY_REVEAL_DURATION = 250;

    private Model mModel;
    private MultiSelectManager mSelectionManager;
@@ -704,47 +703,29 @@ public class DirectoryFragment extends Fragment
        final DocumentInfo srcParent = getDisplayState().stack.peek();
        new GetDocumentsTask() {
            @Override
            void onDocumentsReady(List<DocumentInfo> docs) {
            void onDocumentsReady(final List<DocumentInfo> docs) {
                new AlertDialog.Builder(getActivity())
                    .setTitle(R.string.delete_confirmation_title)
                    .setMessage(
                            Shared.getQuantityString(
                                    getActivity(),
                                    R.plurals.delete_confirmation_message,
                                    docs.size()))
                    .setPositiveButton(
                         android.R.string.yes,
                         new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // Hide the files in the UI.
                final SparseArray<String> hidden = mAdapter.hide(selected.getAll());

                checkState(DELETE_JOB_DELAY > DELETE_UNDO_TIMEOUT);
                String operationId = FileOperations.delete(
                        getActivity(), docs, srcParent, getDisplayState().stack,
                        DELETE_JOB_DELAY);
                showDeleteSnackbar(hidden, operationId);
            }
        }.execute(selected);
    }

    private void showDeleteSnackbar(final SparseArray<String> hidden, final String jobId) {

        Context context = getActivity();
        String message = Shared.getQuantityString(context, R.plurals.deleting, hidden.size());

        // Show a snackbar informing the user that files will be deleted, and give them an option to
        // cancel.
        final Activity activity = getActivity();
        Snackbars.makeSnackbar(activity, message, DELETE_UNDO_TIMEOUT)
                .setAction(
                        R.string.undo,
                        new View.OnClickListener() {
                            @Override
                            public void onClick(View view) {}
                        })
                .setCallback(
                        new Snackbar.Callback() {
                            @Override
                            public void onDismissed(Snackbar snackbar, int event) {
                                if (event == Snackbar.Callback.DISMISS_EVENT_ACTION) {
                                    // If the delete was cancelled, just unhide the files.
                                    FileOperations.cancel(activity, jobId);
                                    mAdapter.unhide(hidden);
                                }
                                mAdapter.hide(selected.getAll());
                                FileOperations.delete(
                                        getActivity(), docs, srcParent, getDisplayState().stack);
                            }
                        })
                    .setNegativeButton(android.R.string.no, null)
                    .show();
            }
        }.execute(selected);
    }

    private void transferDocuments(final Selection selected, final @OpType int mode) {
        // Pop up a dialog to pick a destination.  This is inadequate but works for now.
+6 −3
Original line number Diff line number Diff line
@@ -67,12 +67,15 @@ import java.util.ArrayList;
import java.util.List;

class CopyJob extends Job {

    private static final String TAG = "CopyJob";
    private static final int PROGRESS_INTERVAL_MILLIS = 1000;
    private static final int PROGRESS_INTERVAL_MILLIS = 500;

    final List<DocumentInfo> mSrcs;
    final ArrayList<DocumentInfo> convertedFiles = new ArrayList<>();

    private long mStartTime = -1;

    private long mBatchSize;
    private long mBytesCopied;
    private long mLastNotificationTime;
@@ -496,8 +499,8 @@ class CopyJob extends Job {
            try {
                while ((len = in.read(buffer)) != -1) {
                    if (isCanceled()) {
                        throw new ResourceException("Canceled copy mid-copy of %s",
                                src.derivedUri);
                        if (DEBUG) Log.d(TAG, "Canceled copy mid-copy of: " + src.derivedUri);
                        return;
                    }
                    out.write(buffer, 0, len);
                    makeCopyProgress(len);
+2 −2
Original line number Diff line number Diff line
@@ -57,8 +57,8 @@ final class DeleteJob extends Job {
    @Override
    Builder createProgressBuilder() {
        return super.createProgressBuilder(
                service.getString(R.string.move_notification_title),
                R.drawable.ic_menu_copy,
                service.getString(R.string.delete_notification_title),
                R.drawable.ic_menu_delete,
                service.getString(android.R.string.cancel),
                R.drawable.ic_cab_cancel);
    }
+2 −6
Original line number Diff line number Diff line
@@ -22,7 +22,6 @@ import static com.android.documentsui.Shared.EXTRA_STACK;
import static com.android.documentsui.Shared.asArrayList;
import static com.android.documentsui.Shared.getQuantityString;
import static com.android.documentsui.services.FileOperationService.EXTRA_CANCEL;
import static com.android.documentsui.services.FileOperationService.EXTRA_DELAY;
import static com.android.documentsui.services.FileOperationService.EXTRA_JOB_ID;
import static com.android.documentsui.services.FileOperationService.EXTRA_OPERATION;
import static com.android.documentsui.services.FileOperationService.EXTRA_SRC_LIST;
@@ -165,19 +164,16 @@ public final class FileOperations {
     *     Use {@link #createJobId} if you don't have one handy.
     * @param srcDocs A list of src files to copy.
     * @param srcParent Parent of all the source documents.
     * @param delay Number of milliseconds to wait before executing the job.
     * @return Id of the job.
     */
    public static String delete(
            Activity activity, List<DocumentInfo> srcDocs, DocumentInfo srcParent,
            DocumentStack location, int delay) {
            DocumentStack location) {
        String jobId = createJobId();
        if (DEBUG) Log.d(TAG, "Initiating 'delete' operation id " + jobId
                + " delayed by " + delay + " milliseconds.");
        if (DEBUG) Log.d(TAG, "Initiating 'delete' operation id " + jobId + ".");

        Intent intent = createBaseIntent(OPERATION_DELETE, activity, jobId, srcDocs, srcParent,
                location);
        intent.putExtra(EXTRA_DELAY, delay);
        activity.startService(intent);

        return jobId;
Loading