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