blob: 5019aee412547af352620fa4593b09d44107a43a [file] [log] [blame]
/*
* 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.
*
* <p>
* 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.
* </p>
*
* <p>
* When the magnification config uses {@link #MAGNIFICATION_MODE_FULLSCREEN}.
* {@link AccessibilityService} will be able to control full-screen magnifier on the display.
* </p>
*
* <p>
* 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.
* </p>
*
* <p>
* 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.
* </p>
*/
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<MagnificationConfig> CREATOR =
new Parcelable.Creator<MagnificationConfig>() {
public MagnificationConfig createFromParcel(Parcel parcel) {
return new MagnificationConfig(parcel);
}
public MagnificationConfig[] newArray(int size) {
return new MagnificationConfig[size];
}
};
}