1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.tests.usagestats;
18
19import android.app.ListActivity;
20import android.app.usage.UsageStats;
21import android.app.usage.UsageStatsManager;
22import android.content.Context;
23import android.content.Intent;
24import android.os.Bundle;
25import android.text.format.DateUtils;
26import android.view.LayoutInflater;
27import android.view.Menu;
28import android.view.MenuInflater;
29import android.view.MenuItem;
30import android.view.View;
31import android.view.ViewGroup;
32import android.widget.BaseAdapter;
33import android.widget.TextView;
34
35import java.util.ArrayList;
36import java.util.Collections;
37import java.util.Comparator;
38import java.util.Map;
39
40public class UsageStatsActivity extends ListActivity {
41    private static final long USAGE_STATS_PERIOD = 1000 * 60 * 60 * 24 * 14;
42    private UsageStatsManager mUsageStatsManager;
43    private Adapter mAdapter;
44    private Comparator<UsageStats> mComparator = new Comparator<UsageStats>() {
45        @Override
46        public int compare(UsageStats o1, UsageStats o2) {
47            return Long.compare(o2.getTotalTimeInForeground(), o1.getTotalTimeInForeground());
48        }
49    };
50
51    @Override
52    protected void onCreate(Bundle savedInstanceState) {
53        super.onCreate(savedInstanceState);
54        mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
55        mAdapter = new Adapter();
56        setListAdapter(mAdapter);
57    }
58
59    @Override
60    public boolean onCreateOptionsMenu(Menu menu) {
61        MenuInflater inflater = getMenuInflater();
62        inflater.inflate(R.menu.main, menu);
63        return super.onCreateOptionsMenu(menu);
64    }
65
66    @Override
67    public boolean onOptionsItemSelected(MenuItem item) {
68        switch (item.getItemId()) {
69            case R.id.log:
70                startActivity(new Intent(this, UsageLogActivity.class));
71                return true;
72
73            default:
74                return super.onOptionsItemSelected(item);
75        }
76    }
77
78    @Override
79    protected void onResume() {
80        super.onResume();
81        updateAdapter();
82    }
83
84    private void updateAdapter() {
85        long now = System.currentTimeMillis();
86        long beginTime = now - USAGE_STATS_PERIOD;
87        Map<String, UsageStats> stats = mUsageStatsManager.queryAndAggregateUsageStats(
88                beginTime, now);
89        mAdapter.update(stats);
90    }
91
92    private class Adapter extends BaseAdapter {
93        private ArrayList<UsageStats> mStats = new ArrayList<>();
94
95        public void update(Map<String, UsageStats> stats) {
96            mStats.clear();
97            if (stats == null) {
98                return;
99            }
100
101            mStats.addAll(stats.values());
102            Collections.sort(mStats, mComparator);
103            notifyDataSetChanged();
104        }
105
106        @Override
107        public int getCount() {
108            return mStats.size();
109        }
110
111        @Override
112        public Object getItem(int position) {
113            return mStats.get(position);
114        }
115
116        @Override
117        public long getItemId(int position) {
118            return position;
119        }
120
121        @Override
122        public View getView(int position, View convertView, ViewGroup parent) {
123            final ViewHolder holder;
124            if (convertView == null) {
125                convertView = LayoutInflater.from(UsageStatsActivity.this)
126                        .inflate(R.layout.row_item, parent, false);
127                holder = new ViewHolder();
128                holder.packageName = (TextView) convertView.findViewById(android.R.id.text1);
129                holder.usageTime = (TextView) convertView.findViewById(android.R.id.text2);
130                convertView.setTag(holder);
131            } else {
132                holder = (ViewHolder) convertView.getTag();
133            }
134
135            holder.packageName.setText(mStats.get(position).getPackageName());
136            holder.usageTime.setText(DateUtils.formatDuration(
137                    mStats.get(position).getTotalTimeInForeground()));
138            return convertView;
139        }
140    }
141
142    private static class ViewHolder {
143        TextView packageName;
144        TextView usageTime;
145    }
146}