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 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;
331789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinskiimport java.util.List;
34afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport java.util.Map;
35afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
368d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.text.format.DateUtils;
378d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinskiimport android.util.ArrayMap;
38afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.util.Log;
39afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.LayoutInflater;
40afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.View;
41afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.view.ViewGroup;
42afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView;
43afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.BaseAdapter;
44afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.ListView;
45afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.Spinner;
46afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.TextView;
47afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Projectimport android.widget.AdapterView.OnItemSelectedListener;
48afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
49afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project/**
50afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project * Activity to display package usage statistics.
51afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project */
521789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinskipublic class UsageStatsActivity extends Activity implements OnItemSelectedListener {
538d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    private static final String TAG = "UsageStatsActivity";
54b8eb474b924254839248d9227b2e04cb5f4e891fChristian Mehlmauer    private static final boolean localLOGV = false;
558d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    private UsageStatsManager mUsageStatsManager;
56afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private LayoutInflater mInflater;
57afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private UsageStatsAdapter mAdapter;
58afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    private PackageManager mPm;
591789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
601789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class AppNameComparator implements Comparator<UsageStats> {
618d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private Map<String, String> mAppLabelList;
628d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
638d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        AppNameComparator(Map<String, String> appList) {
64afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mAppLabelList = appList;
65afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
668d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
678d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
681789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
698d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            String alabel = mAppLabelList.get(a.getPackageName());
708d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            String blabel = mAppLabelList.get(b.getPackageName());
71afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return alabel.compareTo(blabel);
72afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
73afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
748d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
751789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class LastTimeUsedComparator implements Comparator<UsageStats> {
768d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
771789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
78afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // return by descending order
798d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return (int)(b.getLastTimeUsed() - a.getLastTimeUsed());
80afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
81afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
821789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
831789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski    public static class UsageTimeComparator implements Comparator<UsageStats> {
848d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
851789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        public final int compare(UsageStats a, UsageStats b) {
861789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            return (int)(b.getTotalTimeInForeground() - a.getTotalTimeInForeground());
87afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
88afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
891789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
908d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    // View Holder used when displaying views
91afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    static class AppViewHolder {
92afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        TextView pkgName;
938d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        TextView lastTimeUsed;
94afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        TextView usageTime;
95afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
961789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
97afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    class UsageStatsAdapter extends BaseAdapter {
98afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project         // Constants defining order for display order
99afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private static final int _DISPLAY_ORDER_USAGE_TIME = 0;
1008d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private static final int _DISPLAY_ORDER_LAST_TIME_USED = 1;
101afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private static final int _DISPLAY_ORDER_APP_NAME = 2;
1021789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
103afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private int mDisplayOrder = _DISPLAY_ORDER_USAGE_TIME;
1048d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private LastTimeUsedComparator mLastTimeUsedComparator = new LastTimeUsedComparator();
1058d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private UsageTimeComparator mUsageTimeComparator = new UsageTimeComparator();
106afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private AppNameComparator mAppLabelComparator;
1078d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        private final ArrayMap<String, String> mAppLabelMap = new ArrayMap<>();
1081789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski        private final ArrayList<UsageStats> mPackageStats = new ArrayList<>();
1098d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
110afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        UsageStatsAdapter() {
1118d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            Calendar cal = Calendar.getInstance();
1128d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            cal.add(Calendar.DAY_OF_YEAR, -5);
1138d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1141789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            final List<UsageStats> stats =
1151789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST,
1161789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                            cal.getTimeInMillis(), System.currentTimeMillis());
1178d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            if (stats == null) {
118afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
119afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
1208d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1211789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            ArrayMap<String, UsageStats> map = new ArrayMap<>();
1221789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            final int statCount = stats.size();
1231789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            for (int i = 0; i < statCount; i++) {
1241789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                final android.app.usage.UsageStats pkgStats = stats.get(i);
1258d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1268d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                // load application labels for each application
1278d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                try {
1288d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    ApplicationInfo appInfo = mPm.getApplicationInfo(pkgStats.getPackageName(), 0);
1298d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    String label = appInfo.loadLabel(mPm).toString();
1308d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    mAppLabelMap.put(pkgStats.getPackageName(), label);
1311789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
1321789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    UsageStats existingStats =
1331789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                            map.get(pkgStats.getPackageName());
1341789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    if (existingStats == null) {
1351789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        map.put(pkgStats.getPackageName(), pkgStats);
1361789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    } else {
1371789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        existingStats.add(pkgStats);
1381789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                    }
1391789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
140afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                } catch (NameNotFoundException e) {
1418d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                    // This package may be gone.
142afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                }
1431789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            }
1441789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            mPackageStats.addAll(map.values());
1458d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1461789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            // Sort list
1471789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            mAppLabelComparator = new AppNameComparator(mAppLabelMap);
1481789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            sortList();
149afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
1508d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
1518d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
152afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public int getCount() {
1538d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.size();
154afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
155afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1568d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
157afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public Object getItem(int position) {
1588d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            return mPackageStats.get(position);
159afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
160afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1618d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
162afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public long getItemId(int position) {
163afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return position;
164afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
165afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
1668d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        @Override
167afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        public View getView(int position, View convertView, ViewGroup parent) {
168afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // A ViewHolder keeps references to children views to avoid unneccessary calls
169afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to findViewById() on each row.
170afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            AppViewHolder holder;
171afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
172afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // When convertView is not null, we can reuse it directly, there is no need
173afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // to reinflate it. We only inflate a new View when the convertView supplied
174afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // by ListView is null.
175afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (convertView == null) {
176afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView = mInflater.inflate(R.layout.usage_stats_item, null);
177afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
178afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Creates a ViewHolder and store references to the two children views
179afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // we want to bind data to.
180afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = new AppViewHolder();
181afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName = (TextView) convertView.findViewById(R.id.package_name);
1828d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed = (TextView) convertView.findViewById(R.id.last_time_used);
183afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.usageTime = (TextView) convertView.findViewById(R.id.usage_time);
184afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                convertView.setTag(holder);
185afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
186afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // Get the ViewHolder back to get fast access to the TextView
187afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // and the ImageView.
188afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder = (AppViewHolder) convertView.getTag();
189afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
190afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
191afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            // Bind the data efficiently with the holder
1921789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski            UsageStats pkgStats = mPackageStats.get(position);
193afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (pkgStats != null) {
1948d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                String label = mAppLabelMap.get(pkgStats.getPackageName());
195afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                holder.pkgName.setText(label);
1968d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.lastTimeUsed.setText(DateUtils.formatSameDayTime(pkgStats.getLastTimeUsed(),
1978d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                        System.currentTimeMillis(), DateFormat.MEDIUM, DateFormat.MEDIUM));
1988d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                holder.usageTime.setText(
1991789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski                        DateUtils.formatElapsedTime(pkgStats.getTotalTimeInForeground() / 1000));
200afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else {
2018762093e0094e09493fa6cbac8e8fbf265f18165Michael Chan                Log.w(TAG, "No usage stats info for package:" + position);
202afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
203afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            return convertView;
204afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
2051789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
206afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        void sortList(int sortOrder) {
207afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == sortOrder) {
208afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                // do nothing
209afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                return;
210afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
211afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            mDisplayOrder= sortOrder;
212afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            sortList();
213afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
214afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        private void sortList() {
215afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            if (mDisplayOrder == _DISPLAY_ORDER_USAGE_TIME) {
216afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by usage time");
2178d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mUsageTimeComparator);
2188d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski            } else if (mDisplayOrder == _DISPLAY_ORDER_LAST_TIME_USED) {
2198d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                if (localLOGV) Log.i(TAG, "Sorting by last time used");
2208d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mLastTimeUsedComparator);
221afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            } else if (mDisplayOrder == _DISPLAY_ORDER_APP_NAME) {
222afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project                if (localLOGV) Log.i(TAG, "Sorting by application name");
2238d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski                Collections.sort(mPackageStats, mAppLabelComparator);
224afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            }
225afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project            notifyDataSetChanged();
226afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        }
227afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
228afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
229afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    /** Called when the activity is first created. */
2308d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
231afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    protected void onCreate(Bundle icicle) {
232afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        super.onCreate(icicle);
2338d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        setContentView(R.layout.usage_stats);
2348d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2358d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
236afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
237afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mPm = getPackageManager();
2388d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski
2398d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        Spinner typeSpinner = (Spinner) findViewById(R.id.typeSpinner);
2408d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        typeSpinner.setOnItemSelectedListener(this);
2411789f7d236bca1583fd3f7eafcf81bbae915e229Adam Lesinski
2428d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        ListView listView = (ListView) findViewById(R.id.pkg_list);
243afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter = new UsageStatsAdapter();
2448d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski        listView.setAdapter(mAdapter);
245afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
246afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2478d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
2488d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
249afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        mAdapter.sortList(position);
250afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
251afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project
2528d7be7b738cce9facdd8832aa845ceb79c19ffc6Adam Lesinski    @Override
253afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    public void onNothingSelected(AdapterView<?> parent) {
254afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project        // do nothing
255afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project    }
256afc4ab2ffbb8327ddce9907961295a32cbf49d0fThe Android Open Source Project}
257