1ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown/* 2ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * Copyright (C) 2013 The Android Open Source Project 3ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * 4ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * Licensed under the Apache License, Version 2.0 (the "License"); 5ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * you may not use this file except in compliance with the License. 6ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * You may obtain a copy of the License at 7ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * 8ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * http://www.apache.org/licenses/LICENSE-2.0 9ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * 10ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * Unless required by applicable law or agreed to in writing, software 11ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * distributed under the License is distributed on an "AS IS" BASIS, 12ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * See the License for the specific language governing permissions and 14ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown * limitations under the License. 15ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown */ 16ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 17ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownpackage com.example.android.supportv7; 18ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 19ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.app.ListActivity; 20ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.content.Intent; 21ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.content.pm.PackageManager; 22ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.content.pm.ResolveInfo; 23ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.os.Bundle; 24ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.view.View; 25ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.widget.ListView; 26ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport android.widget.SimpleAdapter; 27ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 28ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.text.Collator; 29ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.ArrayList; 30ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.Collections; 31ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.Comparator; 32ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.HashMap; 33ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.List; 34ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownimport java.util.Map; 35ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 36ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brownpublic class Support7Demos extends ListActivity { 37ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 38ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown @Override 39ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown public void onCreate(Bundle savedInstanceState) { 40ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown super.onCreate(savedInstanceState); 41ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 42ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Intent intent = getIntent(); 43ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String path = intent.getStringExtra("com.example.android.apis.Path"); 44ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 45ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if (path == null) { 46ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown path = ""; 47ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 48ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 49ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown setListAdapter(new SimpleAdapter(this, getData(path), 50ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown android.R.layout.simple_list_item_1, new String[] { "title" }, 51ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown new int[] { android.R.id.text1 })); 52ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown getListView().setTextFilterEnabled(true); 53ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 54ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 55ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown protected List<Map<String, Object>> getData(String prefix) { 56ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown List<Map<String, Object>> myData = new ArrayList<Map<String, Object>>(); 57ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 58ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Intent mainIntent = new Intent(Intent.ACTION_MAIN, null); 59e1ab8c5ca7ab8e6d9a6124ad292363ebd67857d9Jeff Brown mainIntent.addCategory("com.example.android.supportv7.SAMPLE_CODE"); 60ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 61ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown PackageManager pm = getPackageManager(); 62ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0); 63ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 64ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if (null == list) 65ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown return myData; 66ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 67ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String[] prefixPath; 68ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String prefixWithSlash = prefix; 69ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 70ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if (prefix.equals("")) { 71ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown prefixPath = null; 72ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } else { 73ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown prefixPath = prefix.split("/"); 74ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown prefixWithSlash = prefix + "/"; 75ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 76ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 77ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown int len = list.size(); 78ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 79ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Map<String, Boolean> entries = new HashMap<String, Boolean>(); 80ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 81ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown for (int i = 0; i < len; i++) { 82ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown ResolveInfo info = list.get(i); 83ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown CharSequence labelSeq = info.loadLabel(pm); 84ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String label = labelSeq != null 85ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown ? labelSeq.toString() 86ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown : info.activityInfo.name; 87ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 88ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if (prefixWithSlash.length() == 0 || label.startsWith(prefixWithSlash)) { 89ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 90ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String[] labelPath = label.split("/"); 91ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 92ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown String nextLabel = prefixPath == null ? labelPath[0] : labelPath[prefixPath.length]; 93ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 94ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if ((prefixPath != null ? prefixPath.length : 0) == labelPath.length - 1) { 95ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown addItem(myData, nextLabel, activityIntent( 96ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown info.activityInfo.applicationInfo.packageName, 97ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown info.activityInfo.name)); 98ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } else { 99ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown if (entries.get(nextLabel) == null) { 100ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown addItem(myData, nextLabel, browseIntent( 101ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown prefix.equals("") ? nextLabel : prefix + "/" + nextLabel)); 102ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown entries.put(nextLabel, true); 103ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 104ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 105ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 106ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 107ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 108ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Collections.sort(myData, sDisplayNameComparator); 109ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 110ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown return myData; 111ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 112ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 113ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown private final static Comparator<Map<String, Object>> sDisplayNameComparator = 114ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown new Comparator<Map<String, Object>>() { 115ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown private final Collator collator = Collator.getInstance(); 116ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 117ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown @Override 118ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown public int compare(Map<String, Object> map1, Map<String, Object> map2) { 119ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown return collator.compare(map1.get("title"), map2.get("title")); 120ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 121ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown }; 122ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 123ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown protected Intent activityIntent(String pkg, String componentName) { 124ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Intent result = new Intent(); 125ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown result.setClassName(pkg, componentName); 126ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown return result; 127ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 128ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 129ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown protected Intent browseIntent(String path) { 130ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Intent result = new Intent(); 131ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown result.setClass(this, Support7Demos.class); 132ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown result.putExtra("com.example.android.apis.Path", path); 133ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown return result; 134ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 135ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 136ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown protected void addItem(List<Map<String, Object>> data, String name, Intent intent) { 137ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Map<String, Object> temp = new HashMap<String, Object>(); 138ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown temp.put("title", name); 139ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown temp.put("intent", intent); 140ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown data.add(temp); 141ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 142ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 143ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown @Override 144ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown @SuppressWarnings("unchecked") 145ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown protected void onListItemClick(ListView l, View v, int position, long id) { 146ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Map<String, Object> map = (Map<String, Object>)l.getItemAtPosition(position); 147ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown 148ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown Intent intent = (Intent) map.get("intent"); 149ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown startActivity(intent); 150ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown } 151ecdd1b114d4fb36682cdabe205e08e6f68f79f63Jeff Brown} 152