1748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski/* 2748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * Copyright (C) 2016 The Android Open Source Project 3748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * 4748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * Licensed under the Apache License, Version 2.0 (the "License"); 5748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * you may not use this file except in compliance with the License. 6748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * You may obtain a copy of the License at 7748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * 8748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * http://www.apache.org/licenses/LICENSE-2.0 9748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * 10748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * Unless required by applicable law or agreed to in writing, software 11748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * distributed under the License is distributed on an "AS IS" BASIS, 12748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * See the License for the specific language governing permissions and 14748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * limitations under the License. 15748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski */ 16748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 17748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskipackage com.android.documentsui; 18748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 19748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.annotation.IntDef; 20748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.app.AlertDialog; 21748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.app.Dialog; 22748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.app.DialogFragment; 23748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.app.FragmentManager; 24748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.app.FragmentTransaction; 25748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.content.DialogInterface; 26748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.os.Bundle; 27748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport android.text.Html; 28748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 29748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport com.android.documentsui.model.DocumentInfo; 30748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport com.android.documentsui.model.DocumentStack; 31748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport com.android.documentsui.services.FileOperationService; 32a3471af5f9533513efd60faab5c8475881fc7c62Steve McKayimport com.android.documentsui.services.FileOperationService.OpType; 33748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 34748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport java.lang.annotation.Retention; 35748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport java.lang.annotation.RetentionPolicy; 36748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskiimport java.util.ArrayList; 37748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 38748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski/** 39748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski * Alert dialog for operation dialogs. 40748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski */ 41748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewskipublic class OperationDialogFragment extends DialogFragment { 42748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 43748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public static final int DIALOG_TYPE_UNKNOWN = 0; 44748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public static final int DIALOG_TYPE_FAILURE = 1; 45748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public static final int DIALOG_TYPE_CONVERTED = 2; 46748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 47748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski @IntDef(flag = true, value = { 48748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski DIALOG_TYPE_UNKNOWN, 49748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski DIALOG_TYPE_FAILURE, 50748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski DIALOG_TYPE_CONVERTED 51748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski }) 52748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 53748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski @Retention(RetentionPolicy.SOURCE) 54748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public @interface DialogType {} 55748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 56748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski private static final String TAG = "OperationDialogFragment"; 57748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 58748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public static void show(FragmentManager fm, @DialogType int dialogType, 59748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski ArrayList<DocumentInfo> failedSrcList, DocumentStack dstStack, 60748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski @OpType int operationType) { 61748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final Bundle args = new Bundle(); 62748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski args.putInt(FileOperationService.EXTRA_DIALOG_TYPE, dialogType); 63748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski args.putInt(FileOperationService.EXTRA_OPERATION, operationType); 64748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski args.putParcelableArrayList(FileOperationService.EXTRA_SRC_LIST, failedSrcList); 65748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 66748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final FragmentTransaction ft = fm.beginTransaction(); 67748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final OperationDialogFragment fragment = new OperationDialogFragment(); 68748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski fragment.setArguments(args); 69748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 70748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski ft.add(fragment, TAG); 71748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski ft.commitAllowingStateLoss(); 72748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 73748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 74748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski @Override 75748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public Dialog onCreateDialog(Bundle inState) { 76748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski super.onCreate(inState); 77748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 78748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final @DialogType int dialogType = 79748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski getArguments().getInt(FileOperationService.EXTRA_DIALOG_TYPE); 80748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final @OpType int operationType = 81748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski getArguments().getInt(FileOperationService.EXTRA_OPERATION); 82748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final ArrayList<DocumentInfo> srcList = getArguments().getParcelableArrayList( 83748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski FileOperationService.EXTRA_SRC_LIST); 84748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 85748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 86748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski String messageFormat; 87748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 88748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski switch (dialogType) { 89748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski case DIALOG_TYPE_CONVERTED: 90748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski messageFormat = getString(R.string.copy_converted_warning_content); 91748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski break; 92748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 93748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski case DIALOG_TYPE_FAILURE: 94748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski switch (operationType) { 95748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski case FileOperationService.OPERATION_COPY: 96748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski messageFormat = getString(R.string.copy_failure_alert_content); 97748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski break; 988f6387021b380e28c7981810e1c9be579c456211Steve McKay case FileOperationService.OPERATION_DELETE: 998f6387021b380e28c7981810e1c9be579c456211Steve McKay messageFormat = getString(R.string.delete_failure_alert_content); 1008f6387021b380e28c7981810e1c9be579c456211Steve McKay break; 101748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski case FileOperationService.OPERATION_MOVE: 102748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski messageFormat = getString(R.string.move_failure_alert_content); 103748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski break; 104748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski default: 105748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski throw new UnsupportedOperationException(); 106748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 107748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski break; 108748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 109748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski default: 110748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski throw new UnsupportedOperationException(); 111748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 112748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 113748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski final StringBuilder list = new StringBuilder("<p>"); 114748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski for (DocumentInfo documentInfo : srcList) { 115a3471af5f9533513efd60faab5c8475881fc7c62Steve McKay list.append(String.format("• %s<br>", Html.escapeHtml(documentInfo.displayName))); 116748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 117748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski list.append("</p>"); 118748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski builder.setMessage(Html.fromHtml(String.format(messageFormat, list.toString()))); 119748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski builder.setPositiveButton( 120748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski R.string.close, 121748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski new DialogInterface.OnClickListener() { 122748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski @Override 123748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski public void onClick(DialogInterface dialog, int id) { 124748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski dialog.dismiss(); 125748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 126748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski }); 127748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski 128748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski return builder.create(); 129748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski } 130748ea8cc785b6f037518703308ffd3eb2a151c5aTomasz Mikolajewski} 131