1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 * 16 */ 17 18 package com.android.systemui.keyguard.ui.view.layout.sections 19 20 import android.content.res.Resources 21 import android.view.LayoutInflater 22 import android.view.View 23 import androidx.constraintlayout.widget.ConstraintLayout 24 import androidx.constraintlayout.widget.ConstraintSet 25 import androidx.constraintlayout.widget.ConstraintSet.BOTTOM 26 import androidx.constraintlayout.widget.ConstraintSet.END 27 import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID 28 import androidx.constraintlayout.widget.ConstraintSet.START 29 import androidx.constraintlayout.widget.ConstraintSet.VISIBILITY_MODE_IGNORE 30 import androidx.constraintlayout.widget.ConstraintSet.WRAP_CONTENT 31 import androidx.core.view.isVisible 32 import com.android.systemui.animation.view.LaunchableLinearLayout 33 import com.android.systemui.dagger.qualifiers.Main 34 import com.android.systemui.keyguard.shared.model.KeyguardSection 35 import com.android.systemui.keyguard.ui.binder.KeyguardSettingsViewBinder 36 import com.android.systemui.keyguard.ui.viewmodel.KeyguardRootViewModel 37 import com.android.systemui.keyguard.ui.viewmodel.KeyguardSettingsMenuViewModel 38 import com.android.systemui.keyguard.ui.viewmodel.KeyguardTouchHandlingViewModel 39 import com.android.systemui.plugins.ActivityStarter 40 import com.android.systemui.res.R 41 import com.android.systemui.statusbar.VibratorHelper 42 import javax.inject.Inject 43 import kotlinx.coroutines.DisposableHandle 44 45 class DefaultSettingsPopupMenuSection 46 @Inject 47 constructor( 48 @Main private val resources: Resources, 49 private val keyguardSettingsMenuViewModel: KeyguardSettingsMenuViewModel, 50 private val keyguardTouchHandlingViewModel: KeyguardTouchHandlingViewModel, 51 private val keyguardRootViewModel: KeyguardRootViewModel, 52 private val vibratorHelper: VibratorHelper, 53 private val activityStarter: ActivityStarter, 54 ) : KeyguardSection() { 55 private var settingsPopupMenuHandle: DisposableHandle? = null 56 addViewsnull57 override fun addViews(constraintLayout: ConstraintLayout) { 58 val view = 59 LayoutInflater.from(constraintLayout.context) 60 .inflate(R.layout.keyguard_settings_popup_menu, constraintLayout, false) 61 .apply { 62 id = R.id.keyguard_settings_button 63 isVisible = false 64 alpha = 0f 65 } as LaunchableLinearLayout 66 constraintLayout.addView(view) 67 } 68 bindDatanull69 override fun bindData(constraintLayout: ConstraintLayout) { 70 settingsPopupMenuHandle = 71 KeyguardSettingsViewBinder.bind( 72 constraintLayout.requireViewById<View>(R.id.keyguard_settings_button), 73 keyguardSettingsMenuViewModel, 74 keyguardTouchHandlingViewModel, 75 keyguardRootViewModel, 76 vibratorHelper, 77 activityStarter, 78 ) 79 } 80 applyConstraintsnull81 override fun applyConstraints(constraintSet: ConstraintSet) { 82 val horizontalOffsetMargin = 83 resources.getDimensionPixelSize(R.dimen.keyguard_affordance_horizontal_offset) 84 85 constraintSet.apply { 86 constrainWidth(R.id.keyguard_settings_button, WRAP_CONTENT) 87 constrainHeight(R.id.keyguard_settings_button, WRAP_CONTENT) 88 constrainMinHeight( 89 R.id.keyguard_settings_button, 90 resources.getDimensionPixelSize(R.dimen.keyguard_affordance_fixed_height) 91 ) 92 connect(R.id.keyguard_settings_button, START, PARENT_ID, START, horizontalOffsetMargin) 93 connect(R.id.keyguard_settings_button, END, PARENT_ID, END, horizontalOffsetMargin) 94 connect( 95 R.id.keyguard_settings_button, 96 BOTTOM, 97 PARENT_ID, 98 BOTTOM, 99 resources.getDimensionPixelSize(R.dimen.keyguard_affordance_vertical_offset) 100 ) 101 // Ignore ConstrainSet's default visibility, and let the view choose 102 setVisibilityMode(R.id.keyguard_settings_button, VISIBILITY_MODE_IGNORE) 103 } 104 } 105 removeViewsnull106 override fun removeViews(constraintLayout: ConstraintLayout) { 107 settingsPopupMenuHandle?.dispose() 108 constraintLayout.removeView(R.id.keyguard_settings_button) 109 } 110 } 111