1 /*
2  * Copyright (C) 2024 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 package com.android.healthconnect.controller.selectabledeletion
17 
18 import android.content.Context
19 import android.view.View.GONE
20 import android.view.View.OnClickListener
21 import android.view.View.VISIBLE
22 import android.view.ViewGroup
23 import android.widget.CheckBox
24 import androidx.preference.PreferenceViewHolder
25 import com.android.healthconnect.controller.R
26 import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings
27 import com.android.healthconnect.controller.permissions.data.HealthPermissionType
28 import com.android.healthconnect.controller.shared.preference.HealthPreference
29 
30 /** Custom preference for displaying checkboxes where the user can delete their data */
31 class DeletionPermissionTypesPreference constructor(context: Context) : HealthPreference(context) {
32     private var checkboxButtonListener: OnClickListener? = null
33 
34     // TODO: b/341886932
35     // var logName : ElementName = ErrorPageElement.UNKNOWN_ELEMENT
36     private var isShowCheckbox: Boolean = false
37     private var widgetFrame: ViewGroup? = null
38     private var checkBox: CheckBox? = null
39     private var isChecked: Boolean = false
40     private lateinit var healthPermissionType: HealthPermissionType
41 
42     init {
43         widgetLayoutResource = R.layout.widget_checkbox
44         isSelectable = true
45     }
46 
onBindViewHoldernull47     override fun onBindViewHolder(holder: PreferenceViewHolder) {
48         super.onBindViewHolder(holder)
49         widgetFrame = holder?.findViewById(android.R.id.widget_frame) as ViewGroup?
50 
51         showCheckbox(isShowCheckbox)
52 
53         checkBox = holder?.findViewById(R.id.checkbox_button) as CheckBox
54 
55         checkBox?.isChecked = this.isChecked
56 
57         checkBox?.contentDescription =
58             context.getString(
59                 FitnessPermissionStrings.fromPermissionType(healthPermissionType).uppercaseLabel)
60 
61         checkBox?.setOnClickListener(checkboxButtonListener)
62 
63         val widgetFrameParent: ViewGroup? = widgetFrame?.parent as ViewGroup?
64         widgetFrameParent?.setPaddingRelative(
65             widgetFrameParent.paddingStart,
66             widgetFrameParent.paddingTop,
67             /* end = */ 0,
68             widgetFrameParent.paddingBottom)
69     }
70 
71     /** Set a click listener to check the checkbox */
setOnPreferenceClickListenernull72     fun setOnPreferenceClickListener(
73         method: () -> Unit,
74         onPreferenceClickListener: OnPreferenceClickListener
75     ) {
76         val clickListener = OnPreferenceClickListener {
77             if (isShowCheckbox) {
78                 checkBox?.toggle()
79                 // Set local variable to current value of whether checkBox is checked
80                 isChecked = checkBox?.isChecked ?: false
81                 method()
82             } else {
83                 onPreferenceClickListener.onPreferenceClick(it)
84             }
85             true
86         }
87 
88         checkboxButtonListener = OnClickListener {
89             isChecked = !isChecked
90             method()
91         }
92 
93         super.setOnPreferenceClickListener(clickListener)
94     }
95 
setHealthPermissionTypenull96     fun setHealthPermissionType(healthPermissionType: HealthPermissionType) {
97         this.healthPermissionType = healthPermissionType
98     }
99 
getHealthPermissionTypenull100     fun getHealthPermissionType(): HealthPermissionType {
101         return healthPermissionType
102     }
103 
104     /** Display or hide checkbox */
showCheckboxnull105     fun showCheckbox(isShowCheckbox: Boolean) {
106         setShowCheckbox(isShowCheckbox)
107         widgetFrame?.visibility = if (isShowCheckbox) VISIBLE else GONE
108         widgetFrame?.tag = if (isShowCheckbox) "checkbox" else ""
109     }
110 
setIsCheckednull111     fun setIsChecked(isChecked: Boolean) {
112         this.isChecked = isChecked
113     }
114 
getIsCheckednull115     fun getIsChecked(): Boolean {
116         return isChecked
117     }
118 
setShowCheckboxnull119     fun setShowCheckbox(isShowCheckbox: Boolean) {
120         this.isShowCheckbox = isShowCheckbox
121     }
122 }
123