Loading packages/DocumentsUI/AndroidManifest.xml +1 −1 Original line number Original line Diff line number Diff line Loading @@ -92,7 +92,7 @@ </receiver> </receiver> <service <service android:name=".CopyService" android:name=".services.FileOperationService" android:exported="false"> android:exported="false"> </service> </service> </application> </application> Loading packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; Loading Loading @@ -154,8 +155,8 @@ public class DocumentsActivity extends BaseActivity { if (state.action == ACTION_PICK_COPY_DESTINATION) { if (state.action == ACTION_PICK_COPY_DESTINATION) { state.directoryCopy = intent.getBooleanExtra( state.directoryCopy = intent.getBooleanExtra( Shared.EXTRA_DIRECTORY_COPY, false); Shared.EXTRA_DIRECTORY_COPY, false); state.transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE, state.transferMode = intent.getIntExtra(FileOperationService.EXTRA_OPERATION, CopyService.TRANSFER_MODE_COPY); FileOperationService.OPERATION_COPY); } } return state; return state; Loading Loading @@ -481,7 +482,7 @@ public class DocumentsActivity extends BaseActivity { // Picking a copy destination is only used internally by us, so we // Picking a copy destination is only used internally by us, so we // don't need to extend permissions to the caller. // don't need to extend permissions to the caller. intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); intent.putExtra(CopyService.EXTRA_TRANSFER_MODE, mState.transferMode); intent.putExtra(FileOperationService.EXTRA_OPERATION, mState.transferMode); } else { } else { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION Loading packages/DocumentsUI/src/com/android/documentsui/FailureDialogFragment.java +29 −12 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.documentsui; package com.android.documentsui; import static com.android.internal.util.Preconditions.checkArgument; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.Dialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.DialogFragment; Loading @@ -27,6 +29,8 @@ import android.text.Html; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperations; import java.util.ArrayList; import java.util.ArrayList; Loading @@ -37,20 +41,20 @@ public class FailureDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { implements DialogInterface.OnClickListener { private static final String TAG = "FailureDialogFragment"; private static final String TAG = "FailureDialogFragment"; private int mTransferMode; private int mOperationType; private ArrayList<DocumentInfo> mFailedSrcList; private ArrayList<DocumentInfo> mFailedSrcList; public static void show(FragmentManager fm, int failure, public static void show(FragmentManager fm, int failure, ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int transferMode) { ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int operationType) { // TODO: Add support for other failures than copy. // TODO: Add support for other failures than copy. if (failure != CopyService.FAILURE_COPY) { if (failure != FileOperationService.FAILURE_COPY) { return; return; } } final Bundle args = new Bundle(); final Bundle args = new Bundle(); args.putInt(CopyService.EXTRA_FAILURE, failure); args.putInt(FileOperationService.EXTRA_FAILURE, failure); args.putInt(CopyService.EXTRA_TRANSFER_MODE, transferMode); args.putInt(FileOperationService.EXTRA_OPERATION, operationType); args.putParcelableArrayList(CopyService.EXTRA_SRC_LIST, failedSrcList); args.putParcelableArrayList(FileOperationService.EXTRA_SRC_LIST, failedSrcList); final FragmentTransaction ft = fm.beginTransaction(); final FragmentTransaction ft = fm.beginTransaction(); final FailureDialogFragment fragment = new FailureDialogFragment(); final FailureDialogFragment fragment = new FailureDialogFragment(); Loading @@ -63,10 +67,12 @@ public class FailureDialogFragment extends DialogFragment @Override @Override public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) { if (whichButton == DialogInterface.BUTTON_POSITIVE) { if (whichButton == DialogInterface.BUTTON_POSITIVE) { CopyService.start(getActivity(), mFailedSrcList, FileOperations.start( getActivity(), mFailedSrcList, (DocumentStack) getActivity().getIntent().getParcelableExtra( (DocumentStack) getActivity().getIntent().getParcelableExtra( Shared.EXTRA_STACK), Shared.EXTRA_STACK), mTransferMode); mOperationType); } } } } Loading @@ -74,16 +80,27 @@ public class FailureDialogFragment extends DialogFragment public Dialog onCreateDialog(Bundle inState) { public Dialog onCreateDialog(Bundle inState) { super.onCreate(inState); super.onCreate(inState); mTransferMode = getArguments().getInt(CopyService.EXTRA_TRANSFER_MODE); mOperationType = getArguments().getInt(FileOperationService.EXTRA_OPERATION); mFailedSrcList = getArguments().getParcelableArrayList(CopyService.EXTRA_SRC_LIST); mFailedSrcList = getArguments().getParcelableArrayList(FileOperationService.EXTRA_SRC_LIST); final StringBuilder list = new StringBuilder("<p>"); final StringBuilder list = new StringBuilder("<p>"); for (DocumentInfo documentInfo : mFailedSrcList) { for (DocumentInfo documentInfo : mFailedSrcList) { list.append(String.format("• %s<br>", documentInfo.displayName)); list.append(String.format("• %s<br>", documentInfo.displayName)); } } list.append("</p>"); list.append("</p>"); final String messageFormat = getString(mTransferMode == CopyService.TRANSFER_MODE_COPY ? R.string.copy_failure_alert_content : R.string.move_failure_alert_content); // TODO: Add support for other file operations. checkArgument( mOperationType == FileOperationService.OPERATION_COPY || mOperationType == FileOperationService.OPERATION_MOVE); int messageId = mOperationType == FileOperationService.OPERATION_COPY ? R.string.copy_failure_alert_content : R.string.move_failure_alert_content; final String messageFormat = getString( messageId); final String message = String.format(messageFormat, list.toString()); final String message = String.format(messageFormat, list.toString()); return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity()) Loading packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +8 −5 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; Loading Loading @@ -120,20 +121,22 @@ public class FilesActivity extends BaseActivity { ProviderExecutor.forAuthority(homeUri.getAuthority())); ProviderExecutor.forAuthority(homeUri.getAuthority())); } } final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0); final int failure = intent.getIntExtra(FileOperationService.EXTRA_FAILURE, 0); final int transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE, final int opType = intent.getIntExtra( CopyService.TRANSFER_MODE_COPY); FileOperationService.EXTRA_OPERATION, FileOperationService.OPERATION_COPY); // DialogFragment takes care of restoring the dialog on configuration change. // DialogFragment takes care of restoring the dialog on configuration change. // Only show it manually for the first time (icicle is null). // Only show it manually for the first time (icicle is null). if (icicle == null && failure != 0) { if (icicle == null && failure != 0) { final ArrayList<DocumentInfo> failedSrcList = final ArrayList<DocumentInfo> failedSrcList = intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST); intent.getParcelableArrayListExtra(FileOperationService.EXTRA_SRC_LIST); FailureDialogFragment.show( FailureDialogFragment.show( getFragmentManager(), getFragmentManager(), failure, failure, failedSrcList, failedSrcList, mState.stack, mState.stack, transferMode); opType); } } } } Loading packages/DocumentsUI/src/com/android/documentsui/Shared.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,9 @@ import android.content.Context; import android.text.format.DateUtils; import android.text.format.DateUtils; import android.text.format.Time; import android.text.format.Time; import java.util.ArrayList; import java.util.List; /** @hide */ /** @hide */ public final class Shared { public final class Shared { /** Intent action name to pick a copy destination. */ /** Intent action name to pick a copy destination. */ Loading Loading @@ -64,4 +67,13 @@ public final class Shared { return DateUtils.formatDateTime(context, when, flags); return DateUtils.formatDateTime(context, when, flags); } } /** * A convenient way to transform any list into a (parcelable) ArrayList. * Uses cast if possible, else creates a new list with entries from {@code list}. */ public static <T> ArrayList<T> asArrayList(List<T> list) { return list instanceof ArrayList ? (ArrayList<T>) list : new ArrayList<T>(list); } } } Loading
packages/DocumentsUI/AndroidManifest.xml +1 −1 Original line number Original line Diff line number Diff line Loading @@ -92,7 +92,7 @@ </receiver> </receiver> <service <service android:name=".CopyService" android:name=".services.FileOperationService" android:exported="false"> android:exported="false"> </service> </service> </application> </application> Loading
packages/DocumentsUI/src/com/android/documentsui/DocumentsActivity.java +4 −3 Original line number Original line Diff line number Diff line Loading @@ -54,6 +54,7 @@ import com.android.documentsui.dirlist.DirectoryFragment; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import java.util.Arrays; import java.util.Arrays; import java.util.List; import java.util.List; Loading Loading @@ -154,8 +155,8 @@ public class DocumentsActivity extends BaseActivity { if (state.action == ACTION_PICK_COPY_DESTINATION) { if (state.action == ACTION_PICK_COPY_DESTINATION) { state.directoryCopy = intent.getBooleanExtra( state.directoryCopy = intent.getBooleanExtra( Shared.EXTRA_DIRECTORY_COPY, false); Shared.EXTRA_DIRECTORY_COPY, false); state.transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE, state.transferMode = intent.getIntExtra(FileOperationService.EXTRA_OPERATION, CopyService.TRANSFER_MODE_COPY); FileOperationService.OPERATION_COPY); } } return state; return state; Loading Loading @@ -481,7 +482,7 @@ public class DocumentsActivity extends BaseActivity { // Picking a copy destination is only used internally by us, so we // Picking a copy destination is only used internally by us, so we // don't need to extend permissions to the caller. // don't need to extend permissions to the caller. intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); intent.putExtra(Shared.EXTRA_STACK, (Parcelable) mState.stack); intent.putExtra(CopyService.EXTRA_TRANSFER_MODE, mState.transferMode); intent.putExtra(FileOperationService.EXTRA_OPERATION, mState.transferMode); } else { } else { intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION Loading
packages/DocumentsUI/src/com/android/documentsui/FailureDialogFragment.java +29 −12 Original line number Original line Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.documentsui; package com.android.documentsui; import static com.android.internal.util.Preconditions.checkArgument; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.Dialog; import android.app.Dialog; import android.app.DialogFragment; import android.app.DialogFragment; Loading @@ -27,6 +29,8 @@ import android.text.Html; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.services.FileOperationService; import com.android.documentsui.services.FileOperations; import java.util.ArrayList; import java.util.ArrayList; Loading @@ -37,20 +41,20 @@ public class FailureDialogFragment extends DialogFragment implements DialogInterface.OnClickListener { implements DialogInterface.OnClickListener { private static final String TAG = "FailureDialogFragment"; private static final String TAG = "FailureDialogFragment"; private int mTransferMode; private int mOperationType; private ArrayList<DocumentInfo> mFailedSrcList; private ArrayList<DocumentInfo> mFailedSrcList; public static void show(FragmentManager fm, int failure, public static void show(FragmentManager fm, int failure, ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int transferMode) { ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, int operationType) { // TODO: Add support for other failures than copy. // TODO: Add support for other failures than copy. if (failure != CopyService.FAILURE_COPY) { if (failure != FileOperationService.FAILURE_COPY) { return; return; } } final Bundle args = new Bundle(); final Bundle args = new Bundle(); args.putInt(CopyService.EXTRA_FAILURE, failure); args.putInt(FileOperationService.EXTRA_FAILURE, failure); args.putInt(CopyService.EXTRA_TRANSFER_MODE, transferMode); args.putInt(FileOperationService.EXTRA_OPERATION, operationType); args.putParcelableArrayList(CopyService.EXTRA_SRC_LIST, failedSrcList); args.putParcelableArrayList(FileOperationService.EXTRA_SRC_LIST, failedSrcList); final FragmentTransaction ft = fm.beginTransaction(); final FragmentTransaction ft = fm.beginTransaction(); final FailureDialogFragment fragment = new FailureDialogFragment(); final FailureDialogFragment fragment = new FailureDialogFragment(); Loading @@ -63,10 +67,12 @@ public class FailureDialogFragment extends DialogFragment @Override @Override public void onClick(DialogInterface dialog, int whichButton) { public void onClick(DialogInterface dialog, int whichButton) { if (whichButton == DialogInterface.BUTTON_POSITIVE) { if (whichButton == DialogInterface.BUTTON_POSITIVE) { CopyService.start(getActivity(), mFailedSrcList, FileOperations.start( getActivity(), mFailedSrcList, (DocumentStack) getActivity().getIntent().getParcelableExtra( (DocumentStack) getActivity().getIntent().getParcelableExtra( Shared.EXTRA_STACK), Shared.EXTRA_STACK), mTransferMode); mOperationType); } } } } Loading @@ -74,16 +80,27 @@ public class FailureDialogFragment extends DialogFragment public Dialog onCreateDialog(Bundle inState) { public Dialog onCreateDialog(Bundle inState) { super.onCreate(inState); super.onCreate(inState); mTransferMode = getArguments().getInt(CopyService.EXTRA_TRANSFER_MODE); mOperationType = getArguments().getInt(FileOperationService.EXTRA_OPERATION); mFailedSrcList = getArguments().getParcelableArrayList(CopyService.EXTRA_SRC_LIST); mFailedSrcList = getArguments().getParcelableArrayList(FileOperationService.EXTRA_SRC_LIST); final StringBuilder list = new StringBuilder("<p>"); final StringBuilder list = new StringBuilder("<p>"); for (DocumentInfo documentInfo : mFailedSrcList) { for (DocumentInfo documentInfo : mFailedSrcList) { list.append(String.format("• %s<br>", documentInfo.displayName)); list.append(String.format("• %s<br>", documentInfo.displayName)); } } list.append("</p>"); list.append("</p>"); final String messageFormat = getString(mTransferMode == CopyService.TRANSFER_MODE_COPY ? R.string.copy_failure_alert_content : R.string.move_failure_alert_content); // TODO: Add support for other file operations. checkArgument( mOperationType == FileOperationService.OPERATION_COPY || mOperationType == FileOperationService.OPERATION_MOVE); int messageId = mOperationType == FileOperationService.OPERATION_COPY ? R.string.copy_failure_alert_content : R.string.move_failure_alert_content; final String messageFormat = getString( messageId); final String message = String.format(messageFormat, list.toString()); final String message = String.format(messageFormat, list.toString()); return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(getActivity()) Loading
packages/DocumentsUI/src/com/android/documentsui/FilesActivity.java +8 −5 Original line number Original line Diff line number Diff line Loading @@ -49,6 +49,7 @@ import com.android.documentsui.model.DocumentInfo; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DocumentStack; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.DurableUtils; import com.android.documentsui.model.RootInfo; import com.android.documentsui.model.RootInfo; import com.android.documentsui.services.FileOperationService; import java.util.ArrayList; import java.util.ArrayList; import java.util.Arrays; import java.util.Arrays; Loading Loading @@ -120,20 +121,22 @@ public class FilesActivity extends BaseActivity { ProviderExecutor.forAuthority(homeUri.getAuthority())); ProviderExecutor.forAuthority(homeUri.getAuthority())); } } final int failure = intent.getIntExtra(CopyService.EXTRA_FAILURE, 0); final int failure = intent.getIntExtra(FileOperationService.EXTRA_FAILURE, 0); final int transferMode = intent.getIntExtra(CopyService.EXTRA_TRANSFER_MODE, final int opType = intent.getIntExtra( CopyService.TRANSFER_MODE_COPY); FileOperationService.EXTRA_OPERATION, FileOperationService.OPERATION_COPY); // DialogFragment takes care of restoring the dialog on configuration change. // DialogFragment takes care of restoring the dialog on configuration change. // Only show it manually for the first time (icicle is null). // Only show it manually for the first time (icicle is null). if (icicle == null && failure != 0) { if (icicle == null && failure != 0) { final ArrayList<DocumentInfo> failedSrcList = final ArrayList<DocumentInfo> failedSrcList = intent.getParcelableArrayListExtra(CopyService.EXTRA_SRC_LIST); intent.getParcelableArrayListExtra(FileOperationService.EXTRA_SRC_LIST); FailureDialogFragment.show( FailureDialogFragment.show( getFragmentManager(), getFragmentManager(), failure, failure, failedSrcList, failedSrcList, mState.stack, mState.stack, transferMode); opType); } } } } Loading
packages/DocumentsUI/src/com/android/documentsui/Shared.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -20,6 +20,9 @@ import android.content.Context; import android.text.format.DateUtils; import android.text.format.DateUtils; import android.text.format.Time; import android.text.format.Time; import java.util.ArrayList; import java.util.List; /** @hide */ /** @hide */ public final class Shared { public final class Shared { /** Intent action name to pick a copy destination. */ /** Intent action name to pick a copy destination. */ Loading Loading @@ -64,4 +67,13 @@ public final class Shared { return DateUtils.formatDateTime(context, when, flags); return DateUtils.formatDateTime(context, when, flags); } } /** * A convenient way to transform any list into a (parcelable) ArrayList. * Uses cast if possible, else creates a new list with entries from {@code list}. */ public static <T> ArrayList<T> asArrayList(List<T> list) { return list instanceof ArrayList ? (ArrayList<T>) list : new ArrayList<T>(list); } } }