Loading core/java/android/app/ActivityManager.java +18 −0 Original line number Original line Diff line number Diff line Loading @@ -1470,6 +1470,24 @@ public class ActivityManager { } } } } /** * Returns the usage statistics of each installed package. * * @hide */ public PkgUsageStats[] getAllPackageUsageStats() { try { IUsageStats usageStatsService = IUsageStats.Stub.asInterface( ServiceManager.getService("usagestats")); if (usageStatsService != null) { return usageStatsService.getAllPkgUsageStats(); } } catch (RemoteException e) { Log.w(TAG, "Could not query usage stats", e); } return new PkgUsageStats[0]; } /** /** * @param userid the user's id. Zero indicates the default user * @param userid the user's id. Zero indicates the default user * @hide * @hide Loading core/java/com/android/internal/os/PkgUsageStats.java +20 −2 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,9 @@ package com.android.internal.os; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import java.util.HashMap; import java.util.Map; /** /** * implementation of PkgUsageStats associated with an * implementation of PkgUsageStats associated with an * application package. * application package. Loading @@ -28,6 +31,7 @@ public class PkgUsageStats implements Parcelable { public String packageName; public String packageName; public int launchCount; public int launchCount; public long usageTime; public long usageTime; public Map<String, Long> componentResumeTimes; public static final Parcelable.Creator<PkgUsageStats> CREATOR public static final Parcelable.Creator<PkgUsageStats> CREATOR = new Parcelable.Creator<PkgUsageStats>() { = new Parcelable.Creator<PkgUsageStats>() { Loading @@ -46,22 +50,31 @@ public class PkgUsageStats implements Parcelable { + " " + packageName + "}"; + " " + packageName + "}"; } } public PkgUsageStats(String pkgName, int count, long time) { public PkgUsageStats(String pkgName, int count, long time, Map<String, Long> lastResumeTimes) { packageName = pkgName; packageName = pkgName; launchCount = count; launchCount = count; usageTime = time; usageTime = time; componentResumeTimes = new HashMap<String, Long>(lastResumeTimes); } } public PkgUsageStats(Parcel source) { public PkgUsageStats(Parcel source) { packageName = source.readString(); packageName = source.readString(); launchCount = source.readInt(); launchCount = source.readInt(); usageTime = source.readLong(); usageTime = source.readLong(); final int N = source.readInt(); componentResumeTimes = new HashMap<String, Long>(N); for (int i = 0; i < N; i++) { String component = source.readString(); long lastResumeTime = source.readLong(); componentResumeTimes.put(component, lastResumeTime); } } } public PkgUsageStats(PkgUsageStats pStats) { public PkgUsageStats(PkgUsageStats pStats) { packageName = pStats.packageName; packageName = pStats.packageName; launchCount = pStats.launchCount; launchCount = pStats.launchCount; usageTime = pStats.usageTime; usageTime = pStats.usageTime; componentResumeTimes = new HashMap<String, Long>(pStats.componentResumeTimes); } } public int describeContents() { public int describeContents() { Loading @@ -72,5 +85,10 @@ public class PkgUsageStats implements Parcelable { dest.writeString(packageName); dest.writeString(packageName); dest.writeInt(launchCount); dest.writeInt(launchCount); dest.writeLong(usageTime); dest.writeLong(usageTime); dest.writeInt(componentResumeTimes.size()); for (Map.Entry<String, Long> ent : componentResumeTimes.entrySet()) { dest.writeString(ent.getKey()); dest.writeLong(ent.getValue()); } } } } } services/java/com/android/server/am/UsageStatsService.java +33 −12 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ public final class UsageStatsService extends IUsageStats.Stub { private static final String TAG = "UsageStats"; private static final String TAG = "UsageStats"; // Current on-disk Parcel version // Current on-disk Parcel version private static final int VERSION = 1005; private static final int VERSION = 1006; private static final int CHECKIN_VERSION = 4; private static final int CHECKIN_VERSION = 4; Loading Loading @@ -145,6 +145,8 @@ public final class UsageStatsService extends IUsageStats.Stub { final HashMap<String, TimeStats> mLaunchTimes final HashMap<String, TimeStats> mLaunchTimes = new HashMap<String, TimeStats>(); = new HashMap<String, TimeStats>(); int mLaunchCount; int mLaunchCount; final HashMap<String, Long> mLastResumeTimes = new HashMap<String, Long>(); long mUsageTime; long mUsageTime; long mPausedTime; long mPausedTime; long mResumedTime; long mResumedTime; Loading @@ -160,20 +162,28 @@ public final class UsageStatsService extends IUsageStats.Stub { if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount + ", Usage time:" + mUsageTime); + ", Usage time:" + mUsageTime); final int N = in.readInt(); final int numTimeStats = in.readInt(); if (localLOGV) Slog.v(TAG, "Reading comps: " + N); if (localLOGV) Slog.v(TAG, "Reading comps: " + numTimeStats); for (int i=0; i<N; i++) { for (int i=0; i<numTimeStats; i++) { String comp = in.readString(); String comp = in.readString(); if (localLOGV) Slog.v(TAG, "Component: " + comp); if (localLOGV) Slog.v(TAG, "Component: " + comp); TimeStats times = new TimeStats(in); TimeStats times = new TimeStats(in); mLaunchTimes.put(comp, times); mLaunchTimes.put(comp, times); } } final int numResumeTimes = in.readInt(); if (localLOGV) Slog.v(TAG, "Reading last resume times: " + numResumeTimes); for (int i=0; i<numResumeTimes; i++) { String comp = in.readString(); if (localLOGV) Slog.v(TAG, "Component: " + comp); mLastResumeTimes.put(comp, in.readLong()); } } } void updateResume(boolean launched) { void updateResume(String comp, boolean launched) { if (launched) { if (launched) { mLaunchCount ++; mLaunchCount ++; } } mLastResumeTimes.put(comp, System.currentTimeMillis()); mResumedTime = SystemClock.elapsedRealtime(); mResumedTime = SystemClock.elapsedRealtime(); } } Loading Loading @@ -203,20 +213,29 @@ public final class UsageStatsService extends IUsageStats.Stub { void writeToParcel(Parcel out) { void writeToParcel(Parcel out) { out.writeInt(mLaunchCount); out.writeInt(mLaunchCount); out.writeLong(mUsageTime); out.writeLong(mUsageTime); final int N = mLaunchTimes.size(); final int numTimeStats = mLaunchTimes.size(); out.writeInt(N); out.writeInt(numTimeStats); if (N > 0) { if (numTimeStats > 0) { for (Map.Entry<String, TimeStats> ent : mLaunchTimes.entrySet()) { for (Map.Entry<String, TimeStats> ent : mLaunchTimes.entrySet()) { out.writeString(ent.getKey()); out.writeString(ent.getKey()); TimeStats times = ent.getValue(); TimeStats times = ent.getValue(); times.writeToParcel(out); times.writeToParcel(out); } } } } final int numResumeTimes = mLastResumeTimes.size(); out.writeInt(numResumeTimes); if (numResumeTimes > 0) { for (Map.Entry<String, Long> ent : mLastResumeTimes.entrySet()) { out.writeString(ent.getKey()); out.writeLong(ent.getValue()); } } } } void clear() { void clear() { mLaunchTimes.clear(); mLaunchTimes.clear(); mLaunchCount = 0; mLaunchCount = 0; mLastResumeTimes.clear(); mUsageTime = 0; mUsageTime = 0; } } } } Loading Loading @@ -546,7 +565,7 @@ public final class UsageStatsService extends IUsageStats.Stub { pus = new PkgUsageStatsExtended(); pus = new PkgUsageStatsExtended(); mStats.put(pkgName, pus); mStats.put(pkgName, pus); } } pus.updateResume(!samePackage); pus.updateResume(mLastResumedComp, !samePackage); if (!sameComp) { if (!sameComp) { pus.addLaunchCount(mLastResumedComp); pus.addLaunchCount(mLastResumedComp); } } Loading Loading @@ -624,7 +643,8 @@ public final class UsageStatsService extends IUsageStats.Stub { if (pus == null) { if (pus == null) { return null; return null; } } return new PkgUsageStats(pkgName, pus.mLaunchCount, pus.mUsageTime); return new PkgUsageStats(pkgName, pus.mLaunchCount, pus.mUsageTime, pus.mLastResumeTimes); } } } } Loading @@ -641,7 +661,8 @@ public final class UsageStatsService extends IUsageStats.Stub { int i = 0; int i = 0; for (String key: keys) { for (String key: keys) { PkgUsageStatsExtended pus = mStats.get(key); PkgUsageStatsExtended pus = mStats.get(key); retArr[i] = new PkgUsageStats(key, pus.mLaunchCount, pus.mUsageTime); retArr[i] = new PkgUsageStats(key, pus.mLaunchCount, pus.mUsageTime, pus.mLastResumeTimes); i++; i++; } } return retArr; return retArr; Loading Loading
core/java/android/app/ActivityManager.java +18 −0 Original line number Original line Diff line number Diff line Loading @@ -1470,6 +1470,24 @@ public class ActivityManager { } } } } /** * Returns the usage statistics of each installed package. * * @hide */ public PkgUsageStats[] getAllPackageUsageStats() { try { IUsageStats usageStatsService = IUsageStats.Stub.asInterface( ServiceManager.getService("usagestats")); if (usageStatsService != null) { return usageStatsService.getAllPkgUsageStats(); } } catch (RemoteException e) { Log.w(TAG, "Could not query usage stats", e); } return new PkgUsageStats[0]; } /** /** * @param userid the user's id. Zero indicates the default user * @param userid the user's id. Zero indicates the default user * @hide * @hide Loading
core/java/com/android/internal/os/PkgUsageStats.java +20 −2 Original line number Original line Diff line number Diff line Loading @@ -19,6 +19,9 @@ package com.android.internal.os; import android.os.Parcel; import android.os.Parcel; import android.os.Parcelable; import android.os.Parcelable; import java.util.HashMap; import java.util.Map; /** /** * implementation of PkgUsageStats associated with an * implementation of PkgUsageStats associated with an * application package. * application package. Loading @@ -28,6 +31,7 @@ public class PkgUsageStats implements Parcelable { public String packageName; public String packageName; public int launchCount; public int launchCount; public long usageTime; public long usageTime; public Map<String, Long> componentResumeTimes; public static final Parcelable.Creator<PkgUsageStats> CREATOR public static final Parcelable.Creator<PkgUsageStats> CREATOR = new Parcelable.Creator<PkgUsageStats>() { = new Parcelable.Creator<PkgUsageStats>() { Loading @@ -46,22 +50,31 @@ public class PkgUsageStats implements Parcelable { + " " + packageName + "}"; + " " + packageName + "}"; } } public PkgUsageStats(String pkgName, int count, long time) { public PkgUsageStats(String pkgName, int count, long time, Map<String, Long> lastResumeTimes) { packageName = pkgName; packageName = pkgName; launchCount = count; launchCount = count; usageTime = time; usageTime = time; componentResumeTimes = new HashMap<String, Long>(lastResumeTimes); } } public PkgUsageStats(Parcel source) { public PkgUsageStats(Parcel source) { packageName = source.readString(); packageName = source.readString(); launchCount = source.readInt(); launchCount = source.readInt(); usageTime = source.readLong(); usageTime = source.readLong(); final int N = source.readInt(); componentResumeTimes = new HashMap<String, Long>(N); for (int i = 0; i < N; i++) { String component = source.readString(); long lastResumeTime = source.readLong(); componentResumeTimes.put(component, lastResumeTime); } } } public PkgUsageStats(PkgUsageStats pStats) { public PkgUsageStats(PkgUsageStats pStats) { packageName = pStats.packageName; packageName = pStats.packageName; launchCount = pStats.launchCount; launchCount = pStats.launchCount; usageTime = pStats.usageTime; usageTime = pStats.usageTime; componentResumeTimes = new HashMap<String, Long>(pStats.componentResumeTimes); } } public int describeContents() { public int describeContents() { Loading @@ -72,5 +85,10 @@ public class PkgUsageStats implements Parcelable { dest.writeString(packageName); dest.writeString(packageName); dest.writeInt(launchCount); dest.writeInt(launchCount); dest.writeLong(usageTime); dest.writeLong(usageTime); dest.writeInt(componentResumeTimes.size()); for (Map.Entry<String, Long> ent : componentResumeTimes.entrySet()) { dest.writeString(ent.getKey()); dest.writeLong(ent.getValue()); } } } } }
services/java/com/android/server/am/UsageStatsService.java +33 −12 Original line number Original line Diff line number Diff line Loading @@ -63,7 +63,7 @@ public final class UsageStatsService extends IUsageStats.Stub { private static final String TAG = "UsageStats"; private static final String TAG = "UsageStats"; // Current on-disk Parcel version // Current on-disk Parcel version private static final int VERSION = 1005; private static final int VERSION = 1006; private static final int CHECKIN_VERSION = 4; private static final int CHECKIN_VERSION = 4; Loading Loading @@ -145,6 +145,8 @@ public final class UsageStatsService extends IUsageStats.Stub { final HashMap<String, TimeStats> mLaunchTimes final HashMap<String, TimeStats> mLaunchTimes = new HashMap<String, TimeStats>(); = new HashMap<String, TimeStats>(); int mLaunchCount; int mLaunchCount; final HashMap<String, Long> mLastResumeTimes = new HashMap<String, Long>(); long mUsageTime; long mUsageTime; long mPausedTime; long mPausedTime; long mResumedTime; long mResumedTime; Loading @@ -160,20 +162,28 @@ public final class UsageStatsService extends IUsageStats.Stub { if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount + ", Usage time:" + mUsageTime); + ", Usage time:" + mUsageTime); final int N = in.readInt(); final int numTimeStats = in.readInt(); if (localLOGV) Slog.v(TAG, "Reading comps: " + N); if (localLOGV) Slog.v(TAG, "Reading comps: " + numTimeStats); for (int i=0; i<N; i++) { for (int i=0; i<numTimeStats; i++) { String comp = in.readString(); String comp = in.readString(); if (localLOGV) Slog.v(TAG, "Component: " + comp); if (localLOGV) Slog.v(TAG, "Component: " + comp); TimeStats times = new TimeStats(in); TimeStats times = new TimeStats(in); mLaunchTimes.put(comp, times); mLaunchTimes.put(comp, times); } } final int numResumeTimes = in.readInt(); if (localLOGV) Slog.v(TAG, "Reading last resume times: " + numResumeTimes); for (int i=0; i<numResumeTimes; i++) { String comp = in.readString(); if (localLOGV) Slog.v(TAG, "Component: " + comp); mLastResumeTimes.put(comp, in.readLong()); } } } void updateResume(boolean launched) { void updateResume(String comp, boolean launched) { if (launched) { if (launched) { mLaunchCount ++; mLaunchCount ++; } } mLastResumeTimes.put(comp, System.currentTimeMillis()); mResumedTime = SystemClock.elapsedRealtime(); mResumedTime = SystemClock.elapsedRealtime(); } } Loading Loading @@ -203,20 +213,29 @@ public final class UsageStatsService extends IUsageStats.Stub { void writeToParcel(Parcel out) { void writeToParcel(Parcel out) { out.writeInt(mLaunchCount); out.writeInt(mLaunchCount); out.writeLong(mUsageTime); out.writeLong(mUsageTime); final int N = mLaunchTimes.size(); final int numTimeStats = mLaunchTimes.size(); out.writeInt(N); out.writeInt(numTimeStats); if (N > 0) { if (numTimeStats > 0) { for (Map.Entry<String, TimeStats> ent : mLaunchTimes.entrySet()) { for (Map.Entry<String, TimeStats> ent : mLaunchTimes.entrySet()) { out.writeString(ent.getKey()); out.writeString(ent.getKey()); TimeStats times = ent.getValue(); TimeStats times = ent.getValue(); times.writeToParcel(out); times.writeToParcel(out); } } } } final int numResumeTimes = mLastResumeTimes.size(); out.writeInt(numResumeTimes); if (numResumeTimes > 0) { for (Map.Entry<String, Long> ent : mLastResumeTimes.entrySet()) { out.writeString(ent.getKey()); out.writeLong(ent.getValue()); } } } } void clear() { void clear() { mLaunchTimes.clear(); mLaunchTimes.clear(); mLaunchCount = 0; mLaunchCount = 0; mLastResumeTimes.clear(); mUsageTime = 0; mUsageTime = 0; } } } } Loading Loading @@ -546,7 +565,7 @@ public final class UsageStatsService extends IUsageStats.Stub { pus = new PkgUsageStatsExtended(); pus = new PkgUsageStatsExtended(); mStats.put(pkgName, pus); mStats.put(pkgName, pus); } } pus.updateResume(!samePackage); pus.updateResume(mLastResumedComp, !samePackage); if (!sameComp) { if (!sameComp) { pus.addLaunchCount(mLastResumedComp); pus.addLaunchCount(mLastResumedComp); } } Loading Loading @@ -624,7 +643,8 @@ public final class UsageStatsService extends IUsageStats.Stub { if (pus == null) { if (pus == null) { return null; return null; } } return new PkgUsageStats(pkgName, pus.mLaunchCount, pus.mUsageTime); return new PkgUsageStats(pkgName, pus.mLaunchCount, pus.mUsageTime, pus.mLastResumeTimes); } } } } Loading @@ -641,7 +661,8 @@ public final class UsageStatsService extends IUsageStats.Stub { int i = 0; int i = 0; for (String key: keys) { for (String key: keys) { PkgUsageStatsExtended pus = mStats.get(key); PkgUsageStatsExtended pus = mStats.get(key); retArr[i] = new PkgUsageStats(key, pus.mLaunchCount, pus.mUsageTime); retArr[i] = new PkgUsageStats(key, pus.mLaunchCount, pus.mUsageTime, pus.mLastResumeTimes); i++; i++; } } return retArr; return retArr; Loading