1 /* 2 * Copyright (C) 2020 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.systemui.accessibility; 18 19 import android.annotation.NonNull; 20 import android.graphics.Rect; 21 import android.os.Handler; 22 import android.os.RemoteException; 23 import android.util.Log; 24 import android.view.accessibility.IRemoteMagnificationAnimationCallback; 25 import android.view.accessibility.IWindowMagnificationConnection; 26 import android.view.accessibility.IWindowMagnificationConnectionCallback; 27 28 import com.android.systemui.dagger.qualifiers.Main; 29 30 /** 31 * Implementation of window magnification connection. 32 * 33 * @see IWindowMagnificationConnection 34 */ 35 class WindowMagnificationConnectionImpl extends IWindowMagnificationConnection.Stub { 36 37 private static final String TAG = "WindowMagnificationConnectionImpl"; 38 39 private IWindowMagnificationConnectionCallback mConnectionCallback; 40 private final WindowMagnification mWindowMagnification; 41 private final Handler mHandler; 42 private final ModeSwitchesController mModeSwitchesController; 43 WindowMagnificationConnectionImpl(@onNull WindowMagnification windowMagnification, @Main Handler mainHandler, ModeSwitchesController modeSwitchesController)44 WindowMagnificationConnectionImpl(@NonNull WindowMagnification windowMagnification, 45 @Main Handler mainHandler, ModeSwitchesController modeSwitchesController) { 46 mWindowMagnification = windowMagnification; 47 mHandler = mainHandler; 48 mModeSwitchesController = modeSwitchesController; 49 } 50 51 @Override enableWindowMagnification(int displayId, float scale, float centerX, float centerY, IRemoteMagnificationAnimationCallback callback)52 public void enableWindowMagnification(int displayId, float scale, float centerX, 53 float centerY, IRemoteMagnificationAnimationCallback callback) { 54 mHandler.post( 55 () -> mWindowMagnification.enableWindowMagnification(displayId, scale, centerX, 56 centerY, callback)); 57 } 58 59 @Override setScale(int displayId, float scale)60 public void setScale(int displayId, float scale) { 61 mHandler.post(() -> mWindowMagnification.setScale(displayId, scale)); 62 } 63 64 @Override disableWindowMagnification(int displayId, IRemoteMagnificationAnimationCallback callback)65 public void disableWindowMagnification(int displayId, 66 IRemoteMagnificationAnimationCallback callback) { 67 mHandler.post(() -> mWindowMagnification.disableWindowMagnification(displayId, 68 callback)); 69 } 70 71 @Override moveWindowMagnifier(int displayId, float offsetX, float offsetY)72 public void moveWindowMagnifier(int displayId, float offsetX, float offsetY) { 73 mHandler.post( 74 () -> mWindowMagnification.moveWindowMagnifier(displayId, offsetX, offsetY)); 75 } 76 77 @Override showMagnificationButton(int displayId, int magnificationMode)78 public void showMagnificationButton(int displayId, int magnificationMode) { 79 mHandler.post( 80 () -> mModeSwitchesController.showButton(displayId, magnificationMode)); 81 } 82 83 @Override removeMagnificationButton(int displayId)84 public void removeMagnificationButton(int displayId) { 85 mHandler.post( 86 () -> mModeSwitchesController.removeButton(displayId)); 87 } 88 89 @Override setConnectionCallback(IWindowMagnificationConnectionCallback callback)90 public void setConnectionCallback(IWindowMagnificationConnectionCallback callback) { 91 mConnectionCallback = callback; 92 } 93 onWindowMagnifierBoundsChanged(int displayId, Rect frame)94 void onWindowMagnifierBoundsChanged(int displayId, Rect frame) { 95 if (mConnectionCallback != null) { 96 try { 97 mConnectionCallback.onWindowMagnifierBoundsChanged(displayId, frame); 98 } catch (RemoteException e) { 99 Log.e(TAG, "Failed to inform bounds changed", e); 100 } 101 } 102 } 103 onSourceBoundsChanged(int displayId, Rect sourceBounds)104 void onSourceBoundsChanged(int displayId, Rect sourceBounds) { 105 if (mConnectionCallback != null) { 106 try { 107 mConnectionCallback.onSourceBoundsChanged(displayId, sourceBounds); 108 } catch (RemoteException e) { 109 Log.e(TAG, "Failed to inform source bounds changed", e); 110 } 111 } 112 } 113 onPerformScaleAction(int displayId, float scale)114 void onPerformScaleAction(int displayId, float scale) { 115 if (mConnectionCallback != null) { 116 try { 117 mConnectionCallback.onPerformScaleAction(displayId, scale); 118 } catch (RemoteException e) { 119 Log.e(TAG, "Failed to inform performing scale action", e); 120 } 121 } 122 } 123 onAccessibilityActionPerformed(int displayId)124 void onAccessibilityActionPerformed(int displayId) { 125 if (mConnectionCallback != null) { 126 try { 127 mConnectionCallback.onAccessibilityActionPerformed(displayId); 128 } catch (RemoteException e) { 129 Log.e(TAG, "Failed to inform an accessibility action is already performed", e); 130 } 131 } 132 } 133 } 134