• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2022 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.autodelete
17 
18 import android.content.Context
19 import android.icu.text.MessageFormat
20 import android.os.Bundle
21 import android.view.LayoutInflater
22 import android.view.ViewGroup
23 import android.widget.LinearLayout
24 import android.widget.RadioButton
25 import android.widget.RadioGroup
26 import androidx.core.os.bundleOf
27 import androidx.core.view.children
28 import androidx.fragment.app.FragmentManager
29 import androidx.preference.Preference
30 import androidx.preference.PreferenceViewHolder
31 import com.android.healthconnect.controller.R
32 import com.android.healthconnect.controller.utils.logging.AutoDeleteElement
33 import com.android.healthconnect.controller.utils.logging.ErrorPageElement
34 import com.android.healthconnect.controller.utils.logging.HealthConnectLogger
35 
36 /**
37  * Custom preference for displaying a custom dialog where the user can confirm the auto-delete range
38  * update.
39  */
40 class AutoDeleteRangePickerPreference
41 constructor(
42     context: Context,
43     private val childFragmentManager: FragmentManager,
44     private var autoDeleteRange: AutoDeleteRange,
45     private val logger: HealthConnectLogger
46 ) : Preference(context), RadioGroup.OnCheckedChangeListener {
47 
48     companion object {
49         const val SET_TO_NEVER_EVENT = "SET_TO_NEVER_EVENT"
50         const val AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY = "auto_delete_range_picker"
51     }
52 
53     init {
54         key = AUTO_DELETE_RANGE_PICKER_PREFERENCE_KEY
55     }
56 
onBindViewHoldernull57     override fun onBindViewHolder(holder: PreferenceViewHolder?) {
58         super.onBindViewHolder(holder)
59 
60         val widgetFrame: ViewGroup = holder?.findViewById(android.R.id.widget_frame) as ViewGroup
61         val widgetFrameParent: LinearLayout = widgetFrame.parent as LinearLayout
62 
63         val iconFrame: LinearLayout? = holder.findViewById(android.R.id.icon_frame) as LinearLayout?
64         widgetFrameParent.removeView(iconFrame)
65 
66         var autoDeleteWidget: ViewGroup? =
67             holder.findViewById(R.id.auto_delete_range_picker_layout) as ViewGroup?
68         if (autoDeleteWidget == null) {
69             val inflater: LayoutInflater = context.getSystemService(LayoutInflater::class.java)
70             autoDeleteWidget =
71                 inflater.inflate(R.layout.widget_auto_delete_range_picker, widgetFrameParent, false)
72                     as ViewGroup?
73             widgetFrameParent.addView(autoDeleteWidget, 0)
74         }
75 
76         val radioGroup: RadioGroup = holder.findViewById(R.id.radio_group_time_range) as RadioGroup
77         setRadioButtonTexts(radioGroup)
78 
79         setRadioButtonLogging(radioGroup)
80 
81         radioGroup.setOnCheckedChangeListener(null)
82         setCheckedRadioButton(radioGroup, autoDeleteRange)
83         radioGroup.setOnCheckedChangeListener(this)
84     }
85 
setRadioButtonLoggingnull86     private fun setRadioButtonLogging(radioGroup: RadioGroup) {
87         radioGroup.children.forEach {
88             val element =
89                 when (it.id) {
90                     R.id.radio_button_3_months -> AutoDeleteElement.AUTO_DELETE_3_MONTHS_BUTTON
91                     R.id.radio_button_18_months -> AutoDeleteElement.AUTO_DELETE_18_MONTHS_BUTTON
92                     R.id.radio_button_never -> AutoDeleteElement.AUTO_DELETE_NEVER_BUTTON
93                     else -> ErrorPageElement.UNKNOWN_ELEMENT
94                 }
95 
96             it.setOnClickListener { logger.logInteraction(element) }
97 
98             logger.logImpression(element)
99         }
100     }
101 
setRadioButtonTextsnull102     private fun setRadioButtonTexts(radioGroup: RadioGroup) {
103         val radioButton3Months: RadioButton = radioGroup.findViewById(R.id.radio_button_3_months)
104         var count = AutoDeleteRange.AUTO_DELETE_RANGE_THREE_MONTHS.numberOfMonths
105         radioButton3Months.text =
106             MessageFormat.format(
107                 context.getString(R.string.range_after_x_months), mapOf("count" to count))
108 
109         val radioButton18Months: RadioButton = radioGroup.findViewById(R.id.radio_button_18_months)
110         count = AutoDeleteRange.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS.numberOfMonths
111         radioButton18Months.text =
112             MessageFormat.format(
113                 context.getString(R.string.range_after_x_months), mapOf("count" to count))
114     }
115 
setCheckedRadioButtonnull116     private fun setCheckedRadioButton(radioGroup: RadioGroup, autoDeleteRange: AutoDeleteRange) {
117         when (autoDeleteRange) {
118             AutoDeleteRange.AUTO_DELETE_RANGE_NEVER -> radioGroup.check(R.id.radio_button_never)
119             AutoDeleteRange.AUTO_DELETE_RANGE_THREE_MONTHS ->
120                 radioGroup.check(R.id.radio_button_3_months)
121             AutoDeleteRange.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS ->
122                 radioGroup.check(R.id.radio_button_18_months)
123         }
124     }
125 
setToNeverOrAskConfirmationnull126     private fun setToNeverOrAskConfirmation(chosenId: Int) {
127         if (chosenId == R.id.radio_button_never) {
128             childFragmentManager.setFragmentResult(SET_TO_NEVER_EVENT, Bundle())
129             return
130         }
131         val newAutoDeleteRange: AutoDeleteRange =
132             if (chosenId == R.id.radio_button_3_months)
133                 AutoDeleteRange.AUTO_DELETE_RANGE_THREE_MONTHS
134             else AutoDeleteRange.AUTO_DELETE_RANGE_EIGHTEEN_MONTHS
135         childFragmentManager.setFragmentResult(
136             AutoDeleteConfirmationDialogFragment.AUTO_DELETE_CONFIRMATION_DIALOG_EVENT,
137             bundleOf(
138                 AutoDeleteConfirmationDialogFragment.NEW_AUTO_DELETE_RANGE_BUNDLE to
139                     newAutoDeleteRange,
140                 AutoDeleteConfirmationDialogFragment.OLD_AUTO_DELETE_RANGE_BUNDLE to
141                     autoDeleteRange))
142     }
143 
onCheckedChangednull144     override fun onCheckedChanged(radioGroup: RadioGroup, checkedId: Int) {
145         setToNeverOrAskConfirmation(checkedId)
146     }
147 
updateAutoDeleteRangenull148     fun updateAutoDeleteRange(newAutoDeleteRange: AutoDeleteRange) {
149         autoDeleteRange = newAutoDeleteRange
150         notifyChanged()
151     }
152 }
153