/* * Copyright (C) 2021 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.accessibilityservice; import android.annotation.FloatRange; import android.annotation.IntDef; import android.annotation.NonNull; import android.os.Parcel; import android.os.Parcelable; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; /** * This class describes the magnification config for {@link AccessibilityService} to control the * magnification. * *

* When the magnification config uses {@link #MAGNIFICATION_MODE_DEFAULT}, * {@link AccessibilityService} will be able to control the activated magnifier on the display. * If there is no magnifier activated, it controls the last-activated magnification mode. * If there is no magnifier activated before, it controls full-screen magnifier by default. *

* *

* When the magnification config uses {@link #MAGNIFICATION_MODE_FULLSCREEN}. * {@link AccessibilityService} will be able to control full-screen magnifier on the display. *

* *

* When the magnification config uses {@link #MAGNIFICATION_MODE_WINDOW} and the platform * supports {@link android.content.pm.PackageManager#FEATURE_WINDOW_MAGNIFICATION} feature. * {@link AccessibilityService} will be able to control window magnifier on the display. *

* *

* If the other magnification configs, scale centerX and centerY, are not set by the * {@link Builder}, the configs should be current values or default values. And the center * position ordinarily is the center of the screen. *

*/ public final class MagnificationConfig implements Parcelable { /** The controlling magnification mode. It controls the activated magnifier. */ public static final int MAGNIFICATION_MODE_DEFAULT = 0; /** The controlling magnification mode. It controls full-screen magnifier. */ public static final int MAGNIFICATION_MODE_FULLSCREEN = 1; /** * The controlling magnification mode. It is valid if the platform supports * {@link android.content.pm.PackageManager#FEATURE_WINDOW_MAGNIFICATION} feature. */ public static final int MAGNIFICATION_MODE_WINDOW = 2; /** @hide */ @IntDef(prefix = {"MAGNIFICATION_MODE"}, value = { MAGNIFICATION_MODE_DEFAULT, MAGNIFICATION_MODE_FULLSCREEN, MAGNIFICATION_MODE_WINDOW, }) @Retention(RetentionPolicy.SOURCE) @interface MagnificationMode { } private int mMode = MAGNIFICATION_MODE_DEFAULT; private boolean mActivated = false; private float mScale = Float.NaN; private float mCenterX = Float.NaN; private float mCenterY = Float.NaN; private MagnificationConfig() { /* do nothing */ } private MagnificationConfig(@NonNull Parcel parcel) { mMode = parcel.readInt(); mActivated = parcel.readBoolean(); mScale = parcel.readFloat(); mCenterX = parcel.readFloat(); mCenterY = parcel.readFloat(); } /** * Returns the magnification mode that is the current activated mode or the controlling mode of * the config. * * @return The magnification mode */ public int getMode() { return mMode; } /** * Returns the activated state of the controlling magnifier. The controlling magnifier can be * activated even if the scale returned by {@link MagnificationConfig#getScale()} equals to 1.0. * * @return {@code true} if the magnifier is activated and showing on screen, * {@code false} otherwise. */ public boolean isActivated() { return mActivated; } /** * Returns the magnification scale of the controlling magnifier * * @return The magnification scale */ public float getScale() { return mScale; } /** * Returns the screen-relative X coordinate of the center of the magnification viewport. * * @return The X coordinate */ public float getCenterX() { return mCenterX; } /** * Returns the screen-relative Y coordinate of the center of the magnification viewport. * * @return The Y coordinate */ public float getCenterY() { return mCenterY; } @NonNull @Override public String toString() { StringBuilder stringBuilder = new StringBuilder("MagnificationConfig["); stringBuilder.append("mode: ").append(getMode()); stringBuilder.append(", "); stringBuilder.append("activated: ").append(isActivated()); stringBuilder.append(", "); stringBuilder.append("scale: ").append(getScale()); stringBuilder.append(", "); stringBuilder.append("centerX: ").append(getCenterX()); stringBuilder.append(", "); stringBuilder.append("centerY: ").append(getCenterY()); stringBuilder.append("] "); return stringBuilder.toString(); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(@NonNull Parcel parcel, int flags) { parcel.writeInt(mMode); parcel.writeBoolean(mActivated); parcel.writeFloat(mScale); parcel.writeFloat(mCenterX); parcel.writeFloat(mCenterY); } /** * Builder for creating {@link MagnificationConfig} objects. */ public static final class Builder { private int mMode = MAGNIFICATION_MODE_DEFAULT; private boolean mActivated = true; private float mScale = Float.NaN; private float mCenterX = Float.NaN; private float mCenterY = Float.NaN; /** * Creates a new Builder. */ public Builder() { } /** * Sets the magnification mode. * * @param mode The magnification mode * @return This builder */ @NonNull public MagnificationConfig.Builder setMode(@MagnificationMode int mode) { mMode = mode; return this; } /** * Sets magnification activated state. * * @param activated The magnification activated state * @return This builder */ @NonNull public MagnificationConfig.Builder setActivated(boolean activated) { mActivated = activated; return this; } /** * Sets the magnification scale. * * @param scale The magnification scale, in the range [1, 8] * @return This builder */ @NonNull public MagnificationConfig.Builder setScale(@FloatRange(from = 1f, to = 8f) float scale) { mScale = scale; return this; } /** * Sets the X coordinate of the center of the magnification viewport. * The controlling magnifier will apply the given position. * * @param centerX the screen-relative X coordinate around which to * center and scale that is in the range [0, screenWidth], * or {@link Float#NaN} to leave unchanged * @return This builder */ @NonNull public MagnificationConfig.Builder setCenterX(float centerX) { mCenterX = centerX; return this; } /** * Sets the Y coordinate of the center of the magnification viewport. * The controlling magnifier will apply the given position. * * @param centerY the screen-relative Y coordinate around which to * center and scale that is in the range [0, screenHeight], * or {@link Float#NaN} to leave unchanged * @return This builder */ @NonNull public MagnificationConfig.Builder setCenterY(float centerY) { mCenterY = centerY; return this; } /** * Builds and returns a {@link MagnificationConfig} */ @NonNull public MagnificationConfig build() { MagnificationConfig magnificationConfig = new MagnificationConfig(); magnificationConfig.mMode = mMode; magnificationConfig.mActivated = mActivated; magnificationConfig.mScale = mScale; magnificationConfig.mCenterX = mCenterX; magnificationConfig.mCenterY = mCenterY; return magnificationConfig; } } /** * @see Parcelable.Creator */ public static final @NonNull Parcelable.Creator CREATOR = new Parcelable.Creator() { public MagnificationConfig createFromParcel(Parcel parcel) { return new MagnificationConfig(parcel); } public MagnificationConfig[] newArray(int size) { return new MagnificationConfig[size]; } }; }