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