UsageStatsActivity.java revision 8d7be7b738cce9facdd8832aa845ceb79c19ffc6
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;
208d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.app.usage.PackageUsageStats;
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 Lesinski
288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport java.text.DateFormat;
29afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.ArrayList;
308d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport java.util.Calendar;
31afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Collections;
32afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Comparator;
33afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Map;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
358d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.text.format.DateUtils;
368d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.util.ArrayMap;
37afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Spinner;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView.OnItemSelectedListener;
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 */
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectpublic class UsageStats 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;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
598d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public static class AppNameComparator implements Comparator<PackageUsageStats> {
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
678d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        public final int compare(PackageUsageStats a, PackageUsageStats 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
748d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public static class LastTimeUsedComparator implements Comparator<PackageUsageStats> {
758d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
768d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        public final int compare(PackageUsageStats a, PackageUsageStats 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    }
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
828d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public static class UsageTimeComparator implements Comparator<PackageUsageStats> {
838d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
848d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        public final int compare(PackageUsageStats a, PackageUsageStats b) {
858d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return (int)(b.getTotalTimeSpent() - a.getTotalTimeSpent());
86afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
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    }
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
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;
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
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<>();
1078d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private final ArrayList<PackageUsageStats> 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
1138d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            final android.app.usage.UsageStats stats =
1148d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    mUsageStatsManager.getRecentStatsSince(cal.getTimeInMillis());
1158d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            if (stats == null) {
116afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
117afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1188d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1198d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            final int pkgCount = stats.getPackageCount();
1208d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            for (int i = 0; i < pkgCount; i++) {
1218d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                final PackageUsageStats pkgStats = stats.getPackage(i);
1228d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1238d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                // load application labels for each application
1248d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                try {
1258d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    ApplicationInfo appInfo = mPm.getApplicationInfo(pkgStats.getPackageName(), 0);
1268d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    String label = appInfo.loadLabel(mPm).toString();
1278d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    mAppLabelMap.put(pkgStats.getPackageName(), label);
1288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    mPackageStats.add(pkgStats);
129afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                } catch (NameNotFoundException e) {
1308d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    // This package may be gone.
131afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
132afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           }
1338d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
134afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           // Sort list
135afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           mAppLabelComparator = new AppNameComparator(mAppLabelMap);
136afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project           sortList();
137afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1388d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1398d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
1418d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.size();
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
143afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1448d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
145afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
1468d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.get(position);
147afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
148afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1498d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
150afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
151afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return position;
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
153afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1548d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
156afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // A ViewHolder keeps references to children views to avoid unneccessary calls
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
158afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            AppViewHolder holder;
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // When convertView is not null, we can reuse it directly, there is no need
161afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to reinflate it. We only inflate a new View when the convertView supplied
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // by ListView is null.
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (convertView == null) {
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView = mInflater.inflate(R.layout.usage_stats_item, null);
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
166afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Creates a ViewHolder and store references to the two children views
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // we want to bind data to.
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = new AppViewHolder();
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName = (TextView) convertView.findViewById(R.id.package_name);
1708d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used);
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time);
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView.setTag(holder);
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Get the ViewHolder back to get fast access to the TextView
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // and the ImageView.
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = (AppViewHolder) convertView.getTag();
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
1808d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            PackageUsageStats pkgStats = mPackageStats.get(position);
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (pkgStats != null) {
1828d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                String label = mAppLabelMap.get(pkgStats.getPackageName());
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName.setText(label);
1848d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed.setText(DateUtils.formatSameDayTime(pkgStats.getLastTimeUsed(),
1858d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                        System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM));
1868d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.usageTime.setText(
1878d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                        DateUtils.formatElapsedTime(pkgStats.getTotalTimeSpent() / 1000));
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
1898762093e0094e09493fa6cbac8e8fbf265f18165Michael Chan                Log.w(TAG, "No usage stats info for package:" + position);
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
192afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
194afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        void sortList(int sortOrder) {
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == sortOrder) {
196afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // do nothing
197afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
198afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
199afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDisplayOrder= sortOrder;
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            sortList();
201afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private void sortList() {
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) {
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by usage time");
2058d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mUsageTimeComparator);
2068d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            } else if (mDisplayOrder == _DISPLAY_ORDER_LAST_TIME_USED) {
2078d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                if (localLOGV) Log.i(TAG, "Sorting by last time used");
2088d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mLastTimeUsedComparator);
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) {
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by application name");
2118d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mAppLabelComparator);
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            notifyDataSetChanged();
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
217afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
2188d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
219afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
220afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
2218d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        setContentView(R.layout.usage_stats);
2228d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2238d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
2268d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2278d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        Spinner typeSpinner = (Spinner) findViewById(R.id.typeSpinner);
2288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        typeSpinner.setOnItemSelectedListener(this);
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2308d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        ListView listView = (ListView) findViewById(R.id.pkg_list);
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter = new UsageStatsAdapter();
2328d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        listView.setAdapter(mAdapter);
233afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
234afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2358d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
2368d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter.sortList(position);
238afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
239afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2408d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
241afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onNothingSelected(AdapterView<?> parent) {
242afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // do nothing
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
244afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
246