• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2009 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 com.android.email.Controller;
20 import com.android.email.Email;
21 import com.android.email.R;
22 import com.android.email.Utility;
23 import com.android.email.activity.setup.AccountSettings;
24 import com.android.email.mail.AuthenticationFailedException;
25 import com.android.email.mail.CertificateValidationException;
26 import com.android.email.mail.MessagingException;
27 import com.android.email.provider.EmailContent;
28 import com.android.email.provider.EmailContent.Account;
29 import com.android.email.provider.EmailContent.AccountColumns;
30 import com.android.email.provider.EmailContent.Mailbox;
31 import com.android.email.provider.EmailContent.MailboxColumns;
32 import com.android.email.provider.EmailContent.Message;
33 import com.android.email.provider.EmailContent.MessageColumns;
34 
35 import android.app.ListActivity;
36 import android.content.ContentUris;
37 import android.content.Context;
38 import android.content.Intent;
39 import android.database.Cursor;
40 import android.graphics.Typeface;
41 import android.net.Uri;
42 import android.os.AsyncTask;
43 import android.os.Bundle;
44 import android.os.Handler;
45 import android.view.ContextMenu;
46 import android.view.LayoutInflater;
47 import android.view.Menu;
48 import android.view.MenuItem;
49 import android.view.View;
50 import android.view.View.OnClickListener;
51 import android.view.ViewGroup;
52 import android.view.ContextMenu.ContextMenuInfo;
53 import android.view.animation.AnimationUtils;
54 import android.widget.AdapterView;
55 import android.widget.Button;
56 import android.widget.CursorAdapter;
57 import android.widget.ImageView;
58 import android.widget.ListView;
59 import android.widget.ProgressBar;
60 import android.widget.TextView;
61 import android.widget.AdapterView.OnItemClickListener;
62 
63 public class MailboxList extends ListActivity implements OnItemClickListener, OnClickListener {
64 
65     // Intent extras (internal to this activity)
66     private static final String EXTRA_ACCOUNT_ID = "com.android.email.activity._ACCOUNT_ID";
67 
68     private static final String MAILBOX_SELECTION = MailboxColumns.ACCOUNT_KEY + "=?"
69         + " AND " + MailboxColumns.TYPE + "<" + Mailbox.TYPE_NOT_EMAIL
70         + " AND " + MailboxColumns.FLAG_VISIBLE + "=1";
71     private static final String MESSAGE_MAILBOX_ID_SELECTION =
72         MessageColumns.MAILBOX_KEY + "=?";
73 
74     // UI support
75     private ListView mListView;
76     private ProgressBar mProgressIcon;
77     private TextView mErrorBanner;
78 
79     private MailboxListAdapter mListAdapter;
80     private MailboxListHandler mHandler;
81     private ControllerResults mControllerCallback;
82 
83     // DB access
84     private long mAccountId;
85     private LoadMailboxesTask mLoadMailboxesTask;
86     private AsyncTask<Void, Void, Object[]> mLoadAccountNameTask;
87     private MessageCountTask mMessageCountTask;
88 
89     private long mDraftMailboxKey = -1;
90     private long mTrashMailboxKey = -1;
91     private int mUnreadCountDraft = 0;
92     private int mUnreadCountTrash = 0;
93 
94     /**
95      * Open a specific account.
96      *
97      * @param context
98      * @param accountId the account to view
99      */
actionHandleAccount(Context context, long accountId)100     public static void actionHandleAccount(Context context, long accountId) {
101         Intent intent = new Intent(context, MailboxList.class);
102         intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
103         intent.putExtra(EXTRA_ACCOUNT_ID, accountId);
104         context.startActivity(intent);
105     }
106 
107     @Override
onCreate(Bundle icicle)108     public void onCreate(Bundle icicle) {
109         super.onCreate(icicle);
110         setContentView(R.layout.mailbox_list);
111 
112         mHandler = new MailboxListHandler();
113         mControllerCallback = new ControllerResults();
114         mListView = getListView();
115         mProgressIcon = (ProgressBar) findViewById(R.id.title_progress_icon);
116         mErrorBanner = (TextView) findViewById(R.id.connection_error_text);
117 
118         mListView.setOnItemClickListener(this);
119         mListView.setItemsCanFocus(false);
120         registerForContextMenu(mListView);
121 
122         mListAdapter = new MailboxListAdapter(this);
123         setListAdapter(mListAdapter);
124 
125         ((Button) findViewById(R.id.account_title_button)).setOnClickListener(this);
126 
127         mAccountId = getIntent().getLongExtra(EXTRA_ACCOUNT_ID, -1);
128         if (mAccountId != -1) {
129             mLoadMailboxesTask = new LoadMailboxesTask(mAccountId);
130             mLoadMailboxesTask.execute();
131         } else {
132             finish();
133         }
134 
135         ((TextView)findViewById(R.id.title_left_text)).setText(R.string.mailbox_list_title);
136 
137         // Go to the database for the account name
138         mLoadAccountNameTask = new AsyncTask<Void, Void, Object[]>() {
139             @Override
140             protected Object[] doInBackground(Void... params) {
141                 String accountName = null;
142                 Uri uri = ContentUris.withAppendedId(Account.CONTENT_URI, mAccountId);
143                 Cursor c = MailboxList.this.getContentResolver().query(
144                         uri, new String[] { AccountColumns.DISPLAY_NAME }, null, null, null);
145                 try {
146                     if (c.moveToFirst()) {
147                         accountName = c.getString(0);
148                     }
149                 } finally {
150                     c.close();
151                 }
152                 int nAccounts = EmailContent.count(MailboxList.this, Account.CONTENT_URI, null, null);
153                 return new Object[] {accountName, nAccounts};
154             }
155 
156             @Override
157             protected void onPostExecute(Object[] result) {
158                 if (result == null) {
159                     return;
160                 }
161                 final String accountName = (String) result[0];
162                 // accountName is null if account name can't be retrieved or query exception
163                 if (accountName == null) {
164                     // something is wrong with this account
165                     finish();
166                 }
167 
168                 final int nAccounts = (Integer) result[1];
169                 setTitleAccountName(accountName, nAccounts > 1);
170             }
171 
172         }.execute();
173     }
174 
175     @Override
onPause()176     public void onPause() {
177         super.onPause();
178         Controller.getInstance(getApplication()).removeResultCallback(mControllerCallback);
179     }
180 
181     @Override
onResume()182     public void onResume() {
183         super.onResume();
184         Controller.getInstance(getApplication()).addResultCallback(mControllerCallback);
185 
186         // Exit immediately if the accounts list has changed (e.g. externally deleted)
187         if (Email.getNotifyUiAccountsChanged()) {
188             Welcome.actionStart(this);
189             finish();
190             return;
191         }
192 
193         updateMessageCount();
194 
195         // TODO: may need to clear notifications here
196     }
197 
198     @Override
onDestroy()199     protected void onDestroy() {
200         super.onDestroy();
201 
202         Utility.cancelTaskInterrupt(mLoadMailboxesTask);
203         mLoadMailboxesTask = null;
204         Utility.cancelTaskInterrupt(mLoadAccountNameTask);
205         mLoadAccountNameTask = null;
206         Utility.cancelTaskInterrupt(mMessageCountTask);
207         mMessageCountTask = null;
208 
209         mListAdapter.changeCursor(null);
210     }
211 
onClick(View v)212     public void onClick(View v) {
213         switch (v.getId()) {
214         case R.id.account_title_button:
215             onAccounts();
216             break;
217         }
218     }
219 
onItemClick(AdapterView<?> parent, View view, int position, long id)220     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
221         onOpenMailbox(id);
222     }
223 
224     @Override
onCreateOptionsMenu(Menu menu)225     public boolean onCreateOptionsMenu(Menu menu) {
226         super.onCreateOptionsMenu(menu);
227         getMenuInflater().inflate(R.menu.mailbox_list_option, menu);
228         return true;
229     }
230 
231     @Override
onOptionsItemSelected(MenuItem item)232     public boolean onOptionsItemSelected(MenuItem item) {
233         switch (item.getItemId()) {
234             case R.id.refresh:
235                 onRefresh(-1);
236                 return true;
237             case R.id.accounts:
238                 onAccounts();
239                 return true;
240             case R.id.compose:
241                 onCompose();
242                 return true;
243             case R.id.account_settings:
244                 onEditAccount();
245                 return true;
246             default:
247                 return super.onOptionsItemSelected(item);
248         }
249     }
250 
251     @Override
onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info)252     public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo info) {
253         super.onCreateContextMenu(menu, v, info);
254         AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) info;
255         Cursor c = (Cursor) mListView.getItemAtPosition(menuInfo.position);
256         String folderName = Utility.FolderProperties.getInstance(MailboxList.this)
257                 .getDisplayName(Integer.valueOf(c.getString(mListAdapter.COLUMN_TYPE)));
258         if (folderName == null) {
259             folderName = c.getString(mListAdapter.COLUMN_DISPLAY_NAME);
260         }
261 
262         menu.setHeaderTitle(folderName);
263         getMenuInflater().inflate(R.menu.mailbox_list_context, menu);
264     }
265 
266     @Override
onContextItemSelected(MenuItem item)267     public boolean onContextItemSelected(MenuItem item) {
268         AdapterView.AdapterContextMenuInfo info =
269             (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
270 
271         switch (item.getItemId()) {
272             case R.id.refresh:
273                 onRefresh(info.id);
274                 break;
275             case R.id.open:
276                 onOpenMailbox(info.id);
277                 break;
278         }
279         return super.onContextItemSelected(item);
280     }
281 
282     /**
283      * Refresh the mailbox list, or a single mailbox
284      * @param mailboxId -1 for all
285      */
onRefresh(long mailboxId)286     private void onRefresh(long mailboxId) {
287         Controller controller = Controller.getInstance(getApplication());
288         mHandler.progress(true);
289         if (mailboxId >= 0) {
290             controller.updateMailbox(mAccountId, mailboxId, mControllerCallback);
291         } else {
292             controller.updateMailboxList(mAccountId, mControllerCallback);
293         }
294     }
295 
onAccounts()296     private void onAccounts() {
297         AccountFolderList.actionShowAccounts(this);
298         finish();
299     }
300 
onEditAccount()301     private void onEditAccount() {
302         AccountSettings.actionSettings(this, mAccountId);
303     }
304 
onOpenMailbox(long mailboxId)305     private void onOpenMailbox(long mailboxId) {
306         MessageList.actionHandleMailbox(this, mailboxId);
307     }
308 
onCompose()309     private void onCompose() {
310         MessageCompose.actionCompose(this, mAccountId);
311     }
312 
setTitleAccountName(String accountName, boolean showAccountsButton)313     private void setTitleAccountName(String accountName, boolean showAccountsButton) {
314         TextView accountsButton = (TextView) findViewById(R.id.account_title_button);
315         TextView textPlain = (TextView) findViewById(R.id.title_right_text);
316         if (showAccountsButton) {
317             accountsButton.setVisibility(View.VISIBLE);
318             textPlain.setVisibility(View.GONE);
319             accountsButton.setText(accountName);
320         } else {
321             accountsButton.setVisibility(View.GONE);
322             textPlain.setVisibility(View.VISIBLE);
323             textPlain.setText(accountName);
324         }
325     }
326 
327     /**
328      * Async task for loading the mailboxes for a given account
329      */
330     private class LoadMailboxesTask extends AsyncTask<Void, Void, Cursor> {
331 
332         private long mAccountKey;
333 
334         /**
335          * Special constructor to cache some local info
336          */
LoadMailboxesTask(long accountId)337         public LoadMailboxesTask(long accountId) {
338             mAccountKey = accountId;
339         }
340 
341         @Override
doInBackground(Void... params)342         protected Cursor doInBackground(Void... params) {
343             Cursor c = MailboxList.this.managedQuery(
344                     EmailContent.Mailbox.CONTENT_URI,
345                     MailboxList.this.mListAdapter.PROJECTION,
346                     MAILBOX_SELECTION,
347                     new String[] { String.valueOf(mAccountKey) },
348                     MailboxColumns.TYPE + "," + MailboxColumns.DISPLAY_NAME);
349             mDraftMailboxKey = -1;
350             mTrashMailboxKey = -1;
351             c.moveToPosition(-1);
352             while (c.moveToNext()) {
353                 long mailboxId = c.getInt(mListAdapter.COLUMN_ID);
354                 switch (c.getInt(mListAdapter.COLUMN_TYPE)) {
355                 case Mailbox.TYPE_DRAFTS:
356                     mDraftMailboxKey = mailboxId;
357                     break;
358                 case Mailbox.TYPE_TRASH:
359                     mTrashMailboxKey = mailboxId;
360                     break;
361                 }
362             }
363             if (isCancelled()) {
364                 c.close();
365                 c = null;
366             }
367             return c;
368         }
369 
370         @Override
onPostExecute(Cursor cursor)371         protected void onPostExecute(Cursor cursor) {
372             if (cursor == null || cursor.isClosed()) {
373                 return;
374             }
375             MailboxList.this.mListAdapter.changeCursor(cursor);
376             updateMessageCount();
377         }
378     }
379 
380     private class MessageCountTask extends AsyncTask<Void, Void, int[]> {
381 
382         @Override
doInBackground(Void... params)383         protected int[] doInBackground(Void... params) {
384             int[] counts = new int[2];
385             if (mDraftMailboxKey != -1) {
386                 counts[0] = EmailContent.count(MailboxList.this, Message.CONTENT_URI,
387                         MESSAGE_MAILBOX_ID_SELECTION,
388                         new String[] { String.valueOf(mDraftMailboxKey)});
389             } else {
390                 counts[0] = -1;
391             }
392             if (mTrashMailboxKey != -1) {
393                 counts[1] = EmailContent.count(MailboxList.this, Message.CONTENT_URI,
394                         MESSAGE_MAILBOX_ID_SELECTION,
395                         new String[] { String.valueOf(mTrashMailboxKey)});
396             } else {
397                 counts[1] = -1;
398             }
399             return counts;
400         }
401 
402         @Override
onPostExecute(int[] counts)403         protected void onPostExecute(int[] counts) {
404             boolean countChanged = false;
405             if (counts == null) {
406                 return;
407             }
408             if (counts[0] != -1) {
409                 if (mUnreadCountDraft != counts[0]) {
410                     mUnreadCountDraft = counts[0];
411                     countChanged = true;
412                 }
413             } else {
414                 mUnreadCountDraft = 0;
415             }
416             if (counts[1] != -1) {
417                 if (mUnreadCountTrash != counts[1]) {
418                     mUnreadCountTrash = counts[1];
419                     countChanged = true;
420                 }
421             } else {
422                 mUnreadCountTrash = 0;
423             }
424             if (countChanged) {
425                 mListAdapter.notifyDataSetChanged();
426             }
427         }
428     }
429 
updateMessageCount()430     private void updateMessageCount() {
431         if (mAccountId == -1 || mListAdapter.getCursor() == null) {
432             return;
433         }
434         if (mMessageCountTask != null
435                 && mMessageCountTask.getStatus() != MessageCountTask.Status.FINISHED) {
436             mMessageCountTask.cancel(true);
437         }
438         mMessageCountTask = (MessageCountTask) new MessageCountTask().execute();
439     }
440 
441     /**
442      * Handler for UI-thread operations (when called from callbacks or any other threads)
443      */
444     class MailboxListHandler extends Handler {
445         private static final int MSG_PROGRESS = 1;
446         private static final int MSG_ERROR_BANNER = 2;
447 
448         @Override
handleMessage(android.os.Message msg)449         public void handleMessage(android.os.Message msg) {
450             switch (msg.what) {
451                 case MSG_PROGRESS:
452                     boolean showProgress = (msg.arg1 != 0);
453                     if (showProgress) {
454                         mProgressIcon.setVisibility(View.VISIBLE);
455                     } else {
456                         mProgressIcon.setVisibility(View.GONE);
457                     }
458                     break;
459                 case MSG_ERROR_BANNER:
460                     String message = (String) msg.obj;
461                     boolean isVisible = mErrorBanner.getVisibility() == View.VISIBLE;
462                     if (message != null) {
463                         mErrorBanner.setText(message);
464                         if (!isVisible) {
465                             mErrorBanner.setVisibility(View.VISIBLE);
466                             mErrorBanner.startAnimation(
467                                     AnimationUtils.loadAnimation(
468                                             MailboxList.this, R.anim.header_appear));
469                         }
470                     } else {
471                         if (isVisible) {
472                             mErrorBanner.setVisibility(View.GONE);
473                             mErrorBanner.startAnimation(
474                                     AnimationUtils.loadAnimation(
475                                             MailboxList.this, R.anim.header_disappear));
476                         }
477                     }
478                     break;
479                 default:
480                     super.handleMessage(msg);
481             }
482         }
483 
484         /**
485          * Call from any thread to start/stop progress indicator(s)
486          * @param progress true to start, false to stop
487          */
progress(boolean progress)488         public void progress(boolean progress) {
489             android.os.Message msg = android.os.Message.obtain();
490             msg.what = MSG_PROGRESS;
491             msg.arg1 = progress ? 1 : 0;
492             sendMessage(msg);
493         }
494 
495         /**
496          * Called from any thread to show or hide the connection error banner.
497          * @param message error text or null to hide the box
498          */
showErrorBanner(String message)499         public void showErrorBanner(String message) {
500             android.os.Message msg = android.os.Message.obtain();
501             msg.what = MSG_ERROR_BANNER;
502             msg.obj = message;
503             sendMessage(msg);
504         }
505     }
506 
507     /**
508      * Callback for async Controller results.
509      */
510     private class ControllerResults implements Controller.Result {
511 
512         // TODO report errors into UI
updateMailboxListCallback(MessagingException result, long accountKey, int progress)513         public void updateMailboxListCallback(MessagingException result, long accountKey,
514                 int progress) {
515             if (accountKey == mAccountId) {
516                 updateBanner(result, progress);
517                 updateProgress(result, progress);
518             }
519         }
520 
521         // TODO report errors into UI
updateMailboxCallback(MessagingException result, long accountKey, long mailboxKey, int progress, int numNewMessages)522         public void updateMailboxCallback(MessagingException result, long accountKey,
523                 long mailboxKey, int progress, int numNewMessages) {
524             if (result != null || progress == 100) {
525                 Email.updateMailboxRefreshTime(mailboxKey);
526             }
527             if (accountKey == mAccountId) {
528                 updateBanner(result, progress);
529                 updateProgress(result, progress);
530             }
531         }
532 
loadMessageForViewCallback(MessagingException result, long messageId, int progress)533         public void loadMessageForViewCallback(MessagingException result, long messageId,
534                 int progress) {
535         }
536 
loadAttachmentCallback(MessagingException result, long messageId, long attachmentId, int progress)537         public void loadAttachmentCallback(MessagingException result, long messageId,
538                 long attachmentId, int progress) {
539         }
540 
serviceCheckMailCallback(MessagingException result, long accountId, long mailboxId, int progress, long tag)541         public void serviceCheckMailCallback(MessagingException result, long accountId,
542                 long mailboxId, int progress, long tag) {
543         }
544 
sendMailCallback(MessagingException result, long accountId, long messageId, int progress)545         public void sendMailCallback(MessagingException result, long accountId, long messageId,
546                 int progress) {
547             if (accountId == mAccountId) {
548                 updateBanner(result, progress);
549                 updateProgress(result, progress);
550             }
551         }
552 
updateProgress(MessagingException result, int progress)553         private void updateProgress(MessagingException result, int progress) {
554             if (result != null || progress == 100) {
555                 mHandler.progress(false);
556             } else if (progress == 0) {
557                 mHandler.progress(true);
558             }
559         }
560 
561         /**
562          * Show or hide the connection error banner, and convert the various MessagingException
563          * variants into localizable text.  There is hysteresis in the show/hide logic:  Once shown,
564          * the banner will remain visible until some progress is made on the connection.  The
565          * goal is to keep it from flickering during retries in a bad connection state.
566          *
567          * @param result
568          * @param progress
569          */
updateBanner(MessagingException result, int progress)570         private void updateBanner(MessagingException result, int progress) {
571             if (result != null) {
572                 int id = R.string.status_network_error;
573                 if (result instanceof AuthenticationFailedException) {
574                     id = R.string.account_setup_failed_dlg_auth_message;
575                 } else if (result instanceof CertificateValidationException) {
576                     id = R.string.account_setup_failed_dlg_certificate_message;
577                 } else {
578                     switch (result.getExceptionType()) {
579                         case MessagingException.IOERROR:
580                             id = R.string.account_setup_failed_ioerror;
581                             break;
582                         case MessagingException.TLS_REQUIRED:
583                             id = R.string.account_setup_failed_tls_required;
584                             break;
585                         case MessagingException.AUTH_REQUIRED:
586                             id = R.string.account_setup_failed_auth_required;
587                             break;
588                         case MessagingException.GENERAL_SECURITY:
589                             id = R.string.account_setup_failed_security;
590                             break;
591                     }
592                 }
593                 mHandler.showErrorBanner(getString(id));
594             } else if (progress > 0) {
595                 mHandler.showErrorBanner(null);
596             }
597         }
598     }
599 
600     /**
601      * The adapter for displaying mailboxes.
602      */
603     /* package */ class MailboxListAdapter extends CursorAdapter {
604 
605         public final String[] PROJECTION = new String[] { MailboxColumns.ID,
606                 MailboxColumns.DISPLAY_NAME, MailboxColumns.UNREAD_COUNT, MailboxColumns.TYPE };
607         public final int COLUMN_ID = 0;
608         public final int COLUMN_DISPLAY_NAME = 1;
609         public final int COLUMN_UNREAD_COUNT = 2;
610         public final int COLUMN_TYPE = 3;
611 
612         Context mContext;
613         private LayoutInflater mInflater;
614 
MailboxListAdapter(Context context)615         public MailboxListAdapter(Context context) {
616             super(context, null);
617             mContext = context;
618             mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
619         }
620 
621         @Override
bindView(View view, Context context, Cursor cursor)622         public void bindView(View view, Context context, Cursor cursor) {
623             int type = cursor.getInt(COLUMN_TYPE);
624             String text = Utility.FolderProperties.getInstance(context)
625                     .getDisplayName(type);
626             if (text == null) {
627                 text = cursor.getString(COLUMN_DISPLAY_NAME);
628             }
629             TextView nameView = (TextView) view.findViewById(R.id.mailbox_name);
630             if (text != null) {
631                 nameView.setText(text);
632             }
633 
634             // TODO get/track live folder status
635             text = null;
636             TextView statusView = (TextView) view.findViewById(R.id.mailbox_status);
637             if (text != null) {
638                 statusView.setText(text);
639                 statusView.setVisibility(View.VISIBLE);
640             } else {
641                 statusView.setVisibility(View.GONE);
642             }
643             View chipView = view.findViewById(R.id.chip);
644             chipView.setBackgroundResource(Email.getAccountColorResourceId(mAccountId));
645             // TODO do we use a different count for special mailboxes (total count vs. unread)
646             int count = -1;
647             switch (type) {
648                 case Mailbox.TYPE_DRAFTS:
649                     count = mUnreadCountDraft;
650                     text = String.valueOf(count);
651                     break;
652                 case Mailbox.TYPE_TRASH:
653                     count = mUnreadCountTrash;
654                     text = String.valueOf(count);
655                     break;
656                 default:
657                     text = cursor.getString(COLUMN_UNREAD_COUNT);
658                     if (text != null) {
659                         count = Integer.valueOf(text);
660                     }
661                     break;
662             }
663             TextView unreadCountView = (TextView) view.findViewById(R.id.new_message_count);
664             TextView allCountView = (TextView) view.findViewById(R.id.all_message_count);
665             // If the unread count is zero, not to show countView.
666             if (count > 0) {
667                 nameView.setTypeface(Typeface.DEFAULT_BOLD);
668                 switch (type) {
669                 case Mailbox.TYPE_DRAFTS:
670                 case Mailbox.TYPE_OUTBOX:
671                 case Mailbox.TYPE_SENT:
672                 case Mailbox.TYPE_TRASH:
673                     unreadCountView.setVisibility(View.GONE);
674                     allCountView.setVisibility(View.VISIBLE);
675                     allCountView.setText(text);
676                     break;
677                 default:
678                     allCountView.setVisibility(View.GONE);
679                     unreadCountView.setVisibility(View.VISIBLE);
680                     unreadCountView.setText(text);
681                     break;
682             }
683             } else {
684                 nameView.setTypeface(Typeface.DEFAULT);
685                 allCountView.setVisibility(View.GONE);
686                 unreadCountView.setVisibility(View.GONE);
687             }
688 
689             ImageView folderIcon = (ImageView) view.findViewById(R.id.folder_icon);
690             folderIcon.setImageDrawable(Utility.FolderProperties.getInstance(context)
691                     .getIconIds(type));
692         }
693 
694         @Override
newView(Context context, Cursor cursor, ViewGroup parent)695         public View newView(Context context, Cursor cursor, ViewGroup parent) {
696             return mInflater.inflate(R.layout.mailbox_list_item, parent, false);
697         }
698     }
699 }
700