14557342eeab7018e2edece1d3265819737d078fcDianne Hackborn/* 24557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * Copyright (C) 2011 The Android Open Source Project 34557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * 44557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 54557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * you may not use this file except in compliance with the License. 64557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * You may obtain a copy of the License at 74557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * 84557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 94557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * 104557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * Unless required by applicable law or agreed to in writing, software 114557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 124557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * See the License for the specific language governing permissions and 144557342eeab7018e2edece1d3265819737d078fcDianne Hackborn * limitations under the License. 154557342eeab7018e2edece1d3265819737d078fcDianne Hackborn */ 164557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 174557342eeab7018e2edece1d3265819737d078fcDianne Hackbornpackage com.example.android.supportv13; 184557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 194557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.app.ListActivity; 204557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.content.Intent; 214557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.content.pm.PackageManager; 224557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.content.pm.ResolveInfo; 234557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.os.Bundle; 244557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.view.View; 254557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.widget.ListView; 264557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport android.widget.SimpleAdapter; 274557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 284557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.text.Collator; 294557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.ArrayList; 304557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.Collections; 314557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.Comparator; 324557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.HashMap; 334557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.List; 344557342eeab7018e2edece1d3265819737d078fcDianne Hackbornimport java.util.Map; 354557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 364557342eeab7018e2edece1d3265819737d078fcDianne Hackbornpublic class Support13Demos extends ListActivity { 374557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 384557342eeab7018e2edece1d3265819737d078fcDianne Hackborn @Override 394557342eeab7018e2edece1d3265819737d078fcDianne Hackborn public void onCreate(Bundle savedInstanceState) { 404557342eeab7018e2edece1d3265819737d078fcDianne Hackborn super.onCreate(savedInstanceState); 414557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 424557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Intent intent = getIntent(); 434557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String path = intent.getStringExtra("com.example.android.apis.Path"); 444557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 454557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if (path == null) { 464557342eeab7018e2edece1d3265819737d078fcDianne Hackborn path = ""; 474557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 484557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 494557342eeab7018e2edece1d3265819737d078fcDianne Hackborn setListAdapter(new SimpleAdapter(this, getData(path), 504557342eeab7018e2edece1d3265819737d078fcDianne Hackborn android.R.layout.simple_list_item_1, new String[] { "title" }, 514557342eeab7018e2edece1d3265819737d078fcDianne Hackborn new int[] { android.R.id.text1 })); 524557342eeab7018e2edece1d3265819737d078fcDianne Hackborn getListView().setTextFilterEnabled(true); 534557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 544557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 554557342eeab7018e2edece1d3265819737d078fcDianne Hackborn protected List<Map<String, Object>> getData(String prefix) { 564557342eeab7018e2edece1d3265819737d078fcDianne Hackborn List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>(); 574557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 584557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 594557342eeab7018e2edece1d3265819737d078fcDianne Hackborn mainIntent.addCategory("com.example.android.supportv13.SUPPORT13_SAMPLE_CODE"); 604557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 614557342eeab7018e2edece1d3265819737d078fcDianne Hackborn PackageManager pm = getPackageManager(); 624557342eeab7018e2edece1d3265819737d078fcDianne Hackborn List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0); 634557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 644557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if (null == list) 654557342eeab7018e2edece1d3265819737d078fcDianne Hackborn return myData; 664557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 674557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String[] prefixPath; 684557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String prefixWithSlash = prefix; 694557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 704557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if (prefix.equals("")) { 714557342eeab7018e2edece1d3265819737d078fcDianne Hackborn prefixPath = null; 724557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } else { 734557342eeab7018e2edece1d3265819737d078fcDianne Hackborn prefixPath = prefix.split("/"); 744557342eeab7018e2edece1d3265819737d078fcDianne Hackborn prefixWithSlash = prefix + "/"; 754557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 764557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 774557342eeab7018e2edece1d3265819737d078fcDianne Hackborn int len = list.size(); 784557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 794557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Map<String, Boolean> entries = new HashMap<String, Boolean>(); 804557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 814557342eeab7018e2edece1d3265819737d078fcDianne Hackborn for (int i = 0; i < len; i++) { 824557342eeab7018e2edece1d3265819737d078fcDianne Hackborn ResolveInfo info = list.get(i); 834557342eeab7018e2edece1d3265819737d078fcDianne Hackborn CharSequence labelSeq = info.loadLabel(pm); 844557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String label = labelSeq != null 854557342eeab7018e2edece1d3265819737d078fcDianne Hackborn ? labelSeq.toString() 864557342eeab7018e2edece1d3265819737d078fcDianne Hackborn : info.activityInfo.name; 874557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 884557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) { 894557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 904557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String[] labelPath = label.split("/"); 914557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 924557342eeab7018e2edece1d3265819737d078fcDianne Hackborn String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; 934557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 944557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) { 954557342eeab7018e2edece1d3265819737d078fcDianne Hackborn addItem(myData, nextLabel, activityIntent( 964557342eeab7018e2edece1d3265819737d078fcDianne Hackborn info.activityInfo.applicationInfo.packageName, 974557342eeab7018e2edece1d3265819737d078fcDianne Hackborn info.activityInfo.name)); 984557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } else { 994557342eeab7018e2edece1d3265819737d078fcDianne Hackborn if (entries.get(nextLabel) == null) { 1004557342eeab7018e2edece1d3265819737d078fcDianne Hackborn addItem(myData, nextLabel, browseIntent(prefix.equals("") ? nextLabel : prefix + "/" + nextLabel)); 1014557342eeab7018e2edece1d3265819737d078fcDianne Hackborn entries.put(nextLabel, true); 1024557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1034557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1044557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1054557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1064557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1074557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Collections.sort(myData, sDisplayNameComparator); 1084557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1094557342eeab7018e2edece1d3265819737d078fcDianne Hackborn return myData; 1104557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1114557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1124557342eeab7018e2edece1d3265819737d078fcDianne Hackborn private final static Comparator<Map<String, Object>> sDisplayNameComparator = 1134557342eeab7018e2edece1d3265819737d078fcDianne Hackborn new Comparator<Map<String, Object>>() { 1144557342eeab7018e2edece1d3265819737d078fcDianne Hackborn private final Collator collator = Collator.getInstance(); 1154557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1164557342eeab7018e2edece1d3265819737d078fcDianne Hackborn public int compare(Map<String, Object> map1, Map<String, Object> map2) { 1174557342eeab7018e2edece1d3265819737d078fcDianne Hackborn return collator.compare(map1.get("title"), map2.get("title")); 1184557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1194557342eeab7018e2edece1d3265819737d078fcDianne Hackborn }; 1204557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1214557342eeab7018e2edece1d3265819737d078fcDianne Hackborn protected Intent activityIntent(String pkg, String componentName) { 1224557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Intent result = new Intent(); 1234557342eeab7018e2edece1d3265819737d078fcDianne Hackborn result.setClassName(pkg, componentName); 1244557342eeab7018e2edece1d3265819737d078fcDianne Hackborn return result; 1254557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1264557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1274557342eeab7018e2edece1d3265819737d078fcDianne Hackborn protected Intent browseIntent(String path) { 1284557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Intent result = new Intent(); 1294557342eeab7018e2edece1d3265819737d078fcDianne Hackborn result.setClass(this, Support13Demos.class); 1304557342eeab7018e2edece1d3265819737d078fcDianne Hackborn result.putExtra("com.example.android.apis.Path", path); 1314557342eeab7018e2edece1d3265819737d078fcDianne Hackborn return result; 1324557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1334557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1344557342eeab7018e2edece1d3265819737d078fcDianne Hackborn protected void addItem(List<Map<String, Object>> data, String name, Intent intent) { 1354557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Map<String, Object> temp = new HashMap<String, Object>(); 1364557342eeab7018e2edece1d3265819737d078fcDianne Hackborn temp.put("title", name); 1374557342eeab7018e2edece1d3265819737d078fcDianne Hackborn temp.put("intent", intent); 1384557342eeab7018e2edece1d3265819737d078fcDianne Hackborn data.add(temp); 1394557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1404557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1414557342eeab7018e2edece1d3265819737d078fcDianne Hackborn @Override 1424557342eeab7018e2edece1d3265819737d078fcDianne Hackborn @SuppressWarnings("unchecked") 1434557342eeab7018e2edece1d3265819737d078fcDianne Hackborn protected void onListItemClick(ListView l, View v, int position, long id) { 1444557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position); 1454557342eeab7018e2edece1d3265819737d078fcDianne Hackborn 1464557342eeab7018e2edece1d3265819737d078fcDianne Hackborn Intent intent = (Intent) map.get("intent"); 1474557342eeab7018e2edece1d3265819737d078fcDianne Hackborn startActivity(intent); 1484557342eeab7018e2edece1d3265819737d078fcDianne Hackborn } 1494557342eeab7018e2edece1d3265819737d078fcDianne Hackborn} 150