Home | History | Annotate | Download | only in activity
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package com.android.email.activity;
     18 
     19 import android.app.AlertDialog;
     20 import android.app.Dialog;
     21 import android.app.DialogFragment;
     22 import android.app.Fragment;
     23 import android.app.LoaderManager;
     24 import android.content.Context;
     25 import android.content.CursorLoader;
     26 import android.content.DialogInterface;
     27 import android.content.Loader;
     28 import android.database.Cursor;
     29 import android.os.Bundle;
     30 import android.view.LayoutInflater;
     31 import android.view.View;
     32 import android.widget.AdapterView;
     33 import android.widget.AdapterView.OnItemClickListener;
     34 import android.widget.ListView;
     35 import android.widget.SimpleCursorAdapter;
     36 
     37 import com.android.email.R;
     38 import com.android.mail.providers.Account;
     39 import com.android.mail.providers.UIProvider;
     40 
     41 /**
     42  * Dialog which lists QuickResponses for the specified account. On user selection, will call
     43  * Callback.onQuickResponseSelected() with the selected QuickResponse text.
     44  */
     45 public class InsertQuickResponseDialog extends DialogFragment {
     46     // Key for the Account object in the arguments bundle
     47     private static final String ACCOUNT_KEY = "account";
     48 
     49     /**
     50      * Callback interface for when user selects a QuickResponse.
     51      */
     52     public interface Callback {
     53         /**
     54          * Handles the text of the selected QuickResponse.
     55          */
     56         public void onQuickResponseSelected(CharSequence quickResponse);
     57     }
     58 
     59     // Public no-args constructor needed for fragment re-instantiation
     60     public InsertQuickResponseDialog() {}
     61 
     62     /**
     63      * Create and returns new dialog.
     64      *
     65      * @param callbackFragment fragment that implements {@link Callback}.  Or null, in which case
     66      * the parent activity must implement {@link Callback}.
     67      */
     68     public static InsertQuickResponseDialog
     69             newInstance(Fragment callbackFragment, Account account) {
     70         final InsertQuickResponseDialog dialog = new InsertQuickResponseDialog();
     71 
     72         // If a target is set, it MUST implement Callback. Fail-fast if not.
     73         if (callbackFragment != null) {
     74             if (!(callbackFragment instanceof Callback)) {
     75                 throw new ClassCastException(callbackFragment.toString()
     76                         + " must implement Callback");
     77             }
     78             dialog.setTargetFragment(callbackFragment, 0);
     79         }
     80 
     81         Bundle args = new Bundle();
     82         args.putParcelable(ACCOUNT_KEY, account);
     83         dialog.setArguments(args);
     84         return dialog;
     85     }
     86 
     87     @Override
     88     public Dialog onCreateDialog(Bundle savedInstanceState) {
     89         // If target not set, the parent activity MUST implement Callback. Fail-fast if not.
     90         final Fragment targetFragment = getTargetFragment();
     91         if (targetFragment != null) {
     92             if (!(getActivity() instanceof Callback)) {
     93                 throw new ClassCastException(getActivity().toString() + " must implement Callback");
     94             }
     95         }
     96 
     97         // Now that Callback implementation is verified, build the dialog
     98         final Context context = getActivity();
     99 
    100         final SimpleCursorAdapter adapter = new SimpleCursorAdapter(context,
    101                 R.layout.quick_response_item, null,
    102                 new String[] {UIProvider.QuickResponseColumns.TEXT},
    103                 new int[] {R.id.quick_response_text}, 0);
    104 
    105         final AlertDialog.Builder builder = new AlertDialog.Builder(context);
    106 
    107         // inflate the view to show in the dialog
    108         final LayoutInflater li = LayoutInflater.from(builder.getContext());
    109         final View quickResponsesView = li.inflate(R.layout.quick_responses, null);
    110 
    111         // the view contains both a ListView and its associated empty view; wire them together
    112         final ListView listView = (ListView) quickResponsesView.findViewById(R.id.quick_responses);
    113         listView.setEmptyView(quickResponsesView.findViewById(R.id.quick_responses_empty_view));
    114         listView.setAdapter(adapter);
    115         listView.setOnItemClickListener(new OnItemClickListener() {
    116             @Override
    117             public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    118                 final Cursor c = (Cursor) listView.getItemAtPosition(position);
    119                 final String quickResponseText =
    120                         c.getString(c.getColumnIndex(UIProvider.QuickResponseColumns.TEXT));
    121                 getCallback().onQuickResponseSelected(quickResponseText);
    122                 dismiss();
    123             }
    124         });
    125 
    126         final Account account = getArguments().getParcelable(ACCOUNT_KEY);
    127 
    128         getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() {
    129             @Override
    130             public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    131                 return new CursorLoader(context, account.quickResponseUri,
    132                         UIProvider.QUICK_RESPONSE_PROJECTION, null, null, null);
    133             }
    134 
    135             @Override
    136             public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
    137                 adapter.swapCursor(data);
    138             }
    139 
    140             @Override
    141             public void onLoaderReset(Loader<Cursor> loader) {
    142                 adapter.swapCursor(null);
    143             }
    144         });
    145 
    146         final String dialogTitle = getResources()
    147                 .getString(R.string.message_compose_insert_quick_response_list_title);
    148 
    149         return builder
    150                 .setTitle(dialogTitle)
    151                 .setView(quickResponsesView)
    152                 .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
    153                     @Override
    154                     public void onClick(DialogInterface dialog, int which) {
    155                         dialog.cancel();
    156                     }
    157                 })
    158                 .create();
    159     }
    160 
    161     private Callback getCallback() {
    162         Fragment targetFragment = getTargetFragment();
    163         if (targetFragment != null) {
    164             return (Callback) targetFragment;
    165         }
    166         return (Callback) getActivity();
    167     }
    168 }
    169