/* * Copyright (C) 2025 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.display.ui.view import android.app.Dialog import android.content.Context import android.content.res.Configuration import android.graphics.Insets import android.os.Bundle import android.view.View import android.view.WindowInsets import android.view.WindowInsets.Type import android.view.WindowInsetsAnimation import android.widget.Button import android.widget.CheckBox import android.widget.CompoundButton import android.widget.TextView import androidx.annotation.VisibleForTesting import com.android.systemui.common.ui.view.updateMargin import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.res.R import com.android.systemui.statusbar.phone.DialogDelegate import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject import kotlin.math.max /** * Dialog used to decide what to do with a connected display. * * [onCancelClickListener] is called **only** if either desktop mode didn't start, mirroring didn't * start, or when the dismiss button is pressed. * * This is a new version of the old [MirroringConfirmationDialogDelegate]. */ class ExternalDisplayConnectionDialogDelegate @VisibleForTesting @AssistedInject constructor( @Application private val context: Context, @Assisted("showConcurrentDisplayInfo") private val showConcurrentDisplayInfo: Boolean = false, @Assisted("isInKioskMode") private val isInKioskMode: Boolean = false, @Assisted private val rememberChoiceCheckBoxListener: CompoundButton.OnCheckedChangeListener, @Assisted("onStartDesktop") private val onStartDesktopClickListener: View.OnClickListener, @Assisted("onStartMirroring") private val onStartMirroringClickListener: View.OnClickListener, @Assisted("onCancel") private val onCancelClickListener: View.OnClickListener, @Assisted private val insetsProvider: () -> Insets, ) : DialogDelegate { private lateinit var rememberChoiceCheckbox: CheckBox private lateinit var desktopButton: Button private lateinit var mirrorButton: Button private lateinit var dismissButton: Button private lateinit var dualDisplayWarning: TextView private lateinit var bottomSheet: View private var optionSelected = false private val defaultDialogBottomInset = context.resources.getDimensionPixelSize(R.dimen.dialog_bottom_padding) override fun onCreate(dialog: Dialog, savedInstanceState: Bundle?) { dialog.setContentView(R.layout.connected_display_dialog_2) rememberChoiceCheckbox = dialog.requireViewById(R.id.save_connection_preference).apply { if (isInKioskMode) { visibility = View.GONE } else { visibility = View.VISIBLE setOnCheckedChangeListener(rememberChoiceCheckBoxListener) } } desktopButton = dialog.requireViewById