WakeupController.java revision a57806da53f2eadcf12475892ae3a0e0e58d98cd
1a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/* 2a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Copyright 2017 The Android Open Source Project 3a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 4a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Licensed under the Apache License, Version 2.0 (the "License"); 5a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * you may not use this file except in compliance with the License. 6a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * You may obtain a copy of the License at 7a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 8a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * http://www.apache.org/licenses/LICENSE-2.0 9a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 10a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Unless required by applicable law or agreed to in writing, software 11a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * distributed under the License is distributed on an "AS IS" BASIS, 12a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * See the License for the specific language governing permissions and 14a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * limitations under the License. 15a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 16a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 17a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpackage com.android.server.wifi; 18a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 19a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.content.Context; 20a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.database.ContentObserver; 21a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.Handler; 22a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.os.Looper; 23a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport android.provider.Settings; 24a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 25a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachimport com.android.internal.annotations.VisibleForTesting; 26a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 27a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach/** 28a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * WakeupController is responsible managing Auto Wifi. 29a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 30a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * <p>It determines if and when to re-enable wifi after it has been turned off by the user. 31a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 32a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbachpublic class WakeupController { 33a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 34a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach // TODO(b/69624403) propagate this to Settings 35a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private static final boolean USE_PLATFORM_WIFI_WAKE = false; 36a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 37a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final Context mContext; 38a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final Handler mHandler; 39a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final FrameworkFacade mFrameworkFacade; 40a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private final ContentObserver mContentObserver; 41a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private final WakeupLock mWakeupLock; 42a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private final WifiConfigManager mWifiConfigManager; 43a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 44a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach /** Whether this feature is enabled in Settings. */ 45a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach private boolean mWifiWakeupEnabled; 46a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 47a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach /** Whether the WakeupController is currently active. */ 48a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private boolean mIsActive = false; 49a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 50a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach public WakeupController( 51a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Context context, 52a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Looper looper, 53a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WakeupLock wakeupLock, 54a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WifiConfigManager wifiConfigManager, 55a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WifiConfigStore wifiConfigStore, 56a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach FrameworkFacade frameworkFacade) { 57a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContext = context; 58a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mHandler = new Handler(looper); 59a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWakeupLock = wakeupLock; 60a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWifiConfigManager = wifiConfigManager; 61a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mFrameworkFacade = frameworkFacade; 62a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContentObserver = new ContentObserver(mHandler) { 63a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach @Override 64a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach public void onChange(boolean selfChange) { 65a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mWifiWakeupEnabled = mFrameworkFacade.getIntegerSetting( 66a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContext, Settings.Global.WIFI_WAKEUP_ENABLED, 0) == 1; 67a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 68a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach }; 69a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mFrameworkFacade.registerContentObserver(mContext, Settings.Global.getUriFor( 70a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach Settings.Global.WIFI_WAKEUP_ENABLED), true, mContentObserver); 71a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach mContentObserver.onChange(false /* selfChange */); 72a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 73a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach // registering the store data here has the effect of reading the persisted value of the 74a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach // data sources after system boot finishes 75a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach WakeupConfigStoreData wakeupConfigStoreData = 76a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach new WakeupConfigStoreData(new IsActiveDataSource(), mWakeupLock.getDataSource()); 77a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach wifiConfigStore.registerStoreData(wakeupConfigStoreData); 78a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 79a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 80a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private void setActive(boolean isActive) { 81a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach if (mIsActive != isActive) { 82a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mIsActive = isActive; 83a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mWifiConfigManager.saveToStore(false /* forceWrite */); 84a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 85a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 86a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach 87a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach /** 88a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * Whether the feature is enabled in settings. 89a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * 90a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * <p>Note: This method is only used to determine whether or not to actually enable wifi. All 91a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach * other aspects of the WakeupController lifecycle operate normally irrespective of this. 92a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach */ 93a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach @VisibleForTesting 94a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach boolean isEnabled() { 95a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach return mWifiWakeupEnabled; 96a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach } 97a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 98a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach private class IsActiveDataSource implements WakeupConfigStoreData.DataSource<Boolean> { 99a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 100a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach @Override 101a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach public Boolean getData() { 102a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach return mIsActive; 103a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 104a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach 105a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach @Override 106a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach public void setData(Boolean data) { 107a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach mIsActive = data; 108a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 109a57806da53f2eadcf12475892ae3a0e0e58d98cdEric Schwarzenbach } 110a55e8d795bba5aa66f692cffa8fa28e3b4174546Eric Schwarzenbach} 111