| /* | |
| * Copyright (C) 2016 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.android.documentsui.services; | |
| import static com.android.documentsui.base.SharedMinimal.DEBUG; | |
| import static com.android.documentsui.services.FileOperationService.OPERATION_DELETE; | |
| import android.app.Notification; | |
| import android.app.Notification.Builder; | |
| import android.content.ContentResolver; | |
| import android.content.Context; | |
| import android.net.Uri; | |
| import android.util.Log; | |
| import com.android.documentsui.MetricConsts; | |
| import com.android.documentsui.Metrics; | |
| import com.android.documentsui.R; | |
| import com.android.documentsui.base.DocumentInfo; | |
| import com.android.documentsui.base.DocumentStack; | |
| import com.android.documentsui.base.Features; | |
| import com.android.documentsui.base.UserId; | |
| import com.android.documentsui.clipping.UrisSupplier; | |
| import java.io.FileNotFoundException; | |
| import javax.annotation.Nullable; | |
| final class DeleteJob extends ResolvedResourcesJob { | |
| private static final String TAG = "DeleteJob"; | |
| private final Uri mParentUri; | |
| private volatile int mDocsProcessed = 0; | |
| /** | |
| * Moves files to a destination identified by {@code destination}. | |
| * Performs most work by delegating to CopyJob, then deleting | |
| * a file after it has been copied. | |
| * | |
| * @see @link {@link Job} constructor for most param descriptions. | |
| */ | |
| DeleteJob(Context service, Listener listener, String id, DocumentStack stack, | |
| UrisSupplier srcs, @Nullable Uri srcParent, Features features) { | |
| super(service, listener, id, OPERATION_DELETE, stack, srcs, features); | |
| mParentUri = srcParent; | |
| } | |
| @Override | |
| Builder createProgressBuilder() { | |
| return super.createProgressBuilder( | |
| service.getString(R.string.delete_notification_title), | |
| R.drawable.ic_menu_delete, | |
| service.getString(android.R.string.cancel), | |
| R.drawable.ic_cab_cancel); | |
| } | |
| @Override | |
| public Notification getSetupNotification() { | |
| return getSetupNotification(service.getString(R.string.delete_preparing)); | |
| } | |
| @Override | |
| public Notification getProgressNotification() { | |
| mProgressBuilder.setProgress(mResourceUris.getItemCount(), mDocsProcessed, false); | |
| String format = service.getString(R.string.delete_progress); | |
| mProgressBuilder.setSubText( | |
| String.format(format, mDocsProcessed, mResourceUris.getItemCount())); | |
| mProgressBuilder.setContentText(null); | |
| return mProgressBuilder.build(); | |
| } | |
| @Override | |
| Notification getFailureNotification() { | |
| return getFailureNotification( | |
| R.plurals.delete_error_notification_title, R.drawable.ic_menu_delete); | |
| } | |
| @Override | |
| Notification getWarningNotification() { | |
| throw new UnsupportedOperationException(); | |
| } | |
| @Override | |
| void start() { | |
| ContentResolver resolver = appContext.getContentResolver(); | |
| DocumentInfo parentDoc; | |
| try { | |
| parentDoc = mParentUri != null | |
| ? DocumentInfo.fromUri(resolver, mParentUri, UserId.DEFAULT_USER) | |
| : null; | |
| } catch (FileNotFoundException e) { | |
| Log.e(TAG, "Failed to resolve parent from Uri: " + mParentUri + ". Cannot continue.", e); | |
| failureCount += this.mResourceUris.getItemCount(); | |
| return; | |
| } | |
| for (DocumentInfo doc : mResolvedDocs) { | |
| if (DEBUG) { | |
| Log.d(TAG, "Deleting document @ " + doc.derivedUri); | |
| } | |
| try { | |
| deleteDocument(doc, parentDoc); | |
| } catch (ResourceException e) { | |
| Metrics.logFileOperationFailure( | |
| appContext, MetricConsts.SUBFILEOP_DELETE_DOCUMENT, doc.derivedUri); | |
| Log.e(TAG, "Failed to delete document @ " + doc.derivedUri, e); | |
| onFileFailed(doc); | |
| } | |
| mDocsProcessed++; | |
| if (isCanceled()) { | |
| return; | |
| } | |
| } | |
| Metrics.logFileOperation(operationType, mResolvedDocs, null); | |
| } | |
| @Override | |
| public String toString() { | |
| return new StringBuilder() | |
| .append("DeleteJob") | |
| .append("{") | |
| .append("id=" + id) | |
| .append(", uris=" + mResourceUris) | |
| .append(", docs=" + mResolvedDocs) | |
| .append(", srcParent=" + mParentUri) | |
| .append(", location=" + stack) | |
| .append("}") | |
| .toString(); | |
| } | |
| } |