• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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