287 lines
9.3 KiB
Java
287 lines
9.3 KiB
Java
/*
|
|
* 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];
|
|
}
|
|
};
|
|
}
|