diff options
2 files changed, 38 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/display/mode/SystemRequestObserver.java b/services/core/java/com/android/server/display/mode/SystemRequestObserver.java index 15f19cca99db..4a4c8da1a335 100644 --- a/services/core/java/com/android/server/display/mode/SystemRequestObserver.java +++ b/services/core/java/com/android/server/display/mode/SystemRequestObserver.java @@ -20,6 +20,7 @@ import android.annotation.NonNull; import android.annotation.Nullable; import android.os.IBinder; import android.os.RemoteException; +import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; @@ -28,12 +29,15 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.NoSuchElementException; /** * SystemRequestObserver responsible for handling system requests to filter allowable display * modes */ class SystemRequestObserver { + private static final String TAG = "SystemRequestObserver"; + private final VotesStorage mVotesStorage; private final IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() { @@ -43,6 +47,7 @@ class SystemRequestObserver { } @Override public void binderDied(@NonNull IBinder who) { + Slog.d(TAG, "binder died: " + who); removeSystemRequestedVotes(who); who.unlinkToDeath(mDeathRecipient, 0); } @@ -83,9 +88,11 @@ class SystemRequestObserver { updateStorageLocked(displayId); } if (needLinkToDeath) { + Slog.d(TAG, "binder linking to death: " + token); token.linkToDeath(mDeathRecipient, 0); } } catch (RemoteException re) { + Slog.d(TAG, "linking to death failed: " + token, re); removeSystemRequestedVotes(token); } } @@ -94,14 +101,19 @@ class SystemRequestObserver { boolean needToUnlink = false; synchronized (mLock) { SparseArray<List<Integer>> modesByDisplay = mDisplaysRestrictions.get(token); - if (modesByDisplay != null) { + if (modesByDisplay != null && modesByDisplay.size() > 0) { modesByDisplay.remove(displayId); needToUnlink = modesByDisplay.size() == 0; updateStorageLocked(displayId); } } if (needToUnlink) { - token.unlinkToDeath(mDeathRecipient, 0); + try { + Slog.d(TAG, "binder unlinking to death: " + token); + token.unlinkToDeath(mDeathRecipient, 0); + } catch (NoSuchElementException e) { + Slog.d(TAG, "unlinking to death failed: " + token, e); + } } } diff --git a/services/tests/displayservicetests/src/com/android/server/display/mode/SystemRequestObserverTest.kt b/services/tests/displayservicetests/src/com/android/server/display/mode/SystemRequestObserverTest.kt index 9ea7ea7ef23d..56e4048c842e 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/mode/SystemRequestObserverTest.kt +++ b/services/tests/displayservicetests/src/com/android/server/display/mode/SystemRequestObserverTest.kt @@ -27,6 +27,7 @@ import org.junit.runner.RunWith import org.mockito.junit.MockitoJUnit import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor +import org.mockito.kotlin.clearInvocations import org.mockito.kotlin.doThrow import org.mockito.kotlin.eq import org.mockito.kotlin.mock @@ -149,6 +150,29 @@ class SystemRequestObserverTest { } @Test + fun testTokenUnlinkToDeath_noVotes() { + val systemRequestObserver = SystemRequestObserver(storage) + + systemRequestObserver.requestDisplayModes(mockToken, DISPLAY_ID, null) + + verify(mockToken, never()).unlinkToDeath(any(), eq(0)) + } + + @Test + fun testTokenUnlinkToDeath_removedVotes() { + val systemRequestObserver = SystemRequestObserver(storage) + val requestedModes = intArrayOf(1, 2, 3) + + systemRequestObserver.requestDisplayModes(mockToken, DISPLAY_ID, requestedModes) + systemRequestObserver.requestDisplayModes(mockToken, DISPLAY_ID, null) + clearInvocations(mockToken) + + systemRequestObserver.requestDisplayModes(mockToken, DISPLAY_ID, null) + + verify(mockToken, never()).unlinkToDeath(any(), eq(0)) + } + + @Test fun testTokenUnlinkToDeathNotCalled_votesForOtherDisplayInStorage() { val systemRequestObserver = SystemRequestObserver(storage) val requestedModes = intArrayOf(1, 2, 3) |