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

Commit 9fc03308 authored by Mark Brophy's avatar Mark Brophy
Browse files

Expose app resume times to the ApplicationProvider.

Add ActivityManager.getAllPackageUsageStats which returns
the PkgUsageStats object for all packages.

In UsageStatsService, remember the last resume time of each component, and
add that info to PkgUsageStats instances.

ApplicationProvider will use getAllPackageUsageStats and the new field
in PkgUsageStats to set the new SearchManager column
SUGGEST_COLUMN_LAST_USAGE_HINT for requests with the GLOBAL_SEARCH
permission.

Change-Id: I80e9b127410ed0d528515d2256787f30a953e9b0
parent b7440a14
Loading
Loading
Loading
Loading
+18 −0
Original line number 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 
     * @hide
+20 −2
Original line number Diff line number Diff line
@@ -19,6 +19,9 @@ package com.android.internal.os;
import android.os.Parcel;
import android.os.Parcelable;

import java.util.HashMap;
import java.util.Map;

/**
 * implementation of PkgUsageStats associated with an
 * application package.
@@ -28,6 +31,7 @@ public class PkgUsageStats implements Parcelable {
    public String packageName;
    public int launchCount;
    public long usageTime;
    public Map<String, Long> componentResumeTimes;
    
    public static final Parcelable.Creator<PkgUsageStats> CREATOR
    = new Parcelable.Creator<PkgUsageStats>() {
@@ -46,22 +50,31 @@ public class PkgUsageStats implements Parcelable {
        + " " + packageName + "}";
    }
    
    public PkgUsageStats(String pkgName, int count, long time) {
    public PkgUsageStats(String pkgName, int count, long time, Map<String, Long> lastResumeTimes) {
        packageName = pkgName;
        launchCount = count;
        usageTime = time;
        componentResumeTimes = new HashMap<String, Long>(lastResumeTimes);
    }
    
    public PkgUsageStats(Parcel source) {
        packageName = source.readString();
        launchCount = source.readInt();
        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) {
        packageName = pStats.packageName;
        launchCount = pStats.launchCount;
        usageTime = pStats.usageTime;
        componentResumeTimes = new HashMap<String, Long>(pStats.componentResumeTimes);
    }

    public int describeContents() {
@@ -72,5 +85,10 @@ public class PkgUsageStats implements Parcelable {
        dest.writeString(packageName);
        dest.writeInt(launchCount);
        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 Diff line number Diff line
@@ -63,7 +63,7 @@ public final class UsageStatsService extends IUsageStats.Stub {
    private static final String TAG = "UsageStats";
    
    // Current on-disk Parcel version
    private static final int VERSION = 1005;
    private static final int VERSION = 1006;

    private static final int CHECKIN_VERSION = 4;
    
@@ -145,6 +145,8 @@ public final class UsageStatsService extends IUsageStats.Stub {
        final HashMap<String, TimeStats> mLaunchTimes
                = new HashMap<String, TimeStats>();
        int mLaunchCount;
        final HashMap<String, Long> mLastResumeTimes
                = new HashMap<String, Long>();
        long mUsageTime;
        long mPausedTime;
        long mResumedTime;
@@ -160,20 +162,28 @@ public final class UsageStatsService extends IUsageStats.Stub {
            if (localLOGV) Slog.v(TAG, "Launch count: " + mLaunchCount
                    + ", Usage time:" + mUsageTime);
            
            final int N = in.readInt();
            if (localLOGV) Slog.v(TAG, "Reading comps: " + N);
            for (int i=0; i<N; i++) {
            final int numTimeStats = in.readInt();
            if (localLOGV) Slog.v(TAG, "Reading comps: " + numTimeStats);
            for (int i=0; i<numTimeStats; i++) {
                String comp = in.readString();
                if (localLOGV) Slog.v(TAG, "Component: " + comp);
                TimeStats times = new TimeStats(in);
                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) {
                mLaunchCount ++;
            }
            mLastResumeTimes.put(comp, System.currentTimeMillis());
            mResumedTime = SystemClock.elapsedRealtime();
        }
        
@@ -203,20 +213,29 @@ public final class UsageStatsService extends IUsageStats.Stub {
        void writeToParcel(Parcel out) {
            out.writeInt(mLaunchCount);
            out.writeLong(mUsageTime);
            final int N = mLaunchTimes.size();
            out.writeInt(N);
            if (N > 0) {
            final int numTimeStats = mLaunchTimes.size();
            out.writeInt(numTimeStats);
            if (numTimeStats > 0) {
                for (Map.Entry<String, TimeStats> ent : mLaunchTimes.entrySet()) {
                    out.writeString(ent.getKey());
                    TimeStats times = ent.getValue();
                    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() {
            mLaunchTimes.clear();
            mLaunchCount = 0;
            mLastResumeTimes.clear();
            mUsageTime = 0;
        }
    }
@@ -546,7 +565,7 @@ public final class UsageStatsService extends IUsageStats.Stub {
                pus = new PkgUsageStatsExtended();
                mStats.put(pkgName, pus);
            }
            pus.updateResume(!samePackage);
            pus.updateResume(mLastResumedComp, !samePackage);
            if (!sameComp) {
                pus.addLaunchCount(mLastResumedComp);
            }
@@ -624,7 +643,8 @@ public final class UsageStatsService extends IUsageStats.Stub {
            if (pus == 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;
            for (String key: keys) {
                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++;
            }
            return retArr;