From 5144233d4e050eb08d44c20ed47fb88d3f12ec40 Mon Sep 17 00:00:00 2001 From: Austin Borger Date: Thu, 17 Feb 2022 00:26:18 +0000 Subject: 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) --- libs/binder/IUidObserver.cpp | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'libs/binder/IUidObserver.cpp') diff --git a/libs/binder/IUidObserver.cpp b/libs/binder/IUidObserver.cpp index a1b08db50c..d952dc71f9 100644 --- a/libs/binder/IUidObserver.cpp +++ b/libs/binder/IUidObserver.cpp @@ -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); } -- cgit v1.2.3-59-g8ed1b