1 /* <lambda>null2 * 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.wallpaper.picker.common.dialog.ui.viewbinder 19 20 import android.app.Dialog 21 import android.content.Context 22 import android.view.LayoutInflater 23 import android.view.ViewGroup 24 import android.widget.ImageView 25 import android.widget.TextView 26 import androidx.annotation.LayoutRes 27 import androidx.annotation.StyleRes 28 import androidx.appcompat.app.AlertDialog 29 import androidx.core.view.isVisible 30 import com.android.wallpaper.R 31 import com.android.wallpaper.picker.common.button.ui.viewbinder.ButtonViewBinder 32 import com.android.wallpaper.picker.common.dialog.ui.viewmodel.DialogViewModel 33 import com.android.wallpaper.picker.common.icon.ui.viewbinder.IconViewBinder 34 import com.android.wallpaper.picker.common.text.ui.viewbinder.TextViewBinder 35 36 object DialogViewBinder { 37 /** Returns a shown dialog that's bound to the given [DialogViewModel]. */ 38 fun show( 39 context: Context, 40 viewModel: DialogViewModel, 41 onDismissed: (() -> Unit)? = null, 42 @LayoutRes dialogLayoutResourceId: Int = R.layout.dialog_view, 43 @LayoutRes buttonLayoutResourceId: Int = R.layout.dialog_button, 44 @StyleRes dialogStyleResourceId: Int = R.style.LightDialogTheme, 45 ): Dialog { 46 val view = LayoutInflater.from(context).inflate(dialogLayoutResourceId, null) 47 val icon: ImageView = view.requireViewById(R.id.icon) 48 val headline: TextView = view.requireViewById(R.id.headline) 49 val supportingText: TextView = view.requireViewById(R.id.supporting_text) 50 val message: TextView = view.requireViewById(R.id.message) 51 val buttonContainer: ViewGroup = view.requireViewById(R.id.button_container) 52 53 viewModel.icon?.let { 54 IconViewBinder.bind( 55 view = icon, 56 viewModel = it, 57 ) 58 icon.isVisible = true 59 } 60 ?: run { icon.isVisible = false } 61 62 viewModel.headline?.let { 63 TextViewBinder.bind( 64 view = headline, 65 viewModel = it, 66 ) 67 headline.isVisible = true 68 } 69 ?: run { headline.isVisible = false } 70 71 viewModel.supportingText?.let { 72 TextViewBinder.bind( 73 view = supportingText, 74 viewModel = it, 75 ) 76 supportingText.isVisible = true 77 } 78 ?: run { supportingText.isVisible = false } 79 80 viewModel.message?.let { 81 TextViewBinder.bind( 82 view = message, 83 viewModel = it, 84 ) 85 message.isVisible = true 86 } 87 ?: run { message.isVisible = false } 88 89 val dialog = 90 AlertDialog.Builder(context, dialogStyleResourceId) 91 .setView(view) 92 .apply { 93 if (viewModel.onDismissed != null || onDismissed != null) { 94 setOnDismissListener { 95 onDismissed?.invoke() 96 viewModel.onDismissed?.invoke() 97 } 98 } 99 } 100 .create() 101 102 buttonContainer.removeAllViews() 103 viewModel.buttons.forEach { buttonViewModel -> 104 buttonContainer.addView( 105 ButtonViewBinder.create( 106 context = context, 107 parent = buttonContainer, 108 viewModel = 109 buttonViewModel.copy( 110 onClicked = { 111 buttonViewModel.onClicked?.invoke() 112 dialog.dismiss() 113 }, 114 ), 115 buttonLayoutResourceId = buttonLayoutResourceId, 116 ) 117 ) 118 } 119 120 dialog.show() 121 return dialog 122 } 123 } 124