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