Loading packages/SystemUI/src/com/android/systemui/accessibility/DisplayIdIndexSupplier.java +13 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.view.Display; import androidx.annotation.NonNull; import java.util.function.Consumer; /** * Supplies the instance with given display Id. It generates a new instance if the corresponding * one is not existed. It should run in single thread to avoid race conditions. Loading Loading @@ -101,4 +103,15 @@ abstract class DisplayIdIndexSupplier<T> { public int getSize() { return mSparseArray.size(); } /** * Runs task for each object. * * @param task of each object */ public void forEach(Consumer<T> task) { for (int i = 0; i < mSparseArray.size(); i++) { task.accept(mSparseArray.valueAt(i)); } } } packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java +2 −6 Original line number Diff line number Diff line Loading @@ -87,12 +87,8 @@ public class ModeSwitchesController { */ @MainThread void onConfigurationChanged(int configDiff) { for (int i = 0; i < mSwitchSupplier.getSize(); i++) { final MagnificationModeSwitch magnificationModeSwitch = mSwitchSupplier.valueAt(i); if (magnificationModeSwitch != null) { magnificationModeSwitch.onConfigurationChanged(configDiff); } } mSwitchSupplier.forEach( switchController -> switchController.onConfigurationChanged(configDiff)); } private static class SwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> { Loading packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +65 −20 Original line number Diff line number Diff line Loading @@ -22,7 +22,9 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.os.Handler; import android.view.Display; import android.view.SurfaceControl; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IRemoteMagnificationAnimationCallback; Loading Loading @@ -52,8 +54,6 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall ActivityInfo.CONFIG_DENSITY | ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LOCALE; @VisibleForTesting protected WindowMagnificationAnimationController mWindowMagnificationAnimationController; private final ModeSwitchesController mModeSwitchesController; private final Handler mHandler; private final AccessibilityManager mAccessibilityManager; Loading @@ -62,6 +62,43 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall private WindowMagnificationConnectionImpl mWindowMagnificationConnectionImpl; private Configuration mLastConfiguration; private static class AnimationControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationAnimationController> { private final Context mContext; private final Handler mHandler; private final NavigationModeController mNavigationModeController; private final WindowMagnifierCallback mWindowMagnifierCallback; AnimationControllerSupplier(Context context, Handler handler, NavigationModeController navigationModeController, WindowMagnifierCallback windowMagnifierCallback, DisplayManager displayManager) { super(displayManager); mContext = context; mHandler = handler; mNavigationModeController = navigationModeController; mWindowMagnifierCallback = windowMagnifierCallback; } @Override protected WindowMagnificationAnimationController createInstance(Display display) { final Context context = (display.getDisplayId() == Display.DEFAULT_DISPLAY) ? mContext : mContext.createDisplayContext(display); final WindowMagnificationController controller = new WindowMagnificationController( mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, new SurfaceControl.Transaction(), mWindowMagnifierCallback); final int navBarMode = mNavigationModeController.addListener( controller::onNavigationModeChanged); controller.onNavigationModeChanged(navBarMode); return new WindowMagnificationAnimationController(context, controller); } } @VisibleForTesting DisplayIdIndexSupplier<WindowMagnificationAnimationController> mAnimationControllerSupplier; @Inject public WindowMagnification(Context context, @Main Handler mainHandler, CommandQueue commandQueue, ModeSwitchesController modeSwitchesController, Loading @@ -72,14 +109,9 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mCommandQueue = commandQueue; mModeSwitchesController = modeSwitchesController; final WindowMagnificationController controller = new WindowMagnificationController(mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, new SurfaceControl.Transaction(), this); final int navBarMode = navigationModeController.addListener( controller::onNavigationModeChanged); controller.onNavigationModeChanged(navBarMode); mWindowMagnificationAnimationController = new WindowMagnificationAnimationController( mContext, controller); mAnimationControllerSupplier = new AnimationControllerSupplier(context, mHandler, navigationModeController, this, context.getSystemService(DisplayManager.class)); } @Override Loading @@ -89,7 +121,8 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall return; } mLastConfiguration.setTo(newConfig); mWindowMagnificationAnimationController.onConfigurationChanged(configDiff); mAnimationControllerSupplier.forEach( animationController -> animationController.onConfigurationChanged(configDiff)); if (mModeSwitchesController != null) { mModeSwitchesController.onConfigurationChanged(configDiff); } Loading @@ -103,28 +136,40 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall @MainThread void enableWindowMagnification(int displayId, float scale, float centerX, float centerY, @Nullable IRemoteMagnificationAnimationCallback callback) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.enableWindowMagnification(scale, centerX, centerY, callback); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.enableWindowMagnification(scale, centerX, centerY, callback); } } @MainThread void setScale(int displayId, float scale) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.setScale(scale); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.setScale(scale); } } @MainThread void moveWindowMagnifier(int displayId, float offsetX, float offsetY) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY); } } @MainThread void disableWindowMagnification(int displayId, @Nullable IRemoteMagnificationAnimationCallback callback) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.deleteWindowMagnification(callback); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.deleteWindowMagnification(callback); } } @Override Loading packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +17 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import android.content.Context; import android.hardware.display.DisplayManager; import android.os.RemoteException; import android.provider.Settings; import android.testing.AndroidTestingRunner; Loading Loading @@ -84,8 +85,9 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, mNavigationModeController); mWindowMagnification.mWindowMagnificationAnimationController = mWindowMagnificationAnimationController; mWindowMagnification.mAnimationControllerSupplier = new FakeAnimationControllerSupplier( mContext.getSystemService(DisplayManager.class)); mWindowMagnification.requestWindowMagnificationConnection(true); assertNotNull(mIWindowMagnificationConnection); mIWindowMagnificationConnection.setConnectionCallback(mConnectionCallback); Loading Loading @@ -144,5 +146,18 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { verify(mModeSwitchesController).removeButton(TEST_DISPLAY); } private class FakeAnimationControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationAnimationController> { FakeAnimationControllerSupplier(DisplayManager displayManager) { super(displayManager); } @Override protected WindowMagnificationAnimationController createInstance(Display display) { return mWindowMagnificationAnimationController; } } } Loading
packages/SystemUI/src/com/android/systemui/accessibility/DisplayIdIndexSupplier.java +13 −0 Original line number Diff line number Diff line Loading @@ -23,6 +23,8 @@ import android.view.Display; import androidx.annotation.NonNull; import java.util.function.Consumer; /** * Supplies the instance with given display Id. It generates a new instance if the corresponding * one is not existed. It should run in single thread to avoid race conditions. Loading Loading @@ -101,4 +103,15 @@ abstract class DisplayIdIndexSupplier<T> { public int getSize() { return mSparseArray.size(); } /** * Runs task for each object. * * @param task of each object */ public void forEach(Consumer<T> task) { for (int i = 0; i < mSparseArray.size(); i++) { task.accept(mSparseArray.valueAt(i)); } } }
packages/SystemUI/src/com/android/systemui/accessibility/ModeSwitchesController.java +2 −6 Original line number Diff line number Diff line Loading @@ -87,12 +87,8 @@ public class ModeSwitchesController { */ @MainThread void onConfigurationChanged(int configDiff) { for (int i = 0; i < mSwitchSupplier.getSize(); i++) { final MagnificationModeSwitch magnificationModeSwitch = mSwitchSupplier.valueAt(i); if (magnificationModeSwitch != null) { magnificationModeSwitch.onConfigurationChanged(configDiff); } } mSwitchSupplier.forEach( switchController -> switchController.onConfigurationChanged(configDiff)); } private static class SwitchSupplier extends DisplayIdIndexSupplier<MagnificationModeSwitch> { Loading
packages/SystemUI/src/com/android/systemui/accessibility/WindowMagnification.java +65 −20 Original line number Diff line number Diff line Loading @@ -22,7 +22,9 @@ import android.content.Context; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.graphics.Rect; import android.hardware.display.DisplayManager; import android.os.Handler; import android.view.Display; import android.view.SurfaceControl; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.IRemoteMagnificationAnimationCallback; Loading Loading @@ -52,8 +54,6 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall ActivityInfo.CONFIG_DENSITY | ActivityInfo.CONFIG_ORIENTATION | ActivityInfo.CONFIG_LOCALE; @VisibleForTesting protected WindowMagnificationAnimationController mWindowMagnificationAnimationController; private final ModeSwitchesController mModeSwitchesController; private final Handler mHandler; private final AccessibilityManager mAccessibilityManager; Loading @@ -62,6 +62,43 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall private WindowMagnificationConnectionImpl mWindowMagnificationConnectionImpl; private Configuration mLastConfiguration; private static class AnimationControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationAnimationController> { private final Context mContext; private final Handler mHandler; private final NavigationModeController mNavigationModeController; private final WindowMagnifierCallback mWindowMagnifierCallback; AnimationControllerSupplier(Context context, Handler handler, NavigationModeController navigationModeController, WindowMagnifierCallback windowMagnifierCallback, DisplayManager displayManager) { super(displayManager); mContext = context; mHandler = handler; mNavigationModeController = navigationModeController; mWindowMagnifierCallback = windowMagnifierCallback; } @Override protected WindowMagnificationAnimationController createInstance(Display display) { final Context context = (display.getDisplayId() == Display.DEFAULT_DISPLAY) ? mContext : mContext.createDisplayContext(display); final WindowMagnificationController controller = new WindowMagnificationController( mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, new SurfaceControl.Transaction(), mWindowMagnifierCallback); final int navBarMode = mNavigationModeController.addListener( controller::onNavigationModeChanged); controller.onNavigationModeChanged(navBarMode); return new WindowMagnificationAnimationController(context, controller); } } @VisibleForTesting DisplayIdIndexSupplier<WindowMagnificationAnimationController> mAnimationControllerSupplier; @Inject public WindowMagnification(Context context, @Main Handler mainHandler, CommandQueue commandQueue, ModeSwitchesController modeSwitchesController, Loading @@ -72,14 +109,9 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall mAccessibilityManager = mContext.getSystemService(AccessibilityManager.class); mCommandQueue = commandQueue; mModeSwitchesController = modeSwitchesController; final WindowMagnificationController controller = new WindowMagnificationController(mContext, mHandler, new SfVsyncFrameCallbackProvider(), null, new SurfaceControl.Transaction(), this); final int navBarMode = navigationModeController.addListener( controller::onNavigationModeChanged); controller.onNavigationModeChanged(navBarMode); mWindowMagnificationAnimationController = new WindowMagnificationAnimationController( mContext, controller); mAnimationControllerSupplier = new AnimationControllerSupplier(context, mHandler, navigationModeController, this, context.getSystemService(DisplayManager.class)); } @Override Loading @@ -89,7 +121,8 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall return; } mLastConfiguration.setTo(newConfig); mWindowMagnificationAnimationController.onConfigurationChanged(configDiff); mAnimationControllerSupplier.forEach( animationController -> animationController.onConfigurationChanged(configDiff)); if (mModeSwitchesController != null) { mModeSwitchesController.onConfigurationChanged(configDiff); } Loading @@ -103,28 +136,40 @@ public class WindowMagnification extends SystemUI implements WindowMagnifierCall @MainThread void enableWindowMagnification(int displayId, float scale, float centerX, float centerY, @Nullable IRemoteMagnificationAnimationCallback callback) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.enableWindowMagnification(scale, centerX, centerY, callback); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.enableWindowMagnification(scale, centerX, centerY, callback); } } @MainThread void setScale(int displayId, float scale) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.setScale(scale); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.setScale(scale); } } @MainThread void moveWindowMagnifier(int displayId, float offsetX, float offsetY) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.moveWindowMagnifier(offsetX, offsetY); } } @MainThread void disableWindowMagnification(int displayId, @Nullable IRemoteMagnificationAnimationCallback callback) { //TODO: b/144080869 support multi-display. mWindowMagnificationAnimationController.deleteWindowMagnification(callback); final WindowMagnificationAnimationController windowMagnificationAnimationController = mAnimationControllerSupplier.get(displayId); if (windowMagnificationAnimationController != null) { windowMagnificationAnimationController.deleteWindowMagnification(callback); } } @Override Loading
packages/SystemUI/tests/src/com/android/systemui/accessibility/IWindowMagnificationConnectionTest.java +17 −2 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.verify; import android.content.Context; import android.hardware.display.DisplayManager; import android.os.RemoteException; import android.provider.Settings; import android.testing.AndroidTestingRunner; Loading Loading @@ -84,8 +85,9 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { mWindowMagnification = new WindowMagnification(getContext(), getContext().getMainThreadHandler(), mCommandQueue, mModeSwitchesController, mNavigationModeController); mWindowMagnification.mWindowMagnificationAnimationController = mWindowMagnificationAnimationController; mWindowMagnification.mAnimationControllerSupplier = new FakeAnimationControllerSupplier( mContext.getSystemService(DisplayManager.class)); mWindowMagnification.requestWindowMagnificationConnection(true); assertNotNull(mIWindowMagnificationConnection); mIWindowMagnificationConnection.setConnectionCallback(mConnectionCallback); Loading Loading @@ -144,5 +146,18 @@ public class IWindowMagnificationConnectionTest extends SysuiTestCase { verify(mModeSwitchesController).removeButton(TEST_DISPLAY); } private class FakeAnimationControllerSupplier extends DisplayIdIndexSupplier<WindowMagnificationAnimationController> { FakeAnimationControllerSupplier(DisplayManager displayManager) { super(displayManager); } @Override protected WindowMagnificationAnimationController createInstance(Display display) { return mWindowMagnificationAnimationController; } } }