18a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik/* 28a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * Copyright (C) 2015 The Android Open Source Project 38a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * 48a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * Licensed under the Apache License, Version 2.0 (the "License"); 58a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * you may not use this file except in compliance with the License. 68a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * You may obtain a copy of the License at 78a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * 88a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * http://www.apache.org/licenses/LICENSE-2.0 98a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * 108a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * Unless required by applicable law or agreed to in writing, software 118a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * distributed under the License is distributed on an "AS IS" BASIS, 128a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * See the License for the specific language governing permissions and 148a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik * limitations under the License. 158a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik */ 168a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikpackage com.android.test.uibench; 178a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 188a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.content.Intent; 198a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.content.pm.PackageManager; 208a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.content.pm.ResolveInfo; 218a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.os.Bundle; 228a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.support.v4.app.FragmentManager; 238a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.support.v4.app.ListFragment; 248a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.support.v7.app.AppCompatActivity; 258a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.view.View; 268a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.widget.ListView; 278a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport android.widget.SimpleAdapter; 288a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 298a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.text.Collator; 308a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.ArrayList; 318a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.Collections; 328a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.Comparator; 338a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.HashMap; 348a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.List; 358a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikimport java.util.Map; 368a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 378a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craikpublic class MainActivity extends AppCompatActivity { 388a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik private static final String EXTRA_PATH = "activity_path"; 398a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik private static final String CATEGORY_HWUI_TEST = "com.android.test.uibench.TEST"; 408a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 418a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik @Override 428a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik public void onCreate(Bundle savedInstanceState) { 438a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik super.onCreate(savedInstanceState); 448a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 458a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Intent intent = getIntent(); 468a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String path = intent.getStringExtra(EXTRA_PATH); 478a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 488a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (path == null) { 498a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik path = ""; 508a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } else { 518a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik // not root level, display where we are in the hierarchy 528a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik setTitle(path); 538a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 548a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 558a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik FragmentManager fm = getSupportFragmentManager(); 568a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (fm.findFragmentById(android.R.id.content) == null) { 578a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik ListFragment listFragment = new ListFragment() { 588a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik @Override 5965b04b617f7250927a1b3a4c200a768055435ffdChris Craik @SuppressWarnings("unchecked") 608a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik public void onListItemClick(ListView l, View v, int position, long id) { 618a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position); 628a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 638a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Intent intent = (Intent) map.get("intent"); 648a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik startActivity(intent); 658a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 668a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 678a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik @Override 688a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik public void onViewCreated(View view, Bundle savedInstanceState) { 698a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik super.onViewCreated(view, savedInstanceState); 708a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik getListView().setTextFilterEnabled(true); 718a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 728a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik }; 738a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik listFragment.setListAdapter(new SimpleAdapter(this, getData(path), 748a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik android.R.layout.simple_list_item_1, new String[] { "title" }, 758a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik new int[] { android.R.id.text1 })); 768a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik fm.beginTransaction().add(android.R.id.content, listFragment).commit(); 778a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 788a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 798a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 808a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik protected List<Map<String, Object>> getData(String prefix) { 818a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik List<Map<String, Object>> myData = new ArrayList<>(); 828a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 838a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 848a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik mainIntent.addCategory(CATEGORY_HWUI_TEST); 858a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 868a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik PackageManager pm = getPackageManager(); 878a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0); 888a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 898a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (null == list) 908a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik return myData; 918a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 928a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String[] prefixPath; 938a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String prefixWithSlash = prefix; 948a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 958a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (prefix.equals("")) { 968a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik prefixPath = null; 978a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } else { 988a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik prefixPath = prefix.split("/"); 998a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik prefixWithSlash = prefix + "/"; 1008a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1018a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1028a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik int len = list.size(); 1038a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1048a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Map<String, Boolean> entries = new HashMap<>(); 1058a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1068a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik for (int i = 0; i < len; i++) { 1078a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik ResolveInfo info = list.get(i); 1088a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik CharSequence labelSeq = info.loadLabel(pm); 1098a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String label = labelSeq != null 1108a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik ? labelSeq.toString() 1118a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik : info.activityInfo.name; 1128a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1138a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) { 1148a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1158a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String[] labelPath = label.split("/"); 1168a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1178a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; 1188a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1198a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) { 1208a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik addItem(myData, nextLabel, activityIntent( 1218a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik info.activityInfo.applicationInfo.packageName, 1228a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik info.activityInfo.name)); 1238a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } else { 1248a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik if (entries.get(nextLabel) == null) { 1258a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik addItem(myData, nextLabel, browseIntent(prefix.equals("") ? 1268a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik nextLabel : prefix + "/" + nextLabel)); 1278a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik entries.put(nextLabel, true); 1288a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1298a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1308a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1318a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1328a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1338a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Collections.sort(myData, sDisplayNameComparator); 1348a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1358a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik return myData; 1368a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1378a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1388a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik private final static Comparator<Map<String, Object>> sDisplayNameComparator = 1398a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik new Comparator<Map<String, Object>>() { 1408a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik private final Collator collator = Collator.getInstance(); 1418a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1428a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik public int compare(Map<String, Object> map1, Map<String, Object> map2) { 1438a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik return collator.compare(map1.get("title"), map2.get("title")); 1448a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1458a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik }; 1468a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1478a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik protected Intent activityIntent(String pkg, String componentName) { 1488a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Intent result = new Intent(); 1498a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik result.setClassName(pkg, componentName); 1508a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik return result; 1518a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1528a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1538a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik protected Intent browseIntent(String path) { 1548a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Intent result = new Intent(); 1558a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik result.setClass(this, MainActivity.class); 1568a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik result.putExtra(EXTRA_PATH, path); 1578a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik return result; 1588a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1598a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik 1608a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik protected void addItem(List<Map<String, Object>> data, String name, Intent intent) { 1618a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik Map<String, Object> temp = new HashMap<>(); 1628a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik temp.put("title", name); 1638a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik temp.put("intent", intent); 1648a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik data.add(temp); 1658a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik } 1668a1c0e851392c1c93a04d622a57331d3c60e8e45Chris Craik} 167