blob: f4e06a5faef9e208fe81e89fccc2aeb300412731 [file] [log] [blame]
/*
* 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));
}
}