15a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo/* 25a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Copyright (C) 2011 The Android Open Source Project 35a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * 45a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Licensed under the Apache License, Version 2.0 (the "License"); 55a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * you may not use this file except in compliance with the License. 65a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * You may obtain a copy of the License at 75a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * 85a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * http://www.apache.org/licenses/LICENSE-2.0 95a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * 105a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Unless required by applicable law or agreed to in writing, software 115a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * distributed under the License is distributed on an "AS IS" BASIS, 125a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * See the License for the specific language governing permissions and 145a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * limitations under the License. 155a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo */ 165a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 175a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugopackage com.android.email.activity; 185a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 195a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.app.AlertDialog; 205a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.app.Dialog; 215a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.app.DialogFragment; 225a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.app.Fragment; 23c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerimport android.app.LoaderManager; 245a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.content.Context; 25c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerimport android.content.CursorLoader; 265a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.content.DialogInterface; 27c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerimport android.content.Loader; 28c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerimport android.database.Cursor; 295a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.os.Bundle; 306dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieuximport android.view.LayoutInflater; 315a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.view.View; 325a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.widget.AdapterView; 335a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.widget.AdapterView.OnItemClickListener; 345a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugoimport android.widget.ListView; 35c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerimport android.widget.SimpleCursorAdapter; 365a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 376dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieuximport com.android.email.R; 386dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieuximport com.android.mail.providers.Account; 396dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieuximport com.android.mail.providers.UIProvider; 406dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux 415a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo/** 425a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Dialog which lists QuickResponses for the specified account. On user selection, will call 435a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Callback.onQuickResponseSelected() with the selected QuickResponse text. 445a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo */ 45c6953b77552d4cb71776cf0537dc226029381628Tony Mantlerpublic class InsertQuickResponseDialog extends DialogFragment { 465a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo // Key for the Account object in the arguments bundle 475a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo private static final String ACCOUNT_KEY = "account"; 485a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 495a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo /** 505a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Callback interface for when user selects a QuickResponse. 515a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo */ 525a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public interface Callback { 535a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo /** 545a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Handles the text of the selected QuickResponse. 555a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo */ 565a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public void onQuickResponseSelected(CharSequence quickResponse); 575a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 585a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 597985b43ab7310f76c170266da346f993d2f86051Paul Westbrook // Public no-args constructor needed for fragment re-instantiation 607985b43ab7310f76c170266da346f993d2f86051Paul Westbrook public InsertQuickResponseDialog() {} 617985b43ab7310f76c170266da346f993d2f86051Paul Westbrook 625a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo /** 635a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * Create and returns new dialog. 645a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * 655a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * @param callbackFragment fragment that implements {@link Callback}. Or null, in which case 665a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo * the parent activity must implement {@link Callback}. 675a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo */ 685a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public static InsertQuickResponseDialog 695a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo newInstance(Fragment callbackFragment, Account account) { 705a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo final InsertQuickResponseDialog dialog = new InsertQuickResponseDialog(); 715a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 725a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo // If a target is set, it MUST implement Callback. Fail-fast if not. 735a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo if (callbackFragment != null) { 741b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy if (!(callbackFragment instanceof Callback)) { 755a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo throw new ClassCastException(callbackFragment.toString() 765a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo + " must implement Callback"); 775a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 785a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo dialog.setTargetFragment(callbackFragment, 0); 795a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 805a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 815a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo Bundle args = new Bundle(); 825a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo args.putParcelable(ACCOUNT_KEY, account); 835a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo dialog.setArguments(args); 845a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo return dialog; 855a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 865a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 875a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo @Override 885a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo public Dialog onCreateDialog(Bundle savedInstanceState) { 895a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo // If target not set, the parent activity MUST implement Callback. Fail-fast if not. 905a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo final Fragment targetFragment = getTargetFragment(); 915a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo if (targetFragment != null) { 921b8e0fa23f6e9957f0b8753dd3f5b95d3f5d98eaScott Kennedy if (!(getActivity() instanceof Callback)) { 935a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo throw new ClassCastException(getActivity().toString() + " must implement Callback"); 945a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 955a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 965a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 975a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo // Now that Callback implementation is verified, build the dialog 985a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo final Context context = getActivity(); 995a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 1006dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final SimpleCursorAdapter adapter = new SimpleCursorAdapter(context, 101c6953b77552d4cb71776cf0537dc226029381628Tony Mantler R.layout.quick_response_item, null, 102c6953b77552d4cb71776cf0537dc226029381628Tony Mantler new String[] {UIProvider.QuickResponseColumns.TEXT}, 103c6953b77552d4cb71776cf0537dc226029381628Tony Mantler new int[] {R.id.quick_response_text}, 0); 104c6953b77552d4cb71776cf0537dc226029381628Tony Mantler 1056dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final AlertDialog.Builder builder = new AlertDialog.Builder(context); 106c6953b77552d4cb71776cf0537dc226029381628Tony Mantler 1076dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux // inflate the view to show in the dialog 1086dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final LayoutInflater li = LayoutInflater.from(builder.getContext()); 1096dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final View quickResponsesView = li.inflate(R.layout.quick_responses, null); 1106dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux 1116dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux // the view contains both a ListView and its associated empty view; wire them together 1126dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final ListView listView = (ListView) quickResponsesView.findViewById(R.id.quick_responses); 1136dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux listView.setEmptyView(quickResponsesView.findViewById(R.id.quick_responses_empty_view)); 1146dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux listView.setAdapter(adapter); 115c6953b77552d4cb71776cf0537dc226029381628Tony Mantler listView.setOnItemClickListener(new OnItemClickListener() { 116c6953b77552d4cb71776cf0537dc226029381628Tony Mantler @Override 117c6953b77552d4cb71776cf0537dc226029381628Tony Mantler public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 118c6953b77552d4cb71776cf0537dc226029381628Tony Mantler final Cursor c = (Cursor) listView.getItemAtPosition(position); 119c6953b77552d4cb71776cf0537dc226029381628Tony Mantler final String quickResponseText = 120c6953b77552d4cb71776cf0537dc226029381628Tony Mantler c.getString(c.getColumnIndex(UIProvider.QuickResponseColumns.TEXT)); 121c6953b77552d4cb71776cf0537dc226029381628Tony Mantler getCallback().onQuickResponseSelected(quickResponseText); 122c6953b77552d4cb71776cf0537dc226029381628Tony Mantler dismiss(); 123c6953b77552d4cb71776cf0537dc226029381628Tony Mantler } 124c6953b77552d4cb71776cf0537dc226029381628Tony Mantler }); 1255a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 126c6953b77552d4cb71776cf0537dc226029381628Tony Mantler final Account account = getArguments().getParcelable(ACCOUNT_KEY); 1275a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 128c6953b77552d4cb71776cf0537dc226029381628Tony Mantler getLoaderManager().initLoader(0, null, new LoaderManager.LoaderCallbacks<Cursor>() { 129c6953b77552d4cb71776cf0537dc226029381628Tony Mantler @Override 130c6953b77552d4cb71776cf0537dc226029381628Tony Mantler public Loader<Cursor> onCreateLoader(int id, Bundle args) { 1316dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux return new CursorLoader(context, account.quickResponseUri, 132c6953b77552d4cb71776cf0537dc226029381628Tony Mantler UIProvider.QUICK_RESPONSE_PROJECTION, null, null, null); 133c6953b77552d4cb71776cf0537dc226029381628Tony Mantler } 1345a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 135c6953b77552d4cb71776cf0537dc226029381628Tony Mantler @Override 136c6953b77552d4cb71776cf0537dc226029381628Tony Mantler public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 137c6953b77552d4cb71776cf0537dc226029381628Tony Mantler adapter.swapCursor(data); 138c6953b77552d4cb71776cf0537dc226029381628Tony Mantler } 1395a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 140c6953b77552d4cb71776cf0537dc226029381628Tony Mantler @Override 141c6953b77552d4cb71776cf0537dc226029381628Tony Mantler public void onLoaderReset(Loader<Cursor> loader) { 142c6953b77552d4cb71776cf0537dc226029381628Tony Mantler adapter.swapCursor(null); 143c6953b77552d4cb71776cf0537dc226029381628Tony Mantler } 144c6953b77552d4cb71776cf0537dc226029381628Tony Mantler }); 1455a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 1466dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux final String dialogTitle = getResources() 1476dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux .getString(R.string.message_compose_insert_quick_response_list_title); 1486dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux 1496dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux return builder 1506dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux .setTitle(dialogTitle) 1516dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux .setView(quickResponsesView) 152254dde761f1cfed028ba258ec56f6b239eb2fb02Tony Mantler .setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() { 153c6953b77552d4cb71776cf0537dc226029381628Tony Mantler @Override 154c6953b77552d4cb71776cf0537dc226029381628Tony Mantler public void onClick(DialogInterface dialog, int which) { 155c6953b77552d4cb71776cf0537dc226029381628Tony Mantler dialog.cancel(); 156c6953b77552d4cb71776cf0537dc226029381628Tony Mantler } 1576dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux }) 1586dce0b1819b9436cacd34d37d87499c3b9b726dfJames Lemieux .create(); 1595a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 1605a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo 1615a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo private Callback getCallback() { 1625a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo Fragment targetFragment = getTargetFragment(); 1635a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo if (targetFragment != null) { 1645a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo return (Callback) targetFragment; 1655a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 1665a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo return (Callback) getActivity(); 1675a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo } 1685a3888f35b669ffb3cc785d7dfe4862879a3896cJorge Lugo} 169