493 lines
16 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|