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

Commit 00a8b97d authored by Jing Ji's avatar Jing Ji Committed by Rambo Wang
Browse files

Move the handling of carrier app changes in AppRestrictionController

...to non-bg handler.

As the bg thread is pretty slow and it may result in race conditions
if the carrier app requests to start FGS while the handling hasn't
be done yet.

Also fixed the test failures in BackgroundRestrictionTest.

Bug: 331282712
Test: atest BackgroundRestrictionTest
Change-Id: I9a3bcb576185b5859db58222906e86aacba6cb47
(cherry picked from commit 75a9c0f3)
parent 47ad7f75
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -2014,7 +2014,7 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy>
            if (!mBgCurrentDrainHighThresholdByBgLocation) {
                return false;
            }
            if (mTracker.mContext.checkPermission(ACCESS_BACKGROUND_LOCATION,
            if (mTracker.mInjector.checkPermission(ACCESS_BACKGROUND_LOCATION,
                    Process.INVALID_PID, uid) == PERMISSION_GRANTED) {
                return true;
            }
+1 −1
Original line number Diff line number Diff line
@@ -293,7 +293,7 @@ final class AppPermissionTracker extends BaseAppStateTracker<AppPermissionPolicy
                mPermissionGranted = true;
                return;
            }
            mPermissionGranted = mContext.checkPermission(mPermission, Process.INVALID_PID, mUid)
            mPermissionGranted = mInjector.checkPermission(mPermission, Process.INVALID_PID, mUid)
                    == PERMISSION_GRANTED;
        }

+8 −2
Original line number Diff line number Diff line
@@ -235,6 +235,7 @@ public final class AppRestrictionController {
    private final HandlerThread mBgHandlerThread;
    private final BgHandler mBgHandler;
    private final HandlerExecutor mBgExecutor;
    private final HandlerExecutor mExecutor;

    // No lock is needed, as it's immutable after initialization in constructor.
    private final ArrayList<BaseAppStateTracker> mAppStateTrackers = new ArrayList<>();
@@ -1489,6 +1490,7 @@ public final class AppRestrictionController {
        mConstantsObserver = new ConstantsObserver(mBgHandler, mContext);
        mNotificationHelper = new NotificationHelper(this);
        injector.initAppStateTrackers(this);
        mExecutor = new HandlerExecutor(injector.getDefaultHandler());
    }

    void onSystemReady() {
@@ -1506,7 +1508,7 @@ public final class AppRestrictionController {
        mInjector.getAppStateTracker().addBackgroundRestrictedAppListener(
                mBackgroundRestrictionListener);
        mInjector.getAppStandbyInternal().addListener(mAppIdleStateChangeListener);
        mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mBgExecutor,
        mInjector.getRoleManager().addOnRoleHoldersChangedListenerAsUser(mExecutor,
                mRoleHolderChangedListener, UserHandle.ALL);
        mInjector.scheduleInitTrackers(mBgHandler, () -> {
            for (int i = 0, size = mAppStateTrackers.size(); i < size; i++) {
@@ -2896,7 +2898,7 @@ public final class AppRestrictionController {
        for (int i = 0; i < numPhones; i++) {
            final PhoneCarrierPrivilegesCallback callback = new PhoneCarrierPrivilegesCallback(i);
            callbacks.add(callback);
            telephonyManager.registerCarrierPrivilegesCallback(i, mBgExecutor, callback);
            telephonyManager.registerCarrierPrivilegesCallback(i, mExecutor, callback);
        }
        mCarrierPrivilegesCallbacks = callbacks;
    }
@@ -3288,6 +3290,10 @@ public final class AppRestrictionController {
            return System.currentTimeMillis();
        }

        Handler getDefaultHandler() {
            return mAppRestrictionController.mActivityManagerService.mHandler;
        }

        boolean isTest() {
            return false;
        }
+7 −1
Original line number Diff line number Diff line
@@ -75,11 +75,11 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
    static final int STATE_TYPE_INDEX_PERMISSION = 4;

    protected final AppRestrictionController mAppRestrictionController;
    protected final Injector<T> mInjector;
    protected final Context mContext;
    protected final Handler mBgHandler;
    protected final Object mLock;
    protected final ArrayList<StateListener> mStateListeners = new ArrayList<>();
    final Injector<T> mInjector;

    interface StateListener {
        void onStateChange(int uid, String packageName, boolean start, long now, int stateType);
@@ -292,6 +292,7 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
        RoleManager mRoleManager;
        NotificationManagerInternal mNotificationManagerInternal;
        IAppOpsService mIAppOpsService;
        Context mContext;

        void setPolicy(T policy) {
            mAppStatePolicy = policy;
@@ -316,6 +317,7 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
                    NotificationManagerInternal.class);
            mIAppOpsService = IAppOpsService.Stub.asInterface(
                    ServiceManager.getService(Context.APP_OPS_SERVICE));
            mContext = context;

            getPolicy().onSystemReady();
        }
@@ -390,5 +392,9 @@ public abstract class BaseAppStateTracker<T extends BaseAppStatePolicy> {
        IAppOpsService getIAppOpsService() {
            return mIAppOpsService;
        }

        int checkPermission(String perm, int pid, int uid) {
            return mContext.checkPermission(perm, pid, uid);
        }
    }
}
+22 −4
Original line number Diff line number Diff line
@@ -126,6 +126,7 @@ import android.os.BatteryManagerInternal;
import android.os.BatteryStatsInternal;
import android.os.BatteryUsageStats;
import android.os.Handler;
import android.os.Looper;
import android.os.MessageQueue;
import android.os.Process;
import android.os.RemoteException;
@@ -321,6 +322,7 @@ public final class BackgroundRestrictionTest {
    private BindServiceEventListener mBindServiceEventListener;

    private Context mContext = getInstrumentation().getTargetContext();
    private Handler mDefaultHandler = new Handler(Looper.getMainLooper());
    private TestBgRestrictionInjector mInjector;
    private AppRestrictionController mBgRestrictionController;
    private AppBatteryTracker mAppBatteryTracker;
@@ -346,10 +348,6 @@ public final class BackgroundRestrictionTest {
        mActivityManagerService.mConstants = mActivityManagerConstants;
        mPhoneCarrierPrivileges = new PhoneCarrierPrivileges(
                mInjector.getTelephonyManager(), MOCK_PRIVILEGED_PACKAGES.length);
        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
            mPhoneCarrierPrivileges.addNewPrivilegePackages(i,
                    MOCK_PRIVILEGED_PACKAGES[i], MOCK_PRIVILEGED_UIDS[i]);
        }

        doReturn(PROCESS_STATE_FOREGROUND_SERVICE).when(mActivityManagerInternal)
                .getUidProcessState(anyInt());
@@ -3048,6 +3046,11 @@ public final class BackgroundRestrictionTest {

    @Test
    public void testCarrierPrivilegedAppListener() throws Exception {
        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
            mPhoneCarrierPrivileges.addNewPrivilegePackages(i,
                    MOCK_PRIVILEGED_PACKAGES[i], MOCK_PRIVILEGED_UIDS[i]);
        }

        final long shortMs = 1_000L;
        for (int i = 0; i < MOCK_PRIVILEGED_PACKAGES.length; i++) {
            verifyPotentialSystemExemptionReason(REASON_CARRIER_PRIVILEGED_APP,
@@ -3355,6 +3358,11 @@ public final class BackgroundRestrictionTest {
            return mCurrentTimeMillis;
        }

        @Override
        Handler getDefaultHandler() {
            return mDefaultHandler;
        }

        @Override
        boolean isTest() {
            return true;
@@ -3445,6 +3453,16 @@ public final class BackgroundRestrictionTest {
        IAppOpsService getIAppOpsService() {
            return BackgroundRestrictionTest.this.mIAppOpsService;
        }

        @Override
        int checkPermission(String perm, int pid, int uid) {
            try {
                return BackgroundRestrictionTest.this.mIActivityManager.checkPermission(
                        perm, pid, uid);
            } catch (RemoteException e) {
                return PERMISSION_DENIED;
            }
        }
    }

    private class TestAppBatteryTrackerInjector extends TestBaseTrackerInjector<AppBatteryPolicy> {