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

Commit cf76872a authored by Amith Yamasani's avatar Amith Yamasani
Browse files

Add ability to get and set idle state of apps

Add am shell command to set and get idle
Add public API to check if an app is idle

Bug: 20534955
Bug: 20493806
Change-Id: Ib48b3fe847c71f05ef3905563f6e903cf060c498
parent a1ab2d37
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -6131,6 +6131,7 @@ package android.app.usage {
  }
  public final class UsageStatsManager {
    method public boolean isAppIdle(java.lang.String);
    method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long);
    method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long);
    method public android.app.usage.UsageEvents queryEvents(long, long);
+1 −0
Original line number Diff line number Diff line
@@ -6319,6 +6319,7 @@ package android.app.usage {
  }
  public final class UsageStatsManager {
    method public boolean isAppIdle(java.lang.String);
    method public java.util.Map<java.lang.String, android.app.usage.UsageStats> queryAndAggregateUsageStats(long, long);
    method public java.util.List<android.app.usage.ConfigurationStats> queryConfigurations(int, long, long);
    method public android.app.usage.UsageEvents queryEvents(long, long);
+51 −0
Original line number Diff line number Diff line
@@ -142,6 +142,8 @@ public class Am extends BaseCommand {
                "       am task resizeable <TASK_ID> [true|false]\n" +
                "       am task resize <TASK_ID> <LEFT,TOP,RIGHT,BOTTOM>\n" +
                "       am get-config\n" +
                "       am set-idle [--user <USER_ID>] <PACKAGE> true|false\n" +
                "       am get-idle [--user <USER_ID>] <PACKAGE>\n" +
                "\n" +
                "am start: start an Activity.  Options are:\n" +
                "    -D: enable debugging\n" +
@@ -282,6 +284,11 @@ public class Am extends BaseCommand {
                "am get-config: retrieve the configuration and any recent configurations\n" +
                "  of the device\n" +
                "\n" +
                "am set-idle: sets the idle state of an app\n" +
                "\n" +
                "am get-idle: returns the idle state of an app\n" +
                "\n" +
                "\n" +
                "<INTENT> specifications include these flags and arguments:\n" +
                "    [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]\n" +
                "    [-c <CATEGORY> [-c <CATEGORY>] ...]\n" +
@@ -388,6 +395,10 @@ public class Am extends BaseCommand {
            runTask();
        } else if (op.equals("get-config")) {
            runGetConfig();
        } else if (op.equals("set-idle")) {
            runSetIdle();
        } else if (op.equals("get-idle")) {
            runGetIdle();
        } else {
            showError("Error: unknown command '" + op + "'");
        }
@@ -2019,6 +2030,46 @@ public class Am extends BaseCommand {
        }
    }

    private void runSetIdle() throws Exception {
        int userId = UserHandle.USER_OWNER;

        String opt;
        while ((opt=nextOption()) != null) {
            if (opt.equals("--user")) {
                userId = parseUserArg(nextArgRequired());
            } else {
                System.err.println("Error: Unknown option: " + opt);
                return;
            }
        }
        String packageName = nextArgRequired();
        String value = nextArgRequired();

        IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
                Context.USAGE_STATS_SERVICE));
        usm.setAppIdle(packageName, Boolean.parseBoolean(value), userId);
    }

    private void runGetIdle() throws Exception {
        int userId = UserHandle.USER_OWNER;

        String opt;
        while ((opt=nextOption()) != null) {
            if (opt.equals("--user")) {
                userId = parseUserArg(nextArgRequired());
            } else {
                System.err.println("Error: Unknown option: " + opt);
                return;
            }
        }
        String packageName = nextArgRequired();

        IUsageStatsManager usm = IUsageStatsManager.Stub.asInterface(ServiceManager.getService(
                Context.USAGE_STATS_SERVICE));
        boolean isIdle = usm.isAppIdle(packageName, userId);
        System.out.println("Idle=" + isIdle);
    }

    /**
     * Open the given file for sending into the system process. This verifies
     * with SELinux that the system will have access to the file.
+2 −0
Original line number Diff line number Diff line
@@ -30,4 +30,6 @@ interface IUsageStatsManager {
    ParceledListSlice queryConfigurationStats(int bucketType, long beginTime, long endTime,
            String callingPackage);
    UsageEvents queryEvents(long beginTime, long endTime, String callingPackage);
    void setAppIdle(String packageName, boolean idle, int userId);
    boolean isAppIdle(String packageName, int userId);
}
+17 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.app.usage;
import android.content.Context;
import android.content.pm.ParceledListSlice;
import android.os.RemoteException;
import android.os.UserHandle;
import android.util.ArrayMap;

import java.util.Collections;
@@ -217,4 +218,20 @@ public final class UsageStatsManager {
        }
        return aggregatedStats;
    }

    /**
     * Returns whether the specified app is currently considered idle. This will be true if the
     * app hasn't been used directly or indirectly for a period of time defined by the system. This
     * could be of the order of several hours or days.
     * @param packageName The package name of the app to query
     * @return whether the app is currently considered idle
     */
    public boolean isAppIdle(String packageName) {
        try {
            return mService.isAppIdle(packageName, UserHandle.myUserId());
        } catch (RemoteException e) {
            // fall through and return default
        }
        return false;
    }
}
Loading