1/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.dialer.voicemail;
18
19import android.content.ContentUris;
20import android.database.Cursor;
21import android.net.Uri;
22import android.test.suitebuilder.annotation.Suppress;
23
24import com.android.dialer.calllog.CallLogActivity;
25import com.android.dialer.database.VoicemailArchiveContract;
26import static com.android.dialer.voicemail.VoicemailAsyncTaskUtil.Tasks.ARCHIVE_VOICEMAIL_CONTENT;
27import static com.android.dialer.voicemail.VoicemailPlaybackPresenter.Tasks.CHECK_FOR_CONTENT;
28
29/**
30 * Unit tests for {@link VoicemailPlaybackPresenter} and {@link VoicemailPlaybackLayout}.
31 */
32public class VoicemailPlaybackTest
33        extends VoicemailActivityInstrumentationTestCase2<CallLogActivity> {
34
35    public VoicemailPlaybackTest() {
36        super(CallLogActivity.class);
37    }
38
39    @Override
40    public void setUp() throws Exception {
41        super.setUp();
42        mPresenter = VoicemailPlaybackPresenter.getInstance(getActivity(), null);
43    }
44
45    @Override
46    public void tearDown() throws Exception {
47        cleanUpArchivedVoicemailUri();
48        super.tearDown();
49    }
50
51    @Suppress
52    public void testWhenCheckForContentCompletes() throws Throwable {
53        setUriForRealFileVoicemailEntry();
54        setPlaybackViewForPresenter();
55
56        getInstrumentation().runOnMainSync(new Runnable() {
57            @Override
58            public void run() {
59                mPresenter.resumePlayback();
60            }
61        });
62        mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
63        getInstrumentation().waitForIdleSync();
64
65        assertStateTextContains("Loading voicemail");
66    }
67
68    public void testArchiveContent() throws Throwable {
69        setUriForRealFileVoicemailEntry();
70        setPlaybackViewForPresenter();
71        mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
72
73        getInstrumentation().runOnMainSync(new Runnable() {
74            @Override
75            public void run() {
76                mPresenter.archiveContent(mVoicemailUri, true);
77            }
78        });
79        mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
80        mFakeAsyncTaskExecutor.runTask(ARCHIVE_VOICEMAIL_CONTENT);
81        getInstrumentation().waitForIdleSync();
82        assertVoicemailArchived();
83    }
84
85    public void testShareContent() throws Throwable {
86        setUriForRealFileVoicemailEntry();
87        setPlaybackViewForPresenter();
88        mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
89
90        getInstrumentation().runOnMainSync(new Runnable() {
91            @Override
92            public void run() {
93                mPresenter.archiveContent(mVoicemailUri, false);
94            }
95        });
96        mFakeAsyncTaskExecutor.runTask(CHECK_FOR_CONTENT);
97        mFakeAsyncTaskExecutor.runTask(ARCHIVE_VOICEMAIL_CONTENT);
98        getInstrumentation().waitForIdleSync();
99        assertVoicemailArchived();
100    }
101
102    private void assertVoicemailArchived() {
103        try (Cursor cursor = getArchivedVoicemailCursor()) {
104            assertTrue(hasContent(cursor));
105            assertEquals(ContentUris.parseId(mVoicemailUri), getRowServerId(cursor));
106        } catch (Exception e) {
107            fail("Voicemail was not archived: " + e.toString());
108        }
109    }
110
111    private void cleanUpArchivedVoicemailUri() {
112        try (Cursor cursor = getArchivedVoicemailCursor()) {
113            if (hasContent(cursor)) {
114                getContentResolver().delete(getRowUri(cursor), null, null);
115            }
116        }
117    }
118
119    private Cursor getArchivedVoicemailCursor() {
120        return getContentResolver().query(
121                VoicemailArchiveContract.VoicemailArchive.CONTENT_URI,
122                new String[] {
123                        VoicemailArchiveContract.VoicemailArchive._ID,
124                        VoicemailArchiveContract.VoicemailArchive.SERVER_ID
125                },
126                VoicemailArchiveContract.VoicemailArchive.SERVER_ID + "="
127                        + ContentUris.parseId(mVoicemailUri),
128                null,
129                null);
130    }
131
132    private int getRowServerId(Cursor cursor) {
133        return cursor
134                .getInt(cursor.getColumnIndex(VoicemailArchiveContract.VoicemailArchive.SERVER_ID));
135    }
136
137    private Uri getRowUri(Cursor cursor) {
138        return VoicemailArchiveContract.VoicemailArchive.buildWithId(cursor.getInt(
139                cursor.getColumnIndex(VoicemailArchiveContract.VoicemailArchive._ID)));
140    }
141
142    private boolean hasContent(Cursor cursor) {
143        return cursor != null && cursor.moveToFirst();
144    }
145}