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

Commit b16ab3b9 authored by Varun Shah's avatar Varun Shah Committed by android-build-merger
Browse files

Merge "Add a dumpsys for UsageStatsDatabase info." into qt-dev

am: 88f46c6c

Change-Id: Ieb6b1e1e08c117c87b6f5db9ff3edc101e7d766a
parents 8dd69195 88f46c6c
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -1172,4 +1172,16 @@ public class UsageStatsDatabase {
            pw.decreaseIndent();
        }
    }

    IntervalStats readIntervalStatsForFile(int interval, long fileName) {
        synchronized (mLock) {
            final IntervalStats stats = new IntervalStats();
            try {
                readLocked(mSortedStatFiles[interval].get(fileName, null), stats);
                return stats;
            } catch (Exception e) {
                return null;
            }
        }
    }
}
+56 −0
Original line number Diff line number Diff line
@@ -774,6 +774,62 @@ public class UsageStatsService extends SystemService implements
                            mAppTimeLimit.dump(remainingArgs, pw);
                        }
                        return;
                    } else if ("file".equals(arg)) {
                        final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
                        if (i + 1 >= args.length) {
                            // dump everything for all users
                            final int numUsers = mUserState.size();
                            for (int user = 0; user < numUsers; user++) {
                                ipw.println("user=" + mUserState.keyAt(user));
                                ipw.increaseIndent();
                                mUserState.valueAt(user).dumpFile(ipw, null);
                                ipw.decreaseIndent();
                            }
                        } else {
                            final int user;
                            try {
                                user = Integer.valueOf(args[i + 1]);
                            } catch (NumberFormatException nfe) {
                                ipw.println("invalid user specified.");
                                return;
                            }
                            if (mUserState.indexOfKey(user) < 0) {
                                ipw.println("the specified user does not exist.");
                                return;
                            }
                            final String[] remainingArgs = Arrays.copyOfRange(
                                    args, i + 2, args.length);
                            // dump everything for the specified user
                            mUserState.get(user).dumpFile(ipw, remainingArgs);
                        }
                        return;
                    } else if ("database-info".equals(arg)) {
                        final IndentingPrintWriter ipw = new IndentingPrintWriter(pw, "  ");
                        if (i + 1 >= args.length) {
                            // dump info for all users
                            final int numUsers = mUserState.size();
                            for (int user = 0; user < numUsers; user++) {
                                ipw.println("user=" + mUserState.keyAt(user));
                                ipw.increaseIndent();
                                mUserState.valueAt(user).dumpDatabaseInfo(ipw);
                                ipw.decreaseIndent();
                            }
                        } else {
                            final int user;
                            try {
                                user = Integer.valueOf(args[i + 1]);
                            } catch (NumberFormatException nfe) {
                                ipw.println("invalid user specified.");
                                return;
                            }
                            if (mUserState.indexOfKey(user) < 0) {
                                ipw.println("the specified user does not exist.");
                                return;
                            }
                            // dump info only for the specified user
                            mUserState.get(user).dumpDatabaseInfo(ipw);
                        }
                        return;
                    } else if (arg != null && !arg.startsWith("-")) {
                        // Anything else that doesn't start with '-' is a pkg to filter
                        pkg = arg;
+88 −0
Original line number Diff line number Diff line
@@ -28,6 +28,7 @@ import static android.app.usage.UsageStatsManager.INTERVAL_YEARLY;
import android.app.usage.ConfigurationStats;
import android.app.usage.EventList;
import android.app.usage.EventStats;
import android.app.usage.TimeSparseArray;
import android.app.usage.UsageEvents;
import android.app.usage.UsageEvents.Event;
import android.app.usage.UsageStats;
@@ -38,6 +39,7 @@ import android.os.SystemClock;
import android.text.format.DateUtils;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.AtomicFile;
import android.util.Slog;
import android.util.SparseIntArray;

@@ -665,6 +667,77 @@ class UserUsageStatsService {
        mDatabase.dump(pw, compact);
    }

    void dumpDatabaseInfo(IndentingPrintWriter ipw) {
        mDatabase.dump(ipw, false);
    }

    void dumpFile(IndentingPrintWriter ipw, String[] args) {
        if (args == null || args.length == 0) {
            // dump all files for every interval for specified user
            final int numIntervals = mDatabase.mSortedStatFiles.length;
            for (int interval = 0; interval < numIntervals; interval++) {
                ipw.println("interval=" + intervalToString(interval));
                ipw.increaseIndent();
                dumpFileDetailsForInterval(ipw, interval);
                ipw.decreaseIndent();
            }
        } else {
            final int interval;
            try {
                final int intervalValue = stringToInterval(args[0]);
                if (intervalValue == -1) {
                    interval = Integer.valueOf(args[0]);
                } else {
                    interval = intervalValue;
                }
            } catch (NumberFormatException nfe) {
                ipw.println("invalid interval specified.");
                return;
            }
            if (interval < 0 || interval >= mDatabase.mSortedStatFiles.length) {
                ipw.println("the specified interval does not exist.");
                return;
            }
            if (args.length == 1) {
                // dump all files in the specified interval
                dumpFileDetailsForInterval(ipw, interval);
            } else {
                // dump details only for the specified filename
                final long filename;
                try {
                    filename = Long.valueOf(args[1]);
                } catch (NumberFormatException nfe) {
                    ipw.println("invalid filename specified.");
                    return;
                }
                final IntervalStats stats = mDatabase.readIntervalStatsForFile(interval, filename);
                if (stats == null) {
                    ipw.println("the specified filename does not exist.");
                    return;
                }
                dumpFileDetails(ipw, stats, Long.valueOf(args[1]));
            }
        }
    }

    private void dumpFileDetailsForInterval(IndentingPrintWriter ipw, int interval) {
        final TimeSparseArray<AtomicFile> files = mDatabase.mSortedStatFiles[interval];
        final int numFiles = files.size();
        for (int i = 0; i < numFiles; i++) {
            final long filename = files.keyAt(i);
            final IntervalStats stats = mDatabase.readIntervalStatsForFile(interval, filename);
            dumpFileDetails(ipw, stats, filename);
            ipw.println();
        }
    }

    private void dumpFileDetails(IndentingPrintWriter ipw, IntervalStats stats, long filename) {
        ipw.println("file=" + filename);
        ipw.increaseIndent();
        printIntervalStats(ipw, stats, false, false, null);
        ipw.decreaseIndent();
    }

    static String formatDateTime(long dateTime, boolean pretty) {
        if (pretty) {
            return "\"" + sDateFormat.format(dateTime)+ "\"";
@@ -908,6 +981,21 @@ class UserUsageStatsService {
        }
    }

    private static int stringToInterval(String interval) {
        switch (interval.toLowerCase()) {
            case "daily":
                return INTERVAL_DAILY;
            case "weekly":
                return INTERVAL_WEEKLY;
            case "monthly":
                return INTERVAL_MONTHLY;
            case "yearly":
                return INTERVAL_YEARLY;
            default:
                return -1;
        }
    }

    private static String eventToString(int eventType) {
        switch (eventType) {
            case Event.NONE: