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 17 package android.app.usage; 18 19 import android.os.Parcel; 20 import android.os.Parcelable; 21 22 /** 23 * Contains usage statistics for an app package for a specific 24 * time range. 25 */ 26 public final class UsageStats implements Parcelable { 27 28 /** 29 * {@hide} 30 */ 31 public String mPackageName; 32 33 /** 34 * {@hide} 35 */ 36 public long mBeginTimeStamp; 37 38 /** 39 * {@hide} 40 */ 41 public long mEndTimeStamp; 42 43 /** 44 * Last time used by the user with an explicit action (notification, activity launch). 45 * {@hide} 46 */ 47 public long mLastTimeUsed; 48 49 /** 50 * {@hide} 51 */ 52 public long mTotalTimeInForeground; 53 54 /** 55 * {@hide} 56 */ 57 public int mLaunchCount; 58 59 /** 60 * {@hide} 61 */ 62 public int mLastEvent; 63 64 /** 65 * {@hide} 66 */ UsageStats()67 public UsageStats() { 68 } 69 UsageStats(UsageStats stats)70 public UsageStats(UsageStats stats) { 71 mPackageName = stats.mPackageName; 72 mBeginTimeStamp = stats.mBeginTimeStamp; 73 mEndTimeStamp = stats.mEndTimeStamp; 74 mLastTimeUsed = stats.mLastTimeUsed; 75 mTotalTimeInForeground = stats.mTotalTimeInForeground; 76 mLaunchCount = stats.mLaunchCount; 77 mLastEvent = stats.mLastEvent; 78 } 79 getPackageName()80 public String getPackageName() { 81 return mPackageName; 82 } 83 84 /** 85 * Get the beginning of the time range this {@link android.app.usage.UsageStats} represents, 86 * measured in milliseconds since the epoch. 87 * <p/> 88 * See {@link System#currentTimeMillis()}. 89 */ getFirstTimeStamp()90 public long getFirstTimeStamp() { 91 return mBeginTimeStamp; 92 } 93 94 /** 95 * Get the end of the time range this {@link android.app.usage.UsageStats} represents, 96 * measured in milliseconds since the epoch. 97 * <p/> 98 * See {@link System#currentTimeMillis()}. 99 */ getLastTimeStamp()100 public long getLastTimeStamp() { 101 return mEndTimeStamp; 102 } 103 104 /** 105 * Get the last time this package was used, measured in milliseconds since the epoch. 106 * <p/> 107 * See {@link System#currentTimeMillis()}. 108 */ getLastTimeUsed()109 public long getLastTimeUsed() { 110 return mLastTimeUsed; 111 } 112 113 /** 114 * Get the total time this package spent in the foreground, measured in milliseconds. 115 */ getTotalTimeInForeground()116 public long getTotalTimeInForeground() { 117 return mTotalTimeInForeground; 118 } 119 120 /** 121 * Add the statistics from the right {@link UsageStats} to the left. The package name for 122 * both {@link UsageStats} objects must be the same. 123 * @param right The {@link UsageStats} object to merge into this one. 124 * @throws java.lang.IllegalArgumentException if the package names of the two 125 * {@link UsageStats} objects are different. 126 */ add(UsageStats right)127 public void add(UsageStats right) { 128 if (!mPackageName.equals(right.mPackageName)) { 129 throw new IllegalArgumentException("Can't merge UsageStats for package '" + 130 mPackageName + "' with UsageStats for package '" + right.mPackageName + "'."); 131 } 132 133 if (right.mBeginTimeStamp > mBeginTimeStamp) { 134 // The incoming UsageStat begins after this one, so use its last time used fields 135 // as the source of truth. 136 // We use the mBeginTimeStamp due to a bug where UsageStats files can overlap with 137 // regards to their mEndTimeStamp. 138 mLastEvent = right.mLastEvent; 139 mLastTimeUsed = right.mLastTimeUsed; 140 } 141 mBeginTimeStamp = Math.min(mBeginTimeStamp, right.mBeginTimeStamp); 142 mEndTimeStamp = Math.max(mEndTimeStamp, right.mEndTimeStamp); 143 mTotalTimeInForeground += right.mTotalTimeInForeground; 144 mLaunchCount += right.mLaunchCount; 145 } 146 147 @Override describeContents()148 public int describeContents() { 149 return 0; 150 } 151 152 @Override writeToParcel(Parcel dest, int flags)153 public void writeToParcel(Parcel dest, int flags) { 154 dest.writeString(mPackageName); 155 dest.writeLong(mBeginTimeStamp); 156 dest.writeLong(mEndTimeStamp); 157 dest.writeLong(mLastTimeUsed); 158 dest.writeLong(mTotalTimeInForeground); 159 dest.writeInt(mLaunchCount); 160 dest.writeInt(mLastEvent); 161 } 162 163 public static final Creator<UsageStats> CREATOR = new Creator<UsageStats>() { 164 @Override 165 public UsageStats createFromParcel(Parcel in) { 166 UsageStats stats = new UsageStats(); 167 stats.mPackageName = in.readString(); 168 stats.mBeginTimeStamp = in.readLong(); 169 stats.mEndTimeStamp = in.readLong(); 170 stats.mLastTimeUsed = in.readLong(); 171 stats.mTotalTimeInForeground = in.readLong(); 172 stats.mLaunchCount = in.readInt(); 173 stats.mLastEvent = in.readInt(); 174 return stats; 175 } 176 177 @Override 178 public UsageStats[] newArray(int size) { 179 return new UsageStats[size]; 180 } 181 }; 182 } 183