1369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee/* 2369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * Copyright (C) 2011 The Android Open Source Project 3369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * 4369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License"); 5369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * you may not use this file except in compliance with the License. 6369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * You may obtain a copy of the License at 7369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * 8369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * http://www.apache.org/licenses/LICENSE-2.0 9369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * 10369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * Unless required by applicable law or agreed to in writing, software 11369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS, 12369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * See the License for the specific language governing permissions and 14369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * limitations under the License 15369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee */ 16369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 170cb8224a32bd956f6052e6eecc96720711bf6bfcDebashish Chatterjeepackage com.android.contacts.voicemail; 18369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 19369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_CAN_BE_CONFIGURED; 20369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_OK; 21369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_NO_CONNECTION; 22369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_OK; 23369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING; 24369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION; 25369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK; 26369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 27369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport android.database.Cursor; 28369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport android.net.Uri; 29369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport android.provider.VoicemailContract.Status; 30369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 31e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.R; 32e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Chengimport com.android.contacts.util.UriUtils; 33e0b2f1e2d01d1ac52ba207dc7ce76971d853298eChiao Cheng 34369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport java.util.ArrayList; 35369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport java.util.Collections; 36369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport java.util.Comparator; 37369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeeimport java.util.List; 38369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 39369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee/** Implementation of {@link VoicemailStatusHelper}. */ 40369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjeepublic class VoicemailStatusHelperImpl implements VoicemailStatusHelper { 41369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int SOURCE_PACKAGE_INDEX = 0; 42369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int CONFIGURATION_STATE_INDEX = 1; 43369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int DATA_CHANNEL_STATE_INDEX = 2; 44369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int NOTIFICATION_CHANNEL_STATE_INDEX = 3; 45369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int SETTINGS_URI_INDEX = 4; 46369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int VOICEMAIL_ACCESS_URI_INDEX = 5; 47369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static final int NUM_COLUMNS = 6; 48ccbccde9cf094470118201091d8cc116cfcff725Debashish Chatterjee /** Projection on the voicemail_status table used by this class. */ 490cb8224a32bd956f6052e6eecc96720711bf6bfcDebashish Chatterjee public static final String[] PROJECTION = new String[NUM_COLUMNS]; 50369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee static { 51369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[SOURCE_PACKAGE_INDEX] = Status.SOURCE_PACKAGE; 52369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[CONFIGURATION_STATE_INDEX] = Status.CONFIGURATION_STATE; 53369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[DATA_CHANNEL_STATE_INDEX] = Status.DATA_CHANNEL_STATE; 54369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[NOTIFICATION_CHANNEL_STATE_INDEX] = Status.NOTIFICATION_CHANNEL_STATE; 55369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[SETTINGS_URI_INDEX] = Status.SETTINGS_URI; 56369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee PROJECTION[VOICEMAIL_ACCESS_URI_INDEX] = Status.VOICEMAIL_ACCESS_URI; 57369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 58369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 59369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Possible user actions. */ 60369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee public static enum Action { 61369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee NONE(-1), 62369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee CALL_VOICEMAIL(R.string.voicemail_status_action_call_server), 63369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee CONFIGURE_VOICEMAIL(R.string.voicemail_status_action_configure); 64369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 65369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private final int mMessageId; 66369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private Action(int messageId) { 67369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee mMessageId = messageId; 68369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 69369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 70369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee public int getMessageId() { 71369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return mMessageId; 72369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 73369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 74369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 75369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** 76369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * Overall state of the source status. Each state is associated with the corresponding display 77369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * string and the corrective action. The states are also assigned a relative priority which is 78369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * used to order the messages from different sources. 79369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee */ 80369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private static enum OverallState { 81369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // TODO: Add separate string for call details and call log pages for the states that needs 82369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // to be shown in both. 83369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Both notification and data channel are not working. */ 846e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee NO_CONNECTION(0, Action.CALL_VOICEMAIL, R.string.voicemail_status_voicemail_not_available, 856e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee R.string.voicemail_status_audio_not_available), 86369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Notifications working, but data channel is not working. Audio cannot be downloaded. */ 876e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee NO_DATA(1, Action.CALL_VOICEMAIL, R.string.voicemail_status_voicemail_not_available, 886e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee R.string.voicemail_status_audio_not_available), 89369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Messages are known to be waiting but data channel is not working. */ 906e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee MESSAGE_WAITING(2, Action.CALL_VOICEMAIL, R.string.voicemail_status_messages_waiting, 916e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee R.string.voicemail_status_audio_not_available), 92369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Notification channel not working, but data channel is. */ 93369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee NO_NOTIFICATIONS(3, Action.CALL_VOICEMAIL, 94369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee R.string.voicemail_status_voicemail_not_available), 95369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Invite user to set up voicemail. */ 96369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee INVITE_FOR_CONFIGURATION(4, Action.CONFIGURE_VOICEMAIL, 97369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee R.string.voicemail_status_configure_voicemail), 98369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** 99369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * No detailed notifications, but data channel is working. 100369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * This is normal mode of operation for certain sources. No action needed. 101369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee */ 102369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee NO_DETAILED_NOTIFICATION(5, Action.NONE, -1), 103369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Visual voicemail not yet set up. No local action needed. */ 104369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee NOT_CONFIGURED(6, Action.NONE, -1), 105369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** Everything is OK. */ 106369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee OK(7, Action.NONE, -1), 107369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** If one or more state value set by the source is not valid. */ 108369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee INVALID(8, Action.NONE, -1); 109369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 110369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private final int mPriority; 111369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private final Action mAction; 1126e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee private final int mCallLogMessageId; 1136e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee private final int mCallDetailsMessageId; 1146e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee 1156e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee private OverallState(int priority, Action action, int callLogMessageId) { 1166e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee this(priority, action, callLogMessageId, -1); 1176e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee } 118369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 1196e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee private OverallState(int priority, Action action, int callLogMessageId, 1206e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee int callDetailsMessageId) { 121369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee mPriority = priority; 122369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee mAction = action; 1236e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee mCallLogMessageId = callLogMessageId; 1246e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee mCallDetailsMessageId = callDetailsMessageId; 125369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 126369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 127369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee public Action getAction() { 128369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return mAction; 129369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 130369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 131369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee public int getPriority() { 132369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return mPriority; 133369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 134369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 1356e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee public int getCallLogMessageId() { 1366e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee return mCallLogMessageId; 1376e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee } 1386e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee 1396e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee public int getCallDetailsMessageId() { 1406e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee return mCallDetailsMessageId; 141369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 142369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 143369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 1449e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee /** A wrapper on {@link StatusMessage} which additionally stores the priority of the message. */ 1459e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee private static class MessageStatusWithPriority { 1469e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee private final StatusMessage mMessage; 147369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private final int mPriority; 148369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 1499e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee public MessageStatusWithPriority(StatusMessage message, int priority) { 150369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee mMessage = message; 151369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee mPriority = priority; 152369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 153369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 154369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 155369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee @Override 156ccbccde9cf094470118201091d8cc116cfcff725Debashish Chatterjee public List<StatusMessage> getStatusMessages(Cursor cursor) { 157c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda List<MessageStatusWithPriority> messages = 158c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda new ArrayList<VoicemailStatusHelperImpl.MessageStatusWithPriority>(); 159c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda cursor.moveToPosition(-1); 160c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda while(cursor.moveToNext()) { 161c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda MessageStatusWithPriority message = getMessageForStatusEntry(cursor); 162c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda if (message != null) { 163c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda messages.add(message); 164369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 165369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 166c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda // Finally reorder the messages by their priority. 167c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda return reorderMessages(messages); 168c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda } 169c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda 170c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda @Override 171c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda public int getNumberActivityVoicemailSources(Cursor cursor) { 172c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda int count = 0; 173c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda cursor.moveToPosition(-1); 174c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda while(cursor.moveToNext()) { 175c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda if (isVoicemailSourceActive(cursor)) { 176c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda ++count; 177c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda } 178c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda } 179c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda return count; 180c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda } 181c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda 182c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda /** Returns whether the source status in the cursor corresponds to an active source. */ 183c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda private boolean isVoicemailSourceActive(Cursor cursor) { 184c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda return cursor.getString(SOURCE_PACKAGE_INDEX) != null 185c9ec94eddcb881962bdf334ddde4719d5386a976Flavio Lerda && cursor.getInt(CONFIGURATION_STATE_INDEX) == Status.CONFIGURATION_STATE_OK; 186369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 187369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 1889e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee private List<StatusMessage> reorderMessages(List<MessageStatusWithPriority> messageWrappers) { 1899e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee Collections.sort(messageWrappers, new Comparator<MessageStatusWithPriority>() { 190369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee @Override 1919e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee public int compare(MessageStatusWithPriority msg1, MessageStatusWithPriority msg2) { 192369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return msg1.mPriority - msg2.mPriority; 193369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 194369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee }); 1959e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee List<StatusMessage> reorderMessages = new ArrayList<VoicemailStatusHelper.StatusMessage>(); 196369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Copy the ordered message objects into the final list. 1979e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee for (MessageStatusWithPriority messageWrapper : messageWrappers) { 198369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee reorderMessages.add(messageWrapper.mMessage); 199369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 200369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return reorderMessages; 201369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 202369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 203369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee /** 204369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee * Returns the message for the status entry pointed to by the cursor. 205369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee */ 2069e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee private MessageStatusWithPriority getMessageForStatusEntry(Cursor cursor) { 207369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee final String sourcePackage = cursor.getString(SOURCE_PACKAGE_INDEX); 208369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (sourcePackage == null) { 209369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return null; 210369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 211369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee final OverallState overallState = getOverallState(cursor.getInt(CONFIGURATION_STATE_INDEX), 212369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee cursor.getInt(DATA_CHANNEL_STATE_INDEX), 213369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX)); 214369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee final Action action = overallState.getAction(); 215369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 216369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // No source package or no action, means no message shown. 217369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (action == Action.NONE) { 218369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return null; 219369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 220369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 221369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee Uri actionUri = null; 222369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (action == Action.CALL_VOICEMAIL) { 22315820796f3914b91c0a86e2291b472d68ad72424Flavio Lerda actionUri = UriUtils.parseUriOrNull(cursor.getString(VOICEMAIL_ACCESS_URI_INDEX)); 22463d4405224fbe28b9f6f733fe6a5509a5228b761Flavio Lerda // Even if actionUri is null, it is still be useful to show the notification. 225369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (action == Action.CONFIGURE_VOICEMAIL) { 22615820796f3914b91c0a86e2291b472d68ad72424Flavio Lerda actionUri = UriUtils.parseUriOrNull(cursor.getString(SETTINGS_URI_INDEX)); 22763d4405224fbe28b9f6f733fe6a5509a5228b761Flavio Lerda // If there is no settings URI, there is no point in showing the notification. 22863d4405224fbe28b9f6f733fe6a5509a5228b761Flavio Lerda if (actionUri == null) { 22963d4405224fbe28b9f6f733fe6a5509a5228b761Flavio Lerda return null; 23063d4405224fbe28b9f6f733fe6a5509a5228b761Flavio Lerda } 231369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 2329e0038930f0f504bd0054775ba2ed99699cba417Debashish Chatterjee return new MessageStatusWithPriority( 2336e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee new StatusMessage(sourcePackage, overallState.getCallLogMessageId(), 2346e4052c8685192d94a793afeccf8d0f0212584d0Debashish Chatterjee overallState.getCallDetailsMessageId(), action.getMessageId(), 235369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee actionUri), 236369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee overallState.getPriority()); 237369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 238369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee 239369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee private OverallState getOverallState(int configurationState, int dataChannelState, 240369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee int notificationChannelState) { 241369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (configurationState == CONFIGURATION_STATE_OK) { 242369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Voicemail is configured. Let's see how is the data channel. 243369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (dataChannelState == DATA_CHANNEL_STATE_OK) { 244369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Data channel is fine. What about notification channel? 245369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_OK) { 246369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.OK; 247369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING) { 248369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.NO_DETAILED_NOTIFICATION; 249369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_NO_CONNECTION) { 250369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.NO_NOTIFICATIONS; 251369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 252369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (dataChannelState == DATA_CHANNEL_STATE_NO_CONNECTION) { 253369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Data channel is not working. What about notification channel? 254369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_OK) { 255369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.NO_DATA; 256369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING) { 257369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.MESSAGE_WAITING; 258369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_NO_CONNECTION) { 259369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.NO_CONNECTION; 260369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 261369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 262369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (configurationState == CONFIGURATION_STATE_CAN_BE_CONFIGURED) { 263369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Voicemail not configured. data/notification channel states are irrelevant. 264369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.INVITE_FOR_CONFIGURATION; 265369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } else if (configurationState == Status.CONFIGURATION_STATE_NOT_CONFIGURED) { 266369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Voicemail not configured. data/notification channel states are irrelevant. 267369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.NOT_CONFIGURED; 268369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 269369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee // Will reach here only if the source has set an invalid value. 270369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee return OverallState.INVALID; 271369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee } 272369d5d7522a4dbf705930922f35c66b14d3e315bDebashish Chatterjee} 273