Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7de5178c authored by Nicolo' Mazzucato's avatar Nicolo' Mazzucato
Browse files

Extract Shade window Layout params to a common place

This is needed as they will be used both from ShadeWindowController and when we move the shade window between displays.

Bug: 362719719
Test: NotificationShadeWindowControllerImplTest
Flag: com.android.systemui.shade_window_goes_around
Change-Id: I023f8d3a7431548acd077143cd9ef205008a62a2
parent f9f90962
Loading
Loading
Loading
Loading
+1 −32
Original line number Diff line number Diff line
@@ -17,8 +17,6 @@
package com.android.systemui.shade;

import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static android.view.WindowManager.LayoutParams.PRIVATE_FLAG_OPTIMIZE_MEASURE;

import static com.android.systemui.statusbar.NotificationRemoteInputManager.ENABLE_REMOTE_INPUT;
import static com.android.systemui.util.kotlin.JavaAdapterKt.collectFlow;
@@ -27,16 +25,13 @@ import android.app.IActivityManager;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.content.res.Configuration;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.Region;
import android.os.Binder;
import android.os.Build;
import android.os.RemoteException;
import android.os.Trace;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.IWindow;
import android.view.IWindowSession;
import android.view.View;
@@ -271,33 +266,7 @@ public class NotificationShadeWindowControllerImpl implements NotificationShadeW
        // Now that the notification shade encompasses the sliding panel and its
        // translucent backdrop, the entire thing is made TRANSLUCENT and is
        // hardware-accelerated.
        mLp = new LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT,
                LayoutParams.TYPE_NOTIFICATION_SHADE,
                LayoutParams.FLAG_NOT_FOCUSABLE
                        | LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING
                        | LayoutParams.FLAG_SPLIT_TOUCH
                        | LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
                        | LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                PixelFormat.TRANSLUCENT);
        mLp.token = new Binder();
        mLp.gravity = Gravity.TOP;
        mLp.setFitInsetsTypes(0 /* types */);
        mLp.setTitle("NotificationShade");
        mLp.packageName = mContext.getPackageName();
        mLp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
        mLp.privateFlags |= PRIVATE_FLAG_OPTIMIZE_MEASURE;

        if (SceneContainerFlag.isEnabled()) {
            // This prevents the appearance and disappearance of the software keyboard (also known
            // as the "IME") from scrolling/panning the window to make room for the keyboard.
            //
            // The scene container logic does its own adjustment and animation when the IME appears
            // or disappears.
            mLp.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_NOTHING;
        }

        mLp = ShadeWindowLayoutParams.INSTANCE.create(mContext);
        mWindowManager.addView(mWindowRootView, mLp);

        // We use BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE here, however, there is special logic in
+69 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 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 com.android.systemui.shade

import android.content.Context
import android.graphics.PixelFormat
import android.os.Binder
import android.view.Gravity
import android.view.ViewGroup
import android.view.WindowManager.LayoutParams
import com.android.systemui.scene.shared.flag.SceneContainerFlag

object ShadeWindowLayoutParams {
    /**
     * Creates [LayoutParams] for the shade window.
     *
     * This is extracted to a single place as those layout params will be used by several places:
     * - When sysui starts, and the shade is added the first time
     * - When the shade moves to a different window (e.g. while an external display is connected)
     */
    fun create(context: Context): LayoutParams {
        return LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT,
                LayoutParams.TYPE_NOTIFICATION_SHADE,
                LayoutParams.FLAG_NOT_FOCUSABLE or
                    LayoutParams.FLAG_TOUCHABLE_WHEN_WAKING or
                    LayoutParams.FLAG_SPLIT_TOUCH or
                    LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH or
                    LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
                // Now that the notification shade encompasses the sliding panel and its
                // translucent backdrop, the entire thing is made TRANSLUCENT and is
                // hardware-accelerated.
                PixelFormat.TRANSLUCENT,
            )
            .apply {
                token = Binder()
                gravity = Gravity.TOP
                fitInsetsTypes = 0
                title = "NotificationShade"
                packageName = context.packageName
                layoutInDisplayCutoutMode = LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
                privateFlags = privateFlags or LayoutParams.PRIVATE_FLAG_OPTIMIZE_MEASURE
                if (SceneContainerFlag.isEnabled) {
                    // This prevents the appearance and disappearance of the software keyboard (also
                    // known as the "IME") from scrolling/panning the window to make room for the
                    // keyboard.
                    //
                    // The scene container logic does its own adjustment and animation when the IME
                    // appears or disappears.
                    softInputMode = LayoutParams.SOFT_INPUT_ADJUST_NOTHING
                }
            }
    }
}