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
17814a8d35ae11b70027e0e476ca1c0bb589106b4dAmith Yamasanipackage com.android.server.search;
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;
33814a8d35ae11b70027e0e476ca1c0bb589106b4dAmith Yamasaniimport com.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
745bb87cd9b81506b0c25d3f9184e406762a9e9d9cAmith Yamasani        Searchables searchables = new Searchables(mContext, 0);
754175be2f4e1e27490f38c387525d0c0cba88b47bJeff Sharkey        searchables.updateSearchableList();
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);
1065bb87cd9b81506b0c25d3f9184e406762a9e9d9cAmith Yamasani        Searchables searchables = new Searchables(mockContext, 0);
1074175be2f4e1e27490f38c387525d0c0cba88b47bJeff Sharkey        searchables.updateSearchableList();
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);
1255bb87cd9b81506b0c25d3f9184e406762a9e9d9cAmith Yamasani        Searchables searchables = new Searchables(mockContext, 0);
1264175be2f4e1e27490f38c387525d0c0cba88b47bJeff Sharkey        searchables.updateSearchableList();
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