• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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 android.accessibilityservice;
18 
19 import android.annotation.FloatRange;
20 import android.annotation.IntDef;
21 import android.annotation.NonNull;
22 import android.os.Parcel;
23 import android.os.Parcelable;
24 
25 import java.lang.annotation.Retention;
26 import java.lang.annotation.RetentionPolicy;
27 
28 /**
29  * This class describes the magnification config for {@link AccessibilityService} to control the
30  * magnification.
31  *
32  * <p>
33  * When the magnification config uses {@link #MAGNIFICATION_MODE_DEFAULT},
34  * {@link AccessibilityService} will be able to control the activated magnifier on the display.
35  * If there is no magnifier activated, it controls the last-activated magnification mode.
36  * If there is no magnifier activated before, it controls full-screen magnifier by default.
37  * </p>
38  *
39  * <p>
40  * When the magnification config uses {@link #MAGNIFICATION_MODE_FULLSCREEN}.
41  * {@link AccessibilityService} will be able to control full-screen magnifier on the display.
42  * </p>
43  *
44  * <p>
45  * When the magnification config uses {@link #MAGNIFICATION_MODE_WINDOW} and the platform
46  * supports {@link android.content.pm.PackageManager#FEATURE_WINDOW_MAGNIFICATION} feature.
47  * {@link AccessibilityService} will be able to control window magnifier on the display.
48  * </p>
49  *
50  * <p>
51  * If the other magnification configs, scale centerX and centerY, are not set by the
52  * {@link Builder}, the configs should be current values or default values. And the center
53  * position ordinarily is the center of the screen.
54  * </p>
55  */
56 public final class MagnificationConfig implements Parcelable {
57 
58     /** The controlling magnification mode. It controls the activated magnifier. */
59     public static final int MAGNIFICATION_MODE_DEFAULT = 0;
60     /** The controlling magnification mode. It controls full-screen magnifier. */
61     public static final int MAGNIFICATION_MODE_FULLSCREEN = 1;
62     /**
63      * The controlling magnification mode. It is valid if the platform supports
64      * {@link android.content.pm.PackageManager#FEATURE_WINDOW_MAGNIFICATION} feature.
65      */
66     public static final int MAGNIFICATION_MODE_WINDOW = 2;
67 
68     /** @hide */
69     @IntDef(prefix = {"MAGNIFICATION_MODE"}, value = {
70             MAGNIFICATION_MODE_DEFAULT,
71             MAGNIFICATION_MODE_FULLSCREEN,
72             MAGNIFICATION_MODE_WINDOW,
73     })
74     @Retention(RetentionPolicy.SOURCE)
75     @interface MagnificationMode {
76     }
77 
78     private int mMode = MAGNIFICATION_MODE_DEFAULT;
79     private float mScale = Float.NaN;
80     private float mCenterX = Float.NaN;
81     private float mCenterY = Float.NaN;
82 
MagnificationConfig()83     private MagnificationConfig() {
84         /* do nothing */
85     }
86 
MagnificationConfig(@onNull Parcel parcel)87     private MagnificationConfig(@NonNull Parcel parcel) {
88         mMode = parcel.readInt();
89         mScale = parcel.readFloat();
90         mCenterX = parcel.readFloat();
91         mCenterY = parcel.readFloat();
92     }
93 
94     /**
95      * Returns the magnification mode that is the current activated mode or the controlling mode of
96      * the config.
97      *
98      * @return The magnification mode
99      */
getMode()100     public int getMode() {
101         return mMode;
102     }
103 
104     /**
105      * Returns the magnification scale of the controlling magnifier
106      *
107      * @return the scale If the controlling magnifier is not activated, it returns 1 by default
108      */
getScale()109     public float getScale() {
110         return mScale;
111     }
112 
113     /**
114      * Returns the screen-relative X coordinate of the center of the magnification viewport.
115      *
116      * @return the X coordinate. If the controlling magnifier is {@link #MAGNIFICATION_MODE_WINDOW}
117      * but not enabled, it returns {@link Float#NaN}. If the controlling magnifier is {@link
118      * #MAGNIFICATION_MODE_FULLSCREEN} but not enabled, it returns 0
119      */
getCenterX()120     public float getCenterX() {
121         return mCenterX;
122     }
123 
124     /**
125      * Returns the screen-relative Y coordinate of the center of the magnification viewport.
126      *
127      * @return the Y coordinate If the controlling magnifier is {@link #MAGNIFICATION_MODE_WINDOW}
128      * but not enabled, it returns {@link Float#NaN}. If the controlling magnifier is {@link
129      * #MAGNIFICATION_MODE_FULLSCREEN} but not enabled, it returns 0
130      */
getCenterY()131     public float getCenterY() {
132         return mCenterY;
133     }
134 
135     @NonNull
136     @Override
toString()137     public String toString() {
138         StringBuilder stringBuilder = new StringBuilder("MagnificationConfig[");
139         stringBuilder.append("mode: ").append(getMode());
140         stringBuilder.append(", ");
141         stringBuilder.append("scale: ").append(getScale());
142         stringBuilder.append(", ");
143         stringBuilder.append("centerX: ").append(getCenterX());
144         stringBuilder.append(", ");
145         stringBuilder.append("centerY: ").append(getCenterY());
146         stringBuilder.append("] ");
147         return stringBuilder.toString();
148     }
149 
150     @Override
describeContents()151     public int describeContents() {
152         return 0;
153     }
154 
155     @Override
writeToParcel(@onNull Parcel parcel, int flags)156     public void writeToParcel(@NonNull Parcel parcel, int flags) {
157         parcel.writeInt(mMode);
158         parcel.writeFloat(mScale);
159         parcel.writeFloat(mCenterX);
160         parcel.writeFloat(mCenterY);
161     }
162 
163     /**
164      * Builder for creating {@link MagnificationConfig} objects.
165      */
166     public static final class Builder {
167 
168         private int mMode = MAGNIFICATION_MODE_DEFAULT;
169         private float mScale = Float.NaN;
170         private float mCenterX = Float.NaN;
171         private float mCenterY = Float.NaN;
172 
173         /**
174          * Creates a new Builder.
175          */
Builder()176         public Builder() {
177         }
178 
179         /**
180          * Sets the magnification mode.
181          *
182          * @param mode The magnification mode
183          * @return This builder
184          */
185         @NonNull
setMode(@agnificationMode int mode)186         public MagnificationConfig.Builder setMode(@MagnificationMode int mode) {
187             mMode = mode;
188             return this;
189         }
190 
191         /**
192          * Sets the magnification scale.
193          *
194          * @param scale The magnification scale, in the range [1, 8]
195          * @return This builder
196          */
197         @NonNull
setScale(@loatRangefrom = 1f, to = 8f) float scale)198         public MagnificationConfig.Builder setScale(@FloatRange(from = 1f, to = 8f) float scale) {
199             mScale = scale;
200             return this;
201         }
202 
203         /**
204          * Sets the X coordinate of the center of the magnification viewport.
205          * The controlling magnifier will apply the given position.
206          *
207          * @param centerX the screen-relative X coordinate around which to
208          *                center and scale that is in the range [0, screenWidth],
209          *                or {@link Float#NaN} to leave unchanged
210          * @return This builder
211          */
212         @NonNull
setCenterX(float centerX)213         public MagnificationConfig.Builder setCenterX(float centerX) {
214             mCenterX = centerX;
215             return this;
216         }
217 
218         /**
219          * Sets the Y coordinate of the center of the magnification viewport.
220          * The controlling magnifier will apply the given position.
221          *
222          * @param centerY the screen-relative Y coordinate around which to
223          *                center and scale that is in the range [0, screenHeight],
224          *                or {@link Float#NaN} to leave unchanged
225          * @return This builder
226          */
227         @NonNull
setCenterY(float centerY)228         public MagnificationConfig.Builder setCenterY(float centerY) {
229             mCenterY = centerY;
230             return this;
231         }
232 
233         /**
234          * Builds and returns a {@link MagnificationConfig}
235          */
236         @NonNull
build()237         public MagnificationConfig build() {
238             MagnificationConfig magnificationConfig = new MagnificationConfig();
239             magnificationConfig.mMode = mMode;
240             magnificationConfig.mScale = mScale;
241             magnificationConfig.mCenterX = mCenterX;
242             magnificationConfig.mCenterY = mCenterY;
243             return magnificationConfig;
244         }
245     }
246 
247     /**
248      * @see Parcelable.Creator
249      */
250     public static final @NonNull Parcelable.Creator<MagnificationConfig> CREATOR =
251             new Parcelable.Creator<MagnificationConfig>() {
252                 public MagnificationConfig createFromParcel(Parcel parcel) {
253                     return new MagnificationConfig(parcel);
254                 }
255 
256                 public MagnificationConfig[] newArray(int size) {
257                     return new MagnificationConfig[size];
258                 }
259             };
260 }
261