1dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski/*
2dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * Copyright (C) 2016 The Android Open Source Project
3dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski *
4dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * Licensed under the Apache License, Version 2.0 (the "License");
5dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * you may not use this file except in compliance with the License.
6dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * You may obtain a copy of the License at
7dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski *
8dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski *      http://www.apache.org/licenses/LICENSE-2.0
9dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski *
10dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * Unless required by applicable law or agreed to in writing, software
11dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * distributed under the License is distributed on an "AS IS" BASIS,
12dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * See the License for the specific language governing permissions and
14dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * limitations under the License.
15dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski */
16dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
17dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskipackage com.android.documentsui;
18dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
19dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.annotation.IntDef;
20dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.app.Dialog;
21dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.app.DialogFragment;
22dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.app.FragmentManager;
23dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.app.FragmentTransaction;
24dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.content.DialogInterface;
2599f1dc3da6defec0596864934bfe76adc96a1d62Steve McKayimport android.net.Uri;
26dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.os.Bundle;
2799f1dc3da6defec0596864934bfe76adc96a1d62Steve McKayimport android.support.v7.app.AlertDialog;
28dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport android.text.Html;
29dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
30d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport com.android.documentsui.base.DocumentInfo;
31d080506e3aa8547605cd4783eb660775d7d2b8eeSteve McKayimport com.android.documentsui.base.DocumentStack;
32dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport com.android.documentsui.services.FileOperationService;
33946f5617db2400538df26bef185ff8484365272bSteve McKayimport com.android.documentsui.services.FileOperationService.OpType;
3456aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewskiimport com.android.documentsui.ui.MessageBuilder;
35dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
36dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport java.lang.annotation.Retention;
37dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport java.lang.annotation.RetentionPolicy;
38dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskiimport java.util.ArrayList;
3956aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski
40dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski/**
41dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski * Alert dialog for operation dialogs.
42dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski */
43dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewskipublic class OperationDialogFragment extends DialogFragment {
44dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
45dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    public static final int DIALOG_TYPE_UNKNOWN = 0;
46dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    public static final int DIALOG_TYPE_FAILURE = 1;
47dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    public static final int DIALOG_TYPE_CONVERTED = 2;
48dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
49dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    @IntDef(flag = true, value = {
50dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        DIALOG_TYPE_UNKNOWN,
51dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        DIALOG_TYPE_FAILURE,
52dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        DIALOG_TYPE_CONVERTED
53dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    })
54dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
55dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    @Retention(RetentionPolicy.SOURCE)
56dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    public @interface DialogType {}
57dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
58dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    private static final String TAG = "OperationDialogFragment";
59dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
6099f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay    public static void show(
6199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            FragmentManager fm,
6299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            @DialogType int dialogType,
6399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            ArrayList<DocumentInfo> failedSrcList,
64d573c7dbfed47170bb584f5c7245bbfe737cff75Tomasz Mikolajewski            ArrayList<Uri> uriList,
6599f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay            DocumentStack dstStack,
66dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski            @OpType int operationType) {
6799f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay
68dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final Bundle args = new Bundle();
69dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        args.putInt(FileOperationService.EXTRA_DIALOG_TYPE, dialogType);
704833477d7d42fa79ee42956bae4aebad77074e4bGarfield, Tan        args.putInt(FileOperationService.EXTRA_OPERATION_TYPE, operationType);
7199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        args.putParcelableArrayList(FileOperationService.EXTRA_FAILED_DOCS, failedSrcList);
7256aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski        args.putParcelableArrayList(FileOperationService.EXTRA_FAILED_URIS, uriList);
73dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
74dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final FragmentTransaction ft = fm.beginTransaction();
75dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final OperationDialogFragment fragment = new OperationDialogFragment();
76dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        fragment.setArguments(args);
77dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
78dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        ft.add(fragment, TAG);
79dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        ft.commitAllowingStateLoss();
80dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    }
81dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
82dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    @Override
83dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    public Dialog onCreateDialog(Bundle inState) {
84dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        super.onCreate(inState);
85dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
86dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final @DialogType int dialogType =
87dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski              getArguments().getInt(FileOperationService.EXTRA_DIALOG_TYPE);
88dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final @OpType int operationType =
894833477d7d42fa79ee42956bae4aebad77074e4bGarfield, Tan              getArguments().getInt(FileOperationService.EXTRA_OPERATION_TYPE);
9099f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        final ArrayList<Uri> uriList = getArguments().getParcelableArrayList(
9199f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay                FileOperationService.EXTRA_FAILED_URIS);
9299f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay        final ArrayList<DocumentInfo> docList = getArguments().getParcelableArrayList(
9399f1dc3da6defec0596864934bfe76adc96a1d62Steve McKay                FileOperationService.EXTRA_FAILED_DOCS);
94dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
95dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
9656aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski        final String message = new MessageBuilder(getContext()).generateListMessage(
9756aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski                dialogType, operationType, docList, uriList);
9856aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski
9956aeb4918fdd6419f71f48ac5927c4709de42d4fTomasz Mikolajewski        builder.setMessage(Html.fromHtml(message));
100dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        builder.setPositiveButton(
101dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                R.string.close,
102dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                new DialogInterface.OnClickListener() {
103dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                    @Override
104dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                    public void onClick(DialogInterface dialog, int id) {
105dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                        dialog.dismiss();
106dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                    }
107dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski                });
108dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski
109dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski        return builder.create();
110dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski    }
111dd2b31c758e8d694867af58a425180689d25ead1Tomasz Mikolajewski}
112