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