Merge "Move magnification-relatd stuff to MagnificationController"

This commit is contained in:
Ryan Lin
2020-09-28 04:56:48 +00:00
committed by Android (Google) Code Review
6 changed files with 170 additions and 72 deletions

View File

@@ -119,8 +119,8 @@ import com.android.internal.util.IntPair;
import com.android.server.LocalServices;
import com.android.server.SystemService;
import com.android.server.accessibility.magnification.FullScreenMagnificationController;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.MagnificationGestureHandler;
import com.android.server.accessibility.magnification.MagnificationTransitionController;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.wm.ActivityTaskManagerInternal;
import com.android.server.wm.WindowManagerInternal;
@@ -219,16 +219,12 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
// Lazily initialized - access through getSystemActionPerfomer()
private SystemActionPerformer mSystemActionPerformer;
private FullScreenMagnificationController mFullScreenMagnificationController;
private InteractionBridge mInteractionBridge;
private AlertDialog mEnableTouchExplorationDialog;
private AccessibilityInputFilter mInputFilter;
private WindowMagnificationManager mWindowMagnificationMgr;
private boolean mHasInputFilter;
private KeyEventDispatcher mKeyEventDispatcher;
@@ -259,7 +255,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
private Point mTempPoint = new Point();
private boolean mIsAccessibilityButtonShown;
private MagnificationTransitionController mMagnificationTransitionController;
private MagnificationController mMagnificationController;
private AccessibilityUserState getCurrentUserStateLocked() {
return getUserStateLocked(mCurrentUserId);
@@ -292,7 +288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
SystemActionPerformer systemActionPerformer,
AccessibilityWindowManager a11yWindowManager,
AccessibilityDisplayListener a11yDisplayListener,
WindowMagnificationManager windowMagnificationMgr) {
MagnificationController magnificationController) {
mContext = context;
mPowerManager = (PowerManager) mContext.getSystemService(Context.POWER_SERVICE);
mWindowManagerService = LocalServices.getService(WindowManagerInternal.class);
@@ -303,8 +299,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mSystemActionPerformer = systemActionPerformer;
mA11yWindowManager = a11yWindowManager;
mA11yDisplayListener = a11yDisplayListener;
mWindowMagnificationMgr = windowMagnificationMgr;
mMagnificationTransitionController = new MagnificationTransitionController(this, mLock);
mMagnificationController = magnificationController;
init();
}
@@ -324,7 +319,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
mA11yWindowManager = new AccessibilityWindowManager(mLock, mMainHandler,
mWindowManagerService, this, mSecurityPolicy, this);
mA11yDisplayListener = new AccessibilityDisplayListener(mContext, mMainHandler);
mMagnificationTransitionController = new MagnificationTransitionController(this, mLock);
mMagnificationController = new MagnificationController(this, mLock, mContext);
init();
}
@@ -1195,9 +1190,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
// The user changed.
mCurrentUserId = userId;
if (mWindowMagnificationMgr != null) {
mWindowMagnificationMgr.setUserId(mCurrentUserId);
}
mMagnificationController.updateUserIdIfNeeded(mCurrentUserId);
AccessibilityUserState userState = getCurrentUserStateLocked();
readConfigurationForUserStateLocked(userState);
@@ -1554,7 +1547,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
if (fallBackMagnificationModeSettingsLocked(userState)) {
return;
}
mMagnificationTransitionController.transitionMagnificationModeLocked(
mMagnificationController.transitionMagnificationModeLocked(
Display.DEFAULT_DISPLAY, userState.getMagnificationModeLocked(),
this::onMagnificationTransitionEndedLocked);
}
@@ -2310,13 +2303,9 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
return;
}
if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.setUserId(userState.mUserId);
}
if (mUiAutomationManager.suppressingAccessibilityServicesLocked()
&& mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.unregisterAll();
&& mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
getFullScreenMagnificationController().unregisterAll();
return;
}
@@ -2339,8 +2328,8 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
final int displayId = display.getDisplayId();
if (userHasListeningMagnificationServicesLocked(userState, displayId)) {
getFullScreenMagnificationController().register(displayId);
} else if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.unregister(displayId);
} else if (mMagnificationController.isFullScreenMagnificationControllerInitialized()) {
getFullScreenMagnificationController().unregister(displayId);
}
}
}
@@ -2990,10 +2979,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
*/
public WindowMagnificationManager getWindowMagnificationMgr() {
synchronized (mLock) {
if (mWindowMagnificationMgr == null) {
mWindowMagnificationMgr = new WindowMagnificationManager(mContext, mCurrentUserId);
}
return mWindowMagnificationMgr;
return mMagnificationController.getWindowMagnificationMgr();
}
}
@@ -3060,12 +3046,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
@Override
public FullScreenMagnificationController getFullScreenMagnificationController() {
synchronized (mLock) {
if (mFullScreenMagnificationController == null) {
mFullScreenMagnificationController = new FullScreenMagnificationController(mContext,
this, mLock);
mFullScreenMagnificationController.setUserId(mCurrentUserId);
}
return mFullScreenMagnificationController;
return mMagnificationController.getFullScreenMagnificationController();
}
}
@@ -3307,9 +3288,7 @@ public class AccessibilityManagerService extends IAccessibilityManager.Stub
}
}
}
if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.onDisplayRemoved(displayId);
}
mMagnificationController.onDisplayRemoved(displayId);
mA11yWindowManager.stopTrackingWindows(displayId);
}

View File

@@ -21,6 +21,7 @@ import static android.provider.Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Context;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.Region;
@@ -29,21 +30,26 @@ import android.util.Slog;
import android.util.SparseArray;
import android.view.accessibility.MagnificationAnimationCallback;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.accessibility.AccessibilityManagerService;
/**
* Handles magnification mode transition.
* Handles all magnification controllers initialization, generic interactions
* and magnification mode transition.
*/
public class MagnificationTransitionController {
public class MagnificationController {
private static final boolean DEBUG = false;
private static final String TAG = "MagnificationController";
private final AccessibilityManagerService mAms;
private final PointF mTempPoint = new PointF();
private final Object mLock;
private final Context mContext;
private final SparseArray<DisableMagnificationCallback>
mMagnificationEndRunnableSparseArray = new SparseArray();
private FullScreenMagnificationController mFullScreenMagnificationController;
private WindowMagnificationManager mWindowMagnificationMgr;
/**
* A callback to inform the magnification transition result.
@@ -56,9 +62,20 @@ public class MagnificationTransitionController {
void onResult(boolean success);
}
public MagnificationTransitionController(AccessibilityManagerService ams, Object lock) {
public MagnificationController(AccessibilityManagerService ams, Object lock,
Context context) {
mAms = ams;
mLock = lock;
mContext = context;
}
@VisibleForTesting
public MagnificationController(AccessibilityManagerService ams, Object lock,
Context context, FullScreenMagnificationController fullScreenMagnificationController,
WindowMagnificationManager windowMagnificationManager) {
this(ams, lock, context);
mFullScreenMagnificationController = fullScreenMagnificationController;
mWindowMagnificationMgr = windowMagnificationManager;
}
/**
@@ -97,7 +114,7 @@ public class MagnificationTransitionController {
}
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationManager();
final WindowMagnificationManager windowMagnificationMgr = getWindowMagnificationMgr();
final float scale = windowMagnificationMgr.getPersistedScale();
final DisableMagnificationCallback animationEndCallback =
new DisableMagnificationCallback(transitionCallBack, displayId, targetMode,
@@ -111,6 +128,39 @@ public class MagnificationTransitionController {
setDisableMagnificationCallbackLocked(displayId, animationEndCallback);
}
/**
* Updates the active user ID of {@link FullScreenMagnificationController} and {@link
* WindowMagnificationManager}.
*
* @param userId the currently active user ID
*/
public void updateUserIdIfNeeded(int userId) {
synchronized (mLock) {
if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.setUserId(userId);
}
if (mWindowMagnificationMgr != null) {
mWindowMagnificationMgr.setUserId(userId);
}
}
}
/**
* Removes the magnification instance with given id.
*
* @param displayId The logical display id.
*/
public void onDisplayRemoved(int displayId) {
synchronized (mLock) {
if (mFullScreenMagnificationController != null) {
mFullScreenMagnificationController.onDisplayRemoved(displayId);
}
if (mWindowMagnificationMgr != null) {
mWindowMagnificationMgr.onDisplayRemoved(displayId);
}
}
}
private DisableMagnificationCallback getDisableMagnificationEndRunnableLocked(
int displayId) {
return mMagnificationEndRunnableSparseArray.get(displayId);
@@ -125,31 +175,63 @@ public class MagnificationTransitionController {
}
}
private FullScreenMagnificationController getFullScreenMagnificationController() {
return mAms.getFullScreenMagnificationController();
/**
* Getter of {@link FullScreenMagnificationController}.
*
* @return {@link FullScreenMagnificationController}.
*/
public FullScreenMagnificationController getFullScreenMagnificationController() {
synchronized (mLock) {
if (mFullScreenMagnificationController == null) {
mFullScreenMagnificationController = new FullScreenMagnificationController(mContext,
mAms, mLock);
mFullScreenMagnificationController.setUserId(mAms.getCurrentUserIdLocked());
}
}
return mFullScreenMagnificationController;
}
private WindowMagnificationManager getWindowMagnificationManager() {
return mAms.getWindowMagnificationMgr();
/**
* Is {@link #mFullScreenMagnificationController} is initialized.
* @return {code true} if {@link #mFullScreenMagnificationController} is initialized.
*/
public boolean isFullScreenMagnificationControllerInitialized() {
synchronized (mLock) {
return mFullScreenMagnificationController != null;
}
}
/**
* Getter of {@link WindowMagnificationManager}.
*
* @return {@link WindowMagnificationManager}.
*/
public WindowMagnificationManager getWindowMagnificationMgr() {
synchronized (mLock) {
if (mWindowMagnificationMgr == null) {
mWindowMagnificationMgr = new WindowMagnificationManager(mContext,
mAms.getCurrentUserIdLocked());
}
return mWindowMagnificationMgr;
}
}
private @Nullable
PointF getCurrentMagnificationBoundsCenterLocked(int displayId, int targetMode) {
if (targetMode == ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN) {
final WindowMagnificationManager magnificationManager = getWindowMagnificationManager();
if (!magnificationManager.isWindowMagnifierEnabled(displayId)) {
if (mWindowMagnificationMgr == null
|| !mWindowMagnificationMgr.isWindowMagnifierEnabled(displayId)) {
return null;
}
mTempPoint.set(magnificationManager.getCenterX(displayId),
magnificationManager.getCenterY(displayId));
mTempPoint.set(mWindowMagnificationMgr.getCenterX(displayId),
mWindowMagnificationMgr.getCenterY(displayId));
} else {
final FullScreenMagnificationController screenMagnificationController =
getFullScreenMagnificationController();
if (!screenMagnificationController.isMagnifying(displayId)) {
if (mFullScreenMagnificationController == null
|| !mFullScreenMagnificationController.isMagnifying(displayId)) {
return null;
}
mTempPoint.set(screenMagnificationController.getCenterX(displayId),
screenMagnificationController.getCenterY(displayId));
mTempPoint.set(mFullScreenMagnificationController.getCenterX(displayId),
mFullScreenMagnificationController.getCenterY(displayId));
}
return mTempPoint;
}
@@ -228,7 +310,7 @@ public class MagnificationTransitionController {
mCurrentCenter.y, true,
AccessibilityManagerService.MAGNIFICATION_GESTURE_HANDLER_ID);
} else {
getWindowMagnificationManager().enableWindowMagnification(mDisplayId,
getWindowMagnificationMgr().enableWindowMagnification(mDisplayId,
mCurrentScale, mCurrentCenter.x,
mCurrentCenter.y);
}

View File

@@ -452,6 +452,15 @@ public class WindowMagnificationManager implements
return magnifier;
}
/**
* Removes the window magnifier with given id.
*
* @param displayId The logical display id.
*/
void onDisplayRemoved(int displayId) {
disableWindowMagnification(displayId, true);
}
private class ConnectionCallback extends IWindowMagnificationConnectionCallback.Stub implements
IBinder.DeathRecipient {
private boolean mExpiredDeathRecipient = false;

View File

@@ -49,6 +49,7 @@ import androidx.test.InstrumentationRegistry;
import com.android.server.LocalServices;
import com.android.server.accessibility.AccessibilityManagerService.AccessibilityDisplayListener;
import com.android.server.accessibility.magnification.MagnificationController;
import com.android.server.accessibility.magnification.WindowMagnificationManager;
import com.android.server.accessibility.test.MessageCapturingHandler;
import com.android.server.wm.ActivityTaskManagerInternal;
@@ -94,6 +95,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
@Mock private IBinder mMockBinder;
@Mock private IAccessibilityServiceClient mMockServiceClient;
@Mock private WindowMagnificationManager mMockWindowMagnificationMgr;
@Mock private MagnificationController mMockMagnificationController;
private AccessibilityUserState mUserState;
private MessageCapturingHandler mHandler = new MessageCapturingHandler(null);
@@ -110,6 +112,8 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
LocalServices.addService(
ActivityTaskManagerInternal.class, mMockActivityTaskManagerInternal);
when(mMockMagnificationController.getWindowMagnificationMgr()).thenReturn(
mMockWindowMagnificationMgr);
mA11yms = new AccessibilityManagerService(
InstrumentationRegistry.getContext(),
mMockPackageManager,
@@ -117,7 +121,7 @@ public class AccessibilityManagerServiceTest extends AndroidTestCase {
mMockSystemActionPerformer,
mMockA11yWindowManager,
mMockA11yDisplayListener,
mMockWindowMagnificationMgr);
mMockMagnificationController);
final AccessibilityUserState userState = new AccessibilityUserState(
mA11yms.getCurrentUserIdLocked(), mMockContext, mA11yms);

View File

@@ -62,7 +62,7 @@ import org.mockito.MockitoAnnotations;
* Tests for MagnificationController.
*/
@RunWith(AndroidJUnit4.class)
public class MagnificationTransitionControllerTest {
public class MagnificationControllerTest {
private static final int TEST_DISPLAY = Display.DEFAULT_DISPLAY;
private static final Region MAGNIFICATION_REGION = new Region(0, 0, 500, 600);
@@ -75,7 +75,7 @@ public class MagnificationTransitionControllerTest {
Settings.Secure.ACCESSIBILITY_MAGNIFICATION_MODE_FULLSCREEN;
@Mock private AccessibilityManagerService mService;
@Mock private MagnificationTransitionController.TransitionCallBack mTransitionCallBack;
@Mock private MagnificationController.TransitionCallBack mTransitionCallBack;
@Mock private Context mContext;
@Mock private FullScreenMagnificationController mScreenMagnificationController;
@Captor private ArgumentCaptor<MagnificationAnimationCallback> mCallbackArgumentCaptor;
@@ -83,7 +83,7 @@ public class MagnificationTransitionControllerTest {
private MockWindowMagnificationConnection mMockConnection;
private WindowMagnificationManager mWindowMagnificationManager;
private MockContentResolver mMockResolver;
private MagnificationTransitionController mMagnificationTransitionController;
private MagnificationController mMagnificationController;
@Before
public void setUp() throws Exception {
@@ -95,14 +95,12 @@ public class MagnificationTransitionControllerTest {
Settings.Secure.putFloatForUser(mMockResolver,
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_SCALE, DEFAULT_SCALE,
CURRENT_USER_ID);
mWindowMagnificationManager = new WindowMagnificationManager(mContext, CURRENT_USER_ID);
when(mService.getFullScreenMagnificationController()).thenReturn(
mScreenMagnificationController);
when(mService.getWindowMagnificationMgr()).thenReturn(mWindowMagnificationManager);
mWindowMagnificationManager = Mockito.spy(
new WindowMagnificationManager(mContext, CURRENT_USER_ID));
mMockConnection = new MockWindowMagnificationConnection(true);
mWindowMagnificationManager.setConnection(mMockConnection.getConnection());
mMagnificationTransitionController = new MagnificationTransitionController(mService,
new Object());
mMagnificationController = new MagnificationController(mService, new Object(), mContext,
mScreenMagnificationController, mWindowMagnificationManager);
}
@After
@@ -113,7 +111,7 @@ public class MagnificationTransitionControllerTest {
@Test
public void transitionToWindowMode_notMagnifying_doNothing() throws RemoteException {
setMagnificationModeSettings(MODE_FULLSCREEN);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_WINDOW,
mTransitionCallBack);
@@ -130,7 +128,7 @@ public class MagnificationTransitionControllerTest {
throws RemoteException {
setMagnificationEnabled(MODE_FULLSCREEN);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_WINDOW,
mTransitionCallBack);
@@ -147,11 +145,11 @@ public class MagnificationTransitionControllerTest {
public void transitionToWindowMode_disablingWindowMode_enablingWindowWithFormerCenter()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_FULLSCREEN,
mTransitionCallBack);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_WINDOW,
mTransitionCallBack);
@@ -166,7 +164,7 @@ public class MagnificationTransitionControllerTest {
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_FULLSCREEN,
mTransitionCallBack);
mMockConnection.invokeCallbacks();
@@ -186,7 +184,7 @@ public class MagnificationTransitionControllerTest {
magnificationBounds.bottom + 100);
setMagnificationEnabled(MODE_WINDOW, magnifiedCenter.x, magnifiedCenter.y);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_FULLSCREEN,
mTransitionCallBack);
mMockConnection.invokeCallbacks();
@@ -202,11 +200,11 @@ public class MagnificationTransitionControllerTest {
public void transitionToFullScreenMode_disablingFullScreen_enableFullScreenWithFormerCenter()
throws RemoteException {
setMagnificationEnabled(MODE_FULLSCREEN);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_WINDOW,
mTransitionCallBack);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_FULLSCREEN,
mTransitionCallBack);
@@ -221,7 +219,7 @@ public class MagnificationTransitionControllerTest {
public void interruptDuringTransitionToFullScreenMode_windowMagnifying_notifyTransitionFailed()
throws RemoteException {
setMagnificationEnabled(MODE_WINDOW);
mMagnificationTransitionController.transitionMagnificationModeLocked(TEST_DISPLAY,
mMagnificationController.transitionMagnificationModeLocked(TEST_DISPLAY,
MODE_FULLSCREEN,
mTransitionCallBack);
@@ -237,7 +235,23 @@ public class MagnificationTransitionControllerTest {
verify(mTransitionCallBack).onResult(false);
}
@Test
public void onDisplayRemoved_notifyAllModules() {
mMagnificationController.onDisplayRemoved(TEST_DISPLAY);
verify(mScreenMagnificationController).onDisplayRemoved(TEST_DISPLAY);
verify(mWindowMagnificationManager).onDisplayRemoved(TEST_DISPLAY);
}
@Test
public void updateUserIdIfNeeded_AllModulesAvailable_setUserId() {
mMagnificationController.updateUserIdIfNeeded(CURRENT_USER_ID);
verify(mScreenMagnificationController).setUserId(CURRENT_USER_ID);
verify(mWindowMagnificationManager).setUserId(CURRENT_USER_ID);
}
private void setMagnificationEnabled(int mode) throws RemoteException {
setMagnificationEnabled(mode, MAGNIFIED_CENTER_X, MAGNIFIED_CENTER_Y);
}

View File

@@ -369,6 +369,16 @@ public class WindowMagnificationManagerTest {
assertEquals(mWindowMagnificationManager.getCenterY(TEST_DISPLAY), 200f);
}
@Test
public void onDisplayRemoved_enabledOnTestDisplay_disabled() {
mWindowMagnificationManager.requestConnection(true);
mWindowMagnificationManager.enableWindowMagnification(TEST_DISPLAY, 3f, 100f, 200f);
mWindowMagnificationManager.onDisplayRemoved(TEST_DISPLAY);
assertFalse(mWindowMagnificationManager.isWindowMagnifierEnabled(TEST_DISPLAY));
}
private MotionEvent generatePointersDownEvent(PointF[] pointersLocation) {
final int len = pointersLocation.length;