script-astra/Android/Sdk/sources/android-35/android/window/BackNavigationInfo.java
localadmin 4380f00a78 init
2025-01-20 18:15:20 +03:00

493 lines
16 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.window;
import android.annotation.AnimRes;
import android.annotation.ColorInt;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
import android.graphics.Color;
import android.os.Bundle;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.RemoteCallback;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/**
* Information to be sent to SysUI about a back event.
*
* @hide
*/
@TestApi
public final class BackNavigationInfo implements Parcelable {
/**
* The target of the back navigation is undefined.
*/
public static final int TYPE_UNDEFINED = -1;
/**
* Navigating back will close the currently visible dialog
*/
public static final int TYPE_DIALOG_CLOSE = 0;
/**
* Navigating back will bring the user back to the home screen
*/
public static final int TYPE_RETURN_TO_HOME = 1;
/**
* Navigating back will bring the user to the previous activity in the same Task
*/
public static final int TYPE_CROSS_ACTIVITY = 2;
/**
* Navigating back will bring the user to the previous activity in the previous Task
*/
public static final int TYPE_CROSS_TASK = 3;
/**
* A {@link OnBackInvokedCallback} is available and needs to be called.
* <p>
*/
public static final int TYPE_CALLBACK = 4;
/**
* Key to access the boolean value passed in {#mOnBackNavigationDone} result bundle
* that represents if back navigation has been triggered.
* @hide
*/
public static final String KEY_NAVIGATION_FINISHED = "NavigationFinished";
/**
* Key to access the boolean value passed in {#mOnBackNavigationDone} result bundle
* that represents if back gesture has been triggered.
* @hide
*/
public static final String KEY_GESTURE_FINISHED = "GestureFinished";
/**
* Defines the type of back destinations a back even can lead to. This is used to define the
* type of animation that need to be run on SystemUI.
* @hide
*/
@IntDef(prefix = "TYPE_", value = {
TYPE_UNDEFINED,
TYPE_DIALOG_CLOSE,
TYPE_RETURN_TO_HOME,
TYPE_CROSS_ACTIVITY,
TYPE_CROSS_TASK,
TYPE_CALLBACK
})
@Retention(RetentionPolicy.SOURCE)
public @interface BackTargetType {
}
private final int mType;
@Nullable
private final RemoteCallback mOnBackNavigationDone;
@Nullable
private final IOnBackInvokedCallback mOnBackInvokedCallback;
private final boolean mPrepareRemoteAnimation;
private final boolean mAnimationCallback;
@Nullable
private final CustomAnimationInfo mCustomAnimationInfo;
private final int mLetterboxColor;
/**
* Create a new {@link BackNavigationInfo} instance.
*
* @param type The {@link BackTargetType} of the destination (what will be
* @param onBackNavigationDone The callback to be called once the client is done with the
* back preview.
* @param onBackInvokedCallback The back callback registered by the current top level window.
*/
private BackNavigationInfo(@BackTargetType int type,
@Nullable RemoteCallback onBackNavigationDone,
@Nullable IOnBackInvokedCallback onBackInvokedCallback,
boolean isPrepareRemoteAnimation,
boolean isAnimationCallback,
@Nullable CustomAnimationInfo customAnimationInfo,
int letterboxColor) {
mType = type;
mOnBackNavigationDone = onBackNavigationDone;
mOnBackInvokedCallback = onBackInvokedCallback;
mPrepareRemoteAnimation = isPrepareRemoteAnimation;
mAnimationCallback = isAnimationCallback;
mCustomAnimationInfo = customAnimationInfo;
mLetterboxColor = letterboxColor;
}
private BackNavigationInfo(@NonNull Parcel in) {
mType = in.readInt();
mOnBackNavigationDone = in.readTypedObject(RemoteCallback.CREATOR);
mOnBackInvokedCallback = IOnBackInvokedCallback.Stub.asInterface(in.readStrongBinder());
mPrepareRemoteAnimation = in.readBoolean();
mAnimationCallback = in.readBoolean();
mCustomAnimationInfo = in.readTypedObject(CustomAnimationInfo.CREATOR);
mLetterboxColor = in.readInt();
}
/** @hide */
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeInt(mType);
dest.writeTypedObject(mOnBackNavigationDone, flags);
dest.writeStrongInterface(mOnBackInvokedCallback);
dest.writeBoolean(mPrepareRemoteAnimation);
dest.writeBoolean(mAnimationCallback);
dest.writeTypedObject(mCustomAnimationInfo, flags);
dest.writeInt(mLetterboxColor);
}
/**
* Returns the type of back navigation that is about to happen.
* @hide
* @see BackTargetType
*/
public @BackTargetType int getType() {
return mType;
}
/**
* Returns the {@link OnBackInvokedCallback} of the top level window or null if
* the client didn't register a callback.
* <p>
* This is never null when {@link #getType} returns {@link #TYPE_CALLBACK}.
* @hide
* @see OnBackInvokedCallback
* @see OnBackInvokedDispatcher
*/
@Nullable
public IOnBackInvokedCallback getOnBackInvokedCallback() {
return mOnBackInvokedCallback;
}
/**
* Return true if the core is preparing a back gesture animation.
* @hide
*/
public boolean isPrepareRemoteAnimation() {
return mPrepareRemoteAnimation;
}
/**
* Return true if the callback is {@link OnBackAnimationCallback}.
* @hide
*/
public boolean isAnimationCallback() {
return mAnimationCallback;
}
/**
* @return Letterbox color
* @hide
*/
public int getLetterboxColor() {
return mLetterboxColor;
}
/**
* Callback to be called when the back preview is finished in order to notify the server that
* it can clean up the resources created for the animation.
* @hide
* @param triggerBack Boolean indicating if back navigation has been triggered.
*/
public void onBackNavigationFinished(boolean triggerBack) {
if (mOnBackNavigationDone != null) {
Bundle result = new Bundle();
result.putBoolean(KEY_NAVIGATION_FINISHED, triggerBack);
mOnBackNavigationDone.sendResult(result);
}
}
/**
* Callback to be called when the back gesture is finished in order to notify the server that
* it can ask app to start rendering.
* @hide
* @param triggerBack Boolean indicating if back gesture has been triggered.
*/
public void onBackGestureFinished(boolean triggerBack) {
if (mOnBackNavigationDone != null) {
Bundle result = new Bundle();
result.putBoolean(KEY_GESTURE_FINISHED, triggerBack);
mOnBackNavigationDone.sendResult(result);
}
}
/**
* Get customize animation info.
* @hide
*/
@Nullable
public CustomAnimationInfo getCustomAnimationInfo() {
return mCustomAnimationInfo;
}
/** @hide */
@Override
public int describeContents() {
return 0;
}
@NonNull
public static final Creator<BackNavigationInfo> CREATOR = new Creator<BackNavigationInfo>() {
@Override
public BackNavigationInfo createFromParcel(Parcel in) {
return new BackNavigationInfo(in);
}
@Override
public BackNavigationInfo[] newArray(int size) {
return new BackNavigationInfo[size];
}
};
@Override
public String toString() {
return "BackNavigationInfo{"
+ "mType=" + typeToString(mType) + " (" + mType + ")"
+ ", mOnBackNavigationDone=" + mOnBackNavigationDone
+ ", mOnBackInvokedCallback=" + mOnBackInvokedCallback
+ ", mPrepareRemoteAnimation=" + mPrepareRemoteAnimation
+ ", mAnimationCallback=" + mAnimationCallback
+ ", mCustomizeAnimationInfo=" + mCustomAnimationInfo
+ '}';
}
/**
* Translates the {@link BackNavigationInfo} integer type to its String representation
*/
@NonNull
public static String typeToString(@BackTargetType int type) {
switch (type) {
case TYPE_UNDEFINED:
return "TYPE_UNDEFINED";
case TYPE_DIALOG_CLOSE:
return "TYPE_DIALOG_CLOSE";
case TYPE_RETURN_TO_HOME:
return "TYPE_RETURN_TO_HOME";
case TYPE_CROSS_ACTIVITY:
return "TYPE_CROSS_ACTIVITY";
case TYPE_CROSS_TASK:
return "TYPE_CROSS_TASK";
case TYPE_CALLBACK:
return "TYPE_CALLBACK";
}
return String.valueOf(type);
}
/**
* Information for customize back animation.
* @hide
*/
public static final class CustomAnimationInfo implements Parcelable {
private final String mPackageName;
private int mWindowAnimations;
@AnimRes private int mCustomExitAnim;
@AnimRes private int mCustomEnterAnim;
@ColorInt private int mCustomBackground;
/**
* The package name of the windowAnimations.
*/
@NonNull
public String getPackageName() {
return mPackageName;
}
/**
* The resource Id of window animations.
*/
public int getWindowAnimations() {
return mWindowAnimations;
}
/**
* The exit animation resource Id of customize activity transition.
*/
public int getCustomExitAnim() {
return mCustomExitAnim;
}
/**
* The entering animation resource Id of customize activity transition.
*/
public int getCustomEnterAnim() {
return mCustomEnterAnim;
}
/**
* The background color of customize activity transition.
*/
public int getCustomBackground() {
return mCustomBackground;
}
public CustomAnimationInfo(@NonNull String packageName) {
this.mPackageName = packageName;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeString8(mPackageName);
dest.writeInt(mWindowAnimations);
dest.writeInt(mCustomEnterAnim);
dest.writeInt(mCustomExitAnim);
dest.writeInt(mCustomBackground);
}
private CustomAnimationInfo(@NonNull Parcel in) {
mPackageName = in.readString8();
mWindowAnimations = in.readInt();
mCustomEnterAnim = in.readInt();
mCustomExitAnim = in.readInt();
mCustomBackground = in.readInt();
}
@Override
public String toString() {
return "CustomAnimationInfo, package name= " + mPackageName;
}
@NonNull
public static final Creator<CustomAnimationInfo> CREATOR = new Creator<>() {
@Override
public CustomAnimationInfo createFromParcel(Parcel in) {
return new CustomAnimationInfo(in);
}
@Override
public CustomAnimationInfo[] newArray(int size) {
return new CustomAnimationInfo[size];
}
};
}
/**
* @hide
*/
@SuppressWarnings("UnusedReturnValue") // Builder pattern
public static class Builder {
private int mType = TYPE_UNDEFINED;
@Nullable
private RemoteCallback mOnBackNavigationDone = null;
@Nullable
private IOnBackInvokedCallback mOnBackInvokedCallback = null;
private boolean mPrepareRemoteAnimation;
private CustomAnimationInfo mCustomAnimationInfo;
private boolean mAnimationCallback = false;
private int mLetterboxColor = Color.TRANSPARENT;
/**
* @see BackNavigationInfo#getType()
*/
public Builder setType(@BackTargetType int type) {
mType = type;
return this;
}
/**
* @see BackNavigationInfo#onBackNavigationFinished(boolean)
*/
public Builder setOnBackNavigationDone(@Nullable RemoteCallback onBackNavigationDone) {
mOnBackNavigationDone = onBackNavigationDone;
return this;
}
/**
* @see BackNavigationInfo#getOnBackInvokedCallback
*/
public Builder setOnBackInvokedCallback(
@Nullable IOnBackInvokedCallback onBackInvokedCallback) {
mOnBackInvokedCallback = onBackInvokedCallback;
return this;
}
/**
* @param prepareRemoteAnimation Whether core prepare animation for shell.
*/
public Builder setPrepareRemoteAnimation(boolean prepareRemoteAnimation) {
mPrepareRemoteAnimation = prepareRemoteAnimation;
return this;
}
/**
* Set windowAnimations for customize animation.
*/
public Builder setWindowAnimations(String packageName, int windowAnimations) {
if (mCustomAnimationInfo == null) {
mCustomAnimationInfo = new CustomAnimationInfo(packageName);
}
mCustomAnimationInfo.mWindowAnimations = windowAnimations;
return this;
}
/**
* Set resources ids for customize activity animation.
*/
public Builder setCustomAnimation(String packageName, @AnimRes int enterResId,
@AnimRes int exitResId, @ColorInt int backgroundColor) {
if (mCustomAnimationInfo == null) {
mCustomAnimationInfo = new CustomAnimationInfo(packageName);
}
mCustomAnimationInfo.mCustomExitAnim = exitResId;
mCustomAnimationInfo.mCustomEnterAnim = enterResId;
mCustomAnimationInfo.mCustomBackground = backgroundColor;
return this;
}
/**
* @param isAnimationCallback whether the callback is {@link OnBackAnimationCallback}
*/
public Builder setAnimationCallback(boolean isAnimationCallback) {
mAnimationCallback = isAnimationCallback;
return this;
}
/**
* @param color Non-transparent if there contain letterbox color.
*/
public Builder setLetterboxColor(int color) {
mLetterboxColor = color;
return this;
}
/**
* Builds and returns an instance of {@link BackNavigationInfo}
*/
public BackNavigationInfo build() {
return new BackNavigationInfo(mType, mOnBackNavigationDone,
mOnBackInvokedCallback,
mPrepareRemoteAnimation,
mAnimationCallback,
mCustomAnimationInfo,
mLetterboxColor);
}
}
}