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