16cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal/*******************************************************************************
26cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      Copyright (C) 2012 Google Inc.
36cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      Licensed to The Android Open Source Project.
46cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *
56cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      Licensed under the Apache License, Version 2.0 (the "License");
66cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      you may not use this file except in compliance with the License.
76cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      You may obtain a copy of the License at
86cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *
96cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *           http://www.apache.org/licenses/LICENSE-2.0
106cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *
116cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      Unless required by applicable law or agreed to in writing, software
126cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      distributed under the License is distributed on an "AS IS" BASIS,
136cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      See the License for the specific language governing permissions and
156cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *      limitations under the License.
166cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal *******************************************************************************/
176cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
186cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalpackage com.android.mail.browse;
196cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
206cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport android.app.AlertDialog;
216cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport android.app.Dialog;
226cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport android.app.DialogFragment;
23b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwalimport android.app.FragmentManager;
246cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport android.content.DialogInterface;
256cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport android.os.Bundle;
266cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
276cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport com.android.mail.R;
286cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport com.android.mail.ui.ControllableActivity;
296cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalimport com.android.mail.ui.ConversationUpdater;
306cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
316cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal/**
32b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal * A dialog which is also a fragment. This dialog shows a message, two buttons (ok/cancel), and runs
33b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal * a listener only for the positive action (ok). Since this is a fragment, it is created
34b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal * automatically over orientation changes. To make a listener that works with this dialog, create a
35b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal * listener with {@link ConversationUpdater#makeDialogListener(int, boolean)}, which correctly
36b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal * handles activity life-cycle events.
376cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal */
386cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwalpublic class ConfirmDialogFragment extends DialogFragment {
39b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    /** Tag for saving the message shown in the dialog. */
40b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    private static final String MESSAGE_KEY = "message";
41b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    /** Tag for the dialog in the fragment manager. */
42b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    private static final String DIALOG_TAG = "confirm-dialog";
436cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
446cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    /**
456cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * Since the fragment can be easily destroyed, get the listener from the central activity
466cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * immediately after the positive button ("OK" in English) is clicked.  We cannot get the
476cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * listener in {@link #onActivityCreated(Bundle)} because the controller has not had a chance
486cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * to create the listener yet.
496cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     */
506cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    private final AlertDialog.OnClickListener POSITIVE_ACTION = new AlertDialog.OnClickListener() {
516cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        @Override
526cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        public void onClick(DialogInterface arg0, int arg1) {
536cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            // Casting to ControllableActivity will crash if it fails. This is the expected
546cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            // behavior, since the cast should always succeed. Cast failures only occur during
556cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            // development.
566cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            final AlertDialog.OnClickListener listener =
576cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal                    ((ControllableActivity) getActivity()).getConversationUpdater().getListener();
586cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            if (listener != null) {
596cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal                listener.onClick(arg0, arg1);
606cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal            }
616cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        }
626cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    };
636cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
646cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    /**
656cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * Needs a public empty constructor for instantiation on orientation changes.
666cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     */
67f0ea4849bf7a2c11f99ca0b42307ae8ba665b1dcPaul Westbrook    public ConfirmDialogFragment() {}
686cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
696cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    /**
706cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * Create a new {@link ConfirmDialogFragment}.
716cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * @param message
726cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     * @return new {@link ConfirmDialogFragment} object.
736cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal     */
746cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    public static ConfirmDialogFragment newInstance(CharSequence message) {
756cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        final ConfirmDialogFragment f = new ConfirmDialogFragment();
766cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        final Bundle args = new Bundle();
776cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        args.putCharSequence(MESSAGE_KEY, message);
786cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        f.setArguments(args);
796cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        return f;
806cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    }
816cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal
826cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    @Override
836cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    public Dialog onCreateDialog(Bundle savedState) {
846cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
856cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        final CharSequence message = (getArguments()).getCharSequence(MESSAGE_KEY);
866cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        builder.setMessage(message)
876cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal               .setPositiveButton(R.string.ok, POSITIVE_ACTION)
886cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal               .setNegativeButton(R.string.cancel, null);
896cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal        return builder.create();
906cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal    }
91b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal
92b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    /**
93b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal     * Display this dialog with the provided fragment manager
94b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal     * @param manager
95b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal     */
96b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    public final void displayDialog (FragmentManager manager) {
97b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal        show(manager, DIALOG_TAG);
98b8c3171710b7f97247fd0c841ce95f5f515ef576Vikram Aggarwal    }
996cadbfce032c5f8d61c873d91989bff1fb7cc4e5Vikram Aggarwal}
100