diff options
| author | 2023-11-16 15:12:15 +0800 | |
|---|---|---|
| committer | 2024-02-26 10:29:29 +0800 | |
| commit | 2b073bd373897306f87f00bfa8e3d1561c9d417f (patch) | |
| tree | 3e8da05352c7fa5e9733dfbfb672e120c496592e | |
| parent | ea6d4a3317e1cf58c94b0406fadadaf2264ad7d9 (diff) | |
fix(fullscreen magnification): Create connecting methods between SystemServer and SystemUI for fullscreen mode
1. Creating the methods onFullscreenMagnificationActivationChanged to notify the fullscreen magnification activation change.
2. Allow establishing the magnification connection in fullscreen only mode.
Bug: 291891390
Test: adb shell device_config put accessibility com.android.window.flags.magnification_always_draw_fullscreen_border true
atest MagnificationConnectionManagerTest
atest MagnificationControllerTest
atest MagnificationConnectionWrapperTest
atest AccessibilityManagerServiceTest
atest frameworks/base/services/tests/servicestests/src/com/android/server/accessibility/magnification
Flag: ACONFIG com.android.window.flags.magnification_always_draw_fullscreen_border DEVELOPMENT
Change-Id: I0bae5a074af6c0546bdb204c34656182d686a0df
10 files changed, 127 insertions, 13 deletions
diff --git a/core/java/android/view/accessibility/IMagnificationConnection.aidl b/core/java/android/view/accessibility/IMagnificationConnection.aidl index aae51abd3c78..450cf7558c6f 100644 --- a/core/java/android/view/accessibility/IMagnificationConnection.aidl +++ b/core/java/android/view/accessibility/IMagnificationConnection.aidl @@ -124,4 +124,9 @@ oneway interface IMagnificationConnection { * @param scale magnification scale. */ void onUserMagnificationScaleChanged(int userId, int displayId, float scale); + + /** + * Notify the changes of fullscreen magnification activation on the specified display + */ + void onFullscreenMagnificationActivationChanged(int displayId, boolean activated); } diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java index d2fda4cfd186..88fa2de186d0 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java @@ -273,6 +273,10 @@ public class Magnification implements CoreStartable, CommandQueue.Callbacks { } } + void onFullscreenMagnificationActivationChanged(int displayId, boolean activated) { + // Do nothing + } + @MainThread void toggleSettingsPanelVisibility(int displayId) { final MagnificationSettingsController magnificationSettingsController = diff --git a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java index ba943b07b704..b5f3aef88dc4 100644 --- a/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java +++ b/packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java @@ -47,6 +47,12 @@ class MagnificationConnectionImpl extends IMagnificationConnection.Stub { } @Override + public void onFullscreenMagnificationActivationChanged(int displayId, boolean activated) { + mHandler.post(() -> mMagnification + .onFullscreenMagnificationActivationChanged(displayId, activated)); + } + + @Override public void enableWindowMagnification(int displayId, float scale, float centerX, float centerY, float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY, IRemoteMagnificationAnimationCallback callback) { diff --git a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java index 46db624cf3c1..43c018cfeea3 100644 --- a/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java +++ b/services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java @@ -3460,13 +3460,20 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub if (!mMagnificationController.supportWindowMagnification()) { return; } - final boolean connect = (userState.isShortcutMagnificationEnabledLocked() + + final boolean shortcutEnabled = (userState.isShortcutMagnificationEnabledLocked() || userState.isMagnificationSingleFingerTripleTapEnabledLocked() || (Flags.enableMagnificationMultipleFingerMultipleTapGesture() - && userState.isMagnificationTwoFingerTripleTapEnabledLocked())) - && (userState.getMagnificationCapabilitiesLocked() - != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) + && userState.isMagnificationTwoFingerTripleTapEnabledLocked())); + + final boolean createConnectionForCurrentCapability = + com.android.window.flags.Flags.magnificationAlwaysDrawFullscreenBorder() + || (userState.getMagnificationCapabilitiesLocked() + != Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN); + + final boolean connect = (shortcutEnabled && createConnectionForCurrentCapability) || userHasMagnificationServicesLocked(userState); + getMagnificationConnectionManager().requestConnection(connect); } diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java index e11c36a91830..bc143428e1ae 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java @@ -674,6 +674,23 @@ public class MagnificationConnectionManager implements } /** + * Notify Fullscreen magnification activation changes. + */ + public boolean onFullscreenMagnificationActivationChanged(int displayId, boolean activated) { + synchronized (mLock) { + waitForConnectionIfNeeded(); + if (mConnectionWrapper == null) { + Slog.w(TAG, + "onFullscreenMagnificationActivationChanged mConnectionWrapper is null. " + + "mConnectionState=" + connectionStateToString(mConnectionState)); + return false; + } + return mConnectionWrapper + .onFullscreenMagnificationActivationChanged(displayId, activated); + } + } + + /** * Calculates the number of fingers in the window. * * @param displayId The logical display id. @@ -1267,15 +1284,7 @@ public class MagnificationConnectionManager implements float centerY, float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY, MagnificationAnimationCallback animationCallback) { - // Wait for the connection with a timeout. - final long endMillis = SystemClock.uptimeMillis() + WAIT_CONNECTION_TIMEOUT_MILLIS; - while (mConnectionState == CONNECTING && (SystemClock.uptimeMillis() < endMillis)) { - try { - mLock.wait(endMillis - SystemClock.uptimeMillis()); - } catch (InterruptedException ie) { - /* ignore */ - } - } + waitForConnectionIfNeeded(); if (mConnectionWrapper == null) { Slog.w(TAG, "enableWindowMagnificationInternal mConnectionWrapper is null. " @@ -1317,4 +1326,16 @@ public class MagnificationConnectionManager implements return mConnectionWrapper != null && mConnectionWrapper.moveWindowMagnifierToPosition( displayId, positionX, positionY, animationCallback); } + + private void waitForConnectionIfNeeded() { + // Wait for the connection with a timeout. + final long endMillis = SystemClock.uptimeMillis() + WAIT_CONNECTION_TIMEOUT_MILLIS; + while (mConnectionState == CONNECTING && (SystemClock.uptimeMillis() < endMillis)) { + try { + mLock.wait(endMillis - SystemClock.uptimeMillis()); + } catch (InterruptedException ie) { + /* ignore */ + } + } + } } diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java index db5b3133169a..f6fb24f38a7a 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java @@ -58,6 +58,22 @@ class MagnificationConnectionWrapper { mConnection.asBinder().linkToDeath(deathRecipient, 0); } + boolean onFullscreenMagnificationActivationChanged(int displayId, boolean activated) { + if (mTrace.isA11yTracingEnabledForTypes(FLAGS_MAGNIFICATION_CONNECTION)) { + mTrace.logTrace(TAG + ".onFullscreenMagnificationActivationChanged", + FLAGS_MAGNIFICATION_CONNECTION); + } + try { + mConnection.onFullscreenMagnificationActivationChanged(displayId, activated); + } catch (RemoteException e) { + if (DBG) { + Slog.e(TAG, "Error calling onFullscreenMagnificationActivationChanged"); + } + return false; + } + return true; + } + boolean enableWindowMagnification(int displayId, float scale, float centerX, float centerY, float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY, @Nullable MagnificationAnimationCallback callback) { diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java index 52e123a5e70c..0d5fd1435ca0 100644 --- a/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java +++ b/services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java @@ -50,6 +50,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.server.LocalServices; import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.wm.WindowManagerInternal; +import com.android.window.flags.Flags; import java.util.concurrent.Executor; @@ -586,6 +587,11 @@ public class MagnificationController implements MagnificationConnectionManager.C @Override public void onFullScreenMagnificationActivationState(int displayId, boolean activated) { + if (Flags.magnificationAlwaysDrawFullscreenBorder()) { + getMagnificationConnectionManager() + .onFullscreenMagnificationActivationChanged(displayId, activated); + } + if (activated) { synchronized (mLock) { mFullScreenModeEnabledTimeArray.put(displayId, SystemClock.uptimeMillis()); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java index 009bfb7efca6..87fe6cf8f283 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java @@ -813,6 +813,18 @@ public class MagnificationConnectionManagerTest { anyBoolean()); } + @Test + public void onFullscreenMagnificationActivationChanged_hasConnection_notifyActivatedState() + throws RemoteException { + mMagnificationConnectionManager.setConnection(mMockConnection.getConnection()); + + mMagnificationConnectionManager + .onFullscreenMagnificationActivationChanged(TEST_DISPLAY, /* activated= */ true); + + verify(mMockConnection.getConnection()) + .onFullscreenMagnificationActivationChanged(eq(TEST_DISPLAY), eq(true)); + } + private MotionEvent generatePointersDownEvent(PointF[] pointersLocation) { final int len = pointersLocation.length; diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java index 07f3036410a0..2120b2e8e1f3 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java @@ -131,6 +131,14 @@ public class MagnificationConnectionWrapperTest { } @Test + public void onFullscreenMagnificationActivationChanged() throws RemoteException { + mConnectionWrapper + .onFullscreenMagnificationActivationChanged(TEST_DISPLAY, /* activated= */ true); + verify(mConnection) + .onFullscreenMagnificationActivationChanged(eq(TEST_DISPLAY), eq(true)); + } + + @Test public void setMirrorWindowCallback() throws RemoteException { mConnectionWrapper.setConnectionCallback(mCallback); verify(mConnection).setConnectionCallback(mCallback); diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java index a0c4b5e26c3f..1a51c45e2ef6 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java @@ -53,6 +53,10 @@ import android.hardware.display.DisplayManagerInternal; import android.os.Looper; import android.os.RemoteException; import android.os.UserHandle; +import android.platform.test.annotations.RequiresFlagsDisabled; +import android.platform.test.annotations.RequiresFlagsEnabled; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.provider.Settings; import android.test.mock.MockContentResolver; import android.testing.DexmakerShareClassLoaderRule; @@ -73,6 +77,7 @@ import com.android.server.accessibility.AccessibilityManagerService; import com.android.server.accessibility.AccessibilityTraceManager; import com.android.server.accessibility.test.MessageCapturingHandler; import com.android.server.wm.WindowManagerInternal; +import com.android.window.flags.Flags; import org.junit.After; import org.junit.Before; @@ -91,6 +96,9 @@ import org.mockito.stubbing.Answer; @RunWith(AndroidJUnit4.class) public class MagnificationControllerTest { + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY; private static final int TEST_SERVICE_ID = 1; private static final Region INITIAL_SCREEN_MAGNIFICATION_REGION = @@ -1263,6 +1271,27 @@ public class MagnificationControllerTest { verify(mService).changeMagnificationMode(TEST_DISPLAY, MODE_WINDOW); } + @Test + @RequiresFlagsEnabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER) + public void onFullscreenMagnificationActivationState_systemUiBorderFlagOn_notifyConnection() { + mMagnificationController.onFullScreenMagnificationActivationState( + TEST_DISPLAY, /* activated= */ true); + + verify(mMagnificationConnectionManager) + .onFullscreenMagnificationActivationChanged(TEST_DISPLAY, /* activated= */ true); + } + + @Test + @RequiresFlagsDisabled(Flags.FLAG_MAGNIFICATION_ALWAYS_DRAW_FULLSCREEN_BORDER) + public void + onFullscreenMagnificationActivationState_systemUiBorderFlagOff_neverNotifyConnection() { + mMagnificationController.onFullScreenMagnificationActivationState( + TEST_DISPLAY, /* activated= */ true); + + verify(mMagnificationConnectionManager, never()) + .onFullscreenMagnificationActivationChanged(TEST_DISPLAY, /* activated= */ true); + } + private void setMagnificationEnabled(int mode) throws RemoteException { setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y); } |