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;
2094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_CAN_BE_CONFIGURED;
2194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.CONFIGURATION_STATE_NOT_CONFIGURED;
2294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE;
2394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_NO_CONNECTION;
2494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.DATA_CHANNEL_STATE_OK;
2594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE;
2694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING;
2794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_NO_CONNECTION;
2894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport static android.provider.VoicemailContract.Status.NOTIFICATION_CHANNEL_STATE_OK;
2994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
3094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentResolver;
3194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.content.ContentValues;
3294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.database.Cursor;
3394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.net.Uri;
3494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.provider.VoicemailContract.Status;
3594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport android.test.AndroidTestCase;
3694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
379554500572ba82fbd7adb0a1637206ef870ef09eChiao Chengimport com.android.dialer.R;
3894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport com.android.dialer.voicemail.VoicemailStatusHelper.StatusMessage;
3994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
4094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengimport java.util.List;
4194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
4294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng/**
4394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng * Unit tests for {@link VoicemailStatusHelperImpl}.
4494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng */
4594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Chengpublic class VoicemailStatusHelperImplTest extends AndroidTestCase {
4694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final String[] TEST_PACKAGES = new String[] {
4794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        "com.test.package1",
4894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        "com.test.package2"
4994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    };
5094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Uri TEST_SETTINGS_URI = Uri.parse("http://www.visual.voicemail.setup");
5294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final Uri TEST_VOICEMAIL_URI = Uri.parse("tel:901");
5394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int ACTION_MSG_CALL_VOICEMAIL =
5594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            R.string.voicemail_status_action_call_server;
5694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int ACTION_MSG_CONFIGURE = R.string.voicemail_status_action_configure;
5794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
5894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int STATUS_MSG_NONE = -1;
5994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int STATUS_MSG_VOICEMAIL_NOT_AVAILABLE =
6094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            R.string.voicemail_status_voicemail_not_available;
6194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int STATUS_MSG_AUDIO_NOT_AVAIALABLE =
6294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            R.string.voicemail_status_audio_not_available;
6394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int STATUS_MSG_MESSAGE_WAITING = R.string.voicemail_status_messages_waiting;
6494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private static final int STATUS_MSG_INVITE_FOR_CONFIGURATION =
6594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            R.string.voicemail_status_configure_voicemail;
6694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
6794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    // Object under test.
6894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private VoicemailStatusHelper mStatusHelper;
6994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
7094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
7194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void setUp() throws Exception {
7294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.setUp();
7394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mStatusHelper = new VoicemailStatusHelperImpl();
7494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
7594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
7694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    @Override
7794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    protected void tearDown() throws Exception {
7894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (String sourcePackage : TEST_PACKAGES) {
7994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            deleteEntryForPackage(sourcePackage);
8094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
8194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Set member variables to null so that they are garbage collected across different runs
8294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // of the tests.
8394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        mStatusHelper = null;
8494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        super.tearDown();
8594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
8694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
8794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
8894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void testNoStatusEntries() {
8994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(0, getStatusMessages().size());
9094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
9194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
9294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void testAllOK() {
9394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[0], getAllOkStatusValues());
9494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[1], getAllOkStatusValues());
9594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(0, getStatusMessages().size());
9694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
9794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
9894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void testNotAllOKForOnePackage() {
9994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[0], getAllOkStatusValues());
10094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[1], getAllOkStatusValues());
10194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
10294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
10394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Good data channel + no notification
10494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // action: call voicemail
10594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // msg: voicemail not available in call log page & none in call details page.
10694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(NOTIFICATION_CHANNEL_STATE, NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
10794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_OK);
10894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
10994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(TEST_PACKAGES[1], values, STATUS_MSG_VOICEMAIL_NOT_AVAILABLE,
11094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                STATUS_MSG_NONE, ACTION_MSG_CALL_VOICEMAIL);
11194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
11294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Message waiting + good data channel - no action.
11394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(NOTIFICATION_CHANNEL_STATE, NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING);
11494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_OK);
11594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
11694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkNoMessages(TEST_PACKAGES[1], values);
11794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
11894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // No data channel + no notification
11994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // action: call voicemail
12094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // msg: voicemail not available in call log page & audio not available in call details page.
12194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(NOTIFICATION_CHANNEL_STATE, NOTIFICATION_CHANNEL_STATE_OK);
12294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_NO_CONNECTION);
12394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
12494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(TEST_PACKAGES[1], values, STATUS_MSG_VOICEMAIL_NOT_AVAILABLE,
12594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                STATUS_MSG_AUDIO_NOT_AVAIALABLE, ACTION_MSG_CALL_VOICEMAIL);
12694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
12794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // No data channel + Notification OK
12894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // action: call voicemail
12994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // msg: voicemail not available in call log page & audio not available in call details page.
13094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(NOTIFICATION_CHANNEL_STATE, NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
13194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_NO_CONNECTION);
13294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
13394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(TEST_PACKAGES[1], values, STATUS_MSG_VOICEMAIL_NOT_AVAILABLE,
13494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                STATUS_MSG_AUDIO_NOT_AVAIALABLE, ACTION_MSG_CALL_VOICEMAIL);
13594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
13694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // No data channel + Notification OK
13794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // action: call voicemail
13894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // msg: message waiting in call log page & audio not available in call details page.
13994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(NOTIFICATION_CHANNEL_STATE, NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING);
14094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_NO_CONNECTION);
14194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
14294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(TEST_PACKAGES[1], values, STATUS_MSG_MESSAGE_WAITING,
14394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                STATUS_MSG_AUDIO_NOT_AVAIALABLE, ACTION_MSG_CALL_VOICEMAIL);
14494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
14594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Not configured. No user action, so no message.
14694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(CONFIGURATION_STATE, CONFIGURATION_STATE_NOT_CONFIGURED);
14794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
14894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkNoMessages(TEST_PACKAGES[1], values);
14994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
15094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Can be configured - invite user for configure voicemail.
15194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(CONFIGURATION_STATE, CONFIGURATION_STATE_CAN_BE_CONFIGURED);
15294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], values);
15394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(TEST_PACKAGES[1], values, STATUS_MSG_INVITE_FOR_CONFIGURATION,
15494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                STATUS_MSG_NONE, ACTION_MSG_CONFIGURE, TEST_SETTINGS_URI);
15594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
15694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
15794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    // Test that priority of messages are handled well.
15894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    public void testMessageOrdering() {
15994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[0], getAllOkStatusValues());
16094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        insertEntryForPackage(TEST_PACKAGES[1], getAllOkStatusValues());
16194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
16294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        final ContentValues valuesNoNotificationGoodDataChannel = new ContentValues();
16394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        valuesNoNotificationGoodDataChannel.put(NOTIFICATION_CHANNEL_STATE,
16494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
16594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        valuesNoNotificationGoodDataChannel.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_OK);
16694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
16794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        final ContentValues valuesNoNotificationNoDataChannel = new ContentValues();
16894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        valuesNoNotificationNoDataChannel.put(NOTIFICATION_CHANNEL_STATE,
16994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                NOTIFICATION_CHANNEL_STATE_NO_CONNECTION);
17094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        valuesNoNotificationNoDataChannel.put(DATA_CHANNEL_STATE, DATA_CHANNEL_STATE_NO_CONNECTION);
17194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
17294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Package1 with valuesNoNotificationGoodDataChannel and
17394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // package2 with  valuesNoNotificationNoDataChannel. Package2 should be above.
17494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[0], valuesNoNotificationGoodDataChannel);
17594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], valuesNoNotificationNoDataChannel);
17694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        List<StatusMessage> messages = getStatusMessages();
17794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(2, messages.size());
17894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(TEST_PACKAGES[0], messages.get(1).sourcePackage);
17994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(TEST_PACKAGES[1], messages.get(0).sourcePackage);
18094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
18194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Now reverse the values - ordering should be reversed as well.
18294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[0], valuesNoNotificationNoDataChannel);
18394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        updateEntryForPackage(TEST_PACKAGES[1], valuesNoNotificationGoodDataChannel);
18494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        messages = getStatusMessages();
18594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(2, messages.size());
18694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(TEST_PACKAGES[0], messages.get(0).sourcePackage);
18794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(TEST_PACKAGES[1], messages.get(1).sourcePackage);
18894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
18994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
19094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    /** Checks that the expected source status message is returned by VoicemailStatusHelper. */
19194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void checkExpectedMessage(String sourcePackage, ContentValues values,
19294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int expectedCallLogMsg, int expectedCallDetailsMsg, int expectedActionMsg,
19394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Uri expectedUri) {
19494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        List<StatusMessage> messages = getStatusMessages();
19594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(1, messages.size());
19694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkMessageMatches(messages.get(0), sourcePackage, expectedCallLogMsg,
19794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                expectedCallDetailsMsg, expectedActionMsg, expectedUri);
19894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
19994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void checkExpectedMessage(String sourcePackage, ContentValues values,
20194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int expectedCallLogMsg, int expectedCallDetailsMessage, int expectedActionMsg) {
20294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        checkExpectedMessage(sourcePackage, values, expectedCallLogMsg, expectedCallDetailsMessage,
20394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                expectedActionMsg, TEST_VOICEMAIL_URI);
20494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
20594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
20694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void checkMessageMatches(StatusMessage message, String expectedSourcePackage,
20794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            int expectedCallLogMsg, int expectedCallDetailsMsg, int expectedActionMsg,
20894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            Uri expectedUri) {
20994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(expectedSourcePackage, message.sourcePackage);
21094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(expectedCallLogMsg, message.callLogMessageId);
21194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(expectedCallDetailsMsg, message.callDetailsMessageId);
21294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(expectedActionMsg, message.actionMessageId);
21394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (expectedUri == null) {
21494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            assertNull(message.actionUri);
21594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        } else {
21694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            assertEquals(expectedUri, message.actionUri);
21794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
21894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
21994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void checkNoMessages(String sourcePackage, ContentValues values) {
22194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(1, updateEntryForPackage(sourcePackage, values));
22294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        List<StatusMessage> messages = getStatusMessages();
22394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        assertEquals(0, messages.size());
22494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
22594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
22694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentValues getAllOkStatusValues() {
22794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        ContentValues values = new ContentValues();
22894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(Status.SETTINGS_URI, TEST_SETTINGS_URI.toString());
22994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(Status.VOICEMAIL_ACCESS_URI, TEST_VOICEMAIL_URI.toString());
23094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
23194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK);
23294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK);
23394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return values;
23494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
23594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
23694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void insertEntryForPackage(String sourcePackage, ContentValues values) {
23794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // If insertion fails then try update as the record might already exist.
23894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        if (getContentResolver().insert(Status.buildSourceUri(sourcePackage), values) == null) {
23994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            updateEntryForPackage(sourcePackage, values);
24094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
24194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
24294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private void deleteEntryForPackage(String sourcePackage) {
24494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        getContentResolver().delete(Status.buildSourceUri(sourcePackage), null, null);
24594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
24694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
24794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private int updateEntryForPackage(String sourcePackage, ContentValues values) {
24894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return getContentResolver().update(
24994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                Status.buildSourceUri(sourcePackage), values, null, null);
25094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
25194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
25294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private List<StatusMessage> getStatusMessages() {
25394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // Restrict the cursor to only the the test packages to eliminate any side effects if there
25494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        // are other status messages already stored on the device.
25594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        Cursor cursor = getContentResolver().query(Status.CONTENT_URI,
25694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                VoicemailStatusHelperImpl.PROJECTION, getTestPackageSelection(), null, null);
25794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return mStatusHelper.getStatusMessages(cursor);
25894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
25994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
26094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private String getTestPackageSelection() {
26194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        StringBuilder sb = new StringBuilder();
26294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        for (String sourcePackage : TEST_PACKAGES) {
26394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            if (sb.length() > 0) {
26494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng                sb.append(" OR ");
26594b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            }
26694b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng            sb.append(String.format("(source_package='%s')", sourcePackage));
26794b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        }
26894b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return sb.toString();
26994b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
27094b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng
27194b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    private ContentResolver getContentResolver() {
27294b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng        return getContext().getContentResolver();
27394b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng    }
27494b10b530c0fc297e2974e57e094c500d3ee6003Chiao Cheng}
275