AccountSettingsEditQuickResponsesFragment.java revision 50d934360d51392ac2aa6f11de4d6e1446cf78c9
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
17package com.android.email.activity.setup;
18
19import com.android.email.Email;
20import com.android.email.R;
21import com.android.email.activity.UiUtilities;
22import com.android.emailcommon.Logging;
23import com.android.emailcommon.provider.EmailContent;
24import com.android.emailcommon.provider.Account;
25import com.android.emailcommon.provider.QuickResponse;
26import com.android.emailcommon.utility.EmailAsyncTask;
27
28import android.app.Activity;
29import android.app.Fragment;
30import android.app.FragmentManager;
31import android.content.Context;
32import android.database.ContentObserver;
33import android.os.Bundle;
34import android.os.Handler;
35import android.preference.PreferenceActivity;
36import android.util.Log;
37import android.view.LayoutInflater;
38import android.view.View;
39import android.view.View.OnClickListener;
40import android.view.ViewGroup;
41import android.widget.AdapterView.OnItemClickListener;
42import android.widget.ArrayAdapter;
43import android.widget.ImageView;
44import android.widget.ListView;
45
46/**
47 * Lists quick responses associated with the specified email account. Allows users to create,
48 * edit, and delete quick responses. Owning activity must:
49 * <ul>
50 *   <li>Launch this fragment using startPreferencePanel().</li>
51 *   <li>Provide an Account as an argument named "account". This account's quick responses
52 *   will be read and potentially modified.</li>
53 * </ul>
54 *
55 * <p>This fragment is run as a preference panel from AccountSettings.</p>
56 */
57public class AccountSettingsEditQuickResponsesFragment extends Fragment
58        implements OnClickListener {
59    private ListView mQuickResponsesView;
60    private Account mAccount;
61    private Context mContext;
62    private EmailAsyncTask.Tracker mTaskTracker;
63
64    // Helper class to place a TextView alongside "Delete" icon in the ListView
65    // displaying the QuickResponses
66    private static class ArrayAdapterWithButtons extends ArrayAdapter<QuickResponse> {
67        private QuickResponse[] mQuickResponses;
68        private final long mAccountId;
69        private final Context mContext;
70        private final FragmentManager mFragmentManager;
71
72        private OnClickListener mOnEditListener = new OnClickListener() {
73            @Override
74            public void onClick(View view) {
75                    QuickResponse quickResponse = (QuickResponse) (view.getTag());
76                    EditQuickResponseDialog
77                            .newInstance(quickResponse, mAccountId)
78                            .show(mFragmentManager, null);
79            }
80        };
81
82        private OnClickListener mOnDeleteListener = new OnClickListener() {
83            @Override
84            public void onClick(View view) {
85                final QuickResponse quickResponse = (QuickResponse) view.getTag();
86
87                // Delete the QuickResponse from the database. Content watchers used to
88                // update the ListView of QuickResponses upon deletion.
89                EmailAsyncTask.runAsyncParallel(new Runnable() {
90                    @Override
91                    public void run() {
92                        EmailContent.delete(mContext, quickResponse.getBaseUri(),
93                                quickResponse.getId());
94                    }
95                });
96            }
97        };
98
99        private static final int resourceId = R.layout.quick_response_item;
100        private static final int textViewId = R.id.quick_response_text;
101
102        /**
103         * Instantiates the custom ArrayAdapter, allowing editing and deletion of QuickResponses.
104         * @param context - context of owning activity
105         * @param quickResponses - the QuickResponses to represent in the ListView.
106         * @param fragmentManager - fragmentManager to which an EditQuickResponseDialog will
107         * attach itself.
108         * @param accountId - accountId of the QuickResponses
109         */
110        public ArrayAdapterWithButtons(
111                Context context, QuickResponse[] quickResponses,
112                FragmentManager fragmentManager, long accountId) {
113            super(context, resourceId, textViewId, quickResponses);
114            mQuickResponses = quickResponses;
115            mAccountId = accountId;
116            mContext = context;
117            mFragmentManager = fragmentManager;
118        }
119
120        @Override
121        public View getView(final int position, View convertView, ViewGroup parent) {
122            convertView = super.getView(position, convertView, parent);
123            convertView.setTag(mQuickResponses[position]);
124            convertView.setOnClickListener(mOnEditListener);
125
126            ImageView deleteIcon = (ImageView) convertView.findViewById(R.id.delete_icon);
127            deleteIcon.setTag(mQuickResponses[position]);
128            deleteIcon.setOnClickListener(mOnDeleteListener);
129
130            return convertView;
131        }
132    }
133
134    /**
135     *  Finds existing QuickResponses for the specified account and attaches the contents to
136     *  a ListView. Optionally allows for editing and deleting of QuickResposnes from ListView.
137     */
138    public static class QuickResponseFinder extends EmailAsyncTask<Void, Void, QuickResponse[]> {
139        private final long mAccountId;
140        private final ListView mQuickResponsesView;
141        private final Context mContext;
142        private final FragmentManager mFragmentManager;
143        private final OnItemClickListener mListener;
144        private final boolean mIsEditable;
145
146        /**
147         * Finds all QuickResponses for the given account. Creates either a standard ListView
148         * with a caller-implemented listener or one with a custom adapter that allows deleting
149         * and editing of QuickResponses via EditQuickResponseDialog.
150         *
151         * @param tracker - tracks the finding and listing of QuickResponses. Should be canceled
152         * onDestroy() or when the results are no longer needed.
153         * @param accountId - id of the account whose QuickResponses are to be returned
154         * @param quickResponsesView - ListView to which an ArrayAdapter with the QuickResponses
155         * will be attached.
156         * @param context - context of the owning activity
157         * @param fragmentManager - required when isEditable is true so that an EditQuickResponse
158         * dialog may properly attach itself. Unused when isEditable is false.
159         * @param listener - optional when isEditable is true, unused when false.
160         * @param isEditable - specifies whether the ListView will allow for user editing of
161         * QuickResponses
162         */
163        public QuickResponseFinder(EmailAsyncTask.Tracker tracker, long accountId,
164                ListView quickResponsesView, Context context, FragmentManager fragmentManager,
165                OnItemClickListener listener, boolean isEditable) {
166            super(tracker);
167            mAccountId = accountId;
168            mQuickResponsesView = quickResponsesView;
169            mContext = context;
170            mFragmentManager = fragmentManager;
171            mListener = listener;
172            mIsEditable = isEditable;
173        }
174
175        @Override
176        protected QuickResponse[] doInBackground(Void... params) {
177            QuickResponse[] quickResponses = QuickResponse.restoreQuickResponsesWithAccountId(
178                    mContext, mAccountId);
179            return quickResponses;
180        }
181
182        @Override
183        protected void onSuccess(QuickResponse[] quickResponseItems) {
184            ArrayAdapter<QuickResponse> adapter;
185            if (mIsEditable) {
186                    adapter = new ArrayAdapterWithButtons(
187                    mContext,
188                    quickResponseItems,
189                    mFragmentManager,
190                    mAccountId);
191            } else {
192                adapter = new ArrayAdapter<QuickResponse>(
193                        mContext,
194                        R.layout.insert_quick_response,
195                        quickResponseItems
196                        );
197                mQuickResponsesView.setOnItemClickListener(mListener);
198            }
199            mQuickResponsesView.setAdapter(adapter);
200        }
201    }
202
203    @Override
204    public void onAttach(Activity activity) {
205        super.onAttach(activity);
206    }
207
208    @Override
209    public void onCreate(Bundle savedInstanceState) {
210        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
211            Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreate");
212        }
213        super.onCreate(savedInstanceState);
214
215        Bundle args = getArguments();
216        mAccount = args.getParcelable("account");
217        mTaskTracker = new EmailAsyncTask.Tracker();
218    }
219
220    @Override
221    public View onCreateView(LayoutInflater inflater, ViewGroup container,
222            Bundle savedInstanceState) {
223        if (Logging.DEBUG_LIFECYCLE && Email.DEBUG) {
224            Log.d(Logging.LOG_TAG, "AccountSettingsEditQuickResponsesFragment onCreateView");
225        }
226        int layoutId = R.layout.account_settings_edit_quick_responses_fragment;
227        View view = inflater.inflate(layoutId, container, false);
228        mContext = getActivity();
229
230        mQuickResponsesView = UiUtilities.getView(view,
231                R.id.account_settings_quick_responses_list);
232
233        new QuickResponseFinder(mTaskTracker, mAccount.mId, mQuickResponsesView,
234                mContext, getFragmentManager(), null, true)
235                .executeParallel();
236
237        this.getActivity().getContentResolver().registerContentObserver(
238                QuickResponse.CONTENT_URI, false, new ContentObserver(new Handler()) {
239                    @Override
240                    public void onChange(boolean selfChange) {
241                        new QuickResponseFinder(mTaskTracker, mAccount.mId, mQuickResponsesView,
242                                mContext, getFragmentManager(), null, true)
243                                .executeParallel();
244                    }
245                });
246
247        UiUtilities.getView(view, R.id.done).setOnClickListener(this);
248        UiUtilities.getView(view, R.id.create_new).setOnClickListener(this);
249
250        return view;
251    }
252
253    @Override
254    public void onDestroy() {
255        mTaskTracker.cancellAllInterrupt();
256        super.onDestroy();
257    }
258
259    /**
260     * Implements OnClickListener
261     */
262    @Override
263    public void onClick(View v) {
264        if (v.getId() == R.id.done) {
265            // since launched using startPreferencePanel, this is the proper way to end it
266            // for both tablets and phones
267            ((PreferenceActivity) getActivity()).finishPreferencePanel(this, 0, null);
268        } else if (v.getId() == R.id.create_new) {
269            EditQuickResponseDialog
270                    .newInstance(null, mAccount.mId)
271                    .show(getFragmentManager(), null);
272        }
273    }
274}