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