| /* |
| * Copyright (C) 2020 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.server.wifi; |
| |
| import android.content.Context; |
| import android.database.ContentObserver; |
| import android.net.Uri; |
| import android.os.Handler; |
| import android.provider.Settings; |
| import android.util.Log; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| |
| import java.io.FileDescriptor; |
| import java.io.PrintWriter; |
| |
| /** |
| * Observer for adaptive connectivity enable settings changes. |
| * This is enabled by default. Will be toggled off via adb command or a settings |
| * toggle by the user to disable adaptive connectivity. |
| */ |
| public class AdaptiveConnectivityEnabledSettingObserver { |
| |
| private static final String TAG = "WifiAdaptConnObserver"; |
| /** |
| * Copy of the settings string. Can't directly use the constant because it is @hide. |
| * See {@link Settings.Secure#ADAPTIVE_CONNECTIVITY_ENABLED}. |
| * TODO(b/167709538): remove this hardcoded string and create new API in Wifi mainline. |
| */ |
| @VisibleForTesting |
| public static final String SETTINGS_SECURE_ADAPTIVE_CONNECTIVITY_ENABLED = |
| "adaptive_connectivity_enabled"; |
| |
| private final WifiMetrics mWifiMetrics; |
| private final FrameworkFacade mFrameworkFacade; |
| private final Context mContext; |
| |
| private final ContentObserver mContentObserver; |
| |
| private boolean mAdaptiveConnectivityEnabled = true; |
| |
| public AdaptiveConnectivityEnabledSettingObserver(Handler handler, |
| WifiMetrics wifiMetrics, FrameworkFacade frameworkFacade, |
| Context context) { |
| mWifiMetrics = wifiMetrics; |
| mFrameworkFacade = frameworkFacade; |
| mContext = context; |
| mContentObserver = new ContentObserver(handler) { |
| @Override |
| public void onChange(boolean selfChange) { |
| handleChange(); |
| } |
| }; |
| } |
| |
| private void handleChange() { |
| mAdaptiveConnectivityEnabled = readValueFromSettings(); |
| Log.d(TAG, "Adaptive connectivity status changed: " + mAdaptiveConnectivityEnabled); |
| mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled); |
| mWifiMetrics.logUserActionEvent( |
| WifiMetrics.convertAdaptiveConnectivityStateToUserActionEventType( |
| mAdaptiveConnectivityEnabled)); |
| } |
| |
| /** Register settings change observer. */ |
| public void initialize() { |
| Uri uri = Settings.Secure.getUriFor(SETTINGS_SECURE_ADAPTIVE_CONNECTIVITY_ENABLED); |
| if (uri == null) { |
| Log.e(TAG, "Adaptive connectivity user toggle does not exist in Settings"); |
| return; |
| } |
| mFrameworkFacade.registerContentObserver( |
| mContext, uri, true, mContentObserver); |
| mAdaptiveConnectivityEnabled = readValueFromSettings(); |
| Log.d(TAG, "Adaptive connectivity status initialized to: " + mAdaptiveConnectivityEnabled); |
| mWifiMetrics.setAdaptiveConnectivityState(mAdaptiveConnectivityEnabled); |
| } |
| |
| private boolean readValueFromSettings() { |
| return mFrameworkFacade.getSecureIntegerSetting( |
| mContext, SETTINGS_SECURE_ADAPTIVE_CONNECTIVITY_ENABLED, 1) == 1; |
| } |
| |
| /** True if adaptive connectivity is enabled, false otherwise. */ |
| public boolean get() { |
| return mAdaptiveConnectivityEnabled; |
| } |
| |
| /** Dump method for debugging */ |
| public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { |
| pw.println("Dump of AdaptiveConnectivityEnabledSettingObserver"); |
| pw.println("mAdaptiveConnectivityEnabled=" + mAdaptiveConnectivityEnabled); |
| } |
| } |