UsageStats.java revision 0debc9aff4c0cbc28e083a948081d91b0f171319
10debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski/** 20debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * Copyright (C) 2014 The Android Open Source Project 30debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * 40debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); you may not 50debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * use this file except in compliance with the License. You may obtain a copy 60debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * of the License at 70debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * 80debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 90debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * 100debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * Unless required by applicable law or agreed to in writing, software 110debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 120debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 130debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * License for the specific language governing permissions and limitations 140debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * under the License. 150debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 160debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 170debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskipackage android.app.usage; 180debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 190debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskiimport android.os.Parcel; 200debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskiimport android.os.Parcelable; 210debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskiimport android.util.ArrayMap; 220debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 230debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskipublic final class UsageStats implements Parcelable { 240debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static class Event implements Parcelable { 250debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 260debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 270debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 280debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final Event[] EMPTY_EVENTS = new Event[0]; 290debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 300debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final int NONE = 0; 310debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final int MOVE_TO_FOREGROUND = 1; 320debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final int MOVE_TO_BACKGROUND = 2; 330debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 340debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 350debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 360debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 370debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final int END_OF_DAY = 3; 380debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 390debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 400debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 410debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 420debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final int CONTINUE_PREVIOUS_DAY = 4; 430debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 440debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public Event() {} 450debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 460debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 470debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 480debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 490debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public Event(String packageName, long timeStamp, int eventType) { 500debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski this.packageName = packageName; 510debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski this.timeStamp = timeStamp; 520debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski this.eventType = eventType; 530debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 540debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 550debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public String packageName; 560debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long timeStamp; 570debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public int eventType; 580debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 590debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 600debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public int describeContents() { 610debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return 0; 620debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 630debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 640debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 650debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public void writeToParcel(Parcel dest, int flags) { 660debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(timeStamp); 670debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeInt(eventType); 680debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeString(packageName); 690debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 700debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 710debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final Creator<Event> CREATOR = new Creator<Event>() { 720debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 730debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public Event createFromParcel(Parcel source) { 740debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final long time = source.readLong(); 750debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final int type = source.readInt(); 760debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final String name = source.readString(); 770debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return new Event(name, time, type); 780debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 790debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 800debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 810debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public Event[] newArray(int size) { 820debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return new Event[size]; 830debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 840debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski }; 850debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 860debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 870debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 880debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 890debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 900debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final UsageStats[] EMPTY_STATS = new UsageStats[0]; 910debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 920debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 930debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 940debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 950debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long mBeginTimeStamp; 960debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 970debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 980debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 990debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1000debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long mEndTimeStamp; 1010debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1020debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1030debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 1040debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1050debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long mLastTimeSaved; 1060debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1070debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski private ArrayMap<String, PackageUsageStats> mPackageStats = new ArrayMap<>(); 1080debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1090debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1100debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * Can be null 1110debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 1120debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1130debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public TimeSparseArray<Event> mEvents; 1140debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1150debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1160debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 1170debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1180debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static UsageStats create(long beginTimeStamp, long endTimeStamp) { 1190debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski UsageStats stats = new UsageStats(); 1200debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mBeginTimeStamp = beginTimeStamp; 1210debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mEndTimeStamp = endTimeStamp; 1220debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return stats; 1230debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1240debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1250debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1260debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 1270debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1280debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats() { 1290debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1300debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1310debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats(UsageStats stats) { 1320debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mBeginTimeStamp = stats.mBeginTimeStamp; 1330debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mEndTimeStamp = stats.mEndTimeStamp; 1340debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mLastTimeSaved = stats.mLastTimeSaved; 1350debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1360debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final int pkgCount = stats.mPackageStats.size(); 1370debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < pkgCount; i++) { 1380debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski PackageUsageStats pkgStats = stats.mPackageStats.valueAt(i); 1390debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mPackageStats.append(stats.mPackageStats.keyAt(i), new PackageUsageStats(pkgStats)); 1400debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1410debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1420debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final int eventCount = stats.mEvents == null ? 0 : stats.mEvents.size(); 1430debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski if (eventCount > 0) { 1440debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mEvents = new TimeSparseArray<>(); 1450debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < eventCount; i++) { 1460debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mEvents.append(stats.mEvents.keyAt(i), stats.mEvents.valueAt(i)); 1470debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1480debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1490debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1500debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1510debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long getFirstTimeStamp() { 1520debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mBeginTimeStamp; 1530debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1540debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1550debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long getLastTimeStamp() { 1560debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mEndTimeStamp; 1570debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1580debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1590debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public int getPackageCount() { 1600debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mPackageStats.size(); 1610debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1620debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1630debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public PackageUsageStats getPackage(int index) { 1640debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mPackageStats.valueAt(index); 1650debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1660debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1670debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public PackageUsageStats getPackage(String packageName) { 1680debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mPackageStats.get(packageName); 1690debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1700debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1710debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1720debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 1730debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1740debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public PackageUsageStats getOrCreatePackageUsageStats(String packageName) { 1750debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski PackageUsageStats pkgStats = mPackageStats.get(packageName); 1760debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski if (pkgStats == null) { 1770debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski pkgStats = new PackageUsageStats(); 1780debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski pkgStats.mPackageName = packageName; 1790debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mPackageStats.put(packageName, pkgStats); 1800debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1810debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return pkgStats; 1820debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1830debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1840debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1850debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public int describeContents() { 1860debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return 0; 1870debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1880debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1890debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1900debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public void writeToParcel(Parcel dest, int flags) { 1910debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(mBeginTimeStamp); 1920debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(mEndTimeStamp); 1930debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(mLastTimeSaved); 1940debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1950debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski int size = mPackageStats.size(); 1960debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeInt(size); 1970debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < size; i++) { 1980debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mPackageStats.valueAt(i).writeToParcel(dest, flags); 1990debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2000debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2010debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski size = mEvents == null ? 0 : mEvents.size(); 2020debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeInt(size); 2030debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < size; i++) { 2040debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mEvents.valueAt(i).writeToParcel(dest, flags); 2050debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2060debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2070debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2080debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final Creator<UsageStats> CREATOR = new Creator<UsageStats>() { 2090debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 2100debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats createFromParcel(Parcel in) { 2110debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski UsageStats stats = new UsageStats(); 2120debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mBeginTimeStamp = in.readLong(); 2130debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mEndTimeStamp = in.readLong(); 2140debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mLastTimeSaved = in.readLong(); 2150debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2160debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski int size = in.readInt(); 2170debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mPackageStats.ensureCapacity(size); 2180debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < size; i++) { 2190debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final PackageUsageStats pkgStats = PackageUsageStats.CREATOR.createFromParcel(in); 2200debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mPackageStats.put(pkgStats.mPackageName, pkgStats); 2210debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2220debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2230debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski size = in.readInt(); 2240debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski if (size > 0) { 2250debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mEvents = new TimeSparseArray<>(size); 2260debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski for (int i = 0; i < size; i++) { 2270debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski final Event event = Event.CREATOR.createFromParcel(in); 2280debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mEvents.put(event.timeStamp, event); 2290debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2300debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2310debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2320debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return stats; 2330debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2340debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 2350debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 2360debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats[] newArray(int size) { 2370debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return new UsageStats[size]; 2380debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 2390debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski }; 2400debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski} 241