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

Commit bce9f378 authored by Kweku Adams's avatar Kweku Adams
Browse files

Use the correct UID for proc state evaluation.

JS policy is primarily based on the source UID, not the calling UID.
Update the code and tests to evaluate the source UID state.

Bug: 253815639
Bug: 253820921
Test: atest FrameworksMockingServicesTests:FlexibilityControllerTest
Change-Id: I193b69e0809f10f38e11fe956f8dbb9c325d993b
parent c81b5c68
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -237,7 +237,7 @@ public final class FlexibilityController extends StateController {
    @GuardedBy("mLock")
    boolean isFlexibilitySatisfiedLocked(JobStatus js) {
        return !mFlexibilityEnabled
                || mService.getUidBias(js.getUid()) == JobInfo.BIAS_TOP_APP
                || mService.getUidBias(js.getSourceUid()) == JobInfo.BIAS_TOP_APP
                || mService.isCurrentlyRunningLocked(js)
                || getNumSatisfiedRequiredConstraintsLocked(js)
                >= js.getNumRequiredFlexibleConstraints();
@@ -587,7 +587,7 @@ public final class FlexibilityController extends StateController {
                }
                if (latest - nowElapsed < mDeadlineProximityLimitMs) {
                    if (DEBUG) {
                        Slog.d(TAG, "deadline proximity met: " + js.getUid());
                        Slog.d(TAG, "deadline proximity met: " + js);
                    }
                    mFlexibilityTracker.adjustJobsRequiredConstraints(js,
                            -js.getNumRequiredFlexibleConstraints(), nowElapsed);
@@ -600,7 +600,7 @@ public final class FlexibilityController extends StateController {
                }
                if (latest - nextTimeElapsed <= mDeadlineProximityLimitMs) {
                    if (DEBUG) {
                        Slog.d(TAG, "last alarm set: " + js.getUid());
                        Slog.d(TAG, "last alarm set: " + js);
                    }
                    addAlarm(js, latest - mDeadlineProximityLimitMs);
                    return;
+17 −10
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import android.app.AlarmManager;
import android.app.AppGlobals;
import android.app.job.JobInfo;
import android.content.ComponentName;
import android.content.Context;
@@ -80,11 +81,13 @@ public class FlexibilityControllerTest {
    private static final String SOURCE_PACKAGE = "com.android.frameworks.mockingservicestests";
    private static final int SOURCE_USER_ID = 0;
    private static final long FROZEN_TIME = 100L;

    private MockitoSession mMockingSession;
    private FlexibilityController mFlexibilityController;
    private DeviceConfig.Properties.Builder mDeviceConfigPropertiesBuilder;
    private JobStore mJobStore;
    private FlexibilityController.FcConfig mFcConfig;
    private int mSourceUid;

    @Mock
    private AlarmManager mAlarmManager;
@@ -98,7 +101,7 @@ public class FlexibilityControllerTest {
    private PackageManager mPackageManager;

    @Before
    public void setup() {
    public void setup() throws Exception {
        mMockingSession = mockitoSession()
                .initMocks(this)
                .strictness(Strictness.LENIENT)
@@ -144,6 +147,8 @@ public class FlexibilityControllerTest {
                mPrefetchController);
        mFcConfig = mFlexibilityController.getFcConfig();

        mSourceUid = AppGlobals.getPackageManager().getPackageUid(SOURCE_PACKAGE, 0, 0);

        setDeviceConfigString(KEY_PERCENTS_TO_DROP_NUM_FLEXIBLE_CONSTRAINTS, "50,60,70,80");
        setDeviceConfigLong(KEY_DEADLINE_PROXIMITY_LIMIT, 0L);
        setDeviceConfigBoolean(KEY_FLEXIBILITY_ENABLED, true);
@@ -648,20 +653,22 @@ public class FlexibilityControllerTest {
    public void testTopAppBypass() {
        JobInfo.Builder jb = createJob(0);
        JobStatus js = createJobStatus("testTopAppBypass", jb);
        js.adjustNumRequiredFlexibleConstraints(100);
        mJobStore.add(js);

        // Needed because if before and after Uid bias is the same, nothing happens.
        when(mJobSchedulerService.getUidBias(js.getUid()))
        when(mJobSchedulerService.getUidBias(mSourceUid))
                .thenReturn(JobInfo.BIAS_FOREGROUND_SERVICE);

        synchronized (mFlexibilityController.mLock) {
            setUidBias(js.getUid(), JobInfo.BIAS_TOP_APP);
            mFlexibilityController.maybeStartTrackingJobLocked(js, null);
            assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js));

            setUidBias(mSourceUid, JobInfo.BIAS_TOP_APP);

            assertTrue(mFlexibilityController.isFlexibilitySatisfiedLocked(js));
            assertTrue(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE));

            setUidBias(js.getUid(), JobInfo.BIAS_FOREGROUND_SERVICE);
            setUidBias(mSourceUid, JobInfo.BIAS_FOREGROUND_SERVICE);

            assertFalse(mFlexibilityController.isFlexibilitySatisfiedLocked(js));
            assertFalse(js.isConstraintSatisfied(CONSTRAINT_FLEXIBLE));
@@ -858,18 +865,18 @@ public class FlexibilityControllerTest {

        final ArraySet<String> pkgs = new ArraySet<>();
        pkgs.add(js.getSourcePackageName());
        when(mJobSchedulerService.getPackagesForUidLocked(js.getUid())).thenReturn(pkgs);
        when(mJobSchedulerService.getPackagesForUidLocked(mSourceUid)).thenReturn(pkgs);

        setUidBias(js.getUid(), BIAS_TOP_APP);
        setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE);
        setUidBias(mSourceUid, BIAS_TOP_APP);
        setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE);
        assertEquals(100L, (long) mFlexibilityController.mPrefetchLifeCycleStart
                .getOrDefault(js.getSourceUserId(), js.getSourcePackageName(), 0L));

        JobSchedulerService.sElapsedRealtimeClock =
                Clock.fixed(Instant.ofEpochMilli(50L), ZoneOffset.UTC);

        setUidBias(js.getUid(), BIAS_TOP_APP);
        setUidBias(js.getUid(), BIAS_FOREGROUND_SERVICE);
        setUidBias(mSourceUid, BIAS_TOP_APP);
        setUidBias(mSourceUid, BIAS_FOREGROUND_SERVICE);
        assertEquals(100L, (long) mFlexibilityController
                .mPrefetchLifeCycleStart.get(js.getSourceUserId(), js.getSourcePackageName()));