Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 622c03e6 authored by Mark Brophy's avatar Mark Brophy Committed by Android (Google) Code Review
Browse files

Merge "Expose app resume times to the ApplicationProvider."

parents 6df76aa9 9fc03308
Loading
Loading
Loading
Loading
+18 −0
Original line number Original line Diff line number Diff line
@@ -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
+20 −2
Original line number Original line Diff line number Diff line
@@ -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.
@@ -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>() {
@@ -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() {
@@ -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());
        }
    }
    }
}
}
+33 −12
Original line number Original line Diff line number Diff line
@@ -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;
    
    
@@ -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;
@@ -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();
        }
        }
        
        
@@ -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;
        }
        }
    }
    }
@@ -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);
            }
            }
@@ -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);
        }
        }
    }
    }
    
    
@@ -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;