Loading packages/DocumentsUI/res/values/strings.xml +9 −0 Original line number Diff line number Diff line Loading @@ -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 --> Loading Loading @@ -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> packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +22 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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. Loading packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading packages/DocumentsUI/src/com/android/documentsui/services/DeleteJob.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading packages/DocumentsUI/src/com/android/documentsui/services/FileOperations.java +2 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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 Loading
packages/DocumentsUI/res/values/strings.xml +9 −0 Original line number Diff line number Diff line Loading @@ -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 --> Loading Loading @@ -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>
packages/DocumentsUI/src/com/android/documentsui/dirlist/DirectoryFragment.java +22 −41 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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. Loading
packages/DocumentsUI/src/com/android/documentsui/services/CopyJob.java +6 −3 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading
packages/DocumentsUI/src/com/android/documentsui/services/DeleteJob.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); } Loading
packages/DocumentsUI/src/com/android/documentsui/services/FileOperations.java +2 −6 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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