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 Lesinski 223516800b611a79339a3c188332d13a26e9086b09Adam Lesinski/** 233516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * Contains usage statistics for an app package for a specific 243516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * time range. 253516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 260debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinskipublic final class UsageStats implements Parcelable { 270debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 280debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 290debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 300debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 313516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public String mPackageName; 320debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 330debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 340debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 350debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 360debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long mBeginTimeStamp; 370debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 380debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 390debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 400debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 410debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long mEndTimeStamp; 420debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 430debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 440debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 450debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 463516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public long mLastTimeUsed; 470debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 483516800b611a79339a3c188332d13a26e9086b09Adam Lesinski /** 493516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * {@hide} 503516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 513516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public long mTotalTimeInForeground; 520debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 530debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 540debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 550debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 563516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public int mLaunchCount; 570debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 580debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 590debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 600debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 613516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public int mLastEvent; 620debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 630debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 640debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski * {@hide} 650debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 660debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats() { 670debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 680debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 690debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats(UsageStats stats) { 703516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mPackageName = stats.mPackageName; 710debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mBeginTimeStamp = stats.mBeginTimeStamp; 720debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski mEndTimeStamp = stats.mEndTimeStamp; 733516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLastTimeUsed = stats.mLastTimeUsed; 743516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mTotalTimeInForeground = stats.mTotalTimeInForeground; 753516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLaunchCount = stats.mLaunchCount; 763516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLastEvent = stats.mLastEvent; 773516800b611a79339a3c188332d13a26e9086b09Adam Lesinski } 780debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 793516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public String getPackageName() { 803516800b611a79339a3c188332d13a26e9086b09Adam Lesinski return mPackageName; 810debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 820debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 833516800b611a79339a3c188332d13a26e9086b09Adam Lesinski /** 84cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * Get the beginning of the time range this {@link android.app.usage.UsageStats} represents, 85cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * measured in milliseconds since the epoch. 86cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * <p/> 87cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * See {@link System#currentTimeMillis()}. 883516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 890debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long getFirstTimeStamp() { 900debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mBeginTimeStamp; 910debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 920debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 933516800b611a79339a3c188332d13a26e9086b09Adam Lesinski /** 94cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * Get the end of the time range this {@link android.app.usage.UsageStats} represents, 95cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * measured in milliseconds since the epoch. 96cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * <p/> 97cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * See {@link System#currentTimeMillis()}. 983516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 990debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public long getLastTimeStamp() { 1000debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return mEndTimeStamp; 1010debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1020debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1033516800b611a79339a3c188332d13a26e9086b09Adam Lesinski /** 104cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * Get the last time this package was used, measured in milliseconds since the epoch. 105cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * <p/> 106cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * See {@link System#currentTimeMillis()}. 1073516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 1083516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public long getLastTimeUsed() { 1093516800b611a79339a3c188332d13a26e9086b09Adam Lesinski return mLastTimeUsed; 1100debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1110debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1123516800b611a79339a3c188332d13a26e9086b09Adam Lesinski /** 113cc562a811da508b275254f275d6e0c1758a47d07Adam Lesinski * Get the total time this package spent in the foreground, measured in milliseconds. 1143516800b611a79339a3c188332d13a26e9086b09Adam Lesinski */ 1153516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public long getTotalTimeInForeground() { 1163516800b611a79339a3c188332d13a26e9086b09Adam Lesinski return mTotalTimeInForeground; 1170debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1180debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1190debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski /** 1203516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * Add the statistics from the right {@link UsageStats} to the left. The package name for 1213516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * both {@link UsageStats} objects must be the same. 1223516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * @param right The {@link UsageStats} object to merge into this one. 1233516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * @throws java.lang.IllegalArgumentException if the package names of the two 1243516800b611a79339a3c188332d13a26e9086b09Adam Lesinski * {@link UsageStats} objects are different. 1250debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski */ 1263516800b611a79339a3c188332d13a26e9086b09Adam Lesinski public void add(UsageStats right) { 1273516800b611a79339a3c188332d13a26e9086b09Adam Lesinski if (!mPackageName.equals(right.mPackageName)) { 1283516800b611a79339a3c188332d13a26e9086b09Adam Lesinski throw new IllegalArgumentException("Can't merge UsageStats for package '" + 1293516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mPackageName + "' with UsageStats for package '" + right.mPackageName + "'."); 1300debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1313516800b611a79339a3c188332d13a26e9086b09Adam Lesinski 1323516800b611a79339a3c188332d13a26e9086b09Adam Lesinski if (right.mEndTimeStamp > mEndTimeStamp) { 1333516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLastEvent = right.mLastEvent; 1343516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mEndTimeStamp = right.mEndTimeStamp; 1353516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLastTimeUsed = right.mLastTimeUsed; 1363516800b611a79339a3c188332d13a26e9086b09Adam Lesinski } 1373516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp); 1383516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mTotalTimeInForeground += right.mTotalTimeInForeground; 1393516800b611a79339a3c188332d13a26e9086b09Adam Lesinski mLaunchCount += right.mLaunchCount; 1400debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1410debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1420debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1430debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public int describeContents() { 1440debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return 0; 1450debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1460debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1470debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1480debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public void writeToParcel(Parcel dest, int flags) { 1493516800b611a79339a3c188332d13a26e9086b09Adam Lesinski dest.writeString(mPackageName); 1500debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(mBeginTimeStamp); 1510debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski dest.writeLong(mEndTimeStamp); 1523516800b611a79339a3c188332d13a26e9086b09Adam Lesinski dest.writeLong(mLastTimeUsed); 1533516800b611a79339a3c188332d13a26e9086b09Adam Lesinski dest.writeLong(mTotalTimeInForeground); 1543516800b611a79339a3c188332d13a26e9086b09Adam Lesinski dest.writeInt(mLaunchCount); 1553516800b611a79339a3c188332d13a26e9086b09Adam Lesinski dest.writeInt(mLastEvent); 1560debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1570debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1580debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public static final Creator<UsageStats> CREATOR = new Creator<UsageStats>() { 1590debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1600debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats createFromParcel(Parcel in) { 1610debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski UsageStats stats = new UsageStats(); 1623516800b611a79339a3c188332d13a26e9086b09Adam Lesinski stats.mPackageName = in.readString(); 1630debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mBeginTimeStamp = in.readLong(); 1640debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski stats.mEndTimeStamp = in.readLong(); 1653516800b611a79339a3c188332d13a26e9086b09Adam Lesinski stats.mLastTimeUsed = in.readLong(); 1663516800b611a79339a3c188332d13a26e9086b09Adam Lesinski stats.mTotalTimeInForeground = in.readLong(); 1673516800b611a79339a3c188332d13a26e9086b09Adam Lesinski stats.mLaunchCount = in.readInt(); 1683516800b611a79339a3c188332d13a26e9086b09Adam Lesinski stats.mLastEvent = in.readInt(); 1690debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return stats; 1700debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1710debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski 1720debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski @Override 1730debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski public UsageStats[] newArray(int size) { 1740debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski return new UsageStats[size]; 1750debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski } 1760debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski }; 1770debc9aff4c0cbc28e083a948081d91b0f171319Adam Lesinski} 178