1 /* 2 * Copyright (C) 2021 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 17 package com.android.settings.uwb; 18 19 import static androidx.lifecycle.Lifecycle.Event.ON_START; 20 import static androidx.lifecycle.Lifecycle.Event.ON_STOP; 21 22 import android.content.BroadcastReceiver; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.content.IntentFilter; 26 import android.content.pm.PackageManager; 27 import android.provider.Settings; 28 import android.uwb.UwbManager; 29 import android.uwb.UwbManager.AdapterStateCallback; 30 31 import androidx.lifecycle.LifecycleObserver; 32 import androidx.lifecycle.OnLifecycleEvent; 33 import androidx.preference.Preference; 34 import androidx.preference.PreferenceScreen; 35 36 import com.android.internal.annotations.VisibleForTesting; 37 import com.android.settings.R; 38 import com.android.settings.core.TogglePreferenceController; 39 40 import java.util.concurrent.Executor; 41 import java.util.concurrent.Executors; 42 43 /** Controller for "UWB" toggle. */ 44 public class UwbPreferenceController extends TogglePreferenceController implements 45 AdapterStateCallback, LifecycleObserver { 46 @VisibleForTesting 47 static final String KEY_UWB_SETTINGS = "uwb_settings"; 48 @VisibleForTesting 49 UwbManager mUwbManager; 50 @VisibleForTesting 51 boolean mAirplaneModeOn; 52 @VisibleForTesting 53 private final BroadcastReceiver mAirplaneModeChangedReceiver; 54 private final Executor mExecutor; 55 private Preference mPreference; 56 UwbPreferenceController(Context context, String key)57 public UwbPreferenceController(Context context, String key) { 58 super(context, key); 59 mExecutor = Executors.newSingleThreadExecutor(); 60 mUwbManager = context.getSystemService(UwbManager.class); 61 mAirplaneModeOn = Settings.Global.getInt(mContext.getContentResolver(), 62 Settings.Global.AIRPLANE_MODE_ON, 0) == 1; 63 mAirplaneModeChangedReceiver = new BroadcastReceiver() { 64 @Override 65 public void onReceive(Context context, Intent intent) { 66 updateState(mPreference); 67 } 68 }; 69 } 70 71 @VisibleForTesting isUwbSupportedOnDevice()72 boolean isUwbSupportedOnDevice() { 73 return mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB); 74 } 75 76 @Override getAvailabilityStatus()77 public int getAvailabilityStatus() { 78 if (!isUwbSupportedOnDevice()) { 79 return UNSUPPORTED_ON_DEVICE; 80 } else if (mAirplaneModeOn) { 81 return DISABLED_DEPENDENT_SETTING; 82 } else { 83 return AVAILABLE; 84 } 85 } 86 87 @Override displayPreference(PreferenceScreen screen)88 public void displayPreference(PreferenceScreen screen) { 89 super.displayPreference(screen); 90 mPreference = screen.findPreference(getPreferenceKey()); 91 } 92 93 @Override isChecked()94 public boolean isChecked() { 95 int state = mUwbManager.getAdapterState(); 96 return state == STATE_ENABLED_ACTIVE || state == STATE_ENABLED_INACTIVE; 97 } 98 99 @Override setChecked(boolean isChecked)100 public boolean setChecked(boolean isChecked) { 101 mAirplaneModeOn = Settings.Global.getInt(mContext.getContentResolver(), 102 Settings.Global.AIRPLANE_MODE_ON, 0) == 1; 103 if (isUwbSupportedOnDevice()) { 104 if (mAirplaneModeOn) { 105 mUwbManager.setUwbEnabled(false); 106 } else { 107 mUwbManager.setUwbEnabled(isChecked); 108 } 109 } 110 return true; 111 } 112 113 @Override onStateChanged(int state, int reason)114 public void onStateChanged(int state, int reason) { 115 } 116 117 /** Called when activity starts being displayed to user. */ 118 @OnLifecycleEvent(ON_START) onStart()119 public void onStart() { 120 if (isUwbSupportedOnDevice()) { 121 mUwbManager.registerAdapterStateCallback(mExecutor, this); 122 } 123 if (mAirplaneModeChangedReceiver != null) { 124 mContext.registerReceiver(mAirplaneModeChangedReceiver, 125 new IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)); 126 } 127 refreshSummary(mPreference); 128 } 129 130 /** Called when activity stops being displayed to user. */ 131 @OnLifecycleEvent(ON_STOP) onStop()132 public void onStop() { 133 if (isUwbSupportedOnDevice()) { 134 mUwbManager.unregisterAdapterStateCallback(this); 135 } 136 if (mAirplaneModeChangedReceiver != null) { 137 mContext.unregisterReceiver(mAirplaneModeChangedReceiver); 138 } 139 } 140 141 @Override updateState(Preference preference)142 public void updateState(Preference preference) { 143 super.updateState(preference); 144 preference.setEnabled(!mAirplaneModeOn); 145 refreshSummary(preference); 146 } 147 148 @Override getSummary()149 public CharSequence getSummary() { 150 if (mAirplaneModeOn) { 151 return mContext.getResources().getString(R.string.uwb_settings_summary_airplane_mode); 152 } else { 153 return mContext.getResources().getString(R.string.uwb_settings_summary); 154 } 155 } 156 } 157 158