| /* |
| * Copyright (C) 2023 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.settings.system |
| |
| import android.app.settings.SettingsEnums |
| import android.content.Context |
| import android.os.Build |
| import android.os.UserManager |
| import android.provider.Settings |
| import androidx.annotation.VisibleForTesting |
| import androidx.compose.runtime.Composable |
| import androidx.compose.runtime.getValue |
| import androidx.compose.ui.graphics.vector.ImageVector |
| import androidx.compose.ui.res.stringResource |
| import androidx.compose.ui.res.vectorResource |
| import androidx.lifecycle.compose.collectAsStateWithLifecycle |
| import com.android.settings.R |
| import com.android.settings.core.SubSettingLauncher |
| import com.android.settings.development.DevelopmentSettingsDashboardFragment |
| import com.android.settings.spa.preference.ComposePreferenceController |
| import com.android.settingslib.spa.widget.preference.PreferenceModel |
| import com.android.settingslib.spa.widget.ui.SettingsIcon |
| import com.android.settingslib.spaprivileged.framework.common.userManager |
| import com.android.settingslib.spaprivileged.model.enterprise.Restrictions |
| import com.android.settingslib.spaprivileged.settingsprovider.settingsGlobalBooleanFlow |
| import com.android.settingslib.spaprivileged.template.preference.RestrictedPreference |
| |
| class DeveloperOptionsController(context: Context, preferenceKey: String) : |
| ComposePreferenceController(context, preferenceKey) { |
| |
| override fun getAvailabilityStatus() = |
| if (mContext.userManager.isAdminUser) AVAILABLE |
| else DISABLED_FOR_USER |
| |
| private val isDevelopmentSettingsEnabledFlow = context.settingsGlobalBooleanFlow( |
| name = Settings.Global.DEVELOPMENT_SETTINGS_ENABLED, |
| defaultValue = Build.IS_ENG, |
| ) |
| |
| @Composable |
| override fun Content() { |
| val isDevelopmentSettingsEnabled by isDevelopmentSettingsEnabledFlow |
| .collectAsStateWithLifecycle(initialValue = false) |
| if (isDevelopmentSettingsEnabled) { |
| DeveloperOptionsPreference() |
| } |
| } |
| |
| @VisibleForTesting |
| @Composable |
| fun DeveloperOptionsPreference() { |
| RestrictedPreference( |
| model = object : PreferenceModel { |
| override val title = |
| stringResource(com.android.settingslib.R.string.development_settings_title) |
| override val icon = @Composable { |
| SettingsIcon(ImageVector.vectorResource(R.drawable.ic_settings_development)) |
| } |
| override val onClick = { |
| SubSettingLauncher(mContext).apply { |
| setDestination(DevelopmentSettingsDashboardFragment::class.qualifiedName) |
| setSourceMetricsCategory(SettingsEnums.SETTINGS_SYSTEM_CATEGORY) |
| }.launch() |
| } |
| }, |
| restrictions = Restrictions(keys = listOf(UserManager.DISALLOW_DEBUGGING_FEATURES)), |
| ) |
| } |
| } |