194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/* 294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Copyright (C) 2011 The Android Open Source Project 394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Licensed under the Apache License, Version 2.0 (the "License"); 594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * you may not use this file except in compliance with the License. 694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * You may obtain a copy of the License at 794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * http://www.apache.org/licenses/LICENSE-2.0 994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * 1094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Unless required by applicable law or agreed to in writing, software 1194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * distributed under the License is distributed on an "AS IS" BASIS, 1294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * See the License for the specific language governing permissions and 1494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * limitations under the License 1594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 1694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpackage com.android.dialer.voicemail; 1894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 1994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_CAN_BE_CONFIGURED; 2094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_OK; 2194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_NO_CONNECTION; 2294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_OK; 2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING; 2494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION; 2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK; 2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.database.Cursor; 2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.net.Uri; 2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.VoicemailContract.Status; 3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 3135071c06d1587942f5a66c8f12e6247e8f904d26Chiao Chengimport com.android.contacts.common.util.UriUtils; 329554500572ba82fbd7adb0a1637206ef870ef09eChiao Chengimport com.android.dialer.R; 3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 3494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.ArrayList; 3594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Collections; 3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.Comparator; 3794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.List; 3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/** Implementation of {@link VoicemailStatusHelper}. */ 4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class VoicemailStatusHelperImpl implements VoicemailStatusHelper { 4194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int SOURCE_PACKAGE_INDEX = 0; 4294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int CONFIGURATION_STATE_INDEX = 1; 4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int DATA_CHANNEL_STATE_INDEX = 2; 4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int NOTIFICATION_CHANNEL_STATE_INDEX = 3; 4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int SETTINGS_URI_INDEX = 4; 4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int VOICEMAIL_ACCESS_URI_INDEX = 5; 4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static final int NUM_COLUMNS = 6; 4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Projection on the voicemail_status table used by this class. */ 4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public static final String[] PROJECTION = new String[NUM_COLUMNS]; 5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng static { 5194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[SOURCE_PACKAGE_INDEX] = Status.SOURCE_PACKAGE; 5294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[CONFIGURATION_STATE_INDEX] = Status.CONFIGURATION_STATE; 5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[DATA_CHANNEL_STATE_INDEX] = Status.DATA_CHANNEL_STATE; 5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[NOTIFICATION_CHANNEL_STATE_INDEX] = Status.NOTIFICATION_CHANNEL_STATE; 5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[SETTINGS_URI_INDEX] = Status.SETTINGS_URI; 5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng PROJECTION[VOICEMAIL_ACCESS_URI_INDEX] = Status.VOICEMAIL_ACCESS_URI; 5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Possible user actions. */ 6094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public static enum Action { 6194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NONE(-1), 6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng CALL_VOICEMAIL(R.string.voicemail_status_action_call_server), 6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng CONFIGURE_VOICEMAIL(R.string.voicemail_status_action_configure); 6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final int mMessageId; 6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private Action(int messageId) { 6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMessageId = messageId; 6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getMessageId() { 7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mMessageId; 7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Overall state of the source status. Each state is associated with the corresponding display 7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * string and the corrective action. The states are also assigned a relative priority which is 7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * used to order the messages from different sources. 7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static enum OverallState { 8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // TODO: Add separate string for call details and call log pages for the states that needs 8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // to be shown in both. 8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Both notification and data channel are not working. */ 8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NO_CONNECTION(0, Action.CALL_VOICEMAIL, R.string.voicemail_status_voicemail_not_available, 8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng R.string.voicemail_status_audio_not_available), 8694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Notifications working, but data channel is not working. Audio cannot be downloaded. */ 8794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NO_DATA(1, Action.CALL_VOICEMAIL, R.string.voicemail_status_voicemail_not_available, 8894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng R.string.voicemail_status_audio_not_available), 8994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Messages are known to be waiting but data channel is not working. */ 9094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng MESSAGE_WAITING(2, Action.CALL_VOICEMAIL, R.string.voicemail_status_messages_waiting, 9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng R.string.voicemail_status_audio_not_available), 9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Notification channel not working, but data channel is. */ 9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NO_NOTIFICATIONS(3, Action.CALL_VOICEMAIL, 9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng R.string.voicemail_status_voicemail_not_available), 9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Invite user to set up voicemail. */ 9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng INVITE_FOR_CONFIGURATION(4, Action.CONFIGURE_VOICEMAIL, 9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng R.string.voicemail_status_configure_voicemail), 9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * No detailed notifications, but data channel is working. 10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * This is normal mode of operation for certain sources. No action needed. 10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NO_DETAILED_NOTIFICATION(5, Action.NONE, -1), 10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Visual voicemail not yet set up. No local action needed. */ 10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng NOT_CONFIGURED(6, Action.NONE, -1), 10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Everything is OK. */ 10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng OK(7, Action.NONE, -1), 10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** If one or more state value set by the source is not valid. */ 10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng INVALID(8, Action.NONE, -1); 10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final int mPriority; 11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final Action mAction; 11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final int mCallLogMessageId; 11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final int mCallDetailsMessageId; 11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private OverallState(int priority, Action action, int callLogMessageId) { 11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng this(priority, action, callLogMessageId, -1); 11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private OverallState(int priority, Action action, int callLogMessageId, 12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int callDetailsMessageId) { 12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPriority = priority; 12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mAction = action; 12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCallLogMessageId = callLogMessageId; 12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mCallDetailsMessageId = callDetailsMessageId; 12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public Action getAction() { 12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mAction; 12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getPriority() { 13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mPriority; 13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getCallLogMessageId() { 13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mCallLogMessageId; 13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 13994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getCallDetailsMessageId() { 14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return mCallDetailsMessageId; 14194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 14394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 14494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** A wrapper on {@link StatusMessage} which additionally stores the priority of the message. */ 14594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private static class MessageStatusWithPriority { 14694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final StatusMessage mMessage; 14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private final int mPriority; 14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 14994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public MessageStatusWithPriority(StatusMessage message, int priority) { 15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mMessage = message; 15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng mPriority = priority; 15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 15694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public List<StatusMessage> getStatusMessages(Cursor cursor) { 15794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng List<MessageStatusWithPriority> messages = 15894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new ArrayList<VoicemailStatusHelperImpl.MessageStatusWithPriority>(); 15994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng cursor.moveToPosition(-1); 16094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng while(cursor.moveToNext()) { 16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng MessageStatusWithPriority message = getMessageForStatusEntry(cursor); 16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (message != null) { 16394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng messages.add(message); 16494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 16594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 16694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Finally reorder the messages by their priority. 16794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return reorderMessages(messages); 16894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 16994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 17094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 17194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int getNumberActivityVoicemailSources(Cursor cursor) { 17294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int count = 0; 17394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng cursor.moveToPosition(-1); 17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng while(cursor.moveToNext()) { 17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (isVoicemailSourceActive(cursor)) { 17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng ++count; 17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return count; 18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** Returns whether the source status in the cursor corresponds to an active source. */ 18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private boolean isVoicemailSourceActive(Cursor cursor) { 18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return cursor.getString(SOURCE_PACKAGE_INDEX) != null 18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng && cursor.getInt(CONFIGURATION_STATE_INDEX) == Status.CONFIGURATION_STATE_OK; 18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private List<StatusMessage> reorderMessages(List<MessageStatusWithPriority> messageWrappers) { 18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Collections.sort(messageWrappers, new Comparator<MessageStatusWithPriority>() { 19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng @Override 19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng public int compare(MessageStatusWithPriority msg1, MessageStatusWithPriority msg2) { 19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return msg1.mPriority - msg2.mPriority; 19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng }); 19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng List<StatusMessage> reorderMessages = new ArrayList<VoicemailStatusHelper.StatusMessage>(); 19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Copy the ordered message objects into the final list. 19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng for (MessageStatusWithPriority messageWrapper : messageWrappers) { 19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng reorderMessages.add(messageWrapper.mMessage); 19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return reorderMessages; 20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng /** 20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Returns the message for the status entry pointed to by the cursor. 20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */ 20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private MessageStatusWithPriority getMessageForStatusEntry(Cursor cursor) { 20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final String sourcePackage = cursor.getString(SOURCE_PACKAGE_INDEX); 20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (sourcePackage == null) { 20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return null; 21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final OverallState overallState = getOverallState(cursor.getInt(CONFIGURATION_STATE_INDEX), 21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng cursor.getInt(DATA_CHANNEL_STATE_INDEX), 21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng cursor.getInt(NOTIFICATION_CHANNEL_STATE_INDEX)); 21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng final Action action = overallState.getAction(); 21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // No source package or no action, means no message shown. 21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (action == Action.NONE) { 21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return null; 21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng Uri actionUri = null; 22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (action == Action.CALL_VOICEMAIL) { 22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionUri = UriUtils.parseUriOrNull(cursor.getString(VOICEMAIL_ACCESS_URI_INDEX)); 22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Even if actionUri is null, it is still be useful to show the notification. 22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (action == Action.CONFIGURE_VOICEMAIL) { 22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionUri = UriUtils.parseUriOrNull(cursor.getString(SETTINGS_URI_INDEX)); 22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // If there is no settings URI, there is no point in showing the notification. 22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (actionUri == null) { 22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return null; 23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return new MessageStatusWithPriority( 23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng new StatusMessage(sourcePackage, overallState.getCallLogMessageId(), 23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng overallState.getCallDetailsMessageId(), action.getMessageId(), 23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng actionUri), 23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng overallState.getPriority()); 23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng 23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng private OverallState getOverallState(int configurationState, int dataChannelState, 24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng int notificationChannelState) { 24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (configurationState == CONFIGURATION_STATE_OK) { 24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Voicemail is configured. Let's see how is the data channel. 24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (dataChannelState == DATA_CHANNEL_STATE_OK) { 24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Data channel is fine. What about notification channel? 24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_OK) { 24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.OK; 24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING) { 24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.NO_DETAILED_NOTIFICATION; 24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_NO_CONNECTION) { 25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.NO_NOTIFICATIONS; 25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (dataChannelState == DATA_CHANNEL_STATE_NO_CONNECTION) { 25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Data channel is not working. What about notification channel? 25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_OK) { 25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.NO_DATA; 25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING) { 25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.MESSAGE_WAITING; 25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (notificationChannelState == NOTIFICATION_CHANNEL_STATE_NO_CONNECTION) { 25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.NO_CONNECTION; 26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (configurationState == CONFIGURATION_STATE_CAN_BE_CONFIGURED) { 26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Voicemail not configured. data/notification channel states are irrelevant. 26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.INVITE_FOR_CONFIGURATION; 26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } else if (configurationState == Status.CONFIGURATION_STATE_NOT_CONFIGURED) { 26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Voicemail not configured. data/notification channel states are irrelevant. 26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.NOT_CONFIGURED; 26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng // Will reach here only if the source has set an invalid value. 27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng return OverallState.INVALID; 27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng } 27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng} 273