/* * Copyright (C) 2025 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.healthconnect.controller.matchmaking import android.app.Activity.RESULT_CANCELED import android.app.Activity.RESULT_OK import android.health.connect.HealthConnectManager.EXTRA_RECORD_TYPES import android.health.connect.datatypes.Record import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Button import android.widget.FrameLayout import androidx.core.content.ContextCompat import androidx.core.view.isVisible import androidx.fragment.app.activityViewModels import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceGroupAdapter import androidx.preference.PreferenceScreen import com.android.healthconnect.controller.R import com.android.healthconnect.controller.permissions.data.FitnessPermissionStrings import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions import com.android.healthconnect.controller.shared.HealthDataCategoryExtensions.icon import com.android.healthconnect.controller.shared.HealthPermissionReader import com.android.healthconnect.controller.shared.children import com.android.healthconnect.controller.shared.preference.ExpandablePreferenceAdapter import com.android.healthconnect.controller.shared.preference.HealthExpandablePreference import com.android.healthconnect.controller.shared.preference.HealthMainSwitchPreference import com.android.healthconnect.controller.shared.preference.HealthSwitchPreference import com.android.healthconnect.controller.utils.DeviceInfoUtils import com.android.healthconnect.controller.utils.increaseViewTouchTargetSize import com.android.healthconnect.controller.utils.logging.HealthConnectLogger import com.android.healthconnect.controller.utils.logging.PermissionsElement import com.android.healthconnect.controller.utils.pref import com.android.settingslib.widget.FooterPreference import com.android.settingslib.widget.SettingsBasePreferenceFragment import com.android.settingslib.widget.SettingsThemeHelper import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject /** * A fragment shown to the user to allow them to grant permissions to multiple apps at once, based * on a specific record type. */ @AndroidEntryPoint(SettingsBasePreferenceFragment::class) class MatchmakingFragment : Hilt_MatchmakingFragment() { companion object { private const val HEADER = "matchmaking_header" private const val ALLOW_ALL_PREFERENCE = "allow_all_preference" private const val MATCHMAKING_APPS_CATEGORY = "matchmaking_apps_category" private const val FOOTER = "matchmaking_footer" } private val viewModel: MatchmakingViewModel by activityViewModels() private var loadingIndicator: View? = null private val header: MatchmakingHeaderPreference by pref(HEADER) private val allowAllPreference: HealthMainSwitchPreference by pref(ALLOW_ALL_PREFERENCE) private val matchmakingAppsCategory: PreferenceCategory by pref(MATCHMAKING_APPS_CATEGORY) private val footer: FooterPreference by pref(FOOTER) @Inject lateinit var deviceInfoUtils: DeviceInfoUtils @Inject lateinit var healthPermissionReader: HealthPermissionReader @Inject lateinit var logger: HealthConnectLogger private val customStyledPrefs = mutableListOf() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?, ): View { val rootView = inflater.inflate(R.layout.fragment_setup, container, false) rootView.background = ContextCompat.getDrawable(requireContext(), R.drawable.rounded_background_transparent) val buttonLayoutId = if (SettingsThemeHelper.isExpressiveTheme(requireContext())) { R.layout.widget_setup_bottom_button_bar_expressive } else { R.layout.widget_setup_bottom_button_bar_legacy } val buttonArea = rootView.findViewById(R.id.action_container) val buttons = inflater.inflate(buttonLayoutId, buttonArea, false) buttonArea.addView(buttons) val preferenceArea = rootView.findViewById(R.id.preference_container) val preferenceView = super.onCreateView(inflater, container, savedInstanceState) preferenceArea.addView(preferenceView) return rootView } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) loadingIndicator = activity?.findViewById(R.id.loading) val allowButton = view.findViewById