summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author chihtinglo <chihtinglo@google.com> 2023-11-16 15:12:15 +0800
committer chihtinglo <chihtinglo@google.com> 2024-02-26 10:29:29 +0800
commit2b073bd373897306f87f00bfa8e3d1561c9d417f (patch)
tree3e8da05352c7fa5e9733dfbfb672e120c496592e
parentea6d4a3317e1cf58c94b0406fadadaf2264ad7d9 (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
-rw-r--r--core/java/android/view/accessibility/IMagnificationConnection.aidl5
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/Magnification.java4
-rw-r--r--packages/SystemUI/src/com/android/systemui/accessibility/MagnificationConnectionImpl.java6
-rw-r--r--services/accessibility/java/com/android/server/accessibility/AccessibilityManagerService.java15
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionManager.java39
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationConnectionWrapper.java16
-rw-r--r--services/accessibility/java/com/android/server/accessibility/magnification/MagnificationController.java6
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionManagerTest.java12
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationConnectionWrapperTest.java8
-rw-r--r--services/tests/servicestests/src/com/android/server/accessibility/magnification/MagnificationControllerTest.java29
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);
}