/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.incallui; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.content.Context; import android.content.Intent; import android.telecom.PhoneAccountHandle; import android.test.InstrumentationTestCase; import com.android.incallui.InCallPresenter.InCallState; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; public class InCallPresenterTest extends InstrumentationTestCase { private MockCallListWrapper mCallList; @Mock private InCallActivity mInCallActivity; @Mock private AudioModeProvider mAudioModeProvider; @Mock private StatusBarNotifier mStatusBarNotifier; @Mock private ContactInfoCache mContactInfoCache; @Mock private ProximitySensor mProximitySensor; InCallPresenter mInCallPresenter; @Mock private Context mContext; @Override protected void setUp() throws Exception { super.setUp(); System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath()); MockitoAnnotations.initMocks(this); mCallList = new MockCallListWrapper(); mInCallPresenter = InCallPresenter.getInstance(); mInCallPresenter.setUp(mContext, mCallList.getCallList(), mAudioModeProvider, mStatusBarNotifier, mContactInfoCache, mProximitySensor); } @Override protected void tearDown() throws Exception { // The tear down method needs to run in the main thread since there is an explicit check // inside TelecomAdapter.getInstance(). getInstrumentation().runOnMainSync(new Runnable() { @Override public void run() { mInCallPresenter.unsetActivity(mInCallActivity); mInCallPresenter.tearDown(); InCallPresenter.setInstance(null); } }); } public void testOnActivitySet_finishesActivityWhenNoCalls() { mInCallPresenter.setActivity(mInCallActivity); verify(mInCallActivity).finish(); } public void testOnCallListChange_sendsNotificationWhenInCall() { mCallList.setHasCall(Call.State.INCOMING, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); verify(mStatusBarNotifier).updateNotification(InCallState.INCOMING, mCallList.getCallList()); verifyInCallActivityNotStarted(); } /** * This behavior is required to ensure that the screen is turned on again by the restarting * activity. */ public void testOnCallListChange_handlesCallWaitingWhenScreenOffShouldRestartActivity() { mCallList.setHasCall(Call.State.ACTIVE, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); mInCallPresenter.setActivity(mInCallActivity); // Pretend that there is a call waiting and the screen is off when(mInCallActivity.isDestroyed()).thenReturn(false); when(mInCallActivity.isFinishing()).thenReturn(false); when(mProximitySensor.isScreenReallyOff()).thenReturn(true); mCallList.setHasCall(Call.State.INCOMING, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); verify(mInCallActivity).finish(); } /** * Verifies that the PENDING_OUTGOING -> IN_CALL transition brings up InCallActivity so * that it can display an error dialog. */ public void testOnCallListChange_pendingOutgoingToInCallTransitionShowsUiForErrorDialog() { mCallList.setHasCall(Call.State.CONNECTING, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); mCallList.setHasCall(Call.State.CONNECTING, false); mCallList.setHasCall(Call.State.ACTIVE, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false)); verifyIncomingCallNotificationNotSent(); } /** * Verifies that if there is a call in the SELECT_PHONE_ACCOUNT state, InCallActivity is displayed * to display the account picker. */ public void testOnCallListChange_noAccountProvidedForCallShowsUiForAccountPicker() { mCallList.setHasCall(Call.State.SELECT_PHONE_ACCOUNT, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); verify(mContext).startActivity(InCallPresenter.getInstance().getInCallIntent(false, false)); verifyIncomingCallNotificationNotSent(); } /** * Verifies that for an expected call state change (e.g. NO_CALLS -> PENDING_OUTGOING), * InCallActivity is not displayed. */ public void testOnCallListChange_noCallsToPendingOutgoingDoesNotShowUi() { mCallList.setHasCall(Call.State.CONNECTING, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); verifyInCallActivityNotStarted(); verifyIncomingCallNotificationNotSent(); } public void testOnCallListChange_LastCallDisconnectedNoCallsLeftFinishesUi() { mCallList.setHasCall(Call.State.DISCONNECTED, true); mInCallPresenter.onCallListChange(mCallList.getCallList()); mInCallPresenter.setActivity(mInCallActivity); verify(mInCallActivity, never()).finish(); // Last remaining disconnected call is removed from CallList, activity should shut down. mCallList.setHasCall(Call.State.DISCONNECTED, false); mInCallPresenter.onCallListChange(mCallList.getCallList()); verify(mInCallActivity).finish(); } //TODO public void testCircularReveal_startsCircularRevealForOutgoingCalls() { } public void testCircularReveal_waitTillCircularRevealSentBeforeShowingCallCard() { } public void testHangupOngoingCall_disconnectsCallCorrectly() { } public void testAnswerIncomingCall() { } public void testDeclineIncomingCall() { } private void verifyInCallActivityNotStarted() { verify(mContext, never()).startActivity(Mockito.any(Intent.class)); } private void verifyIncomingCallNotificationNotSent() { verify(mStatusBarNotifier, never()).updateNotification(Mockito.any(InCallState.class), Mockito.any(CallList.class)); } }