| /* | |
| * 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.ui; | |
| import androidx.annotation.PluralsRes; | |
| import android.content.Context; | |
| import android.text.BidiFormatter; | |
| import android.net.Uri; | |
| import android.text.Html; | |
| import com.android.documentsui.OperationDialogFragment.DialogType; | |
| import com.android.documentsui.R; | |
| import com.android.documentsui.base.DocumentInfo; | |
| import com.android.documentsui.base.Shared; | |
| import com.android.documentsui.services.FileOperationService; | |
| import com.android.documentsui.services.FileOperationService.OpType; | |
| import com.android.documentsui.OperationDialogFragment.DialogType; | |
| import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_FAILURE; | |
| import static com.android.documentsui.OperationDialogFragment.DIALOG_TYPE_CONVERTED; | |
| import java.util.List; | |
| public class MessageBuilder { | |
| private Context mContext; | |
| public MessageBuilder(Context context) { | |
| mContext = context; | |
| } | |
| public String generateDeleteMessage(List<DocumentInfo> docs) { | |
| String message; | |
| int dirsCount = 0; | |
| for (DocumentInfo doc : docs) { | |
| if (doc.isDirectory()) { | |
| ++dirsCount; | |
| } | |
| } | |
| if (docs.size() == 1) { | |
| // Deleteing 1 file xor 1 folder in cwd | |
| // Address b/28772371, where including user strings in message can result in | |
| // broken bidirectional support. | |
| String displayName = BidiFormatter.getInstance().unicodeWrap(docs.get(0).displayName); | |
| message = dirsCount == 0 | |
| ? mContext.getString(R.string.delete_filename_confirmation_message, | |
| displayName) | |
| : mContext.getString(R.string.delete_foldername_confirmation_message, | |
| displayName); | |
| } else if (dirsCount == 0) { | |
| // Deleting only files in cwd | |
| message = Shared.getQuantityString(mContext, | |
| R.plurals.delete_files_confirmation_message, docs.size()); | |
| } else if (dirsCount == docs.size()) { | |
| // Deleting only folders in cwd | |
| message = Shared.getQuantityString(mContext, | |
| R.plurals.delete_folders_confirmation_message, docs.size()); | |
| } else { | |
| // Deleting mixed items (files and folders) in cwd | |
| message = Shared.getQuantityString(mContext, | |
| R.plurals.delete_items_confirmation_message, docs.size()); | |
| } | |
| return message; | |
| } | |
| public String generateListMessage( | |
| @DialogType int dialogType, @OpType int operationType, List<DocumentInfo> docs, | |
| List<Uri> uris) { | |
| int resourceId; | |
| switch (dialogType) { | |
| case DIALOG_TYPE_CONVERTED: | |
| resourceId = R.plurals.copy_converted_warning_content; | |
| break; | |
| case DIALOG_TYPE_FAILURE: | |
| switch (operationType) { | |
| case FileOperationService.OPERATION_COPY: | |
| resourceId = R.plurals.copy_failure_alert_content; | |
| break; | |
| case FileOperationService.OPERATION_COMPRESS: | |
| resourceId = R.plurals.compress_failure_alert_content; | |
| break; | |
| case FileOperationService.OPERATION_EXTRACT: | |
| resourceId = R.plurals.extract_failure_alert_content; | |
| break; | |
| case FileOperationService.OPERATION_DELETE: | |
| resourceId = R.plurals.delete_failure_alert_content; | |
| break; | |
| case FileOperationService.OPERATION_MOVE: | |
| resourceId = R.plurals.move_failure_alert_content; | |
| break; | |
| default: | |
| throw new UnsupportedOperationException(); | |
| } | |
| break; | |
| default: | |
| throw new UnsupportedOperationException(); | |
| } | |
| final StringBuilder list = new StringBuilder("<p>"); | |
| for (DocumentInfo documentInfo : docs) { | |
| list.append("• " + Html.escapeHtml(BidiFormatter.getInstance().unicodeWrap( | |
| documentInfo.displayName)) + "<br>"); | |
| } | |
| if (uris != null) { | |
| for (Uri uri : uris) { | |
| list.append("• " + BidiFormatter.getInstance().unicodeWrap(uri.toSafeString()) + | |
| "<br>"); | |
| } | |
| } | |
| list.append("</p>"); | |
| final int totalItems = docs.size() + (uris != null ? uris.size() : 0); | |
| return mContext.getResources().getQuantityString(resourceId, totalItems, list.toString()); | |
| } | |
| /** | |
| * Generates a formatted quantity string. | |
| */ | |
| public String getQuantityString(@PluralsRes int stringId, int quantity) { | |
| return Shared.getQuantityString(mContext, stringId, quantity); | |
| } | |
| } |