/* * 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 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 docs, List 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("

"); for (DocumentInfo documentInfo : docs) { list.append("• " + Html.escapeHtml(BidiFormatter.getInstance().unicodeWrap( documentInfo.displayName)) + "
"); } if (uris != null) { for (Uri uri : uris) { list.append("• " + BidiFormatter.getInstance().unicodeWrap(uri.toSafeString()) + "
"); } } list.append("

"); 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); } }