Merge "Allow unregistring callbacks in DeviceStateController" into udc-dev

This commit is contained in:
Jiaming Liu
2023-03-11 16:44:09 +00:00
committed by Android (Google) Code Review
3 changed files with 35 additions and 5 deletions

View File

@@ -24,6 +24,7 @@ import android.os.HandlerExecutor;
import com.android.internal.R; import com.android.internal.R;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils; import com.android.internal.util.ArrayUtils;
import java.util.ArrayList; import java.util.ArrayList;
@@ -51,7 +52,8 @@ final class DeviceStateController implements DeviceStateManager.DeviceStateCallb
private final int[] mReverseRotationAroundZAxisStates; private final int[] mReverseRotationAroundZAxisStates;
@GuardedBy("this") @GuardedBy("this")
@NonNull @NonNull
private final List<Consumer<DeviceState>> mDeviceStateCallbacks = new ArrayList<>(); @VisibleForTesting
final List<Consumer<DeviceState>> mDeviceStateCallbacks = new ArrayList<>();
private final boolean mMatchBuiltInDisplayOrientationToDefaultDisplay; private final boolean mMatchBuiltInDisplayOrientationToDefaultDisplay;
@@ -98,6 +100,12 @@ final class DeviceStateController implements DeviceStateManager.DeviceStateCallb
} }
} }
void unregisterDeviceStateCallback(@NonNull Consumer<DeviceState> callback) {
synchronized (this) {
mDeviceStateCallbacks.remove(callback);
}
}
/** /**
* @return true if the rotation direction on the Z axis should be reversed. * @return true if the rotation direction on the Z axis should be reversed.
*/ */

View File

@@ -601,6 +601,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
@VisibleForTesting @VisibleForTesting
final DeviceStateController mDeviceStateController; final DeviceStateController mDeviceStateController;
final Consumer<DeviceStateController.DeviceState> mDeviceStateConsumer;
private final PhysicalDisplaySwitchTransitionLauncher mDisplaySwitchTransitionLauncher; private final PhysicalDisplaySwitchTransitionLauncher mDisplaySwitchTransitionLauncher;
final RemoteDisplayChangeController mRemoteDisplayChangeController; final RemoteDisplayChangeController mRemoteDisplayChangeController;
@@ -1166,12 +1167,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
mDisplayRotation = new DisplayRotation(mWmService, this, mDisplayInfo.address, mDisplayRotation = new DisplayRotation(mWmService, this, mDisplayInfo.address,
mDeviceStateController, root.getDisplayRotationCoordinator()); mDeviceStateController, root.getDisplayRotationCoordinator());
final Consumer<DeviceStateController.DeviceState> deviceStateConsumer = mDeviceStateConsumer =
(@NonNull DeviceStateController.DeviceState newFoldState) -> { (@NonNull DeviceStateController.DeviceState newFoldState) -> {
mDisplaySwitchTransitionLauncher.foldStateChanged(newFoldState); mDisplaySwitchTransitionLauncher.foldStateChanged(newFoldState);
mDisplayRotation.foldStateChanged(newFoldState); mDisplayRotation.foldStateChanged(newFoldState);
}; };
mDeviceStateController.registerDeviceStateCallback(deviceStateConsumer); mDeviceStateController.registerDeviceStateCallback(mDeviceStateConsumer);
mCloseToSquareMaxAspectRatio = mWmService.mContext.getResources().getFloat( mCloseToSquareMaxAspectRatio = mWmService.mContext.getResources().getFloat(
R.dimen.config_closeToSquareDisplayMaxAspectRatio); R.dimen.config_closeToSquareDisplayMaxAspectRatio);
@@ -3283,6 +3284,7 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp
handleAnimatingStoppedAndTransition(); handleAnimatingStoppedAndTransition();
mWmService.stopFreezingDisplayLocked(); mWmService.stopFreezingDisplayLocked();
mDisplayRotation.removeDefaultDisplayRotationChangedCallback(); mDisplayRotation.removeDefaultDisplayRotationChangedCallback();
mDeviceStateController.unregisterDeviceStateCallback(mDeviceStateConsumer);
super.removeImmediately(); super.removeImmediately();
if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this); if (DEBUG_DISPLAY) Slog.v(TAG_WM, "Removing display=" + this);
mPointerEventDispatcher.dispose(); mPointerEventDispatcher.dispose();

View File

@@ -21,6 +21,7 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.verify;
import static com.android.dx.mockito.inline.extended.ExtendedMockito.when; import static com.android.dx.mockito.inline.extended.ExtendedMockito.when;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.any;
import android.content.Context; import android.content.Context;
@@ -55,6 +56,7 @@ public class DeviceStateControllerTests {
private DeviceStateManager mMockDeviceStateManager; private DeviceStateManager mMockDeviceStateManager;
private DeviceStateController.DeviceState mCurrentState = private DeviceStateController.DeviceState mCurrentState =
DeviceStateController.DeviceState.UNKNOWN; DeviceStateController.DeviceState.UNKNOWN;
private Consumer<DeviceStateController.DeviceState> mDelegate;
@Before @Before
public void setUp() { public void setUp() {
@@ -64,10 +66,10 @@ public class DeviceStateControllerTests {
private void initialize(boolean supportFold, boolean supportHalfFold) { private void initialize(boolean supportFold, boolean supportHalfFold) {
mBuilder.setSupportFold(supportFold, supportHalfFold); mBuilder.setSupportFold(supportFold, supportHalfFold);
Consumer<DeviceStateController.DeviceState> delegate = (newFoldState) -> { mDelegate = (newFoldState) -> {
mCurrentState = newFoldState; mCurrentState = newFoldState;
}; };
mBuilder.setDelegate(delegate); mBuilder.setDelegate(mDelegate);
mBuilder.build(); mBuilder.build();
verify(mMockDeviceStateManager).registerCallback(any(), any()); verify(mMockDeviceStateManager).registerCallback(any(), any());
} }
@@ -111,6 +113,24 @@ public class DeviceStateControllerTests {
assertEquals(DeviceStateController.DeviceState.CONCURRENT, mCurrentState); assertEquals(DeviceStateController.DeviceState.CONCURRENT, mCurrentState);
} }
@Test
public void testUnregisterDeviceStateCallback() {
initialize(true /* supportFold */, true /* supportHalfFolded */);
assertEquals(1, mTarget.mDeviceStateCallbacks.size());
assertEquals(mDelegate, mTarget.mDeviceStateCallbacks.get(0));
mTarget.onStateChanged(mOpenDeviceStates[0]);
assertEquals(DeviceStateController.DeviceState.OPEN, mCurrentState);
mTarget.onStateChanged(mFoldedStates[0]);
assertEquals(DeviceStateController.DeviceState.FOLDED, mCurrentState);
// The callback should not receive state change when the it is unregistered.
mTarget.unregisterDeviceStateCallback(mDelegate);
assertTrue(mTarget.mDeviceStateCallbacks.isEmpty());
mTarget.onStateChanged(mOpenDeviceStates[0]);
assertEquals(DeviceStateController.DeviceState.FOLDED /* unchanged */, mCurrentState);
}
private final int[] mFoldedStates = {0}; private final int[] mFoldedStates = {0};
private final int[] mOpenDeviceStates = {1}; private final int[] mOpenDeviceStates = {1};
private final int[] mHalfFoldedStates = {2}; private final int[] mHalfFoldedStates = {2};