/*
 * Copyright (C) 2017 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.
 */

syntax = "proto2";

import "frameworks/base/core/proto/android/app/statusbarmanager.proto";
import "frameworks/base/core/proto/android/content/activityinfo.proto";
import "frameworks/base/core/proto/android/content/configuration.proto";
import "frameworks/base/core/proto/android/graphics/rect.proto";
import "frameworks/base/core/proto/android/server/appwindowthumbnail.proto";
import "frameworks/base/core/proto/android/server/surfaceanimator.proto";
import "frameworks/base/core/proto/android/view/displaycutout.proto";
import "frameworks/base/core/proto/android/view/displayinfo.proto";
import "frameworks/base/core/proto/android/view/surface.proto";
import "frameworks/base/core/proto/android/view/windowlayoutparams.proto";
import "frameworks/base/libs/incident/proto/android/privacy.proto";

package com.android.server.wm;

option java_multiple_files = true;

message WindowManagerServiceDumpProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowManagerPolicyProto policy = 1;
    /* window hierarchy root */
    optional RootWindowContainerProto root_window_container = 2;
    optional IdentifierProto focused_window = 3;
    optional string focused_app = 4;
    optional IdentifierProto input_method_window = 5;
    optional bool display_frozen = 6;
    optional int32 rotation = 7;
    optional int32 last_orientation = 8;
    optional AppTransitionProto app_transition = 9;
}

/* represents DisplayContent */
message RootWindowContainerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    repeated DisplayProto displays = 2;
    /* window references in top down z order */
    repeated IdentifierProto windows = 3;
}

message BarControllerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional .android.app.StatusBarManagerProto.WindowState state = 1;
    optional .android.app.StatusBarManagerProto.TransientWindowState transient_state = 2;
}

message WindowOrientationListenerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool enabled = 1;
    optional .android.view.SurfaceProto.Rotation rotation = 2;
}

message KeyguardServiceDelegateProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool showing = 1;
    optional bool occluded = 2;
    optional bool secure = 3;
    enum ScreenState {
        SCREEN_STATE_OFF = 0;
        SCREEN_STATE_TURNING_ON = 1;
        SCREEN_STATE_ON = 2;
        SCREEN_STATE_TURNING_OFF = 3;
    }
    optional ScreenState screen_state = 4;
    enum InteractiveState {
        INTERACTIVE_STATE_SLEEP = 0;
        INTERACTIVE_STATE_WAKING = 1;
        INTERACTIVE_STATE_AWAKE = 2;
        INTERACTIVE_STATE_GOING_TO_SLEEP = 3;
    }
    optional InteractiveState interactive_state = 5;
}

/* represents PhoneWindowManager */
message WindowManagerPolicyProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional int32 last_system_ui_flags = 1;
    enum UserRotationMode {
        USER_ROTATION_FREE = 0;
        USER_ROTATION_LOCKED = 1;
    }
    optional UserRotationMode rotation_mode = 2;
    optional .android.view.SurfaceProto.Rotation rotation = 3;
    optional .android.content.ActivityInfoProto.ScreenOrientation orientation = 4;
    optional bool screen_on_fully = 5;
    optional bool keyguard_draw_complete = 6;
    optional bool window_manager_draw_complete = 7;
    optional string focused_app_token = 8;
    optional IdentifierProto focused_window = 9;
    optional IdentifierProto top_fullscreen_opaque_window = 10;
    optional IdentifierProto top_fullscreen_opaque_or_dimming_window = 11;
    optional bool keyguard_occluded = 12;
    optional bool keyguard_occluded_changed = 13;
    optional bool keyguard_occluded_pending = 14;
    optional bool force_status_bar = 15;
    optional bool force_status_bar_from_keyguard = 16;
    optional BarControllerProto status_bar = 17;
    optional BarControllerProto navigation_bar = 18;
    optional WindowOrientationListenerProto orientation_listener = 19;
    optional KeyguardServiceDelegateProto keyguard_delegate = 20;
}

/* represents AppTransition */
message AppTransitionProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    enum AppState {
        APP_STATE_IDLE = 0;
        APP_STATE_READY = 1;
        APP_STATE_RUNNING = 2;
        APP_STATE_TIMEOUT = 3;
    }
    optional AppState app_transition_state = 1;
    /* definitions for constants found in {@link com.android.server.wm.AppTransition} */
    enum TransitionType {
        TRANSIT_NONE = 0;
        TRANSIT_UNSET = -1;
        TRANSIT_ACTIVITY_OPEN = 6;
        TRANSIT_ACTIVITY_CLOSE = 7;
        TRANSIT_TASK_OPEN = 8;
        TRANSIT_TASK_CLOSE = 9;
        TRANSIT_TASK_TO_FRONT = 10;
        TRANSIT_TASK_TO_BACK = 11;
        TRANSIT_WALLPAPER_CLOSE = 12;
        TRANSIT_WALLPAPER_OPEN = 13;
        TRANSIT_WALLPAPER_INTRA_OPEN = 14;
        TRANSIT_WALLPAPER_INTRA_CLOSE = 15;
        TRANSIT_TASK_OPEN_BEHIND = 16;
        TRANSIT_TASK_IN_PLACE = 17;
        TRANSIT_ACTIVITY_RELAUNCH = 18;
        TRANSIT_DOCK_TASK_FROM_RECENTS = 19;
        TRANSIT_KEYGUARD_GOING_AWAY = 20;
        TRANSIT_KEYGUARD_GOING_AWAY_ON_WALLPAPER = 21;
        TRANSIT_KEYGUARD_OCCLUDE = 22;
        TRANSIT_KEYGUARD_UNOCCLUDE = 23;
        TRANSIT_TRANSLUCENT_ACTIVITY_OPEN = 24;
        TRANSIT_TRANSLUCENT_ACTIVITY_CLOSE = 25;
    }
    optional TransitionType last_used_app_transition = 2;
}

/* represents DisplayContent */
message DisplayProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    optional int32 id = 2;
    repeated StackProto stacks = 3;
    optional DockedStackDividerControllerProto docked_stack_divider_controller = 4;
    optional PinnedStackControllerProto pinned_stack_controller = 5;
    /* non app windows */
    repeated WindowTokenProto above_app_windows = 6;
    repeated WindowTokenProto below_app_windows = 7;
    repeated WindowTokenProto ime_windows = 8;
    optional int32 dpi = 9;
    optional .android.view.DisplayInfoProto display_info = 10;
    optional int32 rotation = 11;
    optional ScreenRotationAnimationProto screen_rotation_animation = 12;
    optional DisplayFramesProto display_frames = 13;
}

/* represents DisplayFrames */
message DisplayFramesProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional .android.graphics.RectProto stable_bounds = 1;
}

/* represents DockedStackDividerController */
message DockedStackDividerControllerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool minimized_dock = 1;
}

/* represents PinnedStackController */
message PinnedStackControllerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional .android.graphics.RectProto default_bounds = 1;
    optional .android.graphics.RectProto movement_bounds = 2;
}

/* represents TaskStack */
message StackProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    optional int32 id = 2;
    repeated TaskProto tasks = 3;
    optional bool fills_parent = 4;
    optional .android.graphics.RectProto bounds = 5;
    optional bool animation_background_surface_is_dimming = 6;
    optional bool defer_removal = 7;
    optional float minimize_amount = 8;
    optional bool adjusted_for_ime = 9;
    optional float adjust_ime_amount = 10;
    optional float adjust_divider_amount = 11;
    optional .android.graphics.RectProto adjusted_bounds = 12;
    optional bool animating_bounds = 13;
}

/* represents Task */
message TaskProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    optional int32 id = 2;
    repeated AppWindowTokenProto app_window_tokens = 3;
    optional bool fills_parent = 4;
    optional .android.graphics.RectProto bounds = 5;
    optional .android.graphics.RectProto temp_inset_bounds = 6;
    optional bool defer_removal = 7;
}

/* represents AppWindowToken */
message AppWindowTokenProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    /* obtained from ActivityRecord */
    optional string name = 1 [ (.android.privacy).dest = DEST_EXPLICIT ];
    optional WindowTokenProto window_token = 2;
    optional bool last_surface_showing = 3;
    optional bool is_waiting_for_transition_start = 4;
    optional bool is_really_animating = 5;
    optional AppWindowThumbnailProto thumbnail = 6;
    optional bool fills_parent = 7;
    optional bool app_stopped = 8;
    optional bool hidden_requested = 9;
    optional bool client_hidden = 10;
    optional bool defer_hiding_client = 11;
    optional bool reported_drawn = 12;
    optional bool reported_visible = 13;
    optional int32 num_interesting_windows = 14;
    optional int32 num_drawn_windows = 15;
    optional bool all_drawn = 16;
    optional bool last_all_drawn = 17;
    optional bool removed = 18;
    optional IdentifierProto starting_window = 19;
    optional bool starting_displayed = 20;
    optional bool starting_moved = 21;
    optional bool hidden_set_from_transferred_starting_window = 22;
    repeated .android.graphics.RectProto frozen_bounds = 23;
}

/* represents WindowToken */
message WindowTokenProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    optional int32 hash_code = 2;
    repeated WindowStateProto windows = 3;
    optional bool hidden = 4;
    optional bool waiting_to_show = 5;
    optional bool paused = 6;
}

/* represents WindowState */
message WindowStateProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional WindowContainerProto window_container = 1;
    optional IdentifierProto identifier = 2;
    optional int32 display_id = 3;
    optional int32 stack_id = 4;
    optional .android.view.WindowLayoutParamsProto attributes = 5;
    optional .android.graphics.RectProto given_content_insets = 6;
    optional .android.graphics.RectProto frame = 7;
    optional .android.graphics.RectProto containing_frame = 8;
    optional .android.graphics.RectProto parent_frame = 9;
    optional .android.graphics.RectProto content_frame = 10;
    optional .android.graphics.RectProto content_insets = 11;
    optional .android.graphics.RectProto surface_insets = 12;
    optional WindowStateAnimatorProto animator = 13;
    optional bool animating_exit = 14;
    repeated WindowStateProto child_windows = 15;
    optional .android.graphics.RectProto surface_position = 16;
    optional int32 requested_width = 18;
    optional int32 requested_height = 19;
    optional int32 view_visibility = 20;
    optional int32 system_ui_visibility = 21;
    optional bool has_surface = 22;
    optional bool is_ready_for_display = 23;
    optional .android.graphics.RectProto display_frame = 24;
    optional .android.graphics.RectProto overscan_frame = 25;
    optional .android.graphics.RectProto visible_frame = 26;
    optional .android.graphics.RectProto decor_frame = 27;
    optional .android.graphics.RectProto outset_frame = 28;
    optional .android.graphics.RectProto overscan_insets = 29;
    optional .android.graphics.RectProto visible_insets = 30;
    optional .android.graphics.RectProto stable_insets = 31;
    optional .android.graphics.RectProto outsets = 32;
    optional .android.view.DisplayCutoutProto cutout = 33;
    optional bool remove_on_exit = 34;
    optional bool destroying = 35;
    optional bool removed = 36;
    optional bool is_on_screen = 37;
    optional bool is_visible = 38;
}

message IdentifierProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional int32 hash_code = 1;
    optional int32 user_id = 2;
    optional string title = 3 [ (.android.privacy).dest = DEST_EXPLICIT ];
}

/* represents WindowStateAnimator */
message WindowStateAnimatorProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional .android.graphics.RectProto last_clip_rect = 1;
    optional WindowSurfaceControllerProto surface = 2;
    enum DrawState {
        NO_SURFACE = 0;
        DRAW_PENDING = 1;
        COMMIT_DRAW_PENDING = 2;
        READY_TO_SHOW = 3;
        HAS_DRAWN = 4;
    }
    optional DrawState draw_state = 3;
    optional .android.graphics.RectProto system_decor_rect = 4;
}

/* represents WindowSurfaceController */
message WindowSurfaceControllerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool shown = 1;
    optional int32 layer = 2;
}

/* represents ScreenRotationAnimation */
message ScreenRotationAnimationProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional bool started = 1;
    optional bool animation_running = 2;
}

/* represents WindowContainer */
message WindowContainerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional ConfigurationContainerProto configuration_container = 1;
    optional int32 orientation = 2;
    optional bool visible = 3;
    optional SurfaceAnimatorProto surface_animator = 4;
}

/* represents ConfigurationContainer */
message ConfigurationContainerProto {
    option (.android.msg_privacy).dest = DEST_AUTOMATIC;

    optional .android.content.ConfigurationProto override_configuration = 1;
    optional .android.content.ConfigurationProto full_configuration = 2;
    optional .android.content.ConfigurationProto merged_override_configuration = 3;
}
