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

Commit c6fe37b7 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11697857 from 19ba208f to 24Q3-release

Change-Id: Ifff632d1f37cf7d6acc4d9877051538a27d425c4
parents e7c12760 19ba208f
Loading
Loading
Loading
Loading
+23 −0
Original line number Diff line number Diff line
@@ -171,6 +171,7 @@ java_aconfig_library {
// DeviceStateManager
aconfig_declarations {
    name: "android.hardware.devicestate.feature.flags-aconfig",
    exportable: true,
    package: "android.hardware.devicestate.feature.flags",
    srcs: ["core/java/android/hardware/devicestate/feature/*.aconfig"],
}
@@ -184,6 +185,7 @@ java_aconfig_library {
// Input
aconfig_declarations {
    name: "com.android.hardware.input.input-aconfig",
    exportable: true,
    package: "com.android.hardware.input",
    srcs: ["core/java/android/hardware/input/*.aconfig"],
}
@@ -456,6 +458,7 @@ cc_aconfig_library {
// Hardware
aconfig_declarations {
    name: "android.hardware.flags-aconfig",
    exportable: true,
    package: "android.hardware.flags",
    srcs: ["core/java/android/hardware/flags/*.aconfig"],
}
@@ -548,6 +551,7 @@ java_aconfig_library {
// Media Editing
aconfig_declarations {
    name: "com.android.media.flags.editing-aconfig",
    exportable: true,
    package: "com.android.media.editing.flags",
    srcs: [
        "media/java/android/media/flags/editing.aconfig",
@@ -593,6 +597,7 @@ java_aconfig_library {
// Media TV
aconfig_declarations {
    name: "android.media.tv.flags-aconfig",
    exportable: true,
    package: "android.media.tv.flags",
    srcs: ["media/java/android/media/tv/flags/media_tv.aconfig"],
}
@@ -606,6 +611,7 @@ java_aconfig_library {
// OnDeviceIntelligence
aconfig_declarations {
    name: "android.app.ondeviceintelligence-aconfig",
    exportable: true,
    package: "android.app.ondeviceintelligence.flags",
    srcs: ["core/java/android/app/ondeviceintelligence/flags/ondevice_intelligence.aconfig"],
}
@@ -657,6 +663,7 @@ cc_aconfig_library {
// Biometrics
aconfig_declarations {
    name: "android.hardware.biometrics.flags-aconfig",
    exportable: true,
    package: "android.hardware.biometrics",
    srcs: ["core/java/android/hardware/biometrics/flags.aconfig"],
}
@@ -734,6 +741,7 @@ java_aconfig_library {
// Broadcast Radio
aconfig_declarations {
    name: "android.hardware.radio.flags-aconfig",
    exportable: true,
    package: "android.hardware.radio",
    srcs: ["core/java/android/hardware/radio/*.aconfig"],
}
@@ -768,6 +776,7 @@ java_aconfig_library {
// Content Protection
aconfig_declarations {
    name: "android.view.contentprotection.flags-aconfig",
    exportable: true,
    package: "android.view.contentprotection.flags",
    srcs: ["core/java/android/view/contentprotection/flags/*.aconfig"],
}
@@ -794,6 +803,7 @@ java_aconfig_library {
// App prediction
aconfig_declarations {
    name: "android.service.appprediction.flags-aconfig",
    exportable: true,
    package: "android.service.appprediction.flags",
    srcs: ["core/java/android/service/appprediction/flags/*.aconfig"],
}
@@ -807,6 +817,7 @@ java_aconfig_library {
// Controls
aconfig_declarations {
    name: "android.service.controls.flags-aconfig",
    exportable: true,
    package: "android.service.controls.flags",
    srcs: ["core/java/android/service/controls/flags/*.aconfig"],
}
@@ -820,6 +831,7 @@ java_aconfig_library {
// Voice
aconfig_declarations {
    name: "android.service.voice.flags-aconfig",
    exportable: true,
    package: "android.service.voice.flags",
    srcs: ["core/java/android/service/voice/flags/*.aconfig"],
}
@@ -849,6 +861,7 @@ java_aconfig_library {
// Companion
aconfig_declarations {
    name: "android.companion.flags-aconfig",
    exportable: true,
    package: "android.companion",
    srcs: ["core/java/android/companion/*.aconfig"],
}
@@ -862,6 +875,7 @@ java_aconfig_library {
// Networking
aconfig_declarations {
    name: "android.net.platform.flags-aconfig",
    exportable: true,
    package: "android.net.platform.flags",
    srcs: ["core/java/android/net/flags.aconfig"],
    visibility: [":__subpackages__"],
@@ -870,6 +884,7 @@ aconfig_declarations {
// Thread network
aconfig_declarations {
    name: "com.android.net.thread.platform.flags-aconfig",
    exportable: true,
    package: "com.android.net.thread.platform.flags",
    srcs: ["core/java/android/net/thread/flags.aconfig"],
}
@@ -967,6 +982,7 @@ java_aconfig_library {
aconfig_declarations {
    name: "framework-jobscheduler-job.flags-aconfig",
    package: "android.app.job",
    exportable: true,
    srcs: ["apex/jobscheduler/framework/aconfig/job.aconfig"],
}

@@ -1032,6 +1048,7 @@ java_aconfig_library {
// Smartspace
aconfig_declarations {
    name: "android.app.smartspace.flags-aconfig",
    exportable: true,
    package: "android.app.smartspace.flags",
    srcs: ["core/java/android/app/smartspace/flags.aconfig"],
}
@@ -1065,6 +1082,7 @@ java_aconfig_library {
// USB
aconfig_declarations {
    name: "android.hardware.usb.flags-aconfig",
    exportable: true,
    package: "android.hardware.usb.flags",
    srcs: ["core/java/android/hardware/usb/flags/*.aconfig"],
}
@@ -1145,6 +1163,7 @@ java_aconfig_library {
// Provider
aconfig_declarations {
    name: "android.provider.flags-aconfig",
    exportable: true,
    package: "android.provider",
    srcs: ["core/java/android/provider/*.aconfig"],
}
@@ -1165,6 +1184,7 @@ java_aconfig_library {
// Speech
aconfig_declarations {
    name: "android.speech.flags-aconfig",
    exportable: true,
    package: "android.speech.flags",
    srcs: ["core/java/android/speech/flags/*.aconfig"],
}
@@ -1185,6 +1205,7 @@ java_aconfig_library {
// Content
aconfig_declarations {
    name: "android.content.flags-aconfig",
    exportable: true,
    package: "android.content.flags",
    srcs: ["core/java/android/content/flags/flags.aconfig"],
}
@@ -1211,6 +1232,7 @@ java_aconfig_library {
// CrashRecovery Module
aconfig_declarations {
    name: "android.crashrecovery.flags-aconfig",
    exportable: true,
    package: "android.crashrecovery.flags",
    srcs: ["packages/CrashRecovery/aconfig/flags.aconfig"],
}
@@ -1249,6 +1271,7 @@ java_aconfig_library {
// Wearable Sensing
aconfig_declarations {
    name: "android.app.wearable.flags-aconfig",
    exportable: true,
    package: "android.app.wearable",
    srcs: ["core/java/android/app/wearable/*.aconfig"],
}
+0 −11
Original line number Diff line number Diff line
@@ -1737,17 +1737,6 @@ class JobConcurrencyManager {
                    continue;
                }

                if (!nextPending.isReady()) {
                    // This could happen when the job count reached its quota, the constrains
                    // for the job has been updated but hasn't been removed from the pending
                    // queue yet.
                    if (DEBUG) {
                        Slog.w(TAG, "Pending+not ready job: " + nextPending);
                    }
                    pendingJobQueue.remove(nextPending);
                    continue;
                }

                if (DEBUG && isSimilarJobRunningLocked(nextPending)) {
                    Slog.w(TAG, "Already running similar job to: " + nextPending);
                }
+25 −66
Original line number Diff line number Diff line
@@ -512,7 +512,7 @@ public final class QuotaController extends StateController {

    /** An app has reached its quota. The message should contain a {@link UserPackage} object. */
    @VisibleForTesting
    static final int MSG_REACHED_TIME_QUOTA = 0;
    static final int MSG_REACHED_QUOTA = 0;
    /** Drop any old timing sessions. */
    private static final int MSG_CLEAN_UP_SESSIONS = 1;
    /** Check if a package is now within its quota. */
@@ -524,7 +524,7 @@ public final class QuotaController extends StateController {
     * object.
     */
    @VisibleForTesting
    static final int MSG_REACHED_EJ_TIME_QUOTA = 4;
    static final int MSG_REACHED_EJ_QUOTA = 4;
    /**
     * Process a new {@link UsageEvents.Event}. The event will be the message's object and the
     * userId will the first arg.
@@ -533,11 +533,6 @@ public final class QuotaController extends StateController {
    /** A UID's free quota grace period has ended. */
    @VisibleForTesting
    static final int MSG_END_GRACE_PERIOD = 6;
    /**
     * An app has reached its job count quota. The message should contain a {@link UserPackage}
     * object.
     */
    static final int MSG_REACHED_COUNT_QUOTA = 7;

    public QuotaController(@NonNull JobSchedulerService service,
            @NonNull BackgroundJobsController backgroundJobsController,
@@ -879,37 +874,17 @@ public final class QuotaController extends StateController {
    }

    @VisibleForTesting
    @GuardedBy("mLock")
    boolean isWithinQuotaLocked(@NonNull final JobStatus jobStatus) {
        final int standbyBucket = jobStatus.getEffectiveStandbyBucket();
        // A job is within quota if one of the following is true:
        //   1. it was started while the app was in the TOP state
        //   2. the app is currently in the foreground
        //   3. the app overall is within its quota
        if (jobStatus.shouldTreatAsUserInitiatedJob()
        return jobStatus.shouldTreatAsUserInitiatedJob()
                || isTopStartedJobLocked(jobStatus)
                || isUidInForeground(jobStatus.getSourceUid())) {
            return true;
        }

        if (standbyBucket == NEVER_INDEX) return false;

        if (isQuotaFreeLocked(standbyBucket)) return true;

        final ExecutionStats stats = getExecutionStatsLocked(jobStatus.getSourceUserId(),
                jobStatus.getSourcePackageName(), standbyBucket);
        if (!(getRemainingExecutionTimeLocked(stats) > 0)) {
            // Out of execution time quota.
            return false;
        }

        if (mService.isCurrentlyRunningLocked(jobStatus)) {
            // if job is running, considered as in quota so it can keep running.
            return true;
        }

        // Check if the app is within job count quota.
        return isUnderJobCountQuotaLocked(stats) && isUnderSessionCountQuotaLocked(stats);
                || isUidInForeground(jobStatus.getSourceUid())
                || isWithinQuotaLocked(
                jobStatus.getSourceUserId(), jobStatus.getSourcePackageName(), standbyBucket);
    }

    @GuardedBy("mLock")
@@ -934,11 +909,12 @@ public final class QuotaController extends StateController {
        ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket);
        // TODO: use a higher minimum remaining time for jobs with MINIMUM priority
        return getRemainingExecutionTimeLocked(stats) > 0
                && isUnderJobCountQuotaLocked(stats)
                && isUnderSessionCountQuotaLocked(stats);
                && isUnderJobCountQuotaLocked(stats, standbyBucket)
                && isUnderSessionCountQuotaLocked(stats, standbyBucket);
    }

    private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats) {
    private boolean isUnderJobCountQuotaLocked(@NonNull ExecutionStats stats,
            final int standbyBucket) {
        final long now = sElapsedRealtimeClock.millis();
        final boolean isUnderAllowedTimeQuota =
                (stats.jobRateLimitExpirationTimeElapsed <= now
@@ -947,7 +923,8 @@ public final class QuotaController extends StateController {
                && stats.bgJobCountInWindow < stats.jobCountLimit;
    }

    private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats) {
    private boolean isUnderSessionCountQuotaLocked(@NonNull ExecutionStats stats,
            final int standbyBucket) {
        final long now = sElapsedRealtimeClock.millis();
        final boolean isUnderAllowedTimeQuota = (stats.sessionRateLimitExpirationTimeElapsed <= now
                || stats.sessionCountInRateLimitingWindow < mMaxSessionCountPerRateLimitingWindow);
@@ -1472,7 +1449,6 @@ public final class QuotaController extends StateController {
                stats.jobCountInRateLimitingWindow = 0;
            }
            stats.jobCountInRateLimitingWindow += count;
            stats.bgJobCountInWindow += count;
        }
    }

@@ -1707,11 +1683,10 @@ public final class QuotaController extends StateController {
                    changedJobs.add(js);
                }
            } else if (realStandbyBucket != EXEMPTED_INDEX && realStandbyBucket != ACTIVE_INDEX
                    && realStandbyBucket == js.getEffectiveStandbyBucket()
                    && !mService.isCurrentlyRunningLocked(js)) {
                    && realStandbyBucket == js.getEffectiveStandbyBucket()) {
                // An app in the ACTIVE bucket may be out of quota while the job could be in quota
                // for some reason. Therefore, avoid setting the real value here and check each job
                // individually. Running job need to determine its own quota status as well.
                // individually.
                if (setConstraintSatisfied(js, nowElapsed, realInQuota, isWithinEJQuota)) {
                    changedJobs.add(js);
                }
@@ -1830,8 +1805,9 @@ public final class QuotaController extends StateController {
        }

        ExecutionStats stats = getExecutionStatsLocked(userId, packageName, standbyBucket);
        final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats);
        final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats);
        final boolean isUnderJobCountQuota = isUnderJobCountQuotaLocked(stats, standbyBucket);
        final boolean isUnderTimingSessionCountQuota = isUnderSessionCountQuotaLocked(stats,
                standbyBucket);
        final long remainingEJQuota = getRemainingEJExecutionTimeLocked(userId, packageName);

        final boolean inRegularQuota =
@@ -2150,11 +2126,6 @@ public final class QuotaController extends StateController {
                mBgJobCount++;
                if (mRegularJobTimer) {
                    incrementJobCountLocked(mPkg.userId, mPkg.packageName, 1);
                    final ExecutionStats stats = getExecutionStatsLocked(mPkg.userId,
                            mPkg.packageName, jobStatus.getEffectiveStandbyBucket(), false);
                    if (stats.bgJobCountInWindow >= stats.jobCountLimit) {
                        mHandler.obtainMessage(MSG_REACHED_COUNT_QUOTA, mPkg).sendToTarget();
                    }
                }
                if (mRunningBgJobs.size() == 1) {
                    // Started tracking the first job.
@@ -2286,6 +2257,7 @@ public final class QuotaController extends StateController {
                    // repeatedly plugged in and unplugged, or an app changes foreground state
                    // very frequently, the job count for a package may be artificially high.
                    mBgJobCount = mRunningBgJobs.size();

                    if (mRegularJobTimer) {
                        incrementJobCountLocked(mPkg.userId, mPkg.packageName, mBgJobCount);
                        // Starting the timer means that all cached execution stats are now
@@ -2312,8 +2284,7 @@ public final class QuotaController extends StateController {
                    return;
                }
                Message msg = mHandler.obtainMessage(
                        mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA,
                        mPkg);
                        mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg);
                final long timeRemainingMs = mRegularJobTimer
                        ? getTimeUntilQuotaConsumedLocked(mPkg.userId, mPkg.packageName)
                        : getTimeUntilEJQuotaConsumedLocked(mPkg.userId, mPkg.packageName);
@@ -2330,7 +2301,7 @@ public final class QuotaController extends StateController {

        private void cancelCutoff() {
            mHandler.removeMessages(
                    mRegularJobTimer ? MSG_REACHED_TIME_QUOTA : MSG_REACHED_EJ_TIME_QUOTA, mPkg);
                    mRegularJobTimer ? MSG_REACHED_QUOTA : MSG_REACHED_EJ_QUOTA, mPkg);
        }

        public void dump(IndentingPrintWriter pw, Predicate<JobStatus> predicate) {
@@ -2586,7 +2557,7 @@ public final class QuotaController extends StateController {
                    break;
                default:
                    if (DEBUG) {
                        Slog.d(TAG, "Dropping usage event " + event.getEventType());
                        Slog.d(TAG, "Dropping event " + event.getEventType());
                    }
                    break;
            }
@@ -2695,7 +2666,7 @@ public final class QuotaController extends StateController {
        public void handleMessage(Message msg) {
            synchronized (mLock) {
                switch (msg.what) {
                    case MSG_REACHED_TIME_QUOTA: {
                    case MSG_REACHED_QUOTA: {
                        UserPackage pkg = (UserPackage) msg.obj;
                        if (DEBUG) {
                            Slog.d(TAG, "Checking if " + pkg + " has reached its quota.");
@@ -2714,7 +2685,7 @@ public final class QuotaController extends StateController {
                            // This could potentially happen if an old session phases out while a
                            // job is currently running.
                            // Reschedule message
                            Message rescheduleMsg = obtainMessage(MSG_REACHED_TIME_QUOTA, pkg);
                            Message rescheduleMsg = obtainMessage(MSG_REACHED_QUOTA, pkg);
                            timeRemainingMs = getTimeUntilQuotaConsumedLocked(pkg.userId,
                                    pkg.packageName);
                            if (DEBUG) {
@@ -2724,7 +2695,7 @@ public final class QuotaController extends StateController {
                        }
                        break;
                    }
                    case MSG_REACHED_EJ_TIME_QUOTA: {
                    case MSG_REACHED_EJ_QUOTA: {
                        UserPackage pkg = (UserPackage) msg.obj;
                        if (DEBUG) {
                            Slog.d(TAG, "Checking if " + pkg + " has reached its EJ quota.");
@@ -2742,7 +2713,7 @@ public final class QuotaController extends StateController {
                            // This could potentially happen if an old session phases out while a
                            // job is currently running.
                            // Reschedule message
                            Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_TIME_QUOTA, pkg);
                            Message rescheduleMsg = obtainMessage(MSG_REACHED_EJ_QUOTA, pkg);
                            timeRemainingMs = getTimeUntilEJQuotaConsumedLocked(
                                    pkg.userId, pkg.packageName);
                            if (DEBUG) {
@@ -2752,18 +2723,6 @@ public final class QuotaController extends StateController {
                        }
                        break;
                    }
                    case MSG_REACHED_COUNT_QUOTA: {
                        UserPackage pkg = (UserPackage) msg.obj;
                        if (DEBUG) {
                            Slog.d(TAG, pkg + " has reached its count quota.");
                        }

                        mStateChangedListener.onControllerStateChanged(
                                maybeUpdateConstraintForPkgLocked(
                                        sElapsedRealtimeClock.millis(),
                                        pkg.userId, pkg.packageName));
                        break;
                    }
                    case MSG_CLEAN_UP_SESSIONS:
                        if (DEBUG) {
                            Slog.d(TAG, "Cleaning up timing sessions.");
+21 −0
Original line number Diff line number Diff line
@@ -30,3 +30,24 @@ java_library_host {
        type: "full",
    },
}

java_test_host {
    name: "extract-flagged-apis-test",
    srcs: ["ExtractFlaggedApisTest.kt"],
    libs: [
        "extract_flagged_apis_proto",
        "junit",
        "libprotobuf-java-full",
    ],
    static_libs: [
        "truth",
        "truth-liteproto-extension",
        "truth-proto-extension",
    ],
    data: [
        ":extract-flagged-apis",
    ],
    test_options: {
        unit_test: true,
    },
}
+5 −6
Original line number Diff line number Diff line
@@ -28,9 +28,7 @@ fun main(args: Array<String>) {
    val builder = FlagApiMap.newBuilder()
    for (pkg in cb.getPackages().packages) {
        val packageName = pkg.qualifiedName()
        pkg.allClasses()
            .filter { it.methods().size > 0 }
            .forEach {
        pkg.allClasses().forEach {
            extractFlaggedApisFromClass(it, it.methods(), packageName, builder)
            extractFlaggedApisFromClass(it, it.constructors(), packageName, builder)
        }
@@ -45,6 +43,7 @@ fun extractFlaggedApisFromClass(
    packageName: String,
    builder: FlagApiMap.Builder
) {
    if (methods.isEmpty()) return
    val classFlag =
        classItem.modifiers
            .findAnnotation("android.annotation.FlaggedApi")
Loading