10825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 20825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Copyright (C) 2009 The Android Open Source Project 30825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 40825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Licensed under the Apache License, Version 2.0 (the "License"); 50825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * you may not use this file except in compliance with the License. 60825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * You may obtain a copy of the License at 70825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 80825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * http://www.apache.org/licenses/LICENSE-2.0 90825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Unless required by applicable law or agreed to in writing, software 110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * distributed under the License is distributed on an "AS IS" BASIS, 120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * See the License for the specific language governing permissions and 140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * limitations under the License. 150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 170825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepackage com.android.internal.telephony; 180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 190825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.AndroidTestCase; 200825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.suitebuilder.annotation.SmallTest; 210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 220825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.ContentResolver; 230825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.Context; 240825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.content.res.Resources; 250825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallerInfo; 260825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport com.android.internal.telephony.CallerInfoAsyncQuery; 270825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.Log; 280825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.os.Looper; 290825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.test.ActivityInstrumentationTestCase; 300825495a331bb44df395a0cdb79fab85e68db5d5Wink Savilleimport android.util.StringBuilderPrinter; 310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville/* 330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check the CallerInfo utility class works as expected. 340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 370825495a331bb44df395a0cdb79fab85e68db5d5Wink Savillepublic class CallerInfoTest extends AndroidTestCase { 380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private CallerInfo mInfo; 390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Context mContext; 400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String kEmergencyNumber = "Emergency Number"; 420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final int kToken = 0xdeadbeef; 430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private static final String TAG = "CallerInfoUnitTest"; 440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void setUp() throws Exception { 470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.setUp(); 480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mContext = new MockContext(); 490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = new CallerInfo(); 500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville protected void tearDown() throws Exception { 540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super.tearDown(); 550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Checks the caller info instance is flagged as an emergency if 590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the number is an emergency one. There is no test for the 600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * contact based constructors because emergency number are not in 610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * the contact DB. 620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @SmallTest 640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testEmergencyIsProperlySet() throws Exception { 650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.isEmergencyNumber()); 660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = CallerInfo.getCallerInfo(mContext, "911"); 680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertIsValidEmergencyCallerInfo(); 690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = CallerInfo.getCallerInfo(mContext, "tel:911"); 710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertIsValidEmergencyCallerInfo(); 720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // This one hits the content resolver. 750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = CallerInfo.getCallerInfo(mContext, "18001234567"); 760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.isEmergencyNumber()); 770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Same as testEmergencyIsProperlySet but uses the async query api. 810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @SmallTest 830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testEmergencyIsProperlySetUsingAsyncQuery() throws Exception { 840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville QueryRunner query; 850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query = new QueryRunner("911"); 870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query.runAndCheckCompletion(); 880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertIsValidEmergencyCallerInfo(); 890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query = new QueryRunner("tel:911"); 910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query.runAndCheckCompletion(); 920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertIsValidEmergencyCallerInfo(); 930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query = new QueryRunner("18001234567"); 950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville query.runAndCheckCompletion(); 960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.isEmergencyNumber()); 970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * For emergency caller info, phoneNumber should be set to the 1010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * string emergency_call_dialog_number_for_display and the 1020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * photoResource should be set to the picture_emergency drawable. 1030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @SmallTest 1050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void testEmergencyNumberAndPhotoAreSet() throws Exception { 1060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = CallerInfo.getCallerInfo(mContext, "911"); 1070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertIsValidEmergencyCallerInfo(); 1090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // TODO: Add more tests: 1120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check if the voice mail number cannot be retrieved that the 1140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * original phone number is preserved. 1150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Check the markAs* methods work. 1180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 1220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Helpers 1230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // 1240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Partial implementation of MockResources. 1260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public class MockResources extends android.test.mock.MockResources 1270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville { 1280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public String getString(int resId) throws Resources.NotFoundException { 1300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville switch (resId) { 1310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville case com.android.internal.R.string.emergency_call_dialog_number_for_display: 1320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return kEmergencyNumber; 1330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville default: 1340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville throw new UnsupportedOperationException("Missing handling for resid " + resId); 1350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Partial implementation of MockContext. 1400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public class MockContext extends android.test.mock.MockContext { 1410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private ContentResolver mResolver; 1420825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Resources mResources; 1430825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1440825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public MockContext() { 1450825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mResolver = new android.test.mock.MockContentResolver(); 1460825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mResources = new MockResources(); 1470825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1480825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1490825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1500825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public ContentResolver getContentResolver() { 1510825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mResolver; 1520825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1530825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1540825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1550825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public Resources getResources() { 1560825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville return mResources; 1570825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1580825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1590825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1600825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 1610825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Class to run a CallerInfoAsyncQuery in a separate thread, with 1620825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * its own Looper. We cannot use the main Looper because on the 1630825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * 1st quit the thread is maked dead, ie no further test can use 1640825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * it. Also there is not way to inject a Looper instance in the 1650825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * query, so we have to use a thread with its own looper. 1660825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 1670825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private class QueryRunner extends Thread 1680825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville implements CallerInfoAsyncQuery.OnQueryCompleteListener { 1690825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private Looper mLooper; 1700825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private String mNumber; 1710825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private boolean mAsyncCompleted; 1720825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1730825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public QueryRunner(String number) { 1740825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville super(); 1750825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mNumber = number; 1760825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1770825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1780825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Run the query in the thread, wait for completion. 1790825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void runAndCheckCompletion() throws InterruptedException { 1800825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville start(); 1810825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville join(); 1820825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertTrue(mAsyncCompleted); 1830825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1840825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1850825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville @Override 1860825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void run() { 1870825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville Looper.prepare(); 1880825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLooper = Looper.myLooper(); 1890825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAsyncCompleted = false; 1900825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The query will pick the thread local looper we've just prepared. 1910825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville CallerInfoAsyncQuery.startQuery(kToken, mContext, mNumber, this, null); 1920825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLooper.loop(); 1930825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 1940825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 1950825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // Quit the Looper on the 1st callback 1960825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // (EVENT_EMERGENCY_NUMBER). There is another message 1970825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // (EVENT_END_OF_QUEUE) that will never be delivered because 1980825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // the test has exited. The corresponding stack trace 1990825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // "Handler{xxxxx} sending message to a Handler on a dead 2000825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // thread" can be ignored. 2010825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville public void onQueryComplete(int token, Object cookie, CallerInfo info) { 2020825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mAsyncCompleted = true; 2030825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mInfo = info; 2040825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville mLooper.quit(); 2050825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2060825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2070825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2080825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville /** 2090825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville * Fail if mInfo does not contain a valid emergency CallerInfo instance. 2100825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville */ 2110825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville private void assertIsValidEmergencyCallerInfo() throws Exception { 2120825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertTrue(mInfo.isEmergencyNumber()); 2130825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2140825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // For emergency caller info, phoneNumber should be set to the 2150825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // string emergency_call_dialog_number_for_display and the 2160825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // photoResource should be set to the picture_emergency drawable. 2170825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(kEmergencyNumber, mInfo.phoneNumber); 2180825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(com.android.internal.R.drawable.picture_emergency, mInfo.photoResource); 2190825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2200825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville // The name should be null 2210825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.name); 2220825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, mInfo.namePresentation); 2230825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.cnapName); 2240825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, mInfo.numberPresentation); 2250825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2260825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.contactExists); 2270825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, mInfo.person_id); 2280825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.needUpdate); 2290825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.contactRefUri); 2300825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2310825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.phoneLabel); 2320825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertEquals(0, mInfo.numberType); 2330825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.numberLabel); 2340825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2350825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.contactRingtoneUri); 2360825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.shouldSendToVoicemail); 2370825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville 2380825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertNull(mInfo.cachedPhoto); 2390825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville assertFalse(mInfo.isCachedPhotoCurrent); 2400825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville } 2410825495a331bb44df395a0cdb79fab85e68db5d5Wink Saville} 242