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}