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