1875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen/* 2875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Copyright (C) 2009 The Android Open Source Project 3875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 4875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Licensed under the Apache License, Version 2.0 (the "License"); 5875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * you may not use this file except in compliance with the License. 6875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * You may obtain a copy of the License at 7875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 8875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * http://www.apache.org/licenses/LICENSE-2.0 9875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 10875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Unless required by applicable law or agreed to in writing, software 11875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * distributed under the License is distributed on an "AS IS" BASIS, 12875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * See the License for the specific language governing permissions and 14875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * limitations under the License. 15875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 16875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.app; 18875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 1974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringertimport android.app.SearchManager; 202126aac7f992b57fc52141a8bd09fa7a45ac2509Bjorn Bringertimport android.app.SearchableInfo; 212126aac7f992b57fc52141a8bd09fa7a45ac2509Bjorn Bringertimport android.app.SearchableInfo.ActionKeyInfo; 22875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.ComponentName; 23875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.Context; 24875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.Intent; 250e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampathimport android.content.pm.ActivityInfo; 26875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.pm.ApplicationInfo; 27875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.pm.PackageManager; 28875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.pm.ProviderInfo; 29875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.pm.ResolveInfo; 30875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.res.Resources; 31875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.content.res.XmlResourceParser; 3274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringertimport android.os.RemoteException; 33875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.server.search.Searchables; 34875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.test.AndroidTestCase; 35875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.test.MoreAsserts; 36875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.test.mock.MockContext; 37875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.test.mock.MockPackageManager; 38875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.test.suitebuilder.annotation.SmallTest; 39875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport android.view.KeyEvent; 40875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 41875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport java.util.ArrayList; 42875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenimport java.util.List; 43875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 44875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen/** 45875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * To launch this test from the command line: 46875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 47875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * adb shell am instrument -w \ 48875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * -e class com.android.unit_tests.SearchablesTest \ 49875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * com.android.unit_tests/android.test.InstrumentationTestRunner 50875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 51875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen@SmallTest 52875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaenpublic class SearchablesTest extends AndroidTestCase { 53875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 54875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /* 55875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * SearchableInfo tests 56875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Mock the context so I can provide very specific input data 57875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm OK with "zero" searchables 58875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "good" metadata read properly 59875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "bad" metadata skipped properly 60875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm ordering of searchables 61875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "good" actionkeys 62875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * confirm "bad" actionkeys are rejected 63875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * confirm XML ordering enforced (will fail today - bug in SearchableInfo) 64875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * findActionKey works 65875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * getIcon works 66875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 67875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 68875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 69875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Test that non-searchable activities return no searchable info (this would typically 70875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * trigger the use of the default searchable e.g. contacts) 71875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 72875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void testNonSearchable() { 73875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // test basic array & hashmap 74875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen Searchables searchables = new Searchables(mContext); 75875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen searchables.buildSearchableList(); 76875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 77875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // confirm that we return null for non-searchy activities 78875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen ComponentName nonActivity = new ComponentName( 791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen "com.android.frameworks.coretests", 801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen "com.android.frameworks.coretests.activity.NO_SEARCH_ACTIVITY"); 81875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen SearchableInfo si = searchables.getSearchableInfo(nonActivity); 82875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNull(si); 83875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 846cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert 8574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /** 86875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * This is an attempt to run the searchable info list with a mocked context. Here are some 87875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * things I'd like to test. 88875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 89875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm OK with "zero" searchables 90875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "good" metadata read properly 91875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "bad" metadata skipped properly 92875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm ordering of searchables 93875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Confirm "good" actionkeys 94875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * confirm "bad" actionkeys are rejected 95875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * confirm XML ordering enforced (will fail today - bug in SearchableInfo) 96875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * findActionKey works 97875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * getIcon works 98875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 99875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 100aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert public void testSearchablesListReal() { 101875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager()); 102875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MyMockContext mockContext = new MyMockContext(mContext, mockPM); 103875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 104875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // build item list with real-world source data 105875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_PASSTHROUGH); 106aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert Searchables searchables = new Searchables(mockContext); 107875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen searchables.buildSearchableList(); 108875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen // tests with "real" searchables (deprecate, this should be a unit test) 109aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList(); 110aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert int count = searchablesList.size(); 111875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertTrue(count >= 1); // this isn't really a unit test 112875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen checkSearchables(searchablesList); 1136d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList(); 1146d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert checkSearchables(global); 115aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert } 116aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert 117aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert /** 118aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert * This round of tests confirms good operations with "zero" searchables found 119aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert */ 120aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert public void testSearchablesListEmpty() { 121aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert MyMockPackageManager mockPM = new MyMockPackageManager(mContext.getPackageManager()); 122aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert MyMockContext mockContext = new MyMockContext(mContext, mockPM); 123875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 124875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mockPM.setSearchablesMode(MyMockPackageManager.SEARCHABLES_MOCK_ZERO); 125aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert Searchables searchables = new Searchables(mockContext); 126875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen searchables.buildSearchableList(); 127aece7c6723b1a227f6f57db4fde0c1bdd50acf78Bjorn Bringert ArrayList<SearchableInfo> searchablesList = searchables.getSearchablesList(); 1286d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert assertNotNull(searchablesList); 1296d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert MoreAsserts.assertEmpty(searchablesList); 1306d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert ArrayList<SearchableInfo> global = searchables.getSearchablesInGlobalSearchList(); 1316d72e029cb6e5a9cf26aa3314c3dca83614fc91bBjorn Bringert MoreAsserts.assertEmpty(global); 132875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 133875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 134875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 135875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Generic health checker for an array of searchables. 136875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 137875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * This is designed to pass for any semi-legal searchable, without knowing much about 138875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * the format of the underlying data. It's fairly easy for a non-compliant application 139875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * to provide meta-data that will pass here (e.g. a non-existent suggestions authority). 140875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 141875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param searchables The list of searchables to examine. 142875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 143875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private void checkSearchables(ArrayList<SearchableInfo> searchablesList) { 144875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNotNull(searchablesList); 145875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen int count = searchablesList.size(); 146875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen for (int ii = 0; ii < count; ii++) { 147875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen SearchableInfo si = searchablesList.get(ii); 14874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert checkSearchable(si); 149875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 150875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 151875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 15274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert private void checkSearchable(SearchableInfo si) { 15374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNotNull(si); 15474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertTrue(si.getLabelId() != 0); // This must be a useable string 155a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert assertNotEmpty(si.getSearchActivity().getClassName()); 156a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert assertNotEmpty(si.getSearchActivity().getPackageName()); 15774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert if (si.getSuggestAuthority() != null) { 15874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert // The suggestion fields are largely optional, so we'll just confirm basic health 15974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNotEmpty(si.getSuggestAuthority()); 16074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNullOrNotEmpty(si.getSuggestPath()); 16174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNullOrNotEmpty(si.getSuggestSelection()); 16274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNullOrNotEmpty(si.getSuggestIntentAction()); 16374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNullOrNotEmpty(si.getSuggestIntentData()); 16474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert } 16574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /* Add a way to get the entire action key list, then explicitly test its elements */ 16674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /* For now, test the most common action key (CALL) */ 16774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert ActionKeyInfo ai = si.findActionKey(KeyEvent.KEYCODE_CALL); 16874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert if (ai != null) { 169a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert assertEquals(ai.getKeyCode(), KeyEvent.KEYCODE_CALL); 17074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert // one of these three fields must be non-null & non-empty 171a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert boolean m1 = (ai.getQueryActionMsg() != null) && (ai.getQueryActionMsg().length() > 0); 172a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert boolean m2 = (ai.getSuggestActionMsg() != null) && (ai.getSuggestActionMsg().length() > 0); 173a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert boolean m3 = (ai.getSuggestActionMsgColumn() != null) && 174a92041306e4d73baa10fb711fb905b9590f06b26Bjorn Bringert (ai.getSuggestActionMsgColumn().length() > 0); 17574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertTrue(m1 || m2 || m3); 17674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert } 17774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 17874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /* 17974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * Find ways to test these: 18074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * 18174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private int mSearchMode 18274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private Drawable mIcon 18374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert */ 18474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 18574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert /* 18674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * Explicitly not tested here: 18774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * 18874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * Can be null, so not much to see: 18974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * public String mSearchHint 19074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private String mZeroQueryBanner 19174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * 19274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * To be deprecated/removed, so don't bother: 19374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * public boolean mFilterMode 19474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * public boolean mQuickStart 19574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private boolean mIconResized 19674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private int mIconResizeWidth 19774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private int mIconResizeHeight 19874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * 19974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * All of these are "internal" working variables, not part of any contract 20074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private ActivityInfo mActivityInfo 20174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private Rect mTempRect 20274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private String mSuggestProviderPackage 20374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert * private String mCacheActivityContext 20474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert */ 20574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert } 20674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 207875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 208875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Combo assert for "string not null and not empty" 209875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 210875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private void assertNotEmpty(final String s) { 211875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNotNull(s); 212875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MoreAsserts.assertNotEqual(s, ""); 213875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 214875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 215875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 216875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Combo assert for "string null or (not null and not empty)" 217875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 218875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private void assertNullOrNotEmpty(final String s) { 219875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen if (s != null) { 220875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MoreAsserts.assertNotEqual(s, ""); 221875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 222875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 223875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 224875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 225875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * This is a mock for context. Used to perform a true unit test on SearchableInfo. 226875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 227875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 228875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private class MyMockContext extends MockContext { 229875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 230875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen protected Context mRealContext; 231875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen protected PackageManager mPackageManager; 232875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 233875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 234875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Constructor. 235875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 236875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param realContext Please pass in a real context for some pass-throughs to function. 237875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 238875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MyMockContext(Context realContext, PackageManager packageManager) { 239875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mRealContext = realContext; 240875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mPackageManager = packageManager; 241875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 242875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 243875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 244875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Resources. Pass through for now. 245875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 246875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 247875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public Resources getResources() { 248875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mRealContext.getResources(); 249875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 250875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 251875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 252875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Package manager. Pass through for now. 253875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 254875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 255875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public PackageManager getPackageManager() { 256875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mPackageManager; 257875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 258875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 259875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 260875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Package manager. Pass through for now. 261875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 262875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 263875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public Context createPackageContext(String packageName, int flags) 264875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen throws PackageManager.NameNotFoundException { 265875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mRealContext.createPackageContext(packageName, flags); 266875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 2670e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath 2680e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath /** 2690e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * Message broadcast. Pass through for now. 2700e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath */ 2710e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath @Override 2720e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath public void sendBroadcast(Intent intent) { 2730e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath mRealContext.sendBroadcast(intent); 2740e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath } 275875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 276875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 277875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen/** 278875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * This is a mock for package manager. Used to perform a true unit test on SearchableInfo. 279875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 280875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 281875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen private class MyMockPackageManager extends MockPackageManager { 282875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 283875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static int SEARCHABLES_PASSTHROUGH = 0; 284875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static int SEARCHABLES_MOCK_ZERO = 1; 285875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static int SEARCHABLES_MOCK_ONEGOOD = 2; 286875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public final static int SEARCHABLES_MOCK_ONEGOOD_ONEBAD = 3; 287875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 288875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen protected PackageManager mRealPackageManager; 289875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen protected int mSearchablesMode; 290875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 291875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public MyMockPackageManager(PackageManager realPM) { 292875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mRealPackageManager = realPM; 293875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mSearchablesMode = SEARCHABLES_PASSTHROUGH; 294875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 295875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 296875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 297875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Set the mode for various tests. 298875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 299875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public void setSearchablesMode(int newMode) { 300875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen switch (newMode) { 301875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_PASSTHROUGH: 302875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_MOCK_ZERO: 303875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen mSearchablesMode = newMode; 304875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen break; 305875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 306875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen default: 307875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen throw new UnsupportedOperationException(); 308875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 309875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 310875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 311875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 312875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Find activities that support a given intent. 313875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 314875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Retrieve all activities that can be performed for the given intent. 315875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 316875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param intent The desired intent as per resolveActivity(). 317875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param flags Additional option flags. The most important is 318875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * MATCH_DEFAULT_ONLY, to limit the resolution to only 319875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * those activities that support the CATEGORY_DEFAULT. 320875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 321875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return A List<ResolveInfo> containing one entry for each matching 322875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Activity. These are ordered from best to worst match -- that 323875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * is, the first item in the list is what is returned by 324875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * resolveActivity(). If there are no matching activities, an empty 325875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * list is returned. 326875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 327875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 328875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) { 329875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNotNull(intent); 330f9acde27486bcc6eea1092073f7b47c31749efd6Satish Sampath assertTrue(intent.getAction().equals(Intent.ACTION_SEARCH) 3316cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert || intent.getAction().equals(Intent.ACTION_WEB_SEARCH) 3326cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert || intent.getAction().equals(SearchManager.INTENT_ACTION_GLOBAL_SEARCH)); 333875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen switch (mSearchablesMode) { 334875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_PASSTHROUGH: 335875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mRealPackageManager.queryIntentActivities(intent, flags); 336875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_MOCK_ZERO: 337875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return null; 338875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen default: 339875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen throw new UnsupportedOperationException(); 340875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 341875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 342875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 34374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert @Override 34474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert public ResolveInfo resolveActivity(Intent intent, int flags) { 34574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert assertNotNull(intent); 3460e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath assertTrue(intent.getAction().equals(Intent.ACTION_WEB_SEARCH) 3470e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath || intent.getAction().equals(SearchManager.INTENT_ACTION_GLOBAL_SEARCH)); 34874708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert switch (mSearchablesMode) { 34974708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert case SEARCHABLES_PASSTHROUGH: 35074708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert return mRealPackageManager.resolveActivity(intent, flags); 35174708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert case SEARCHABLES_MOCK_ZERO: 35274708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert return null; 35374708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert default: 35474708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert throw new UnsupportedOperationException(); 35574708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert } 35674708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert } 35774708bbdf8d6f172b08343bdc578a20aa4b39148Bjorn Bringert 358875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 359875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Retrieve an XML file from a package. This is a low-level API used to 360875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * retrieve XML meta data. 361875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 362875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param packageName The name of the package that this xml is coming from. 363875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Can not be null. 364875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param resid The resource identifier of the desired xml. Can not be 0. 365875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param appInfo Overall information about <var>packageName</var>. This 366875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * may be null, in which case the application information will be retrieved 367875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * for you if needed; if you already have this information around, it can 368875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * be much more efficient to supply it here. 369875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 370875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return Returns an XmlPullParser allowing you to parse out the XML 371875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * data. Returns null if the xml resource could not be found for any 372875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * reason. 373875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 374875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 375875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public XmlResourceParser getXml(String packageName, int resid, ApplicationInfo appInfo) { 376875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNotNull(packageName); 377875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MoreAsserts.assertNotEqual(packageName, ""); 378875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MoreAsserts.assertNotEqual(resid, 0); 379875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen switch (mSearchablesMode) { 380875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_PASSTHROUGH: 381875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mRealPackageManager.getXml(packageName, resid, appInfo); 382875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_MOCK_ZERO: 383875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen default: 384875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen throw new UnsupportedOperationException(); 385875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 386875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 387875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 388875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen /** 389875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * Find a single content provider by its base path name. 390875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 391875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param name The name of the provider to find. 392875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @param flags Additional option flags. Currently should always be 0. 393875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * 394875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * @return ContentProviderInfo Information about the provider, if found, 395875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen * else null. 396875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen */ 397875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen @Override 398875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen public ProviderInfo resolveContentProvider(String name, int flags) { 399875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertNotNull(name); 400875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen MoreAsserts.assertNotEqual(name, ""); 401875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen assertEquals(flags, 0); 402875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen switch (mSearchablesMode) { 403875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_PASSTHROUGH: 404875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen return mRealPackageManager.resolveContentProvider(name, flags); 405875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen case SEARCHABLES_MOCK_ZERO: 406875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen default: 407875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen throw new UnsupportedOperationException(); 408875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 409875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 4100e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath 4110e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath /** 4120e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * Get the activity information for a particular activity. 4130e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * 4140e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * @param name The name of the activity to find. 4150e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * @param flags Additional option flags. 4160e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * 4170e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath * @return ActivityInfo Information about the activity, if found, else null. 4180e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath */ 4190e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath @Override 4200e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath public ActivityInfo getActivityInfo(ComponentName name, int flags) 4210e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath throws NameNotFoundException { 4220e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath assertNotNull(name); 4230e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath MoreAsserts.assertNotEqual(name, ""); 4240e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath switch (mSearchablesMode) { 4250e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath case SEARCHABLES_PASSTHROUGH: 4260e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath return mRealPackageManager.getActivityInfo(name, flags); 4270e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath case SEARCHABLES_MOCK_ZERO: 4280e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath throw new NameNotFoundException(); 4290e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath default: 4300e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath throw new UnsupportedOperationException(); 4310e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath } 4320e74aa0f7ed90d46e0bdde02bf9b7b29c6b95bd8Satish Sampath } 4336cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert 4346cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert @Override 4356cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert public int checkPermission(String permName, String pkgName) { 4366cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert assertNotNull(permName); 4376cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert assertNotNull(pkgName); 4386cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert switch (mSearchablesMode) { 4396cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert case SEARCHABLES_PASSTHROUGH: 4406cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return mRealPackageManager.checkPermission(permName, pkgName); 4416cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert case SEARCHABLES_MOCK_ZERO: 4426cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert return PackageManager.PERMISSION_DENIED; 4436cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert default: 4446cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert throw new UnsupportedOperationException(); 4456cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } 4466cf7a325e6e9e70d9858e21fbb438341332ed254Bjorn Bringert } 447875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen } 448875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen} 449875d50a4b9294b2be33cff6493cae7acd1d07ea7Karl Rosaen 450