100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee/* 200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Copyright (C) 2011 The Android Open Source Project 300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * 400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License"); 500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * you may not use this file except in compliance with the License. 600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * You may obtain a copy of the License at 700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * 800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * http://www.apache.org/licenses/LICENSE-2.0 900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * 1000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Unless required by applicable law or agreed to in writing, software 1100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS, 1200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * See the License for the specific language governing permissions and 1400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * limitations under the License 1500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee */ 161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeepackage com.android.providers.contacts; 181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentUris; 201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentValues; 2100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.database.Cursor; 221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.net.Uri; 23687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yenimport android.os.BatteryStats.Uid.Proc; 24eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport android.os.ParcelFileDescriptor; 2547fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Leeimport android.os.Process; 26687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yenimport android.provider.CallLog; 2700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.provider.CallLog.Calls; 28975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjeeimport android.provider.VoicemailContract; 299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport android.provider.VoicemailContract.Status; 301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.provider.VoicemailContract.Voicemails; 311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.test.MoreAsserts; 329d84fd3de4464d8d19a8aa419682f75d0089c752Makoto Onukiimport android.test.suitebuilder.annotation.SmallTest; 331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3438210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.common.io.MoreCloseables; 3538210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki 369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport java.io.FileNotFoundException; 37eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport java.io.IOException; 381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.InputStream; 391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.OutputStream; 4000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport java.util.Arrays; 411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.List; 421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee/** 441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Unit tests for {@link VoicemailContentProvider}. 451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * 461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Run the test like this: 471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * <code> 481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * runtest -c com.android.providers.contacts.VoicemailProviderTest contactsprov 491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * </code> 501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */ 5100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee// TODO: Test that calltype and voicemail_uri are auto populated by the provider. 529d84fd3de4464d8d19a8aa419682f75d0089c752Makoto Onuki@SmallTest 53c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeepublic class VoicemailProviderTest extends BaseVoicemailProviderTest { 5400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee /** Fields specific to call_log provider that should not be exposed by voicemail provider. */ 5500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee private static final String[] CALLLOG_PROVIDER_SPECIFIC_COLUMNS = { 5600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NAME, 5700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NUMBER_LABEL, 5800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NUMBER_TYPE, 5900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.TYPE, 6000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.VOICEMAIL_URI, 6100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.COUNTRY_ISO 6200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }; 6300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee /** Total number of columns exposed by voicemail provider. */ 6472ec7ff768c838bf4e69ffdcfb3976217610aba1mike dooley private static final int NUM_VOICEMAIL_FIELDS = 24; 6500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 661975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 671975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected void setUp() throws Exception { 681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee super.setUp(); 691975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 70687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen addProvider(CallLogProviderTestable.class, CallLog.AUTHORITY); 711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 739cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee /** Returns the appropriate /voicemail URI. */ 749cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee private Uri voicemailUri() { 75e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee return mUseSourceUri ? 76e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee Voicemails.buildSourceUri(mActor.packageName) : Voicemails.CONTENT_URI; 771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 781975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 799cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee /** Returns the appropriate /status URI. */ 809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee private Uri statusUri() { 819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee return mUseSourceUri ? 829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Status.buildSourceUri(mActor.packageName) : Status.CONTENT_URI; 839cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testInsert() throws Exception { 86687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(1000L); 87aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues()); 88aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda // We create on purpose a new set of ContentValues here, because the code above modifies 89aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda // the copy it gets. 90aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda assertStoredValues(uri, getTestVoicemailValues()); 91aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda assertSelection(uri, getTestVoicemailValues(), Voicemails._ID, ContentUris.parseId(uri)); 921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, countFilesInTestDirectory()); 9352cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen 94687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(uri, 1000); 951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 975c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen public void testInsertReadMessageIsNotNew() throws Exception { 985c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen ContentValues values = getTestReadVoicemailValues(); 995c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen Uri uri = mResolver.insert(voicemailUri(), values); 1005c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen String[] projection = {Voicemails.NUMBER, Voicemails.DATE, Voicemails.DURATION, 1015c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen Voicemails.TRANSCRIPTION, Voicemails.IS_READ, Voicemails.HAS_CONTENT, 1025c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen Voicemails.SOURCE_DATA, Voicemails.STATE, 103c4b2bcdf4cb3a7d3eed268cc60340173f3749cb6Ta-wei Yen Voicemails.BACKED_UP, Voicemails.RESTORED, Voicemails.ARCHIVED, 104c4b2bcdf4cb3a7d3eed268cc60340173f3749cb6Ta-wei Yen Voicemails.IS_OMTP_VOICEMAIL 1055c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen }; 1065c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen Cursor c = mResolver.query(uri, projection, Calls.NEW + "=0", null, 1075c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen null); 1085c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen try { 1095c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen assertEquals("Record count", 1, c.getCount()); 1105c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen c.moveToFirst(); 1115c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen assertEquals(1, countFilesInTestDirectory()); 1125c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen assertCursorValues(c, values); 1135c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen } catch (Error e) { 1145c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen TestUtils.dumpCursor(c); 1155c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen throw e; 1165c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen } finally { 1175c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen c.close(); 1185c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen } 1195c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen } 1205c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen 1211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Test to ensure that media content can be written and read back. 1221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testFileContent() throws Exception { 1231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 1241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee OutputStream out = mResolver.openOutputStream(uri); 1251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee byte[] outBuffer = {0x1, 0x2, 0x3, 0x4}; 1261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.write(outBuffer); 1271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.flush(); 1281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.close(); 1291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee InputStream in = mResolver.openInputStream(uri); 1301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee byte[] inBuffer = new byte[4]; 1311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee int numBytesRead = in.read(inBuffer); 1321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(numBytesRead, outBuffer.length); 1331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee MoreAsserts.assertEquals(outBuffer, inBuffer); 1341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // No more data should be left. 1351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(-1, in.read(inBuffer)); 1361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee in.close(); 1371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testUpdate() { 140687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(1000L); 1411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 1421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = new ContentValues(); 1431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.NUMBER, "1-800-263-7643"); 1441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DATE, 2000); 1451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DURATION, 40); 146d372af60001602a8c6cccf6258b514360c69b513Yorke Lee values.put(Voicemails.TRANSCRIPTION, "Testing 123"); 1471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.STATE, 2); 1481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.HAS_CONTENT, 1); 1491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_DATA, "foo"); 150dca8f302db8e661f13f3585bc67c53a5adf36617Nancy Chen values.put(Voicemails.PHONE_ACCOUNT_COMPONENT_NAME, "dummy_name"); 151dca8f302db8e661f13f3585bc67c53a5adf36617Nancy Chen values.put(Voicemails.PHONE_ACCOUNT_ID, "dummy_account"); 15227bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.BACKED_UP, 1); 15327bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.RESTORED, 1); 15427bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.ARCHIVED, 1); 15527bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.IS_OMTP_VOICEMAIL, 1); 1561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee int count = mResolver.update(uri, values, null, null); 1571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, count); 1581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertStoredValues(uri, values); 159687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(uri, 1000); 1601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1620f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen public void testUpdateOwnPackageVoicemail_NotDirty() { 1630f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen final Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues()); 1640f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen mResolver.update(uri, new ContentValues(), null, null); 1650f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen 1660f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen // Updating a package's own voicemail should not make the voicemail dirty. 1670f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen ContentValues values = getTestVoicemailValues(); 1680f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen values.put(Voicemails.DIRTY, "0"); 1690f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen assertStoredValues(uri, values); 1700f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen } 1710f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen 1720f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen public void testUpdateOwnPackageVoicemail_RemovesDirtyStatus() { 1730f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen ContentValues values = getTestVoicemailValues(); 1740f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen values.put(Voicemails.DIRTY, "1"); 1750f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen final Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues()); 1760f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen 1770f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen mResolver.update(uri, new ContentValues(), null, null); 1780f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen // At this point, the voicemail should be set back to not dirty. 1790f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen ContentValues newValues = getTestVoicemailValues(); 1800f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen newValues.put(Voicemails.DIRTY, "0"); 1810f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen assertStoredValues(uri, newValues); 1820f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen } 1830f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen 18447fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee public void testDeleteOwnPackageVoicemail_DeletesRow() { 18547fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee setUpForFullPermission(); 18647fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee final Uri ownVoicemail = insertVoicemail(); 18747fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertEquals(1, getCount(voicemailUri(), null, null)); 18847fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 18947fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee mResolver.delete(ownVoicemail, null, null); 19047fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 19147fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertEquals(0, getCount(ownVoicemail, null, null)); 19247fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee } 19347fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 19447fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee public void testDeleteOtherPackageVoicemail_SetsDirtyStatus() { 19547fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee setUpForFullPermission(); 196687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(1000L); 19747fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package"); 19847fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertEquals(1, getCount(voicemailUri(), null, null)); 19947fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 20047fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee // Clear the mapping for our own UID so that this doesn't look like an internal transaction. 20147fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee mPackageManager.removePackage(Process.myUid()); 20247fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee mResolver.delete(anotherVoicemail, null, null); 20347fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 20447fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee ContentValues values = getTestVoicemailValues(); 20547fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee values.put(Voicemails.DIRTY, "1"); 20647fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee values.put(Voicemails.DELETED, "1"); 20747fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 20847fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertEquals(1, getCount(anotherVoicemail, null, null)); 20947fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertStoredValues(anotherVoicemail, values); 210687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(anotherVoicemail, 1000); 21147fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee } 21247fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee 2131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testDelete() { 2141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 2159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee int count = mResolver.delete(voicemailUri(), Voicemails._ID + "=" 2161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee + ContentUris.parseId(uri), null); 2171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, count); 2181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(0, getCount(uri, null, null)); 2191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 221687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen public void testUpdateAfterDelete_lastModifiedNotChanged() { 222687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setUpForFullPermission(); 223687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(1000L); 224687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package"); 225687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertEquals(1, getCount(voicemailUri(), null, null)); 226687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen 227687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen // Clear the mapping for our own UID so that this doesn't look like an internal transaction. 228687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen mPackageManager.removePackage(Process.myUid()); 229687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen mResolver.delete(anotherVoicemail, null, null); 230687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(anotherVoicemail, 1000); 231687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen 232687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen mPackageManager.addPackage(Process.myUid(), mActor.packageName); 233687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(2000L); 234687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen mResolver.update(anotherVoicemail, new ContentValues(), null, null); 235687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(anotherVoicemail, 1000); 236687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen 237687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen setTimeForTest(3000L); 238687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen ContentValues values = new ContentValues(); 239687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen values.put(Voicemails.DELETED, "0"); 240687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen mResolver.update(anotherVoicemail, values, null, null); 241687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen assertLastModified(anotherVoicemail, 3000); 242687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen } 243687bef960a8309410ee1ba0da06a012914bef88eTa-wei Yen 244c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee public void testGetType_ItemUri() throws Exception { 245c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee // Random item uri. 246c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee assertEquals(Voicemails.ITEM_TYPE, 247c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee mResolver.getType(ContentUris.withAppendedId(Voicemails.CONTENT_URI, 100))); 248c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee // Item uri of an inserted voicemail. 2499cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee ContentValues values = getTestVoicemailValues(); 2504b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee values.put(Voicemails.MIME_TYPE, "foo/bar"); 251d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee Uri uri = mResolver.insert(voicemailUri(), values); 252d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee assertEquals(Voicemails.ITEM_TYPE, mResolver.getType(uri)); 253c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee } 2544b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 255c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee public void testGetType_DirUri() throws Exception { 2564b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.CONTENT_URI)); 2574b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.buildSourceUri("foo"))); 2584b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2594b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2604b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // Test to ensure that without full permission it is not possible to use the base uri (i.e. with 2614b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // no package URI specified). 2624b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void testMustUsePackageUriWithoutFullPermission() { 2634b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee setUpForOwnPermission(); 2644b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2654b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2664b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.insert(Voicemails.CONTENT_URI, getTestVoicemailValues()); 2684b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2694b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2704b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2714b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2724b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2734b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2749cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.update(Voicemails.CONTENT_URI, getTestVoicemailValues(), null, null); 2754b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2764b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2774b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2784b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2794b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2804b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2814b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.query(Voicemails.CONTENT_URI, null, null, null, null); 2824b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2834b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2844b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2854b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2864b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2874b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2884b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.delete(Voicemails.CONTENT_URI, null, null); 2894b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2904b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2914b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2924b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testPermissions_InsertAndQuery() { 2941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForFullPermission(); 2951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Insert two records - one each with own and another package. 2961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemail(); 2971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemailForSourcePackage("another-package"); 2989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(2, getCount(voicemailUri(), null, null)); 2991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Now give away full permission and check that only 1 message is accessible. 3011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 3029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(1, getCount(voicemailUri(), null, null)); 3031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Once again try to insert message for another package. This time 3051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // it should fail. 3061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 3071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 3091975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemailForSourcePackage("another-package"); 3101975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3111975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 312ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 313ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForNoPermission(); 314ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mUseSourceUri = false; 315ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // With the READ_ALL_VOICEMAIL permission, we should now be able to read all voicemails 3162ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(READ_VOICEMAIL_PERMISSION); 317ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee assertEquals(2, getCount(voicemailUri(), null, null)); 318ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 319ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // An insert for another package should still fail 320ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 321ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee @Override 322ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee public void run() { 323ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee insertVoicemailForSourcePackage("another-package"); 324ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee } 325ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee }); 3261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testPermissions_UpdateAndDelete() { 3291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForFullPermission(); 3301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Insert two records - one each with own and another package. 3311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee final Uri ownVoicemail = insertVoicemail(); 3321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package"); 3339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(2, getCount(voicemailUri(), null, null)); 3341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Now give away full permission and check that we can update and delete only 3361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // the own voicemail. 3371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 338e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mResolver.update(withSourcePackageParam(ownVoicemail), 3399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee getTestVoicemailValues(), null, null); 340e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mResolver.delete(withSourcePackageParam(ownVoicemail), null, null); 3411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // However, attempting to update or delete another-package's voicemail should fail. 3431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 3441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 3461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.update(anotherVoicemail, null, null, null); 3471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 3491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 3501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 3521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.delete(anotherVoicemail, null, null); 3531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 355ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 3560f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen // If we have the manage voicemail permission, we should be able to both update voicemails 35747fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee // from all packages. 358ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForNoPermission(); 3592ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION); 360ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mResolver.update(anotherVoicemail, getTestVoicemailValues(), null, null); 361ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 362ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // Now add the read voicemail permission temporarily to verify that the update actually 363ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // worked 3642ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(READ_VOICEMAIL_PERMISSION); 365ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee assertStoredValues(anotherVoicemail, getTestVoicemailValues()); 3662ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.removePermissions(READ_VOICEMAIL_PERMISSION); 367ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 368ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mResolver.delete(anotherVoicemail, null, null); 369ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 37047fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee // Now add the read voicemail permission temporarily to verify that the voicemail is 37147fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee // deleted. 3722ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(READ_VOICEMAIL_PERMISSION); 3730f74e8600ad744f2e4ba9c6a4cdadf5da5a20e83Nancy Chen 37447fc56dd40613fae565d0c4d630f5f0b5fc310ffYorke Lee assertEquals(0, getCount(anotherVoicemail, null, null)); 3751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 377e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee private Uri withSourcePackageParam(Uri uri) { 378e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee return uri.buildUpon() 379e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, mActor.packageName) 380e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee .build(); 381e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee } 382e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee 383eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void testUriPermissions() { 384eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee setUpForFullPermission(); 385eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee final Uri uri1 = insertVoicemail(); 386eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee final Uri uri2 = insertVoicemail(); 387eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee // Give away all permissions before querying. Access to both uris should be denied. 388eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee setUpForNoPermission(); 389eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoAccessToUri(uri1); 390eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoAccessToUri(uri2); 391eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 392eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee // Just grant permission to uri1. uri1 should pass but uri2 should still fail. 393eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mActor.addUriPermissions(uri1); 394eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasReadOnlyAccessToUri(uri1); 395eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoAccessToUri(uri2); 396eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 397eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee // Cleanup. 398eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mActor.removeUriPermissions(uri1); 399eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 400eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 401ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee /* 402ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee * Checks that the READ_ALL_VOICEMAIL permission provides read access to a uri. 403ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee */ 404ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee public void testUriPermissions_ReadAccess() { 405ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForFullPermission(); 406ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee final Uri uri1 = insertVoicemail(); 407ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // Give away all permissions before querying. Access should be denied. 408ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForNoPermission(); 409ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mUseSourceUri = false; 410ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee checkHasNoAccessToUri(uri1); 411ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 4122ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(READ_VOICEMAIL_PERMISSION); 413ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee checkHasReadAccessToUri(uri1); 414ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee } 415ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 416ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee /* 417ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee * Checks that the MANAGE_VOICEMAIL permission provides write access to a uri. 418ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee */ 419ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee public void testUriPermissions_WriteAccess() { 420ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForFullPermission(); 421ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee final Uri uri1 = insertVoicemail(); 422ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee // Give away all permissions before querying. Access should be denied. 423ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee setUpForNoPermission(); 424ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee checkHasNoAccessToUri(uri1); 425ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 4262ad39edbd856f3ea1177788aff7e653e593781ebYorke Lee mActor.addPermissions(WRITE_VOICEMAIL_PERMISSION); 427ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee checkHasUpdateAndDeleteAccessToUri(uri1); 428ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee } 429ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 430eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee private void checkHasNoAccessToUri(final Uri uri) { 431eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoReadAccessToUri(uri); 432eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoWriteAccessToUri(uri); 433eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 434eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 435eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee private void checkHasReadOnlyAccessToUri(final Uri uri) { 436eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasReadAccessToUri(uri); 437eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee checkHasNoWriteAccessToUri(uri); 438eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 439eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 440eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee private void checkHasReadAccessToUri(final Uri uri) { 441eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee Cursor cursor = null; 442eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee try { 443eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee cursor = mResolver.query(uri, null, null ,null, null); 444eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee assertEquals(1, cursor.getCount()); 445eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee try { 446eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee ParcelFileDescriptor fd = mResolver.openFileDescriptor(uri, "r"); 447eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee assertNotNull(fd); 448eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fd.close(); 449eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } catch (FileNotFoundException e) { 450eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fail(e.getMessage()); 451eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } catch (IOException e) { 452eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fail(e.getMessage()); 453eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 454eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } finally { 455eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee MoreCloseables.closeQuietly(cursor); 456eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 457eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 458eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 459eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee private void checkHasNoReadAccessToUri(final Uri uri) { 460eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 461eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 462eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 46352cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen mResolver.query(uri, null, null, null, null); 464eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 465eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 466eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 467eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 468eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 469eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee try { 470eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mResolver.openFileDescriptor(uri, "r"); 471eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } catch (FileNotFoundException e) { 472eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fail(e.getMessage()); 473eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 474eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 475eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 476eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 477eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 478ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee private void checkHasUpdateAndDeleteAccessToUri(final Uri uri) { 479ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mResolver.update(uri, getTestVoicemailValues(), null, null); 480ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee mResolver.delete(uri, null, null); 481ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee } 482ab2ec1d4316770e2ce8dc47dd1ae71430cd70e36Yorke Lee 483eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee private void checkHasNoWriteAccessToUri(final Uri uri) { 484eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 485eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 486eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 487eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mResolver.update(uri, getTestVoicemailValues(), null, null); 488eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 489eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 490eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 491eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 492eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 493eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mResolver.delete(uri, null, null); 494eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 495eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 496eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 497eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 498eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 499eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee try { 500eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mResolver.openFileDescriptor(uri, "w"); 501eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } catch (FileNotFoundException e) { 502eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fail(e.getMessage()); 503eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 504eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 505eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 506eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 507eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee @Override 508eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee public void run() { 509eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee try { 510eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee mResolver.openFileDescriptor(uri, "rw"); 511eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } catch (FileNotFoundException e) { 512eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee fail(e.getMessage()); 513eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 514eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 515eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee }); 516eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee } 517eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee 5181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Test to ensure that all operations fail when no voicemail permission is granted. 5191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testNoPermissions() { 5201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForNoPermission(); 5211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 5221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 5231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 5249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.insert(voicemailUri(), getTestVoicemailValues()); 5251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 5261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 5271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 5281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 5291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 5309cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.update(voicemailUri(), getTestVoicemailValues(), null, null); 5311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 5321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 5331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 5341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 5351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 5369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.query(voicemailUri(), null, null, null, null); 5371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 5381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 5391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 5401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 5411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 5429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.delete(voicemailUri(), null, null); 5431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 5441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 5451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 5461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 54700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 54800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // insertable through voicemail provider. 54900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Insert() { 55000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 5519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee final ContentValues values = getTestVoicemailValues(); 55200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee values.put(callLogColumn, "foo"); 55300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee EvenMoreAsserts.assertThrows("Column: " + callLogColumn, 55400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee IllegalArgumentException.class, new Runnable() { 55500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee @Override 55600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void run() { 5579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.insert(voicemailUri(), values); 55800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 55900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }); 56000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 56100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 56200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 56300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 56400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // exposed through voicemail provider query. 56500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Query() { 56600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Query. 5679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Cursor cursor = mResolver.query(voicemailUri(), null, null, null, null); 56800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee List<String> columnNames = Arrays.asList(cursor.getColumnNames()); 56900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee assertEquals(NUM_VOICEMAIL_FIELDS, columnNames.size()); 57000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // None of the call_log provider specific columns should be present. 57100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 57200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee assertFalse("Unexpected column: '" + callLogColumn + "' returned.", 57300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee columnNames.contains(callLogColumn)); 57400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 57500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 57600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 57700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 57800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // updatable through voicemail provider. 57900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Update() { 58000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 58100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee final Uri insertedUri = insertVoicemail(); 5829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee final ContentValues values = getTestVoicemailValues(); 58300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee values.put(callLogColumn, "foo"); 58400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee EvenMoreAsserts.assertThrows("Column: " + callLogColumn, 58500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee IllegalArgumentException.class, new Runnable() { 58600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee @Override 58700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void run() { 58800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee mResolver.update(insertedUri, values, null, null); 58900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 59000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }); 59100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 59200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 59300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 5949cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // Tests for voicemail status table. 5959cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 5969cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusInsert() throws Exception { 5979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee ContentValues values = getTestStatusValues(); 5989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Uri uri = mResolver.insert(statusUri(), values); 5999cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertStoredValues(uri, values); 6009cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertSelection(uri, values, Status._ID, ContentUris.parseId(uri)); 6019cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 6029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 6039cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusUpdate() throws Exception { 6049cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Uri uri = insertTestStatusEntry(); 6059cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee ContentValues values = getTestStatusValues(); 6069cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION); 6079cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.NOTIFICATION_CHANNEL_STATE, 6089cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING); 60921c692d49ce7ad6f9414d46ac2410d3f2e4c4d20Ta-wei Yen values.put(Status.SOURCE_TYPE, 61021c692d49ce7ad6f9414d46ac2410d3f2e4c4d20Ta-wei Yen "vvm_type_test2"); 6119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee int count = mResolver.update(uri, values, null, null); 6129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(1, count); 6139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertStoredValues(uri, values); 6149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 6159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 616155ff44c5809da846b841011923b7e81dede303dTa-wei Yen public void testStatusUpsert() throws Exception { 617155ff44c5809da846b841011923b7e81dede303dTa-wei Yen ContentValues values = getTestStatusValues(); 618155ff44c5809da846b841011923b7e81dede303dTa-wei Yen mResolver.insert(statusUri(), values); 619155ff44c5809da846b841011923b7e81dede303dTa-wei Yen ContentValues values2 = new ContentValues(); 620155ff44c5809da846b841011923b7e81dede303dTa-wei Yen values2.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_NOT_CONFIGURED); 621155ff44c5809da846b841011923b7e81dede303dTa-wei Yen values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_NOT_CONFIGURED); 622155ff44c5809da846b841011923b7e81dede303dTa-wei Yen Uri uri = mResolver.insert(statusUri(), values2); 623155ff44c5809da846b841011923b7e81dede303dTa-wei Yen assertStoredValues(uri, values); 624155ff44c5809da846b841011923b7e81dede303dTa-wei Yen assertSelection(uri, values, Status._ID, ContentUris.parseId(uri)); 625155ff44c5809da846b841011923b7e81dede303dTa-wei Yen } 626155ff44c5809da846b841011923b7e81dede303dTa-wei Yen 6279cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusDelete() { 6289cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Uri uri = insertTestStatusEntry(); 6299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee int count = mResolver.delete(statusUri(), Status._ID + "=" 6309cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee + ContentUris.parseId(uri), null); 6319cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(1, count); 6329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(0, getCount(uri, null, null)); 6339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 6349cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 63552cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen public void testStatusQuotaInsert() { 63652cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen ContentValues values = new ContentValues(); 63752cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.SOURCE_PACKAGE, mActor.packageName); 63852cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.QUOTA_OCCUPIED, 2); 63952cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.QUOTA_TOTAL, 13); 64052cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen Uri uri = mResolver.insert(statusUri(), values); 64152cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen assertStoredValues(uri, values); 64252cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen assertSelection(uri, values, Status._ID, ContentUris.parseId(uri)); 64352cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen } 64452cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen 64552cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen public void testStatusQuotaUpdate() { 64652cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen Uri uri = insertTestStatusEntry(); 64752cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen ContentValues values = new ContentValues(); 64852cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.SOURCE_PACKAGE, mActor.packageName); 64952cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.QUOTA_OCCUPIED, 2); 65052cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen values.put(Status.QUOTA_TOTAL, 13); 65152cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen int count = mResolver.update(uri, values, null, null); 65252cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen assertEquals(1, count); 65352cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen 65452cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen ContentValues refValues = getTestStatusValues(); 65552cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen refValues.put(Status.QUOTA_OCCUPIED, 2); 65652cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen refValues.put(Status.QUOTA_TOTAL, 13); 65752cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen assertStoredValues(uri, refValues); 65852cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen } 65952cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen 660155ff44c5809da846b841011923b7e81dede303dTa-wei Yen public void testStatusQuotaUpsert() { 661155ff44c5809da846b841011923b7e81dede303dTa-wei Yen Uri uri = insertTestStatusEntry(); 662155ff44c5809da846b841011923b7e81dede303dTa-wei Yen ContentValues values = new ContentValues(); 663155ff44c5809da846b841011923b7e81dede303dTa-wei Yen values.put(Status.SOURCE_PACKAGE, mActor.packageName); 664155ff44c5809da846b841011923b7e81dede303dTa-wei Yen values.put(Status.QUOTA_OCCUPIED, 2); 665155ff44c5809da846b841011923b7e81dede303dTa-wei Yen int count = mResolver.update(uri, values, null, null); 666155ff44c5809da846b841011923b7e81dede303dTa-wei Yen 667155ff44c5809da846b841011923b7e81dede303dTa-wei Yen ContentValues values2 = new ContentValues(); 668155ff44c5809da846b841011923b7e81dede303dTa-wei Yen values2.put(Status.QUOTA_TOTAL, 13); 669155ff44c5809da846b841011923b7e81dede303dTa-wei Yen mResolver.insert(uri, values2); 670155ff44c5809da846b841011923b7e81dede303dTa-wei Yen 671155ff44c5809da846b841011923b7e81dede303dTa-wei Yen ContentValues refValues = getTestStatusValues(); 672155ff44c5809da846b841011923b7e81dede303dTa-wei Yen refValues.put(Status.QUOTA_OCCUPIED, 2); 673155ff44c5809da846b841011923b7e81dede303dTa-wei Yen refValues.put(Status.QUOTA_TOTAL, 13); 674155ff44c5809da846b841011923b7e81dede303dTa-wei Yen assertStoredValues(uri, refValues); 675155ff44c5809da846b841011923b7e81dede303dTa-wei Yen } 676155ff44c5809da846b841011923b7e81dede303dTa-wei Yen 6779cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusGetType() throws Exception { 6789cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // Item URI. 6799cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee Uri uri = insertTestStatusEntry(); 6809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(Status.ITEM_TYPE, mResolver.getType(uri)); 6819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 6829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // base URIs. 6839cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(Status.DIR_TYPE, mResolver.getType(Status.CONTENT_URI)); 6849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertEquals(Status.DIR_TYPE, mResolver.getType(Status.buildSourceUri("foo"))); 6859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 6869cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 6879cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // Basic permission checks for the status table. 6889cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusPermissions() throws Exception { 6899cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee final ContentValues values = getTestStatusValues(); 6909cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // Inserting for another package should fail with any of the URIs. 6919cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.SOURCE_PACKAGE, "another.package"); 6929cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 6939cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee @Override 6949cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void run() { 6959cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.insert(Status.CONTENT_URI, values); 6969cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 6979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee }); 6989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 6999cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee @Override 7009cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void run() { 7019cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.insert(Status.buildSourceUri(mActor.packageName), values); 7029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7039cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee }); 7049cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7059cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // But insertion with own package should succeed with the right uri. 7069cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.SOURCE_PACKAGE, mActor.packageName); 7079cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee final Uri uri = mResolver.insert(Status.buildSourceUri(mActor.packageName), values); 7089cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee assertNotNull(uri); 7099cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7109cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // Updating source_package should not work as well. 7119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.SOURCE_PACKAGE, "another.package"); 7129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 7139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee @Override 7149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void run() { 7159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.update(uri, values, null, null); 7169cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7179cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee }); 7189cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7199cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7209cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee // File operation is not supported by /status URI. 7219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void testStatusFileOperation() throws Exception { 7229cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee final Uri uri = insertTestStatusEntry(); 7239cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() { 7249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee @Override 7259cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void run() { 7269cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee try { 7279cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.openOutputStream(uri); 7289cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } catch (FileNotFoundException e) { 7299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee fail("Unexpected exception " + e); 7309cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7319cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee }); 7339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7349cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() { 7359cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee @Override 7369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee public void run() { 7379cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee try { 7389cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee mResolver.openInputStream(uri); 7399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } catch (FileNotFoundException e) { 7409cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee fail("Unexpected exception " + e); 7419cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7439cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee }); 7449cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7459cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** 7471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Inserts a voicemail record with no source package set. The content provider 7481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * will detect source package. 7491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */ 7501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private Uri insertVoicemail() { 7519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee return mResolver.insert(voicemailUri(), getTestVoicemailValues()); 7521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 7531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 7541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** Inserts a voicemail record for the specified source package. */ 7551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private Uri insertVoicemailForSourcePackage(String sourcePackage) { 7569cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee ContentValues values = getTestVoicemailValues(); 7571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_PACKAGE, sourcePackage); 7589cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee return mResolver.insert(voicemailUri(), values); 7591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 7601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 7619cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee private ContentValues getTestVoicemailValues() { 7621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = new ContentValues(); 7631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.NUMBER, "1-800-4664-411"); 7641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DATE, 1000); 7651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DURATION, 30); 766d372af60001602a8c6cccf6258b514360c69b513Yorke Lee values.put(Voicemails.TRANSCRIPTION, "Testing 123"); 767b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda values.put(Voicemails.IS_READ, 0); 7681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.HAS_CONTENT, 0); 7691975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_DATA, "1234"); 7701975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.STATE, Voicemails.STATE_INBOX); 77127bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.BACKED_UP, 0); 77227bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.RESTORED, 0); 77327bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.ARCHIVED, 0); 77427bedb2f415f7bf33f351c6b2575a0087577c077Ta-wei Yen values.put(Voicemails.IS_OMTP_VOICEMAIL, 0); 7751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return values; 7761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 7771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 7785c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen private ContentValues getTestReadVoicemailValues() { 7795c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen ContentValues values = getTestVoicemailValues(); 7805c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen values.put(Voicemails.IS_READ, 1); 7815c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen return values; 7825c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen } 7835c466282ff1ebecb37c93dcb6d6ccfc845330e65Nancy Chen 7849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee private Uri insertTestStatusEntry() { 7859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee return mResolver.insert(statusUri(), getTestStatusValues()); 7869cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 7879cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee 7889cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee private ContentValues getTestStatusValues() { 7899cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee ContentValues values = new ContentValues(); 7909cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.SOURCE_PACKAGE, mActor.packageName); 7919cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.VOICEMAIL_ACCESS_URI, "tel:901"); 7929cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.SETTINGS_URI, "com.example.voicemail.source.SettingsActivity"); 7939cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK); 7949cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK); 7959cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK); 79621c692d49ce7ad6f9414d46ac2410d3f2e4c4d20Ta-wei Yen values.put(Status.SOURCE_TYPE, "vvm_type_test"); 7979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee return values; 7989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee } 79952cb1f8391fdf93ad90d675585a9c7e385e4a8d6Ta-wei Yen 8001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee} 801