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

Commit 22f4af77 authored by Xin Guan's avatar Xin Guan Committed by Android (Google) Code Review
Browse files

Merge "JobScheduler: Update wakelock tag with additional job type info" into main

parents 0a2221f4 56931489
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -55,3 +55,14 @@ flag {
    description: "Introduce a new getPendingJobReasonsHistory() API which returns a limited historical view of getPendingJobReasons()."
    bug: "372031023"
}


flag {
    name: "add_type_info_to_wakelock_tag"
    namespace: "backstage_power"
    description: "Append the job type info to wakelock tag"
    bug: "381880530"
    metadata {
        purpose: PURPOSE_BUGFIX
    }
}
+38 −0
Original line number Diff line number Diff line
@@ -5766,6 +5766,41 @@ public class JobSchedulerService extends com.android.server.SystemService
    }

    // Shell command infrastructure
    int getJobWakelockTag(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
            int jobId) {
        try {
            final int uid = AppGlobals.getPackageManager().getPackageUid(pkgName, 0,
                    userId != UserHandle.USER_ALL ? userId : UserHandle.USER_SYSTEM);
            if (uid < 0) {
                pw.print("unknown(");
                pw.print(pkgName);
                pw.println(")");
                return JobSchedulerShellCommand.CMD_ERR_NO_PACKAGE;
            }

            synchronized (mLock) {
                final JobStatus js = mJobs.getJobByUidAndJobId(uid, namespace, jobId);
                if (DEBUG) {
                    Slog.d(TAG, "get-job-wakelock-tag " + namespace
                            + "/" + uid + "/" + jobId + ": " + js);
                }
                if (js == null) {
                    pw.print("unknown(");
                    UserHandle.formatUid(pw, uid);
                    pw.print("/jid");
                    pw.print(jobId);
                    pw.println(")");
                    return JobSchedulerShellCommand.CMD_ERR_NO_JOB;
                }

                pw.println(js.getWakelockTag());
            }
        } catch (RemoteException e) {
            // can't happen
        }
        return 0;
    }

    int getJobState(PrintWriter pw, String pkgName, int userId, @Nullable String namespace,
            int jobId) {
        try {
@@ -5945,6 +5980,9 @@ public class JobSchedulerService extends com.android.server.SystemService
            pw.print(android.app.job.Flags.FLAG_GET_PENDING_JOB_REASONS_HISTORY_API,
                    android.app.job.Flags.getPendingJobReasonsHistoryApi());
            pw.println();
            pw.print(android.app.job.Flags.FLAG_ADD_TYPE_INFO_TO_WAKELOCK_TAG,
                    android.app.job.Flags.addTypeInfoToWakelockTag());
            pw.println();
            pw.decreaseIndent();
            pw.println();

+48 −0
Original line number Diff line number Diff line
@@ -86,6 +86,8 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
                    return getTransferredNetworkBytes(pw, BYTE_OPTION_DOWNLOAD);
                case "get-transferred-upload-bytes":
                    return getTransferredNetworkBytes(pw, BYTE_OPTION_UPLOAD);
                case "get-job-wakelock-tag":
                    return getJobWakelockTag(pw);
                case "get-job-state":
                    return getJobState(pw);
                case "heartbeat":
@@ -424,6 +426,9 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
            case android.app.job.Flags.FLAG_JOB_DEBUG_INFO_APIS:
                pw.println(android.app.job.Flags.jobDebugInfoApis());
                break;
            case android.app.job.Flags.FLAG_ADD_TYPE_INFO_TO_WAKELOCK_TAG:
                pw.println(android.app.job.Flags.addTypeInfoToWakelockTag());
                break;
            case com.android.server.job.Flags.FLAG_BATCH_ACTIVE_BUCKET_JOBS:
                pw.println(com.android.server.job.Flags.batchActiveBucketJobs());
                break;
@@ -581,6 +586,49 @@ public final class JobSchedulerShellCommand extends BasicShellCommandHandler {
        }
    }

    private int getJobWakelockTag(PrintWriter pw) throws Exception {
        checkPermission("get job wakelock tag");

        int userId = UserHandle.USER_SYSTEM;
        String namespace = null;

        String opt;
        while ((opt = getNextOption()) != null) {
            switch (opt) {
                case "-u":
                case "--user":
                    userId = UserHandle.parseUserArg(getNextArgRequired());
                    break;

                case "-n":
                case "--namespace":
                    namespace = getNextArgRequired();
                    break;

                default:
                    pw.println("Error: unknown option '" + opt + "'");
                    return -1;
            }
        }

        if (userId == UserHandle.USER_CURRENT) {
            userId = ActivityManager.getCurrentUser();
        }

        final String pkgName = getNextArgRequired();
        final String jobIdStr = getNextArgRequired();
        final int jobId = Integer.parseInt(jobIdStr);

        final long ident = Binder.clearCallingIdentity();
        try {
            int ret = mInternal.getJobWakelockTag(pw, pkgName, userId, namespace, jobId);
            printError(ret, pkgName, userId, namespace, jobId);
            return ret;
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }

    private int getJobState(PrintWriter pw) throws Exception {
        checkPermission("get job state");

+6 −1
Original line number Diff line number Diff line
@@ -1459,7 +1459,12 @@ public final class JobStatus {
    @NonNull
    public String getWakelockTag() {
        if (mWakelockTag == null) {
            mWakelockTag = "*job*/" + this.batteryName;
            mWakelockTag = "*job*";
            if (android.app.job.Flags.addTypeInfoToWakelockTag()) {
                mWakelockTag += (isRequestedExpeditedJob()
                    ? "e" : (getJob().isUserInitiated() ? "u" : "r"));
            }
            mWakelockTag += "/" + this.batteryName;
        }
        return mWakelockTag;
    }