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 WindowMagnificationConnectionImpl(@onNull WindowMagnification windowMagnification, @Main Handler mainHandler)43 WindowMagnificationConnectionImpl(@NonNull WindowMagnification windowMagnification, 44 @Main Handler mainHandler) { 45 mWindowMagnification = windowMagnification; 46 mHandler = mainHandler; 47 } 48 49 @Override enableWindowMagnification(int displayId, float scale, float centerX, float centerY, float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY, IRemoteMagnificationAnimationCallback callback)50 public void enableWindowMagnification(int displayId, float scale, float centerX, float centerY, 51 float magnificationFrameOffsetRatioX, float magnificationFrameOffsetRatioY, 52 IRemoteMagnificationAnimationCallback callback) { 53 mHandler.post( 54 () -> mWindowMagnification.enableWindowMagnification(displayId, scale, centerX, 55 centerY, magnificationFrameOffsetRatioX, 56 magnificationFrameOffsetRatioY, 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 moveWindowMagnifierToPosition(int displayId, float positionX, float positionY, IRemoteMagnificationAnimationCallback callback)78 public void moveWindowMagnifierToPosition(int displayId, float positionX, float positionY, 79 IRemoteMagnificationAnimationCallback callback) { 80 mHandler.post(() -> mWindowMagnification.moveWindowMagnifierToPositionInternal( 81 displayId, positionX, positionY, callback)); 82 } 83 84 @Override showMagnificationButton(int displayId, int magnificationMode)85 public void showMagnificationButton(int displayId, int magnificationMode) { 86 mHandler.post( 87 () -> mWindowMagnification.showMagnificationButton(displayId, magnificationMode)); 88 } 89 90 @Override removeMagnificationButton(int displayId)91 public void removeMagnificationButton(int displayId) { 92 mHandler.post( 93 () -> mWindowMagnification.removeMagnificationButton(displayId)); 94 } 95 96 @Override removeMagnificationSettingsPanel(int display)97 public void removeMagnificationSettingsPanel(int display) { 98 mHandler.post(() -> mWindowMagnification.hideMagnificationSettingsPanel(display)); 99 } 100 101 @Override onUserMagnificationScaleChanged(int userId, int displayId, float scale)102 public void onUserMagnificationScaleChanged(int userId, int displayId, float scale) { 103 mHandler.post(() -> mWindowMagnification.setUserMagnificationScale( 104 userId, displayId, scale)); 105 } 106 107 @Override setConnectionCallback(IWindowMagnificationConnectionCallback callback)108 public void setConnectionCallback(IWindowMagnificationConnectionCallback callback) { 109 mConnectionCallback = callback; 110 } 111 onWindowMagnifierBoundsChanged(int displayId, Rect frame)112 void onWindowMagnifierBoundsChanged(int displayId, Rect frame) { 113 if (mConnectionCallback != null) { 114 try { 115 mConnectionCallback.onWindowMagnifierBoundsChanged(displayId, frame); 116 } catch (RemoteException e) { 117 Log.e(TAG, "Failed to inform bounds changed", e); 118 } 119 } 120 } 121 onSourceBoundsChanged(int displayId, Rect sourceBounds)122 void onSourceBoundsChanged(int displayId, Rect sourceBounds) { 123 if (mConnectionCallback != null) { 124 try { 125 mConnectionCallback.onSourceBoundsChanged(displayId, sourceBounds); 126 } catch (RemoteException e) { 127 Log.e(TAG, "Failed to inform source bounds changed", e); 128 } 129 } 130 } 131 onPerformScaleAction(int displayId, float scale, boolean updatePersistence)132 void onPerformScaleAction(int displayId, float scale, boolean updatePersistence) { 133 if (mConnectionCallback != null) { 134 try { 135 mConnectionCallback.onPerformScaleAction(displayId, scale, updatePersistence); 136 } catch (RemoteException e) { 137 Log.e(TAG, "Failed to inform performing scale action", e); 138 } 139 } 140 } 141 onAccessibilityActionPerformed(int displayId)142 void onAccessibilityActionPerformed(int displayId) { 143 if (mConnectionCallback != null) { 144 try { 145 mConnectionCallback.onAccessibilityActionPerformed(displayId); 146 } catch (RemoteException e) { 147 Log.e(TAG, "Failed to inform an accessibility action is already performed", e); 148 } 149 } 150 } 151 onChangeMagnificationMode(int displayId, int mode)152 void onChangeMagnificationMode(int displayId, int mode) { 153 if (mConnectionCallback != null) { 154 try { 155 mConnectionCallback.onChangeMagnificationMode(displayId, mode); 156 } catch (RemoteException e) { 157 Log.e(TAG, "Failed to inform changing magnification mode", e); 158 } 159 } 160 } 161 onMove(int displayId)162 void onMove(int displayId) { 163 if (mConnectionCallback != null) { 164 try { 165 mConnectionCallback.onMove(displayId); 166 } catch (RemoteException e) { 167 Log.e(TAG, "Failed to inform taking control by a user", e); 168 } 169 } 170 } 171 } 172