Merge "DisplayManagerGlobal: fix native refresh rate callback registration" into sc-qpr1-dev

This commit is contained in:
Ady Abraham
2021-08-31 00:14:03 +00:00
committed by Android (Google) Code Review
2 changed files with 63 additions and 7 deletions

View File

@@ -361,6 +361,11 @@ public final class DisplayManagerGlobal {
for (int i = 0; i < numListeners; i++) {
mask |= mDisplayListeners.get(i).mEventsMask;
}
if (mDispatchNativeCallbacks) {
mask |= DisplayManager.EVENT_FLAG_DISPLAY_ADDED
| DisplayManager.EVENT_FLAG_DISPLAY_CHANGED
| DisplayManager.EVENT_FLAG_DISPLAY_REMOVED;
}
return mask;
}
@@ -1047,12 +1052,17 @@ public final class DisplayManagerGlobal {
private static native void nSignalNativeCallbacks(float refreshRate);
// Called from AChoreographer via JNI.
// Registers AChoreographer so that refresh rate callbacks can be dispatched from DMS.
private void registerNativeChoreographerForRefreshRateCallbacks() {
/**
* Called from AChoreographer via JNI.
* Registers AChoreographer so that refresh rate callbacks can be dispatched from DMS.
* Public for unit testing to be able to call this method.
*/
@VisibleForTesting
public void registerNativeChoreographerForRefreshRateCallbacks() {
synchronized (mLock) {
registerCallbackIfNeededLocked();
mDispatchNativeCallbacks = true;
registerCallbackIfNeededLocked();
updateCallbackIfNeededLocked();
DisplayInfo display = getDisplayInfoLocked(Display.DEFAULT_DISPLAY);
if (display != null) {
// We need to tell AChoreographer instances the current refresh rate so that apps
@@ -1063,11 +1073,16 @@ public final class DisplayManagerGlobal {
}
}
// Called from AChoreographer via JNI.
// Unregisters AChoreographer from receiving refresh rate callbacks.
private void unregisterNativeChoreographerForRefreshRateCallbacks() {
/**
* Called from AChoreographer via JNI.
* Unregisters AChoreographer from receiving refresh rate callbacks.
* Public for unit testing to be able to call this method.
*/
@VisibleForTesting
public void unregisterNativeChoreographerForRefreshRateCallbacks() {
synchronized (mLock) {
mDispatchNativeCallbacks = false;
updateCallbackIfNeededLocked();
}
}
}

View File

@@ -32,6 +32,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
@@ -121,6 +122,46 @@ public class DisplayManagerGlobalTest {
Mockito.verifyZeroInteractions(mListener);
}
@Test
public void testDisplayManagerGlobalRegistersWithDisplayManager_WhenThereAreNoOtherListeners()
throws RemoteException {
mDisplayManagerGlobal.registerNativeChoreographerForRefreshRateCallbacks();
Mockito.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(), eq(ALL_DISPLAY_EVENTS));
mDisplayManagerGlobal.unregisterNativeChoreographerForRefreshRateCallbacks();
Mockito.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(), eq(0L));
}
@Test
public void testDisplayManagerGlobalRegistersWithDisplayManager_WhenThereAreListeners()
throws RemoteException {
mDisplayManagerGlobal.registerDisplayListener(mListener, mHandler,
DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS);
InOrder inOrder = Mockito.inOrder(mDisplayManager);
inOrder.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(),
eq(DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
mDisplayManagerGlobal.registerNativeChoreographerForRefreshRateCallbacks();
inOrder.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(),
eq(ALL_DISPLAY_EVENTS | DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
mDisplayManagerGlobal.unregisterNativeChoreographerForRefreshRateCallbacks();
inOrder.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(),
eq(DisplayManager.EVENT_FLAG_DISPLAY_BRIGHTNESS));
mDisplayManagerGlobal.unregisterDisplayListener(mListener);
inOrder.verify(mDisplayManager)
.registerCallbackWithEventMask(mCallbackCaptor.capture(), eq(0L));
}
private void waitForHandler() {
mHandler.runWithScissors(() -> { }, 0);
}