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