/* * Copyright (C) 2016 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.annotation.NonNull; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.AppOpsManager; import android.content.Context; import android.content.pm.PackageManager; import android.hardware.SystemSensorManager; import android.net.IpMemoryStore; import android.net.NetworkCapabilities; import android.net.NetworkKey; import android.net.NetworkScoreManager; import android.net.wifi.IWifiScanner; import android.net.wifi.IWificond; import android.net.wifi.WifiManager; import android.net.wifi.WifiNetworkScoreCache; import android.net.wifi.WifiScanner; import android.os.BatteryStats; import android.os.Handler; import android.os.HandlerThread; import android.os.IBinder; import android.os.INetworkManagementService; import android.os.Looper; import android.os.ServiceManager; import android.os.SystemProperties; import android.os.UserManager; import android.provider.Settings.Secure; import android.security.KeyStore; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.util.LocalLog; import com.android.internal.R; import com.android.internal.app.IBatteryStats; import com.android.internal.os.PowerProfile; import com.android.server.am.ActivityManagerService; import com.android.server.am.BatteryStatsService; import com.android.server.wifi.aware.WifiAwareMetrics; import com.android.server.wifi.hotspot2.PasspointManager; import com.android.server.wifi.hotspot2.PasspointNetworkEvaluator; import com.android.server.wifi.hotspot2.PasspointObjectFactory; import com.android.server.wifi.p2p.SupplicantP2pIfaceHal; import com.android.server.wifi.p2p.WifiP2pMetrics; import com.android.server.wifi.p2p.WifiP2pMonitor; import com.android.server.wifi.p2p.WifiP2pNative; import com.android.server.wifi.rtt.RttMetrics; import com.android.server.wifi.util.WifiPermissionsUtil; import com.android.server.wifi.util.WifiPermissionsWrapper; import java.util.Random; /** * WiFi dependency injector. To be used for accessing various WiFi class instances and as a * handle for mock injection. * * Some WiFi class instances currently depend on having a Looper from a HandlerThread that has * been started. To accommodate this, we have a two-phased approach to initialize and retrieve * an instance of the WifiInjector. */ public class WifiInjector { private static final String BOOT_DEFAULT_WIFI_COUNTRY_CODE = "ro.boot.wificountrycode"; private static final String WIFICOND_SERVICE_NAME = "wificond"; static WifiInjector sWifiInjector = null; private final Context mContext; private final FrameworkFacade mFrameworkFacade = new FrameworkFacade(); private final DeviceConfigFacade mDeviceConfigFacade; private final HandlerThread mWifiServiceHandlerThread; private final HandlerThread mWifiCoreHandlerThread; private final HandlerThread mWifiP2pServiceHandlerThread; private final WifiTrafficPoller mWifiTrafficPoller; private final WifiCountryCode mCountryCode; private final BackupManagerProxy mBackupManagerProxy = new BackupManagerProxy(); private final WifiApConfigStore mWifiApConfigStore; private final WifiNative mWifiNative; private final WifiMonitor mWifiMonitor; private final WifiP2pNative mWifiP2pNative; private final WifiP2pMonitor mWifiP2pMonitor; private final SupplicantStaIfaceHal mSupplicantStaIfaceHal; private final SupplicantP2pIfaceHal mSupplicantP2pIfaceHal; private final HostapdHal mHostapdHal; private final WifiVendorHal mWifiVendorHal; private final ScoringParams mScoringParams; private final ClientModeImpl mClientModeImpl; private final ActiveModeWarden mActiveModeWarden; private final WifiSettingsStore mSettingsStore; private OpenNetworkNotifier mOpenNetworkNotifier; private CarrierNetworkNotifier mCarrierNetworkNotifier; private final CarrierNetworkConfig mCarrierNetworkConfig; private final WifiLockManager mLockManager; private final WifiController mWifiController; private final WificondControl mWificondControl; private final Clock mClock = new Clock(); private final WifiMetrics mWifiMetrics; private final WifiP2pMetrics mWifiP2pMetrics; private WifiLastResortWatchdog mWifiLastResortWatchdog; private final PropertyService mPropertyService = new SystemPropertyService(); private final BuildProperties mBuildProperties = new SystemBuildProperties(); private final KeyStore mKeyStore = KeyStore.getInstance(); private final WifiBackupRestore mWifiBackupRestore; private final WifiMulticastLockManager mWifiMulticastLockManager; private final WifiConfigStore mWifiConfigStore; private final WifiKeyStore mWifiKeyStore; private final WifiConfigManager mWifiConfigManager; private final WifiConnectivityHelper mWifiConnectivityHelper; private final LocalLog mConnectivityLocalLog; private final WifiNetworkSelector mWifiNetworkSelector; private final SavedNetworkEvaluator mSavedNetworkEvaluator; private final NetworkSuggestionEvaluator mNetworkSuggestionEvaluator; private final PasspointNetworkEvaluator mPasspointNetworkEvaluator; private final ScoredNetworkEvaluator mScoredNetworkEvaluator; private final CarrierNetworkEvaluator mCarrierNetworkEvaluator; private final WifiNetworkScoreCache mWifiNetworkScoreCache; private final NetworkScoreManager mNetworkScoreManager; private WifiScanner mWifiScanner; private final WifiPermissionsWrapper mWifiPermissionsWrapper; private final WifiPermissionsUtil mWifiPermissionsUtil; private final PasspointManager mPasspointManager; private final SIMAccessor mSimAccessor; private HandlerThread mWifiAwareHandlerThread; private HandlerThread mRttHandlerThread; private HalDeviceManager mHalDeviceManager; private final IBatteryStats mBatteryStats; private final WifiStateTracker mWifiStateTracker; private final SelfRecovery mSelfRecovery; private final WakeupController mWakeupController; private final INetworkManagementService mNwManagementService; private final ScanRequestProxy mScanRequestProxy; private final SarManager mSarManager; private final BaseWifiDiagnostics mWifiDiagnostics; private final WifiDataStall mWifiDataStall; private final WifiScoreCard mWifiScoreCard; private final WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager; private final DppMetrics mDppMetrics; private final DppManager mDppManager; private final LinkProbeManager mLinkProbeManager; private final IpMemoryStore mIpMemoryStore; private final CellularLinkLayerStatsCollector mCellularLinkLayerStatsCollector; public WifiInjector(Context context) { if (context == null) { throw new IllegalStateException( "WifiInjector should not be initialized with a null Context."); } if (sWifiInjector != null) { throw new IllegalStateException( "WifiInjector was already created, use getInstance instead."); } sWifiInjector = this; mContext = context; mDeviceConfigFacade = new DeviceConfigFacade(); mWifiScoreCard = new WifiScoreCard(mClock, Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID)); mSettingsStore = new WifiSettingsStore(mContext); mWifiPermissionsWrapper = new WifiPermissionsWrapper(mContext); mNetworkScoreManager = mContext.getSystemService(NetworkScoreManager.class); mWifiNetworkScoreCache = new WifiNetworkScoreCache(mContext); mNetworkScoreManager.registerNetworkScoreCache(NetworkKey.TYPE_WIFI, mWifiNetworkScoreCache, NetworkScoreManager.CACHE_FILTER_NONE); mWifiPermissionsUtil = new WifiPermissionsUtil(mWifiPermissionsWrapper, mContext, UserManager.get(mContext), this); mWifiBackupRestore = new WifiBackupRestore(mWifiPermissionsUtil); mBatteryStats = IBatteryStats.Stub.asInterface(mFrameworkFacade.getService( BatteryStats.SERVICE_NAME)); mWifiStateTracker = new WifiStateTracker(mBatteryStats); // Now create and start handler threads mWifiServiceHandlerThread = new HandlerThread("WifiService"); mWifiServiceHandlerThread.start(); mWifiCoreHandlerThread = new HandlerThread("ClientModeImpl"); mWifiCoreHandlerThread.start(); mWifiP2pServiceHandlerThread = new HandlerThread("WifiP2pService"); mWifiP2pServiceHandlerThread.start(); Looper clientModeImplLooper = mWifiCoreHandlerThread.getLooper(); mCarrierNetworkConfig = new CarrierNetworkConfig(mContext, clientModeImplLooper, mFrameworkFacade); WifiAwareMetrics awareMetrics = new WifiAwareMetrics(mClock); RttMetrics rttMetrics = new RttMetrics(mClock); mWifiP2pMetrics = new WifiP2pMetrics(mClock); mDppMetrics = new DppMetrics(); mCellularLinkLayerStatsCollector = new CellularLinkLayerStatsCollector(mContext); mWifiMetrics = new WifiMetrics(mContext, mFrameworkFacade, mClock, clientModeImplLooper, awareMetrics, rttMetrics, new WifiPowerMetrics(), mWifiP2pMetrics, mDppMetrics, mCellularLinkLayerStatsCollector); // Modules interacting with Native. mWifiMonitor = new WifiMonitor(this); mHalDeviceManager = new HalDeviceManager(mClock, clientModeImplLooper); mWifiVendorHal = new WifiVendorHal(mHalDeviceManager, mWifiCoreHandlerThread.getLooper()); mSupplicantStaIfaceHal = new SupplicantStaIfaceHal(mContext, mWifiMonitor, mPropertyService, clientModeImplLooper); mHostapdHal = new HostapdHal(mContext, clientModeImplLooper); mWificondControl = new WificondControl(this, mWifiMonitor, mCarrierNetworkConfig, (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE), clientModeImplLooper, mClock); mNwManagementService = INetworkManagementService.Stub.asInterface( ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE)); mWifiNative = new WifiNative( mWifiVendorHal, mSupplicantStaIfaceHal, mHostapdHal, mWificondControl, mWifiMonitor, mNwManagementService, mPropertyService, mWifiMetrics, new Handler(mWifiCoreHandlerThread.getLooper()), new Random()); mWifiP2pMonitor = new WifiP2pMonitor(this); mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor); mWifiP2pNative = new WifiP2pNative( mWifiVendorHal, mSupplicantP2pIfaceHal, mHalDeviceManager, mPropertyService); // Now get instances of all the objects that depend on the HandlerThreads mWifiTrafficPoller = new WifiTrafficPoller(clientModeImplLooper); mCountryCode = new WifiCountryCode(mWifiNative, SystemProperties.get(BOOT_DEFAULT_WIFI_COUNTRY_CODE), mContext.getResources() .getBoolean(R.bool.config_wifi_revert_country_code_on_cellular_loss)); mWifiApConfigStore = new WifiApConfigStore( mContext, mWifiCoreHandlerThread.getLooper(), mBackupManagerProxy, mFrameworkFacade); // WifiConfigManager/Store objects and their dependencies. // New config store mWifiKeyStore = new WifiKeyStore(mKeyStore); mWifiConfigStore = new WifiConfigStore( mContext, clientModeImplLooper, mClock, mWifiMetrics, WifiConfigStore.createSharedFile(UserManager.get(mContext))); SubscriptionManager subscriptionManager = mContext.getSystemService(SubscriptionManager.class); // Config Manager mWifiConfigManager = new WifiConfigManager(mContext, mClock, UserManager.get(mContext), makeTelephonyManager(), mWifiKeyStore, mWifiConfigStore, mWifiPermissionsUtil, mWifiPermissionsWrapper, this, new NetworkListSharedStoreData(mContext), new NetworkListUserStoreData(mContext), new DeletedEphemeralSsidsStoreData(mClock), new RandomizedMacStoreData(), mFrameworkFacade, mWifiCoreHandlerThread.getLooper()); mWifiMetrics.setWifiConfigManager(mWifiConfigManager); mWifiConnectivityHelper = new WifiConnectivityHelper(mWifiNative); mConnectivityLocalLog = new LocalLog(ActivityManager.isLowRamDeviceStatic() ? 256 : 512); mScoringParams = new ScoringParams(mContext, mFrameworkFacade, new Handler(clientModeImplLooper)); mWifiMetrics.setScoringParams(mScoringParams); mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiScoreCard, mScoringParams, mWifiConfigManager, mClock, mConnectivityLocalLog, mWifiMetrics, mWifiNative); CompatibilityScorer compatibilityScorer = new CompatibilityScorer(mScoringParams); mWifiNetworkSelector.registerCandidateScorer(compatibilityScorer); ScoreCardBasedScorer scoreCardBasedScorer = new ScoreCardBasedScorer(mScoringParams); mWifiNetworkSelector.registerCandidateScorer(scoreCardBasedScorer); BubbleFunScorer bubbleFunScorer = new BubbleFunScorer(mScoringParams); mWifiNetworkSelector.registerCandidateScorer(bubbleFunScorer); mWifiMetrics.setWifiNetworkSelector(mWifiNetworkSelector); mSavedNetworkEvaluator = new SavedNetworkEvaluator(mContext, mScoringParams, mWifiConfigManager, mClock, mConnectivityLocalLog, mWifiConnectivityHelper, subscriptionManager); mWifiNetworkSuggestionsManager = new WifiNetworkSuggestionsManager(mContext, new Handler(mWifiCoreHandlerThread.getLooper()), this, mWifiPermissionsUtil, mWifiConfigManager, mWifiConfigStore, mWifiMetrics); mNetworkSuggestionEvaluator = new NetworkSuggestionEvaluator(mWifiNetworkSuggestionsManager, mWifiConfigManager, mConnectivityLocalLog); mScoredNetworkEvaluator = new ScoredNetworkEvaluator(context, clientModeImplLooper, mFrameworkFacade, mNetworkScoreManager, mWifiConfigManager, mConnectivityLocalLog, mWifiNetworkScoreCache, mWifiPermissionsUtil); mCarrierNetworkEvaluator = new CarrierNetworkEvaluator(mWifiConfigManager, mCarrierNetworkConfig, mConnectivityLocalLog, this); mSimAccessor = new SIMAccessor(mContext); mPasspointManager = new PasspointManager(mContext, this, new Handler(mWifiCoreHandlerThread.getLooper()), mWifiNative, mWifiKeyStore, mClock, mSimAccessor, new PasspointObjectFactory(), mWifiConfigManager, mWifiConfigStore, mWifiMetrics, makeTelephonyManager(), subscriptionManager); mPasspointNetworkEvaluator = new PasspointNetworkEvaluator( mPasspointManager, mWifiConfigManager, mConnectivityLocalLog, mCarrierNetworkConfig, this, subscriptionManager); mWifiMetrics.setPasspointManager(mPasspointManager); mScanRequestProxy = new ScanRequestProxy(mContext, (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE), (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE), this, mWifiConfigManager, mWifiPermissionsUtil, mWifiMetrics, mClock, mFrameworkFacade, new Handler(clientModeImplLooper)); mSarManager = new SarManager(mContext, makeTelephonyManager(), clientModeImplLooper, mWifiNative, new SystemSensorManager(mContext, clientModeImplLooper), mWifiMetrics); mWifiDiagnostics = new WifiDiagnostics( mContext, this, mWifiNative, mBuildProperties, new LastMileLogger(this), mClock); mWifiDataStall = new WifiDataStall(mContext, mFrameworkFacade, mWifiMetrics); mWifiMetrics.setWifiDataStall(mWifiDataStall); mLinkProbeManager = new LinkProbeManager(mClock, mWifiNative, mWifiMetrics, mFrameworkFacade, mWifiCoreHandlerThread.getLooper(), mContext); mClientModeImpl = new ClientModeImpl(mContext, mFrameworkFacade, clientModeImplLooper, UserManager.get(mContext), this, mBackupManagerProxy, mCountryCode, mWifiNative, new WrongPasswordNotifier(mContext, mFrameworkFacade), mSarManager, mWifiTrafficPoller, mLinkProbeManager); mActiveModeWarden = new ActiveModeWarden(this, mContext, clientModeImplLooper, mWifiNative, new DefaultModeManager(mContext, clientModeImplLooper), mBatteryStats); WakeupNotificationFactory wakeupNotificationFactory = new WakeupNotificationFactory(mContext, mFrameworkFacade); WakeupOnboarding wakeupOnboarding = new WakeupOnboarding(mContext, mWifiConfigManager, mWifiCoreHandlerThread.getLooper(), mFrameworkFacade, wakeupNotificationFactory); mWakeupController = new WakeupController(mContext, mWifiCoreHandlerThread.getLooper(), new WakeupLock(mWifiConfigManager, mWifiMetrics.getWakeupMetrics(), mClock), new WakeupEvaluator(mScoringParams), wakeupOnboarding, mWifiConfigManager, mWifiConfigStore, mWifiNetworkSuggestionsManager, mWifiMetrics.getWakeupMetrics(), this, mFrameworkFacade, mClock); mLockManager = new WifiLockManager(mContext, BatteryStatsService.getService(), mClientModeImpl, mFrameworkFacade, new Handler(clientModeImplLooper), mWifiNative, mClock, mWifiMetrics); mWifiController = new WifiController(mContext, mClientModeImpl, clientModeImplLooper, mSettingsStore, mWifiServiceHandlerThread.getLooper(), mFrameworkFacade, mActiveModeWarden, mWifiPermissionsUtil); mSelfRecovery = new SelfRecovery(mWifiController, mClock); mWifiMulticastLockManager = new WifiMulticastLockManager( mClientModeImpl.getMcastLockManagerFilterController(), BatteryStatsService.getService()); mDppManager = new DppManager(mWifiCoreHandlerThread.getLooper(), mWifiNative, mWifiConfigManager, mContext, mDppMetrics); mIpMemoryStore = IpMemoryStore.getMemoryStore(mContext); // Register the various network evaluators with the network selector. mWifiNetworkSelector.registerNetworkEvaluator(mSavedNetworkEvaluator); mWifiNetworkSelector.registerNetworkEvaluator(mNetworkSuggestionEvaluator); if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI_PASSPOINT)) { mWifiNetworkSelector.registerNetworkEvaluator(mPasspointNetworkEvaluator); } mWifiNetworkSelector.registerNetworkEvaluator(mCarrierNetworkEvaluator); mWifiNetworkSelector.registerNetworkEvaluator(mScoredNetworkEvaluator); mClientModeImpl.start(); } /** * Obtain an instance of the WifiInjector class. * * This is the generic method to get an instance of the class. The first instance should be * retrieved using the getInstanceWithContext method. */ public static WifiInjector getInstance() { if (sWifiInjector == null) { throw new IllegalStateException( "Attempted to retrieve a WifiInjector instance before constructor was called."); } return sWifiInjector; } /** * Enable verbose logging in Injector objects. Called from the WifiServiceImpl (based on * binder call). */ public void enableVerboseLogging(int verbose) { mWifiLastResortWatchdog.enableVerboseLogging(verbose); mWifiBackupRestore.enableVerboseLogging(verbose); mHalDeviceManager.enableVerboseLogging(verbose); mScanRequestProxy.enableVerboseLogging(verbose); mWakeupController.enableVerboseLogging(verbose); mCarrierNetworkConfig.enableVerboseLogging(verbose); mWifiNetworkSuggestionsManager.enableVerboseLogging(verbose); LogcatLog.enableVerboseLogging(verbose); mDppManager.enableVerboseLogging(verbose); } public UserManager getUserManager() { return UserManager.get(mContext); } public WifiMetrics getWifiMetrics() { return mWifiMetrics; } public WifiP2pMetrics getWifiP2pMetrics() { return mWifiP2pMetrics; } public SupplicantStaIfaceHal getSupplicantStaIfaceHal() { return mSupplicantStaIfaceHal; } public BackupManagerProxy getBackupManagerProxy() { return mBackupManagerProxy; } public FrameworkFacade getFrameworkFacade() { return mFrameworkFacade; } public HandlerThread getWifiServiceHandlerThread() { return mWifiServiceHandlerThread; } public HandlerThread getWifiP2pServiceHandlerThread() { return mWifiP2pServiceHandlerThread; } public HandlerThread getWifiCoreHandlerThread() { return mWifiCoreHandlerThread; } public WifiTrafficPoller getWifiTrafficPoller() { return mWifiTrafficPoller; } public WifiCountryCode getWifiCountryCode() { return mCountryCode; } public WifiApConfigStore getWifiApConfigStore() { return mWifiApConfigStore; } public SarManager getSarManager() { return mSarManager; } public ClientModeImpl getClientModeImpl() { return mClientModeImpl; } public Handler getClientModeImplHandler() { return mClientModeImpl.getHandler(); } public ActiveModeWarden getActiveModeWarden() { return mActiveModeWarden; } public WifiSettingsStore getWifiSettingsStore() { return mSettingsStore; } public WifiLockManager getWifiLockManager() { return mLockManager; } public WifiController getWifiController() { return mWifiController; } public WifiLastResortWatchdog getWifiLastResortWatchdog() { return mWifiLastResortWatchdog; } public Clock getClock() { return mClock; } public PropertyService getPropertyService() { return mPropertyService; } public BuildProperties getBuildProperties() { return mBuildProperties; } public KeyStore getKeyStore() { return mKeyStore; } public WifiBackupRestore getWifiBackupRestore() { return mWifiBackupRestore; } public WifiMulticastLockManager getWifiMulticastLockManager() { return mWifiMulticastLockManager; } public WifiConfigManager getWifiConfigManager() { return mWifiConfigManager; } public PasspointManager getPasspointManager() { return mPasspointManager; } public CarrierNetworkConfig getCarrierNetworkConfig() { return mCarrierNetworkConfig; } public WakeupController getWakeupController() { return mWakeupController; } public ScoringParams getScoringParams() { return mScoringParams; } public WifiScoreCard getWifiScoreCard() { return mWifiScoreCard; } public TelephonyManager makeTelephonyManager() { return (TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE); } public WifiStateTracker getWifiStateTracker() { return mWifiStateTracker; } public DppManager getDppManager() { return mDppManager; } /** Gets IWificond without caching. */ public IWificond makeWificond() { // We depend on being able to refresh our binder in ClientModeImpl, so don't cache it. IBinder binder = ServiceManager.getService(WIFICOND_SERVICE_NAME); return IWificond.Stub.asInterface(binder); } /** * Create a SoftApManager. * @param config SoftApModeConfiguration object holding the config and mode * @return an instance of SoftApManager */ public SoftApManager makeSoftApManager(@NonNull WifiManager.SoftApCallback callback, @NonNull SoftApModeConfiguration config) { return new SoftApManager(mContext, mWifiCoreHandlerThread.getLooper(), mFrameworkFacade, mWifiNative, mCountryCode.getCountryCode(), callback, mWifiApConfigStore, config, mWifiMetrics, mSarManager); } /** * Create a ScanOnlyModeManager * * @param listener listener for ScanOnlyModeManager state changes * @return a new instance of ScanOnlyModeManager */ public ScanOnlyModeManager makeScanOnlyModeManager( @NonNull ScanOnlyModeManager.Listener listener) { return new ScanOnlyModeManager(mContext, mWifiCoreHandlerThread.getLooper(), mWifiNative, listener, mWifiMetrics, mWakeupController, mSarManager); } /** * Create a ClientModeManager * * @param listener listener for ClientModeManager state changes * @return a new instance of ClientModeManager */ public ClientModeManager makeClientModeManager(ClientModeManager.Listener listener) { return new ClientModeManager(mContext, mWifiCoreHandlerThread.getLooper(), mWifiNative, listener, mWifiMetrics, mClientModeImpl); } /** * Create a WifiLog instance. * @param tag module name to include in all log messages */ public WifiLog makeLog(String tag) { return new LogcatLog(tag); } public BaseWifiDiagnostics getWifiDiagnostics() { return mWifiDiagnostics; } /** * Obtain an instance of WifiScanner. * If it was not already created, then obtain an instance. Note, this must be done lazily since * WifiScannerService is separate and created later. */ public synchronized WifiScanner getWifiScanner() { if (mWifiScanner == null) { mWifiScanner = new WifiScanner(mContext, IWifiScanner.Stub.asInterface(ServiceManager.getService( Context.WIFI_SCANNING_SERVICE)), mWifiCoreHandlerThread.getLooper()); } return mWifiScanner; } /** * Construct a new instance of WifiConnectivityManager & its dependencies. * * Create and return a new WifiConnectivityManager. * @param clientModeImpl Instance of client mode impl. * TODO(b/116233964): Remove cyclic dependency between WifiConnectivityManager & ClientModeImpl. */ public WifiConnectivityManager makeWifiConnectivityManager(ClientModeImpl clientModeImpl) { mOpenNetworkNotifier = new OpenNetworkNotifier(mContext, mWifiCoreHandlerThread.getLooper(), mFrameworkFacade, mClock, mWifiMetrics, mWifiConfigManager, mWifiConfigStore, clientModeImpl, new ConnectToNetworkNotificationBuilder(mContext, mFrameworkFacade)); mCarrierNetworkNotifier = new CarrierNetworkNotifier(mContext, mWifiCoreHandlerThread.getLooper(), mFrameworkFacade, mClock, mWifiMetrics, mWifiConfigManager, mWifiConfigStore, clientModeImpl, new ConnectToNetworkNotificationBuilder(mContext, mFrameworkFacade)); mWifiLastResortWatchdog = new WifiLastResortWatchdog(this, mContext, mClock, mWifiMetrics, clientModeImpl, clientModeImpl.getHandler().getLooper(), mDeviceConfigFacade); return new WifiConnectivityManager(mContext, getScoringParams(), clientModeImpl, this, mWifiConfigManager, clientModeImpl.getWifiInfo(), mWifiNetworkSelector, mWifiConnectivityHelper, mWifiLastResortWatchdog, mOpenNetworkNotifier, mCarrierNetworkNotifier, mCarrierNetworkConfig, mWifiMetrics, mWifiCoreHandlerThread.getLooper(), mClock, mConnectivityLocalLog); } /** * Construct a new instance of {@link WifiNetworkFactory}. * TODO(b/116233964): Remove cyclic dependency between WifiConnectivityManager & ClientModeImpl. */ public WifiNetworkFactory makeWifiNetworkFactory( NetworkCapabilities nc, WifiConnectivityManager wifiConnectivityManager) { return new WifiNetworkFactory( mWifiCoreHandlerThread.getLooper(), mContext, nc, (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE), (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE), (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE), mClock, this, wifiConnectivityManager, mWifiConfigManager, mWifiConfigStore, mWifiPermissionsUtil, mWifiMetrics); } /** * Construct an instance of {@link NetworkRequestStoreData}. */ public NetworkRequestStoreData makeNetworkRequestStoreData( NetworkRequestStoreData.DataSource dataSource) { return new NetworkRequestStoreData(dataSource); } /** * Construct a new instance of {@link UntrustedWifiNetworkFactory}. * TODO(b/116233964): Remove cyclic dependency between WifiConnectivityManager & ClientModeImpl. */ public UntrustedWifiNetworkFactory makeUntrustedWifiNetworkFactory( NetworkCapabilities nc, WifiConnectivityManager wifiConnectivityManager) { return new UntrustedWifiNetworkFactory( mWifiCoreHandlerThread.getLooper(), mContext, nc, wifiConnectivityManager); } /** * Construct an instance of {@link NetworkSuggestionStoreData}. */ public NetworkSuggestionStoreData makeNetworkSuggestionStoreData( NetworkSuggestionStoreData.DataSource dataSource) { return new NetworkSuggestionStoreData(dataSource); } public WifiPermissionsUtil getWifiPermissionsUtil() { return mWifiPermissionsUtil; } public WifiPermissionsWrapper getWifiPermissionsWrapper() { return mWifiPermissionsWrapper; } /** * Returns a singleton instance of a HandlerThread for injection. Uses lazy initialization. * * TODO: share worker thread with other Wi-Fi handlers (b/27924886) */ public HandlerThread getWifiAwareHandlerThread() { if (mWifiAwareHandlerThread == null) { // lazy initialization mWifiAwareHandlerThread = new HandlerThread("wifiAwareService"); mWifiAwareHandlerThread.start(); } return mWifiAwareHandlerThread; } /** * Returns a singleton instance of a HandlerThread for injection. Uses lazy initialization. * * TODO: share worker thread with other Wi-Fi handlers (b/27924886) */ public HandlerThread getRttHandlerThread() { if (mRttHandlerThread == null) { // lazy initialization mRttHandlerThread = new HandlerThread("wifiRttService"); mRttHandlerThread.start(); } return mRttHandlerThread; } /** * Returns a single instance of HalDeviceManager for injection. */ public HalDeviceManager getHalDeviceManager() { return mHalDeviceManager; } public WifiNative getWifiNative() { return mWifiNative; } public WifiMonitor getWifiMonitor() { return mWifiMonitor; } public WifiP2pNative getWifiP2pNative() { return mWifiP2pNative; } public WifiP2pMonitor getWifiP2pMonitor() { return mWifiP2pMonitor; } public SelfRecovery getSelfRecovery() { return mSelfRecovery; } public PowerProfile getPowerProfile() { return new PowerProfile(mContext, false); } public ScanRequestProxy getScanRequestProxy() { return mScanRequestProxy; } public Runtime getJavaRuntime() { return Runtime.getRuntime(); } public ActivityManagerService getActivityManagerService() { return (ActivityManagerService) ActivityManager.getService(); } public WifiDataStall getWifiDataStall() { return mWifiDataStall; } public WifiNetworkSuggestionsManager getWifiNetworkSuggestionsManager() { return mWifiNetworkSuggestionsManager; } public IpMemoryStore getIpMemoryStore() { return mIpMemoryStore; } public HostapdHal getHostapdHal() { return mHostapdHal; } }