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

Commit e1a03f8e authored by Tomasz Mikolajewski's avatar Tomasz Mikolajewski
Browse files

Show copy destination when clicking on the copy notification in Documents UI.

Change-Id: I3d955595bc46903c134c0633a6d32663cc2d0c05
parent 9e3cb046
Loading
Loading
Loading
Loading
+21 −14
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import android.database.Cursor;
import android.net.Uri;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
import android.os.Parcelable;
import android.os.RemoteException;
import android.os.SystemClock;
import android.provider.DocumentsContract;
@@ -38,6 +39,7 @@ import android.text.format.DateUtils;
import android.util.Log;

import com.android.documentsui.model.DocumentInfo;
import com.android.documentsui.model.DocumentStack;

import libcore.io.IoUtils;

@@ -51,8 +53,10 @@ import java.util.Objects;

public class CopyService extends IntentService {
    public static final String TAG = "CopyService";
    public static final String EXTRA_SRC_LIST = "com.android.documentsui.SRC_LIST";

    private static final String EXTRA_CANCEL = "com.android.documentsui.CANCEL";
    public static final String EXTRA_SRC_LIST = "com.android.documentsui.SRC_LIST";
    public static final String EXTRA_STACK = "com.android.documentsui.STACK";

    private NotificationManager mNotificationManager;
    private Notification.Builder mProgressBuilder;
@@ -98,20 +102,20 @@ public class CopyService extends IntentService {
            return;
        }

        ArrayList<DocumentInfo> srcs = intent.getParcelableArrayListExtra(EXTRA_SRC_LIST);
        Uri destinationUri = intent.getData();
        final ArrayList<DocumentInfo> srcs = intent.getParcelableArrayListExtra(EXTRA_SRC_LIST);
        final DocumentStack stack = intent.getParcelableExtra(EXTRA_STACK);

        try {
            // Acquire content providers.
            mSrcClient = DocumentsApplication.acquireUnstableProviderOrThrow(getContentResolver(),
                    srcs.get(0).authority);
            mDstClient = DocumentsApplication.acquireUnstableProviderOrThrow(getContentResolver(),
                    destinationUri.getAuthority());
                    stack.peek().authority);

            setupCopyJob(srcs, destinationUri);
            setupCopyJob(srcs, stack);

            for (int i = 0; i < srcs.size() && !mIsCancelled; ++i) {
                copy(srcs.get(i), destinationUri);
                copy(srcs.get(i), stack.peek());
            }
        } catch (Exception e) {
            // Catch-all to prevent any copy errors from wedging the app.
@@ -142,29 +146,32 @@ public class CopyService extends IntentService {
     * files.
     *
     * @param srcs A list of src files to copy.
     * @param destinationUri The URI of the destination directory.
     * @param stack The copy destination stack.
     * @throws RemoteException
     */
    private void setupCopyJob(ArrayList<DocumentInfo> srcs, Uri destinationUri)
    private void setupCopyJob(ArrayList<DocumentInfo> srcs, DocumentStack stack)
            throws RemoteException {
        // Create an ID for this copy job. Use the timestamp.
        mJobId = String.valueOf(SystemClock.elapsedRealtime());
        // Reset the cancellation flag.
        mIsCancelled = false;

        final Context context = getApplicationContext();
        final Intent navigateIntent = new Intent(context, StandaloneActivity.class);
        navigateIntent.putExtra(EXTRA_STACK, (Parcelable)stack);

        mProgressBuilder = new Notification.Builder(this)
                .setContentTitle(getString(R.string.copy_notification_title))
                .setContentIntent(PendingIntent.getActivity(context, 0, navigateIntent, 0))
                .setCategory(Notification.CATEGORY_PROGRESS)
                .setSmallIcon(R.drawable.ic_menu_copy).setOngoing(true);

        Intent cancelIntent = new Intent(this, CopyService.class);
        final Intent cancelIntent = new Intent(this, CopyService.class);
        cancelIntent.putExtra(EXTRA_CANCEL, mJobId);
        mProgressBuilder.addAction(R.drawable.ic_cab_cancel,
                getString(R.string.cancel), PendingIntent.getService(this, 0,
                        cancelIntent, PendingIntent.FLAG_ONE_SHOT));

        // TODO: Add a content intent to open the destination folder.

        // Send an initial progress notification.
        mProgressBuilder.setProgress(0, 0, true); // Indeterminate progress while setting up.
        mProgressBuilder.setContentText(getString(R.string.copy_preparing));
@@ -322,11 +329,11 @@ public class CopyService extends IntentService {
     * Copies a the given documents to the given location.
     *
     * @param srcInfo DocumentInfos for the documents to copy.
     * @param dstDirUri The URI of the destination directory.
     * @param dstDirInfo The destination directory.
     * @throws RemoteException
     */
    private void copy(DocumentInfo srcInfo, Uri dstDirUri) throws RemoteException {
        final Uri dstUri = DocumentsContract.createDocument(mDstClient, dstDirUri,
    private void copy(DocumentInfo srcInfo, DocumentInfo dstDirInfo) throws RemoteException {
        final Uri dstUri = DocumentsContract.createDocument(mDstClient, dstDirInfo.derivedUri,
                srcInfo.mimeType, srcInfo.displayName);
        if (dstUri == null) {
            // If this is a directory, the entire subdir will not be copied over.
+4 −12
Original line number Diff line number Diff line
@@ -358,18 +358,10 @@ public class DirectoryFragment extends Fragment {
            return;
        }

        // Because the destination picker is launched using an open tree intent, the URI returned is
        // a tree URI. Convert it to a document URI.
        // TODO: Remove this step when the destination picker returns a document URI.
        final Uri destinationTree = data.getData();
        final Uri destination = DocumentsContract.buildDocumentUriUsingTree(destinationTree,
                DocumentsContract.getTreeDocumentId(destinationTree));

        List<DocumentInfo> docs = mSelectedDocumentsForCopy;
        Intent copyIntent = new Intent(context, CopyService.class);
        copyIntent.putParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST,
                new ArrayList<DocumentInfo>(docs));
        copyIntent.setData(destination);
        final List<DocumentInfo> docs = mSelectedDocumentsForCopy;
        final Intent copyIntent = new Intent(context, CopyService.class);
        copyIntent.putParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST, new ArrayList<DocumentInfo>(docs));
        copyIntent.putExtra(CopyService.EXTRA_STACK, data.getParcelableExtra(CopyService.EXTRA_STACK));

        Toast.makeText(context,
                res.getQuantityString(R.plurals.copy_begin, docs.size(), docs.size()),
+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import android.graphics.Point;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Root;
import android.support.v4.app.ActionBarDrawerToggle;
@@ -1109,6 +1110,8 @@ public class DocumentsActivity extends BaseActivity {
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                    | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                    | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
            // TODO: Move passing the stack to the separate ACTION_COPY action once it's implemented.
            intent.putExtra(CopyService.EXTRA_STACK, (Parcelable)mState.stack);
        } else {
            intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                    | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
+3 −27
Original line number Diff line number Diff line
@@ -171,33 +171,9 @@ public class StandaloneActivity extends BaseActivity {
        mState.showAdvanced = mState.forceAdvanced
                | LocalPreferences.getDisplayAdvancedDevices(this);
        mState.showSize = true;
    }

    private class RestoreRootTask extends AsyncTask<Void, Void, RootInfo> {
        private Uri mRootUri;

        public RestoreRootTask(Uri rootUri) {
            mRootUri = rootUri;
        }

        @Override
        protected RootInfo doInBackground(Void... params) {
            final String rootId = DocumentsContract.getRootId(mRootUri);
            return mRoots.getRootOneshot(mRootUri.getAuthority(), rootId);
        }

        @Override
        protected void onPostExecute(RootInfo root) {
            if (isDestroyed()) return;
            mState.restored = true;

            if (root != null) {
                onRootPicked(root, true);
            } else {
                Log.w(TAG, "Failed to find root: " + mRootUri);
                finish();
            }
        }
        final DocumentStack stack = intent.getParcelableExtra(CopyService.EXTRA_STACK);
        if (stack != null)
            mState.stack = stack;
    }

    private class RestoreStackTask extends AsyncTask<Void, Void, Void> {
+1 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.provider.DocumentsContract;
import android.provider.DocumentsContract.Document;
import android.provider.DocumentsContract.Root;
import android.provider.DocumentsProvider;
import android.text.TextUtils;

@@ -161,8 +162,6 @@ public class DocumentInfo implements Durable, Parcelable {
        this.authority = authority;
        this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
        this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
        this.documentId = getCursorString(cursor, Document.COLUMN_DOCUMENT_ID);
        this.mimeType = getCursorString(cursor, Document.COLUMN_MIME_TYPE);
        this.displayName = getCursorString(cursor, Document.COLUMN_DISPLAY_NAME);
        this.lastModified = getCursorLong(cursor, Document.COLUMN_LAST_MODIFIED);
        this.flags = getCursorInt(cursor, Document.COLUMN_FLAGS);
Loading