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