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