1afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
2afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
4afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); you may not
5afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * use this file except in compliance with the License. You may obtain a copy
6afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * of the License at
7afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
8afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0
9afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project *
10afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * License for the specific language governing permissions and limitations
14afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * under the License.
15afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
16afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
17afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpackage com.android.settings;
18afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
19afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.app.Activity;
201789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinskiimport android.app.usage.UsageStats;
218d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.app.usage.UsageStatsManager;
22afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.Context;
23afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.ApplicationInfo;
24afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager;
25afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.content.pm.PackageManager.NameNotFoundException;
26afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.os.Bundle;
278d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.text.format.DateUtils;
288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.util.ArrayMap;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
30afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
3439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport android.widget.AdapterView.OnItemSelectedListener;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
36afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Spinner;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
3939b467482d1bf256a111c757e9b7621c6f523271Jason Monk
4039b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.text.DateFormat;
4139b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.ArrayList;
4239b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.Calendar;
4339b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.Collections;
4439b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.Comparator;
4539b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.List;
4639b467482d1bf256a111c757e9b7621c6f523271Jason Monkimport java.util.Map;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display package usage statistics.
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
511789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinskipublic class UsageStatsActivity extends Activity implements OnItemSelectedListener {
528d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    private static final String TAG = "UsageStatsActivity";
53b8eb474b924254839248d9227b2e04cb5f4e891fChristian Mehlmauer    private static final boolean localLOGV = false;
548d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    private UsageStatsManager mUsageStatsManager;
55afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private UsageStatsAdapter mAdapter;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
581789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
591789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class AppNameComparator implements Comparator<UsageStats> {
608d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private Map<String, String> mAppLabelList;
618d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
628d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        AppNameComparator(Map<String, String> appList) {
63afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppLabelList = appList;
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
658d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
668d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
671789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
688d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            String alabel = mAppLabelList.get(a.getPackageName());
698d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            String blabel = mAppLabelList.get(b.getPackageName());
70afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return alabel.compareTo(blabel);
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
738d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
741789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class LastTimeUsedComparator implements Comparator<UsageStats> {
758d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
761789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
77afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // return by descending order
788d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return (int)(b.getLastTimeUsed() - a.getLastTimeUsed());
79afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
811789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
821789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class UsageTimeComparator implements Comparator<UsageStats> {
838d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
841789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
851789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            return (int)(b.getTotalTimeInForeground() - a.getTotalTimeInForeground());
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
881789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
898d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    // View Holder used when displaying views
90afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static class AppViewHolder {
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        TextView pkgName;
928d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        TextView lastTimeUsed;
93afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        TextView usageTime;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
951789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
96afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class UsageStatsAdapter extends BaseAdapter {
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Constants defining order for display order
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private static final int _DISPLAY_ORDER_USAGE_TIME = 0;
998d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private static final int _DISPLAY_ORDER_LAST_TIME_USED = 1;
100afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private static final int _DISPLAY_ORDER_APP_NAME = 2;
1011789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
102afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME;
1038d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private LastTimeUsedComparator mLastTimeUsedComparator = new LastTimeUsedComparator();
1048d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private UsageTimeComparator mUsageTimeComparator = new UsageTimeComparator();
105afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private AppNameComparator mAppLabelComparator;
1068d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private final ArrayMap<String, String> mAppLabelMap = new ArrayMap<>();
1071789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        private final ArrayList<UsageStats> mPackageStats = new ArrayList<>();
1088d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
109afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        UsageStatsAdapter() {
1108d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            Calendar cal = Calendar.getInstance();
1118d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            cal.add(Calendar.DAY_OF_YEAR, -5);
1128d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1131789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            final List<UsageStats> stats =
1141789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,
1151789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                            cal.getTimeInMillis(), System.currentTimeMillis());
1168d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            if (stats == null) {
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1198d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1201789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            ArrayMap<String, UsageStats> map = new ArrayMap<>();
1211789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            final int statCount = stats.size();
1221789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            for (int i = 0; i < statCount; i++) {
1231789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                final android.app.usage.UsageStats pkgStats = stats.get(i);
1248d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1258d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                // load application labels for each application
1268d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                try {
1278d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    ApplicationInfo appInfo = mPm.getApplicationInfo(pkgStats.getPackageName(), 0);
1288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    String label = appInfo.loadLabel(mPm).toString();
1298d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    mAppLabelMap.put(pkgStats.getPackageName(), label);
1301789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
1311789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    UsageStats existingStats =
1321789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                            map.get(pkgStats.getPackageName());
1331789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    if (existingStats == null) {
1341789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        map.put(pkgStats.getPackageName(), pkgStats);
1351789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    } else {
1361789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        existingStats.add(pkgStats);
1371789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    }
1381789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
139afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                } catch (NameNotFoundException e) {
1408d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    // This package may be gone.
141afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
1421789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            }
1431789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            mPackageStats.addAll(map.values());
1448d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1451789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            // Sort list
1461789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            mAppLabelComparator = new AppNameComparator(mAppLabelMap);
1471789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            sortList();
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1498d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1508d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
1528d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.size();
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1558d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
1578d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.get(position);
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1608d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return position;
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1658d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // A ViewHolder keeps references to children views to avoid unneccessary calls
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            AppViewHolder holder;
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // When convertView is not null, we can reuse it directly, there is no need
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to reinflate it. We only inflate a new View when the convertView supplied
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // by ListView is null.
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (convertView == null) {
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView = mInflater.inflate(R.layout.usage_stats_item, null);
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Creates a ViewHolder and store references to the two children views
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // we want to bind data to.
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = new AppViewHolder();
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName = (TextView) convertView.findViewById(R.id.package_name);
1818d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used);
182afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time);
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView.setTag(holder);
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Get the ViewHolder back to get fast access to the TextView
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // and the ImageView.
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = (AppViewHolder) convertView.getTag();
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
1911789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            UsageStats pkgStats = mPackageStats.get(position);
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (pkgStats != null) {
1938d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                String label = mAppLabelMap.get(pkgStats.getPackageName());
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName.setText(label);
1958d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed.setText(DateUtils.formatSameDayTime(pkgStats.getLastTimeUsed(),
1968d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                        System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM));
1978d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.usageTime.setText(
1981789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        DateUtils.formatElapsedTime(pkgStats.getTotalTimeInForeground() / 1000));
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
2008762093e0094e09493fa6cbac8e8fbf265f18165Michael Chan                Log.w(TAG, "No usage stats info for package:" + position);
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
2041789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
205afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        void sortList(int sortOrder) {
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == sortOrder) {
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // do nothing
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDisplayOrder= sortOrder;
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            sortList();
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private void sortList() {
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) {
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by usage time");
2168d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mUsageTimeComparator);
2178d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            } else if (mDisplayOrder == _DISPLAY_ORDER_LAST_TIME_USED) {
2188d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                if (localLOGV) Log.i(TAG, "Sorting by last time used");
2198d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mLastTimeUsedComparator);
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) {
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by application name");
2228d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mAppLabelComparator);
223afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            notifyDataSetChanged();
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
2298d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
230afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
2328d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        setContentView(R.layout.usage_stats);
2338d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2348d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
235afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
2378d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2388d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        Spinner typeSpinner = (Spinner) findViewById(R.id.typeSpinner);
2398d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        typeSpinner.setOnItemSelectedListener(this);
2401789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
2418d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        ListView listView = (ListView) findViewById(R.id.pkg_list);
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter = new UsageStatsAdapter();
2438d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        listView.setAdapter(mAdapter);
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2468d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
2478d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
248afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter.sortList(position);
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2518d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
252afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onNothingSelected(AdapterView<?> parent) {
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // do nothing
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
256