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