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

Commit 5144233d authored by Austin Borger's avatar Austin Borger
Browse files

Add new onUidProcAdjChanged callback to be consumed by the camera

service.

The camera service needs to know when individual process oom adj scores
are changed in order to address bug #124224342. When two separate
processes are displayed in split screen and focus is switched between
them, both proc states will remain the same while their oom scores
change. This is a problem if both have access to the camera - we want
only one owner of the camera stream at any given time and for the app
in focus to be the one to own it.

This patch adds a new IUidObserver registration level for individual
process oom score changes. In addition a new callback has been added to
IUidObserver to track these changes.

Change-Id: I4d146e2d31990b41a5d6ba78d1a194c12a81c8f2
Bug: 124224342
Test: -- ActivityManagerServiceTest
      -- ActivityManagerProcessStateTest
      -- ActivityManagerFgsBgStartTest
      -- UidObserverControllerTest
      -- NetworkPolicyManagerServiceTest
      -- ShortcutManagerTest2
      -- HintManagerServiceTest
      -- VibrationSettingsTest
      -- CameraEvictionTest#testCamera2AccessCallbackInSplitMode (x100)
parent 70fa373d
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -57,8 +57,7 @@ public:
    }

    virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq,
            int32_t capability)
    {
                                   int32_t capability) {
        Parcel data, reply;
        data.writeInterfaceToken(IUidObserver::getInterfaceDescriptor());
        data.writeInt32((int32_t) uid);
@@ -67,6 +66,12 @@ public:
        data.writeInt32(capability);
        remote()->transact(ON_UID_STATE_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
    }

    virtual void onUidProcAdjChanged(uid_t uid) {
        Parcel data, reply;
        data.writeInt32((int32_t)uid);
        remote()->transact(ON_UID_PROC_ADJ_CHANGED_TRANSACTION, data, &reply, IBinder::FLAG_ONEWAY);
    }
};

// ----------------------------------------------------------------------
@@ -102,6 +107,7 @@ status_t BnUidObserver::onTransact(
            onUidIdle(uid, disabled);
            return NO_ERROR;
        } break;

        case ON_UID_STATE_CHANGED_TRANSACTION: {
            CHECK_INTERFACE(IUidObserver, data, reply);
            uid_t uid = data.readInt32();
@@ -111,6 +117,14 @@ status_t BnUidObserver::onTransact(
            onUidStateChanged(uid, procState, procStateSeq, capability);
            return NO_ERROR;
        } break;

        case ON_UID_PROC_ADJ_CHANGED_TRANSACTION: {
            CHECK_INTERFACE(IUidObserver, data, reply);
            uid_t uid = data.readInt32();
            onUidProcAdjChanged(uid);
            return NO_ERROR;
        } break;

        default:
            return BBinder::onTransact(code, data, reply, flags);
    }
+8 −7
Original line number Diff line number Diff line
@@ -32,7 +32,6 @@ namespace android {
class ActivityManager
{
public:

    enum {
        // Flag for registerUidObserver: report uid state changed
        UID_OBSERVER_PROCSTATE = 1 << 0,
@@ -46,6 +45,8 @@ public:
        UID_OBSERVER_CACHED = 1 << 4,
        // Flag for registerUidObserver: report uid capability has changed
        UID_OBSERVER_CAPABILITY = 1 << 5,
        // Flag for registerUidObserver: report pid oom adj has changed
        UID_OBSERVER_PROC_OOM_ADJ = 1 << 6,
    };

    // PROCESS_STATE_* must come from frameworks/base/core/java/android/app/ProcessStateEnum.aidl.
+4 −2
Original line number Diff line number Diff line
@@ -34,12 +34,14 @@ public:
    virtual void onUidIdle(uid_t uid, bool disabled) = 0;
    virtual void onUidStateChanged(uid_t uid, int32_t procState, int64_t procStateSeq,
                                   int32_t capability) = 0;
    virtual void onUidProcAdjChanged(uid_t uid) = 0;

    enum {
        ON_UID_GONE_TRANSACTION = IBinder::FIRST_CALL_TRANSACTION,
        ON_UID_ACTIVE_TRANSACTION,
        ON_UID_IDLE_TRANSACTION,
        ON_UID_STATE_CHANGED_TRANSACTION
        ON_UID_STATE_CHANGED_TRANSACTION,
        ON_UID_PROC_ADJ_CHANGED_TRANSACTION
    };
};

+6 −4
Original line number Diff line number Diff line
@@ -257,11 +257,13 @@ private:

            bool isUidActive(uid_t uid);

            void onUidGone(uid_t uid, bool disabled);
            void onUidActive(uid_t uid);
            void onUidIdle(uid_t uid, bool disabled);
            void onUidGone(uid_t uid, bool disabled) override;
            void onUidActive(uid_t uid) override;
            void onUidIdle(uid_t uid, bool disabled) override;
            void onUidStateChanged(uid_t uid __unused, int32_t procState __unused,
                                   int64_t procStateSeq __unused, int32_t capability __unused) {}
                                   int64_t procStateSeq __unused,
                                   int32_t capability __unused) override {}
            void onUidProcAdjChanged(uid_t uid __unused) override {}

            void addOverrideUid(uid_t uid, bool active);
            void removeOverrideUid(uid_t uid);