WifiInjector.java revision e699623dae17803bc8fb5dd56b3d6b17f64f9cc7
19e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project/*
264c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath * Copyright (C) 2016 The Android Open Source Project
39e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
49e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * you may not use this file except in compliance with the License.
69e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * You may obtain a copy of the License at
79e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
89e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes *
1009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes * Unless required by applicable law or agreed to in writing, software
1109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1364c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath * See the License for the specific language governing permissions and
1464c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath * limitations under the License.
1564c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath */
1664c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath
1704351a92ecc8429c999acbfc5dfe5aa8bee1d19dElliott Hughespackage com.android.server.wifi;
1864c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath
1964c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.app.ActivityManager;
2064c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.content.Context;
2164c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.NetworkKey;
2264c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.NetworkScoreManager;
2364c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.wifi.IApInterface;
2464c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.wifi.IWifiScanner;
2564c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.wifi.IWificond;
2664c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.wifi.WifiConfiguration;
2764c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamathimport android.net.wifi.WifiInfo;
289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.net.wifi.WifiNetworkScoreCache;
299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.net.wifi.WifiScanner;
309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.BatteryStats;
319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.HandlerThread;
329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.IBinder;
339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.INetworkManagementService;
349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.Looper;
359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.ServiceManager;
369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.SystemProperties;
379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.os.UserManager;
389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.security.KeyStore;
399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport android.telephony.TelephonyManager;
40381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesimport android.util.LocalLog;
419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.internal.R;
439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.internal.app.IBatteryStats;
449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.am.BatteryStatsService;
459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.net.DelayedDiskWrite;
46381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesimport com.android.server.net.IpConfigStore;
479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.aware.WifiAwareMetrics;
489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.hotspot2.LegacyPasspointConfigParser;
499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.hotspot2.PasspointManager;
509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.hotspot2.PasspointNetworkEvaluator;
519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.hotspot2.PasspointObjectFactory;
52381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughesimport com.android.server.wifi.p2p.SupplicantP2pIfaceHal;
539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.p2p.WifiP2pMonitor;
549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.p2p.WifiP2pNative;
559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.util.WifiPermissionsUtil;
569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectimport com.android.server.wifi.util.WifiPermissionsWrapper;
579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
58381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes/**
599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *  WiFi dependency injector. To be used for accessing various WiFi class instances and as a
609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *  handle for mock injection.
619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *
629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *  Some WiFi class instances currently depend on having a Looper from a HandlerThread that has
639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project *  been started. To accommodate this, we have a two-phased approach to initialize and retrieve
6464c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath *  an instance of the WifiInjector.
659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project */
669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Projectpublic class WifiInjector {
679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private static final String BOOT_DEFAULT_WIFI_COUNTRY_CODE = "ro.boot.wificountrycode";
689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private static final String WIFICOND_SERVICE_NAME = "wificond";
699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    static WifiInjector sWifiInjector = null;
719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final Context mContext;
739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final FrameworkFacade mFrameworkFacade = new FrameworkFacade();
749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final HandlerThread mWifiServiceHandlerThread;
759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final HandlerThread mWifiStateMachineHandlerThread;
769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiTrafficPoller mTrafficPoller;
779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiCountryCode mCountryCode;
789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final BackupManagerProxy mBackupManagerProxy = new BackupManagerProxy();
799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiApConfigStore mWifiApConfigStore;
809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiNative mWifiNative;
819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiMonitor mWifiMonitor;
829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiP2pNative mWifiP2pNative;
839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiP2pMonitor mWifiP2pMonitor;
849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final SupplicantStaIfaceHal mSupplicantStaIfaceHal;
859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final SupplicantP2pIfaceHal mSupplicantP2pIfaceHal;
869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiVendorHal mWifiVendorHal;
879e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiStateMachine mWifiStateMachine;
889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiSettingsStore mSettingsStore;
899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiCertManager mCertManager;
909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiNotificationController mNotificationController;
9109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiLockManager mLockManager;
9209eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiController mWifiController;
9309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WificondControl mWificondControl;
9409eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final Clock mClock = new Clock();
9509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiMetrics mWifiMetrics;
9609eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiLastResortWatchdog mWifiLastResortWatchdog;
9709eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final PropertyService mPropertyService = new SystemPropertyService();
9809eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final BuildProperties mBuildProperties = new SystemBuildProperties();
9909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final KeyStore mKeyStore = KeyStore.getInstance();
10009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiBackupRestore mWifiBackupRestore;
10109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiMulticastLockManager mWifiMulticastLockManager;
1029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiConfigStore mWifiConfigStore;
10309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiKeyStore mWifiKeyStore;
10409eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiNetworkHistory mWifiNetworkHistory;
10509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final IpConfigStore mIpConfigStore;
10609eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiConfigStoreLegacy mWifiConfigStoreLegacy;
10709eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiConfigManager mWifiConfigManager;
10809eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiConnectivityHelper mWifiConnectivityHelper;
10909eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final LocalLog mConnectivityLocalLog;
11009eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final WifiNetworkSelector mWifiNetworkSelector;
11109eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final SavedNetworkEvaluator mSavedNetworkEvaluator;
11209eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final PasspointNetworkEvaluator mPasspointNetworkEvaluator;
11309eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final ScoredNetworkEvaluator mScoredNetworkEvaluator;
1149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiNetworkScoreCache mWifiNetworkScoreCache;
11509eb358bbbb9aad3fe48dd3368c8a7a481cbda1cElliott Hughes    private final NetworkScoreManager mNetworkScoreManager;
1169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private WifiScanner mWifiScanner;
1179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiPermissionsWrapper mWifiPermissionsWrapper;
11864c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath    private final WifiPermissionsUtil mWifiPermissionsUtil;
11964c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath    private final PasspointManager mPasspointManager;
1209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final SIMAccessor mSimAccessor;
1219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private HandlerThread mWifiAwareHandlerThread;
1229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private HalDeviceManager mHalDeviceManager;
123381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    private final IBatteryStats mBatteryStats;
1249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final WifiStateTracker mWifiStateTracker;
125381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    private final Runtime mJavaRuntime;
1269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final SelfRecovery mSelfRecovery;
1279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    private final boolean mUseRealLogger;
1299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiInjector(Context context) {
1319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (context == null) {
1329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            throw new IllegalStateException(
1339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    "WifiInjector should not be initialized with a null Context.");
1349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (sWifiInjector != null) {
1379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            throw new IllegalStateException(
1389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    "WifiInjector was already created, use getInstance instead.");
1399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
1409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        sWifiInjector = this;
1429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mContext = context;
1449e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mUseRealLogger = mContext.getResources().getBoolean(
1459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                R.bool.config_wifi_enable_wifi_firmware_debugging);
1469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mSettingsStore = new WifiSettingsStore(mContext);
1479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiPermissionsWrapper = new WifiPermissionsWrapper(mContext);
1489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mNetworkScoreManager = mContext.getSystemService(NetworkScoreManager.class);
1499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiNetworkScoreCache = new WifiNetworkScoreCache(mContext);
1509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI,
1519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE);
152381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        mWifiPermissionsUtil = new WifiPermissionsUtil(mWifiPermissionsWrapper, mContext,
1539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mSettingsStore, UserManager.get(mContext), mNetworkScoreManager, this);
1549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiBackupRestore = new WifiBackupRestore(mWifiPermissionsUtil);
1559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mBatteryStats = IBatteryStats.Stub.asInterface(mFrameworkFacade.getService(
1569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                BatteryStats.SERVICE_NAME));
1579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiStateTracker = new WifiStateTracker(mBatteryStats);
1589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // Now create and start handler threads
1599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiServiceHandlerThread = new HandlerThread("WifiService");
1609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiServiceHandlerThread.start();
1619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiStateMachineHandlerThread = new HandlerThread("WifiStateMachine");
1629e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiStateMachineHandlerThread.start();
163381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        Looper wifiStateMachineLooper = mWifiStateMachineHandlerThread.getLooper();
1649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        WifiAwareMetrics awareMetrics = new WifiAwareMetrics(mClock);
1659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMetrics = new WifiMetrics(mClock, wifiStateMachineLooper, awareMetrics);
1669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // Modules interacting with Native.
1679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMonitor = new WifiMonitor(this);
1689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mHalDeviceManager = new HalDeviceManager();
1699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiVendorHal =
1709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new WifiVendorHal(mHalDeviceManager, mWifiStateMachineHandlerThread.getLooper());
1719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mSupplicantStaIfaceHal = new SupplicantStaIfaceHal(mContext, mWifiMonitor);
1729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWificondControl = new WificondControl(this, mWifiMonitor,
1739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new CarrierNetworkConfig(mContext));
1749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiNative = new WifiNative(SystemProperties.get("wifi.interface", "wlan0"),
1759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiVendorHal, mSupplicantStaIfaceHal, mWificondControl);
176381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        mWifiP2pMonitor = new WifiP2pMonitor(this);
1779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor);
1789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiP2pNative = new WifiP2pNative(SystemProperties.get("wifi.direct.interface", "p2p0"),
1799e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mSupplicantP2pIfaceHal);
1809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1819e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // Now get instances of all the objects that depend on the HandlerThreads
1829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mTrafficPoller =  new WifiTrafficPoller(mContext, mWifiServiceHandlerThread.getLooper(),
1839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiNative.getInterfaceName());
1849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mCountryCode = new WifiCountryCode(mWifiNative,
1859e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                SystemProperties.get(BOOT_DEFAULT_WIFI_COUNTRY_CODE),
1869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mContext.getResources()
187ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes                        .getBoolean(R.bool.config_wifi_revert_country_code_on_cellular_loss));
1889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiApConfigStore = new WifiApConfigStore(mContext, mBackupManagerProxy);
1899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
1909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // WifiConfigManager/Store objects and their dependencies.
1919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // New config store
1929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiKeyStore = new WifiKeyStore(mKeyStore);
1939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiConfigStore = new WifiConfigStore(
1949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mContext, wifiStateMachineLooper, mClock,
1959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                WifiConfigStore.createSharedFile());
1969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // Legacy config store
1979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        DelayedDiskWrite writer = new DelayedDiskWrite();
1989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiNetworkHistory = new WifiNetworkHistory(mContext, writer);
1999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mIpConfigStore = new IpConfigStore(writer);
2009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiConfigStoreLegacy = new WifiConfigStoreLegacy(
2019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiNetworkHistory, mWifiNative, mIpConfigStore,
2029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new LegacyPasspointConfigParser());
2039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // Config Manager
2049e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiConfigManager = new WifiConfigManager(mContext, mClock,
2059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                UserManager.get(mContext), TelephonyManager.from(mContext),
2069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiKeyStore, mWifiConfigStore, mWifiConfigStoreLegacy, mWifiPermissionsUtil,
2079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiPermissionsWrapper, new NetworkListStoreData(),
2089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new DeletedEphemeralSsidsStoreData());
2099e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMetrics.setWifiConfigManager(mWifiConfigManager);
2109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiConnectivityHelper = new WifiConnectivityHelper(mWifiNative);
2119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mConnectivityLocalLog = new LocalLog(ActivityManager.isLowRamDeviceStatic() ? 256 : 512);
2129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiConfigManager, mClock,
2139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mConnectivityLocalLog);
2149e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMetrics.setWifiNetworkSelector(mWifiNetworkSelector);
2159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mSavedNetworkEvaluator = new SavedNetworkEvaluator(mContext,
2169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiConfigManager, mClock, mConnectivityLocalLog, mWifiConnectivityHelper);
2179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mScoredNetworkEvaluator = new ScoredNetworkEvaluator(context, wifiStateMachineLooper,
2189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mFrameworkFacade, mNetworkScoreManager, mWifiConfigManager, mConnectivityLocalLog,
2199e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiNetworkScoreCache);
220381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        mSimAccessor = new SIMAccessor(mContext);
2219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mPasspointManager = new PasspointManager(mContext, mWifiNative, mWifiKeyStore, mClock,
22264c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath                mSimAccessor, new PasspointObjectFactory(), mWifiConfigManager, mWifiConfigStore,
2239e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiMetrics);
2249e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mPasspointNetworkEvaluator = new PasspointNetworkEvaluator(
2259e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mPasspointManager, mWifiConfigManager, mConnectivityLocalLog);
2269e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMetrics.setPasspointManager(mPasspointManager);
2279e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        // mWifiStateMachine has an implicit dependency on mJavaRuntime due to WifiDiagnostics.
2289e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mJavaRuntime = Runtime.getRuntime();
2299e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiStateMachine = new WifiStateMachine(mContext, mFrameworkFacade,
2309e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                wifiStateMachineLooper, UserManager.get(mContext),
2319e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                this, mBackupManagerProxy, mCountryCode, mWifiNative,
2329e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new WrongPasswordNotifier(mContext, mFrameworkFacade));
2339e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mCertManager = new WifiCertManager(mContext);
2349e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mNotificationController = new WifiNotificationController(mContext,
2359e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mWifiStateMachineHandlerThread.getLooper(), mFrameworkFacade, null,
2369e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                new OpenNetworkRecommender());
2379e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mLockManager = new WifiLockManager(mContext, BatteryStatsService.getService());
2389e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiController = new WifiController(mContext, mWifiStateMachine, mSettingsStore,
2399e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                mLockManager, mWifiServiceHandlerThread.getLooper(), mFrameworkFacade);
2409e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mSelfRecovery = new SelfRecovery(mWifiController, mClock);
2419e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiLastResortWatchdog = new WifiLastResortWatchdog(mSelfRecovery, mWifiMetrics);
2429e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        mWifiMulticastLockManager = new WifiMulticastLockManager(mWifiStateMachine,
2439e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                BatteryStatsService.getService());
244381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
2459e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2469e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    /**
2479e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *  Obtain an instance of the WifiInjector class.
2489e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *
2499e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *  This is the generic method to get an instance of the class. The first instance should be
2509e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     *  retrieved using the getInstanceWithContext method.
2519e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project     */
2529e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public static WifiInjector getInstance() {
2539e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        if (sWifiInjector == null) {
2549e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project            throw new IllegalStateException(
2559e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project                    "Attempted to retrieve a WifiInjector instance before constructor was called.");
2569e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        }
2579e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return sWifiInjector;
2589e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2599e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2609e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public UserManager getUserManager() {
2619e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return UserManager.get(mContext);
26264c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath    }
2639e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2649e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiMetrics getWifiMetrics() {
2659e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mWifiMetrics;
2669e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2679e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2689e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public SupplicantStaIfaceHal getSupplicantStaIfaceHal() {
2699e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mSupplicantStaIfaceHal;
2709e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2719e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2729e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public BackupManagerProxy getBackupManagerProxy() {
2739e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mBackupManagerProxy;
2749e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2759e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2769e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public FrameworkFacade getFrameworkFacade() {
2779e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mFrameworkFacade;
2789e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
279381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes
2809e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public HandlerThread getWifiServiceHandlerThread() {
28164c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath        return mWifiServiceHandlerThread;
2829e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2839e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2849e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public HandlerThread getWifiStateMachineHandlerThread() {
285381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes        return mWifiStateMachineHandlerThread;
2869e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
28764c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath
2889e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiTrafficPoller getWifiTrafficPoller() {
2899e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mTrafficPoller;
2909e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2919e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2929e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiCountryCode getWifiCountryCode() {
2939e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mCountryCode;
2949e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2959e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
2969e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiApConfigStore getWifiApConfigStore() {
2979e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mWifiApConfigStore;
2989e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
2999e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3009e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiStateMachine getWifiStateMachine() {
3019e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mWifiStateMachine;
3029e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3039e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
304381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    public WifiSettingsStore getWifiSettingsStore() {
3059e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mSettingsStore;
3069e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3079e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3089e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiCertManager getWifiCertManager() {
30964c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath        return mCertManager;
3109e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
3119e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3129e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiLockManager getWifiLockManager() {
3139e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mLockManager;
314381716e9396b55b1adb8235b020c37344f60ab07Elliott Hughes    }
3159e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project
3169e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiController getWifiController() {
3179e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mWifiController;
3189e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
31964c8fd52127407737beccba617e02eaf4a58ae7fNarayan Kamath
3209e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    public WifiLastResortWatchdog getWifiLastResortWatchdog() {
3219e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project        return mWifiLastResortWatchdog;
3229e38dfa2f95fce609707a0941f10af9a785288deThe Android Open Source Project    }
323ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes
324ee9e11d0d4e3361533860bf04896abb86a291bfbElliott Hughes    public Clock getClock() {
325        return mClock;
326    }
327
328    public PropertyService getPropertyService() {
329        return mPropertyService;
330    }
331
332    public BuildProperties getBuildProperties() {
333        return mBuildProperties;
334    }
335
336    public KeyStore getKeyStore() {
337        return mKeyStore;
338    }
339
340    public WifiBackupRestore getWifiBackupRestore() {
341        return mWifiBackupRestore;
342    }
343
344    public WifiMulticastLockManager getWifiMulticastLockManager() {
345        return mWifiMulticastLockManager;
346    }
347
348    public WifiConfigManager getWifiConfigManager() {
349        return mWifiConfigManager;
350    }
351
352    public PasspointManager getPasspointManager() {
353        return mPasspointManager;
354    }
355
356    public TelephonyManager makeTelephonyManager() {
357        // may not be available when WiFi starts
358        return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
359    }
360
361    public WifiStateTracker getWifiStateTracker() {
362        return mWifiStateTracker;
363    }
364
365    public IWificond makeWificond() {
366        // We depend on being able to refresh our binder in WifiStateMachine, so don't cache it.
367        IBinder binder = ServiceManager.getService(WIFICOND_SERVICE_NAME);
368        return IWificond.Stub.asInterface(binder);
369    }
370
371    /**
372     * Create a SoftApManager.
373     * @param nmService NetworkManagementService allowing SoftApManager to listen for interface
374     * changes
375     * @param listener listener for SoftApManager
376     * @param apInterface network interface to start hostapd against
377     * @param config softAp WifiConfiguration
378     * @return an instance of SoftApManager
379     */
380    public SoftApManager makeSoftApManager(INetworkManagementService nmService,
381                                           SoftApManager.Listener listener,
382                                           IApInterface apInterface,
383                                           WifiConfiguration config) {
384        return new SoftApManager(mWifiServiceHandlerThread.getLooper(),
385                                 mWifiNative, mCountryCode.getCountryCode(),
386                                 listener, apInterface, nmService,
387                                 mWifiApConfigStore, config, mWifiMetrics);
388    }
389
390    /**
391     * Create a WifiLog instance.
392     * @param tag module name to include in all log messages
393     */
394    public WifiLog makeLog(String tag) {
395        return new LogcatLog(tag);
396    }
397
398    public BaseWifiDiagnostics makeWifiDiagnostics(WifiNative wifiNative) {
399        if (mUseRealLogger) {
400            return new WifiDiagnostics(
401                    mContext, this, mWifiStateMachine, wifiNative, mBuildProperties,
402                    new LastMileLogger(this));
403        } else {
404            return new BaseWifiDiagnostics(wifiNative);
405        }
406    }
407
408    /**
409     * Obtain an instance of WifiScanner.
410     * If it was not already created, then obtain an instance.  Note, this must be done lazily since
411     * WifiScannerService is separate and created later.
412     */
413    public synchronized WifiScanner getWifiScanner() {
414        if (mWifiScanner == null) {
415            mWifiScanner = new WifiScanner(mContext,
416                    IWifiScanner.Stub.asInterface(ServiceManager.getService(
417                            Context.WIFI_SCANNING_SERVICE)),
418                    mWifiStateMachineHandlerThread.getLooper());
419        }
420        return mWifiScanner;
421    }
422
423    /**
424     * Obtain a new instance of WifiConnectivityManager.
425     *
426     * Create and return a new WifiConnectivityManager.
427     * @param wifiInfo WifiInfo object for updating wifi state.
428     * @param hasConnectionRequests boolean indicating if WifiConnectivityManager to start
429     * immediately based on connection requests.
430     */
431    public WifiConnectivityManager makeWifiConnectivityManager(WifiInfo wifiInfo,
432                                                               boolean hasConnectionRequests) {
433        return new WifiConnectivityManager(mContext, mWifiStateMachine, getWifiScanner(),
434                mWifiConfigManager, wifiInfo, mWifiNetworkSelector, mWifiConnectivityHelper,
435                mWifiLastResortWatchdog, mNotificationController, mWifiMetrics,
436                mWifiStateMachineHandlerThread.getLooper(), mClock, mConnectivityLocalLog,
437                hasConnectionRequests, mFrameworkFacade, mSavedNetworkEvaluator,
438                mScoredNetworkEvaluator, mPasspointNetworkEvaluator);
439    }
440
441    public WifiPermissionsUtil getWifiPermissionsUtil() {
442        return mWifiPermissionsUtil;
443    }
444
445    public WifiPermissionsWrapper getWifiPermissionsWrapper() {
446        return mWifiPermissionsWrapper;
447    }
448
449    /**
450     * Returns a singleton instance of a HandlerThread for injection. Uses lazy initialization.
451     *
452     * TODO: share worker thread with other Wi-Fi handlers (b/27924886)
453     */
454    public HandlerThread getWifiAwareHandlerThread() {
455        if (mWifiAwareHandlerThread == null) { // lazy initialization
456            mWifiAwareHandlerThread = new HandlerThread("wifiAwareService");
457            mWifiAwareHandlerThread.start();
458        }
459        return mWifiAwareHandlerThread;
460    }
461
462    /**
463     * Returns a single instance of HalDeviceManager for injection.
464     */
465    public HalDeviceManager getHalDeviceManager() {
466        return mHalDeviceManager;
467    }
468
469    public Runtime getJavaRuntime() {
470        return mJavaRuntime;
471    }
472
473    public WifiNative getWifiNative() {
474        return mWifiNative;
475    }
476
477    public WifiMonitor getWifiMonitor() {
478        return mWifiMonitor;
479    }
480
481    public WifiP2pNative getWifiP2pNative() {
482        return mWifiP2pNative;
483    }
484
485    public WifiP2pMonitor getWifiP2pMonitor() {
486        return mWifiP2pMonitor;
487    }
488
489    public SelfRecovery getSelfRecovery() {
490        return mSelfRecovery;
491    }
492}
493