1 /** <lambda>null2 * Copyright (C) 2023 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.settings.spa.network 17 18 import android.content.Context 19 import android.content.pm.PackageManager 20 import androidx.compose.material.icons.Icons 21 import androidx.compose.material.icons.outlined.AirplanemodeActive 22 import androidx.compose.runtime.Composable 23 import androidx.compose.runtime.remember 24 import androidx.compose.runtime.livedata.observeAsState 25 import androidx.compose.ui.platform.LocalContext 26 import androidx.lifecycle.LiveData 27 import androidx.lifecycle.MutableLiveData 28 import com.android.settings.AirplaneModeEnabler 29 import com.android.settings.AirplaneModeEnabler.OnAirplaneModeChangedListener 30 import com.android.settings.R 31 import com.android.settingslib.spa.widget.preference.SwitchPreference 32 import com.android.settingslib.spa.widget.preference.SwitchPreferenceModel 33 import com.android.settingslib.spa.widget.ui.SettingsIcon 34 35 @Composable 36 fun AirplaneModePreference() { 37 val context = LocalContext.current 38 val controller = remember { AirplaneModeController(context) } 39 if (!controller.isAvailable()) return 40 SwitchPreference(object : SwitchPreferenceModel { 41 override val title = context.getString(R.string.airplane_mode) 42 override val checked = controller.airplaneModeState.observeAsState( 43 initial = controller.isAirplaneModeOn() 44 ) 45 override val onCheckedChange = { newChecked: Boolean -> 46 controller.setChecked(newChecked) 47 } 48 override val icon = @Composable { 49 SettingsIcon(imageVector = Icons.Outlined.AirplanemodeActive) 50 } 51 }) 52 } 53 54 private class AirplaneModeController(private val context: Context) : OnAirplaneModeChangedListener { 55 private var airplaneModeEnabler = AirplaneModeEnabler(context, this) 56 private val _airplaneModeState = MutableLiveData<Boolean>() 57 val airplaneModeState: LiveData<Boolean> 58 get() = _airplaneModeState 59 onAirplaneModeChangednull60 override fun onAirplaneModeChanged(isAirplaneModeOn: Boolean) { 61 _airplaneModeState.postValue(isAirplaneModeOn) 62 } 63 isAvailablenull64 fun isAvailable(): Boolean { 65 return context.resources.getBoolean(R.bool.config_show_toggle_airplane) 66 && !context.packageManager.hasSystemFeature(PackageManager.FEATURE_LEANBACK) 67 } 68 isAirplaneModeOnnull69 fun isAirplaneModeOn(): Boolean { 70 return airplaneModeEnabler.isAirplaneModeOn() 71 } 72 setCheckednull73 fun setChecked(newChecked: Boolean) { 74 if (isAirplaneModeOn() == newChecked) { 75 return 76 } 77 airplaneModeEnabler.setAirplaneMode(newChecked) 78 } 79 80 } 81