1d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd/* 2d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Copyright (C) 2015 The Android Open Source Project 3d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 4d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Licensed under the Apache License, Version 2.0 (the "License"); 5d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * you may not use this file except in compliance with the License. 6d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * You may obtain a copy of the License at 7d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 8d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * http://www.apache.org/licenses/LICENSE-2.0 9d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * 10d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * Unless required by applicable law or agreed to in writing, software 11d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * distributed under the License is distributed on an "AS IS" BASIS, 12d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * See the License for the specific language governing permissions and 14d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd * limitations under the License. 15d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd */ 16d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpackage com.android.messaging.ui.conversationlist; 17d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 18d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.support.v4.util.ArrayMap; 19d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.text.TextUtils; 20d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.ActionMode; 21d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.ActionMode.Callback; 22d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.Menu; 23d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport android.view.MenuItem; 24d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 25d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.R; 26d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListData; 27d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.datamodel.data.ConversationListItemData; 28d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport com.android.messaging.util.Assert; 29d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 30d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.Collection; 31d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddimport java.util.HashSet; 32d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 33d3b009ae55651f1e60950342468e3c37fdeb0796Mike Doddpublic class MultiSelectActionModeCallback implements Callback { 34d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private HashSet<String> mBlockedSet; 35d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 36d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public interface Listener { 37d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarDelete(Collection<SelectedConversation> conversations); 38d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarArchive(Iterable<SelectedConversation> conversations, 39d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean isToArchive); 40d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarNotification(Iterable<SelectedConversation> conversations, 41d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean isNotificationOn); 42d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarAddContact(final SelectedConversation conversation); 43d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarBlock(final SelectedConversation conversation); 44d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd void onActionBarHome(); 45d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 46d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 47d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd static class SelectedConversation { 48d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final String conversationId; 49d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final long timestamp; 50d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final String icon; 51d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final String otherParticipantNormalizedDestination; 52d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final CharSequence participantLookupKey; 53d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final boolean isGroup; 54d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final boolean isArchived; 55d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public final boolean notificationEnabled; 56d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public SelectedConversation(ConversationListItemData data) { 57d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd conversationId = data.getConversationId(); 58d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd timestamp = data.getTimestamp(); 59d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd icon = data.getIcon(); 60d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd otherParticipantNormalizedDestination = data.getOtherParticipantNormalizedDestination(); 61d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd participantLookupKey = data.getParticipantLookupKey(); 62d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd isGroup = data.getIsGroup(); 63d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd isArchived = data.getIsArchived(); 64d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd notificationEnabled = data.getNotificationEnabled(); 65d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 66d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 67d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 68d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private final ArrayMap<String, SelectedConversation> mSelectedConversations; 69d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 70d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private Listener mListener; 71d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mArchiveMenuItem; 72d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mUnarchiveMenuItem; 73d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mAddContactMenuItem; 74d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mBlockMenuItem; 75d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mNotificationOnMenuItem; 76d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private MenuItem mNotificationOffMenuItem; 77d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private boolean mHasInflated; 78d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 79d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public MultiSelectActionModeCallback(final Listener listener) { 80d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener = listener; 81d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedConversations = new ArrayMap<>(); 82d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 83d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 84d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 85d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 86d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { 87d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd actionMode.getMenuInflater().inflate(R.menu.conversation_list_fragment_select_menu, menu); 88d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mArchiveMenuItem = menu.findItem(R.id.action_archive); 89d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mUnarchiveMenuItem = menu.findItem(R.id.action_unarchive); 90d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mAddContactMenuItem = menu.findItem(R.id.action_add_contact); 91d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBlockMenuItem = menu.findItem(R.id.action_block); 92d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mNotificationOffMenuItem = menu.findItem(R.id.action_notification_off); 93d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mNotificationOnMenuItem = menu.findItem(R.id.action_notification_on); 94d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mHasInflated = true; 95d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd updateActionIconsVisiblity(); 96d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 97d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 98d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 99d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 100d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) { 101d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 102d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 103d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 104d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 105d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { 106d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd switch(menuItem.getItemId()) { 107d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_delete: 108d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarDelete(mSelectedConversations.values()); 109d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 110d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_archive: 111d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarArchive(mSelectedConversations.values(), true); 112d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 113d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_unarchive: 114d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarArchive(mSelectedConversations.values(), false); 115d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 116d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_notification_off: 117d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarNotification(mSelectedConversations.values(), false); 118d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 119d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_notification_on: 120d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarNotification(mSelectedConversations.values(), true); 121d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 122d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_add_contact: 123d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(mSelectedConversations.size() == 1); 124d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarAddContact(mSelectedConversations.valueAt(0)); 125d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 126d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case R.id.action_block: 127d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.isTrue(mSelectedConversations.size() == 1); 128d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarBlock(mSelectedConversations.valueAt(0)); 129d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 130d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd case android.R.id.home: 131d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarHome(); 132d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return true; 133d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd default: 134d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return false; 135d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 136d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 137d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 138d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd @Override 139d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void onDestroyActionMode(ActionMode actionMode) { 140d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener = null; 141d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedConversations.clear(); 142d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mHasInflated = false; 143d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 144d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 145d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public void toggleSelect(final ConversationListData listData, 146d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final ConversationListItemData conversationListItemData) { 147d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd Assert.notNull(conversationListItemData); 148d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBlockedSet = listData.getBlockedParticipants(); 149d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final String id = conversationListItemData.getConversationId(); 150d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedConversations.containsKey(id)) { 151d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedConversations.remove(id); 152d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 153d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mSelectedConversations.put(id, new SelectedConversation(conversationListItemData)); 154d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 155d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 156d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedConversations.isEmpty()) { 157d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mListener.onActionBarHome(); 158d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 159d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd updateActionIconsVisiblity(); 160d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 161d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 162d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 163d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd public boolean isSelected(final String selectedId) { 164d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return mSelectedConversations.containsKey(selectedId); 165d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 166d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 167d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd private void updateActionIconsVisiblity() { 168d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (!mHasInflated) { 169d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd return; 170d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 171d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 172d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (mSelectedConversations.size() == 1) { 173d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final SelectedConversation conversation = mSelectedConversations.valueAt(0); 174d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // The look up key is a key given to us by contacts app, so if we have a look up key, 175d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // we know that the participant is already in contacts. 176d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final boolean isInContacts = !TextUtils.isEmpty(conversation.participantLookupKey); 177d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mAddContactMenuItem.setVisible(!conversation.isGroup && !isInContacts); 178d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // ParticipantNormalizedDestination is always null for group conversations. 179d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final String otherParticipant = conversation.otherParticipantNormalizedDestination; 180d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBlockMenuItem.setVisible(otherParticipant != null 181d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd && !mBlockedSet.contains(otherParticipant)); 182d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 183d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mBlockMenuItem.setVisible(false); 184d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mAddContactMenuItem.setVisible(false); 185d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 186d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 187d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean hasCurrentlyArchived = false; 188d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean hasCurrentlyUnarchived = false; 189d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean hasCurrentlyOnNotification = false; 190d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd boolean hasCurrentlyOffNotification = false; 191d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd final Iterable<SelectedConversation> conversations = mSelectedConversations.values(); 192d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd for (final SelectedConversation conversation : conversations) { 193d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (conversation.notificationEnabled) { 194d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd hasCurrentlyOnNotification = true; 195d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 196d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd hasCurrentlyOffNotification = true; 197d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 198d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 199d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (conversation.isArchived) { 200d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd hasCurrentlyArchived = true; 201d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } else { 202d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd hasCurrentlyUnarchived = true; 203d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 204d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 205d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // If we found at least one of each example we don't need to keep looping. 206d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd if (hasCurrentlyOffNotification && hasCurrentlyOnNotification && 207d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd hasCurrentlyArchived && hasCurrentlyUnarchived) { 208d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd break; 209d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 210d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 211d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // If we have notification off conversations we show on button, if we have notification on 212d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd // conversation we show off button. We can show both if we have a mixture. 213d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mNotificationOffMenuItem.setVisible(hasCurrentlyOnNotification); 214d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mNotificationOnMenuItem.setVisible(hasCurrentlyOffNotification); 215d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd 216d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mArchiveMenuItem.setVisible(hasCurrentlyUnarchived); 217d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd mUnarchiveMenuItem.setVisible(hasCurrentlyArchived); 218d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd } 219d3b009ae55651f1e60950342468e3c37fdeb0796Mike Dodd} 220