/* * Copyright (C) 2020 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.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.app.ActivityManager; import android.app.TaskInfo; import android.content.pm.ActivityInfo; import android.graphics.Rect; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.os.RemoteException; import android.view.InsetsState; import android.view.SurfaceControl; import android.view.WindowInsets; import android.view.WindowInsets.Type.InsetsType; import android.view.WindowManager; /** * Information you can retrieve about a starting window of a particular task that is currently * start in the system. * @hide */ public final class StartingWindowInfo implements Parcelable { /** * Prefer nothing or not care the type of starting window. * @hide */ public static final int STARTING_WINDOW_TYPE_NONE = 0; /** * Prefer splash screen starting window. * @hide */ public static final int STARTING_WINDOW_TYPE_SPLASH_SCREEN = 1; /** * Prefer snapshot starting window. * @hide */ public static final int STARTING_WINDOW_TYPE_SNAPSHOT = 2; /** * Prefer solid color splash screen starting window. * @hide */ public static final int STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN = 3; /** @hide **/ public static final int STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN = 4; public static final int STARTING_WINDOW_TYPE_WINDOWLESS = 5; /** * @hide */ @IntDef(flag = true, prefix = "STARTING_WINDOW_TYPE_", value = { STARTING_WINDOW_TYPE_NONE, STARTING_WINDOW_TYPE_SPLASH_SCREEN, STARTING_WINDOW_TYPE_SNAPSHOT, STARTING_WINDOW_TYPE_SOLID_COLOR_SPLASH_SCREEN, STARTING_WINDOW_TYPE_LEGACY_SPLASH_SCREEN, STARTING_WINDOW_TYPE_WINDOWLESS }) public @interface StartingWindowType {} /** * The {@link TaskInfo} from this task. *
Note that the configuration of this taskInfo could be from the top activity of its task.
* Because only activity contains persisted configuration (e.g. night mode, language). Besides,
* it can also be used for activity level snapshot.
*/
@NonNull
public ActivityManager.RunningTaskInfo taskInfo;
/** The bounds of the target task. */
@NonNull
public final Rect taskBounds = new Rect();
/**
* The {@link ActivityInfo} of the target activity which to create the starting window.
* It can be null if the info is the same as the top in task info.
* @hide
*/
@Nullable
public ActivityInfo targetActivityInfo;
/**
* InsetsState of TopFullscreenOpaqueWindow
* @hide
*/
@Nullable
public InsetsState topOpaqueWindowInsetsState;
/**
* LayoutParams of TopFullscreenOpaqueWindow
* @hide
*/
@Nullable
public WindowManager.LayoutParams topOpaqueWindowLayoutParams;
/**
* LayoutParams of MainWindow
* @hide
*/
@Nullable
public WindowManager.LayoutParams mainWindowLayoutParams;
/**
* @hide
*/
@IntDef(flag = true, prefix = "TYPE_PARAMETER_", value = {
TYPE_PARAMETER_NEW_TASK,
TYPE_PARAMETER_TASK_SWITCH,
TYPE_PARAMETER_PROCESS_RUNNING,
TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT,
TYPE_PARAMETER_ACTIVITY_CREATED,
TYPE_PARAMETER_USE_SOLID_COLOR_SPLASH_SCREEN,
TYPE_PARAMETER_ALLOW_HANDLE_SOLID_COLOR_SCREEN,
TYPE_PARAMETER_WINDOWLESS,
TYPE_PARAMETER_LEGACY_SPLASH_SCREEN
})
public @interface StartingTypeParams {}
/**
* The parameters of the starting window...
* @hide
*/
public static final int TYPE_PARAMETER_NEW_TASK = 0x00000001;
/** @hide */
public static final int TYPE_PARAMETER_TASK_SWITCH = 0x00000002;
/** @hide */
public static final int TYPE_PARAMETER_PROCESS_RUNNING = 0x00000004;
/** @hide */
public static final int TYPE_PARAMETER_ALLOW_TASK_SNAPSHOT = 0x00000008;
/** @hide */
public static final int TYPE_PARAMETER_ACTIVITY_CREATED = 0x00000010;
/** @hide */
public static final int TYPE_PARAMETER_USE_SOLID_COLOR_SPLASH_SCREEN = 0x00000020;
/**
* The parameter which indicates if the activity has finished drawing.
* @hide
*/
public static final int TYPE_PARAMETER_ACTIVITY_DRAWN = 0x00000040;
/**
* Application will receive the
* {@link
* android.window.SplashScreen.OnExitAnimationListener#onSplashScreenExit(SplashScreenView)}
* callback, even when the splash screen only shows a solid color.
*
* @hide
*/
public static final int TYPE_PARAMETER_ALLOW_HANDLE_SOLID_COLOR_SCREEN = 0x00000080;
/**
* Windowless surface
*/
public static final int TYPE_PARAMETER_WINDOWLESS = 0x00000100;
/**
* Application has set Window_windowSplashScreenBehavior to
* SPLASH_SCREEN_BEHAVIOR_ICON_PREFERRED.
* @hide
*/
public static final int TYPE_PARAMETER_APP_PREFERS_ICON = 0x00000200;
/**
* Application is allowed to use the legacy splash screen
* @hide
*/
public static final int TYPE_PARAMETER_LEGACY_SPLASH_SCREEN = 0x80000000;
/**
* The parameters which effect the starting window type.
* @see android.window.StartingWindowInfo.StartingTypeParams
* @hide
*/
public int startingWindowTypeParameter;
/**
* Specifies a theme for the splash screen.
* @hide
*/
public int splashScreenThemeResId;
/**
* Is keyguard occluded on default display.
* @hide
*/
public boolean isKeyguardOccluded = false;
/**
* TaskSnapshot.
* @hide
*/
public TaskSnapshot taskSnapshot;
@InsetsType public int requestedVisibleTypes = WindowInsets.Type.defaultVisible();
/**
* App token where the starting window should add to.
*/
public IBinder appToken;
public IWindowlessStartingSurfaceCallback windowlessStartingSurfaceCallback;
/**
* The root surface where windowless surface should attach on.
*/
public SurfaceControl rootSurface;
/**
* Notify windowless surface is created.
* @param addedSurface Created surface.
*/
public void notifyAddComplete(SurfaceControl addedSurface) {
if (windowlessStartingSurfaceCallback != null) {
try {
windowlessStartingSurfaceCallback.onSurfaceAdded(addedSurface);
} catch (RemoteException e) {
//
}
}
}
public StartingWindowInfo() {
}
private StartingWindowInfo(@NonNull Parcel source) {
readFromParcel(source);
}
/**
* Return whether the application allow to handle the solid color style splash screen.
*/
public boolean allowHandleSolidColorSplashScreen() {
return (startingWindowTypeParameter & TYPE_PARAMETER_ALLOW_HANDLE_SOLID_COLOR_SCREEN) != 0;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(@NonNull Parcel dest, int flags) {
dest.writeTypedObject(taskInfo, flags);
taskBounds.writeToParcel(dest, flags);
dest.writeTypedObject(targetActivityInfo, flags);
dest.writeInt(startingWindowTypeParameter);
dest.writeTypedObject(topOpaqueWindowInsetsState, flags);
dest.writeTypedObject(topOpaqueWindowLayoutParams, flags);
dest.writeTypedObject(mainWindowLayoutParams, flags);
dest.writeInt(splashScreenThemeResId);
dest.writeBoolean(isKeyguardOccluded);
dest.writeTypedObject(taskSnapshot, flags);
dest.writeInt(requestedVisibleTypes);
dest.writeStrongBinder(appToken);
dest.writeStrongInterface(windowlessStartingSurfaceCallback);
dest.writeTypedObject(rootSurface, flags);
}
void readFromParcel(@NonNull Parcel source) {
taskInfo = source.readTypedObject(ActivityManager.RunningTaskInfo.CREATOR);
taskBounds.readFromParcel(source);
targetActivityInfo = source.readTypedObject(ActivityInfo.CREATOR);
startingWindowTypeParameter = source.readInt();
topOpaqueWindowInsetsState = source.readTypedObject(InsetsState.CREATOR);
topOpaqueWindowLayoutParams = source.readTypedObject(
WindowManager.LayoutParams.CREATOR);
mainWindowLayoutParams = source.readTypedObject(WindowManager.LayoutParams.CREATOR);
splashScreenThemeResId = source.readInt();
isKeyguardOccluded = source.readBoolean();
taskSnapshot = source.readTypedObject(TaskSnapshot.CREATOR);
requestedVisibleTypes = source.readInt();
appToken = source.readStrongBinder();
windowlessStartingSurfaceCallback = IWindowlessStartingSurfaceCallback.Stub
.asInterface(source.readStrongBinder());
rootSurface = source.readTypedObject(SurfaceControl.CREATOR);
}
@Override
public String toString() {
return "StartingWindowInfo{taskId=" + taskInfo.taskId
+ " targetActivityInfo=" + targetActivityInfo
+ " displayId=" + taskInfo.displayId
+ " topActivityType=" + taskInfo.topActivityType
+ " preferredStartingWindowType="
+ Integer.toHexString(startingWindowTypeParameter)
+ " insetsState=" + topOpaqueWindowInsetsState
+ " topWindowLayoutParams=" + topOpaqueWindowLayoutParams
+ " mainWindowLayoutParams=" + mainWindowLayoutParams
+ " splashScreenThemeResId " + Integer.toHexString(splashScreenThemeResId);
}
public static final @android.annotation.NonNull Creator