1 /** 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5 * use this file except in compliance with the License. You may obtain a copy 6 * 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, WITHOUT 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13 * License for the specific language governing permissions and limitations 14 * under the License. 15 */ 16 package com.android.tests.usagestats; 17 18 import android.app.ListActivity; 19 import android.app.usage.UsageEvents; 20 import android.app.usage.UsageStatsManager; 21 import android.content.Context; 22 import android.os.Bundle; 23 import android.os.Handler; 24 import android.support.v4.util.CircularArray; 25 import android.view.LayoutInflater; 26 import android.view.View; 27 import android.view.ViewGroup; 28 import android.widget.BaseAdapter; 29 import android.widget.TextView; 30 31 public class UsageLogActivity extends ListActivity implements Runnable { 32 private static final long USAGE_STATS_PERIOD = 1000 * 60 * 60 * 24 * 14; 33 34 private UsageStatsManager mUsageStatsManager; 35 private Adapter mAdapter; 36 private Handler mHandler = new Handler(); 37 private long mLastTime; 38 39 @Override onCreate(Bundle savedInstanceState)40 protected void onCreate(Bundle savedInstanceState) { 41 super.onCreate(savedInstanceState); 42 mUsageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE); 43 mLastTime = System.currentTimeMillis() - USAGE_STATS_PERIOD; 44 45 mAdapter = new Adapter(); 46 setListAdapter(mAdapter); 47 } 48 49 @Override onResume()50 protected void onResume() { 51 super.onResume(); 52 run(); 53 } 54 55 @Override onPause()56 protected void onPause() { 57 super.onPause(); 58 mHandler.removeCallbacks(this); 59 } 60 61 @Override run()62 public void run() { 63 long now = System.currentTimeMillis(); 64 UsageEvents events = mUsageStatsManager.queryEvents(mLastTime, now); 65 long lastEventTime = mAdapter.update(events); 66 if (lastEventTime >= 0) { 67 mLastTime = lastEventTime + 1; 68 } 69 mHandler.postDelayed(this, 1000 * 5); 70 } 71 72 private class Adapter extends BaseAdapter { 73 private static final int MAX_EVENTS = 50; 74 private final CircularArray<UsageEvents.Event> mEvents = new CircularArray<>(MAX_EVENTS); 75 update(UsageEvents results)76 public long update(UsageEvents results) { 77 long lastTimeStamp = -1; 78 while (results.hasNextEvent()) { 79 UsageEvents.Event event = new UsageEvents.Event(); 80 results.getNextEvent(event); 81 lastTimeStamp = event.getTimeStamp(); 82 if (mEvents.size() == MAX_EVENTS) { 83 mEvents.popLast(); 84 } 85 mEvents.addFirst(event); 86 } 87 88 if (lastTimeStamp != 0) { 89 notifyDataSetChanged(); 90 } 91 return lastTimeStamp; 92 } 93 94 @Override getCount()95 public int getCount() { 96 return mEvents.size(); 97 } 98 99 @Override getItem(int position)100 public UsageEvents.Event getItem(int position) { 101 return mEvents.get(position); 102 } 103 104 @Override getItemId(int position)105 public long getItemId(int position) { 106 return position; 107 } 108 109 @Override getItemViewType(int position)110 public int getItemViewType(int position) { 111 final int eventType = getItem(position).getEventType(); 112 if (eventType == UsageEvents.Event.CONFIGURATION_CHANGE) { 113 return 1; 114 } 115 return 0; 116 } 117 118 @Override getView(int position, View convertView, ViewGroup parent)119 public View getView(int position, View convertView, ViewGroup parent) { 120 final UsageEvents.Event event = getItem(position); 121 122 final ViewHolder holder; 123 if (convertView == null) { 124 holder = new ViewHolder(); 125 126 if (event.getEventType() == UsageEvents.Event.CONFIGURATION_CHANGE) { 127 convertView = LayoutInflater.from(UsageLogActivity.this) 128 .inflate(R.layout.config_row_item, parent, false); 129 holder.config = (TextView) convertView.findViewById(android.R.id.text1); 130 } else { 131 convertView = LayoutInflater.from(UsageLogActivity.this) 132 .inflate(R.layout.row_item, parent, false); 133 holder.packageName = (TextView) convertView.findViewById(android.R.id.text1); 134 holder.state = (TextView) convertView.findViewById(android.R.id.text2); 135 } 136 convertView.setTag(holder); 137 } else { 138 holder = (ViewHolder) convertView.getTag(); 139 } 140 141 if (holder.packageName != null) { 142 holder.packageName.setText(event.getPackageName()); 143 } 144 145 if (holder.state != null) { 146 holder.state.setText(eventToString(event.getEventType())); 147 } 148 149 if (holder.config != null && 150 event.getEventType() == UsageEvents.Event.CONFIGURATION_CHANGE) { 151 holder.config.setText(event.getConfiguration().toString()); 152 } 153 return convertView; 154 } 155 eventToString(int eventType)156 private String eventToString(int eventType) { 157 switch (eventType) { 158 case UsageEvents.Event.MOVE_TO_FOREGROUND: 159 return "Foreground"; 160 161 case UsageEvents.Event.MOVE_TO_BACKGROUND: 162 return "Background"; 163 164 case UsageEvents.Event.CONFIGURATION_CHANGE: 165 return "Config change"; 166 167 case UsageEvents.Event.USER_INTERACTION: 168 return "User Interaction"; 169 170 default: 171 return "Unknown: " + eventType; 172 } 173 } 174 } 175 176 static class ViewHolder { 177 public TextView packageName; 178 public TextView state; 179 public TextView config; 180 } 181 } 182