• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.wifi;
18 
19 import android.annotation.NonNull;
20 import android.annotation.Nullable;
21 import android.annotation.SuppressLint;
22 import android.app.ActivityManager;
23 import android.app.AlarmManager;
24 import android.app.AppOpsManager;
25 import android.app.BroadcastOptions;
26 import android.app.StatsManager;
27 import android.content.Context;
28 import android.net.IpMemoryStore;
29 import android.net.LinkProperties;
30 import android.net.MatchAllNetworkSpecifier;
31 import android.net.NetworkAgentConfig;
32 import android.net.NetworkCapabilities;
33 import android.net.NetworkProvider;
34 import android.net.wifi.WifiContext;
35 import android.net.wifi.WifiScanner;
36 import android.net.wifi.nl80211.WifiNl80211Manager;
37 import android.os.BatteryManager;
38 import android.os.BatteryStatsManager;
39 import android.os.Handler;
40 import android.os.HandlerThread;
41 import android.os.Looper;
42 import android.os.Process;
43 import android.os.UserManager;
44 import android.os.WorkSource;
45 import android.provider.Settings.Secure;
46 import android.security.keystore.AndroidKeyStoreProvider;
47 import android.telephony.CarrierConfigManager;
48 import android.telephony.SubscriptionManager;
49 import android.telephony.TelephonyManager;
50 import android.util.LocalLog;
51 import android.util.Log;
52 
53 import com.android.internal.annotations.VisibleForTesting;
54 import com.android.modules.utils.build.SdkLevel;
55 import com.android.server.wifi.aware.WifiAwareMetrics;
56 import com.android.server.wifi.coex.CoexManager;
57 import com.android.server.wifi.hotspot2.PasspointManager;
58 import com.android.server.wifi.hotspot2.PasspointNetworkNominateHelper;
59 import com.android.server.wifi.hotspot2.PasspointObjectFactory;
60 import com.android.server.wifi.p2p.SupplicantP2pIfaceHal;
61 import com.android.server.wifi.p2p.WifiP2pMetrics;
62 import com.android.server.wifi.p2p.WifiP2pMonitor;
63 import com.android.server.wifi.p2p.WifiP2pNative;
64 import com.android.server.wifi.rtt.RttMetrics;
65 import com.android.server.wifi.util.KeystoreWrapper;
66 import com.android.server.wifi.util.LastCallerInfoManager;
67 import com.android.server.wifi.util.LruConnectionTracker;
68 import com.android.server.wifi.util.NetdWrapper;
69 import com.android.server.wifi.util.SettingsMigrationDataHolder;
70 import com.android.server.wifi.util.WifiPermissionsUtil;
71 import com.android.server.wifi.util.WifiPermissionsWrapper;
72 import com.android.server.wifi.util.WorkSourceHelper;
73 import com.android.wifi.resources.R;
74 
75 import java.io.BufferedReader;
76 import java.io.FileNotFoundException;
77 import java.io.FileReader;
78 import java.security.KeyStore;
79 import java.security.KeyStoreException;
80 import java.security.NoSuchProviderException;
81 import java.util.Random;
82 
83 /**
84  *  WiFi dependency injector. To be used for accessing various WiFi class instances and as a
85  *  handle for mock injection.
86  *
87  *  Some WiFi class instances currently depend on having a Looper from a HandlerThread that has
88  *  been started. To accommodate this, we have a two-phased approach to initialize and retrieve
89  *  an instance of the WifiInjector.
90  */
91 public class WifiInjector {
92     private static final String TAG = "WifiInjector";
93     private static final String BOOT_DEFAULT_WIFI_COUNTRY_CODE = "ro.boot.wificountrycode";
94     /**
95      * Maximum number in-memory store network connection order;
96      */
97     private static final int MAX_RECENTLY_CONNECTED_NETWORK = 100;
98 
makeBaseNetworkCapatibilitiesFilterBuilder()99     private static NetworkCapabilities.Builder makeBaseNetworkCapatibilitiesFilterBuilder() {
100         NetworkCapabilities.Builder builder = new NetworkCapabilities.Builder()
101                 .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
102                 .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
103                 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)
104                 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING)
105                 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED)
106                 .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED)
107                 .setLinkUpstreamBandwidthKbps(1024 * 1024)
108                 .setLinkDownstreamBandwidthKbps(1024 * 1024)
109                 .setNetworkSpecifier(new MatchAllNetworkSpecifier());
110         if (SdkLevel.isAtLeastS()) {
111             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_VCN_MANAGED);
112         }
113         return builder;
114     }
115 
116     @VisibleForTesting
117     public static final NetworkCapabilities REGULAR_NETWORK_CAPABILITIES_FILTER =
118             makeBaseNetworkCapatibilitiesFilterBuilder()
119                     .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
120                     .build();
121 
makeOemNetworkCapatibilitiesFilter()122     private static NetworkCapabilities makeOemNetworkCapatibilitiesFilter() {
123         NetworkCapabilities.Builder builder =
124                 makeBaseNetworkCapatibilitiesFilterBuilder()
125                 .addCapability(NetworkCapabilities.NET_CAPABILITY_OEM_PAID);
126         if (SdkLevel.isAtLeastS()) {
127             // OEM_PRIVATE capability was only added in Android S.
128             builder.addCapability(NetworkCapabilities.NET_CAPABILITY_OEM_PRIVATE);
129         }
130         return builder.build();
131     }
132 
133     private static final NetworkCapabilities OEM_NETWORK_CAPABILITIES_FILTER =
134             makeOemNetworkCapatibilitiesFilter();
135 
136     private static final NetworkCapabilities RESTRICTED_NETWORK_CAPABILITIES_FILTER =
137             makeBaseNetworkCapatibilitiesFilterBuilder()
138                     .removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
139                     .build();
140 
141 
142     static WifiInjector sWifiInjector = null;
143 
144     private final WifiContext mContext;
145     private final BatteryStatsManager mBatteryStats;
146     private final FrameworkFacade mFrameworkFacade = new FrameworkFacade();
147     private final DeviceConfigFacade mDeviceConfigFacade;
148     private final UserManager mUserManager;
149     private final HandlerThread mWifiHandlerThread;
150     private final HandlerThread mWifiP2pServiceHandlerThread;
151     private final HandlerThread mPasspointProvisionerHandlerThread;
152     private final HandlerThread mWifiDiagnosticsHandlerThread;
153     private final WifiTrafficPoller mWifiTrafficPoller;
154     private final WifiCountryCode mCountryCode;
155     private final BackupManagerProxy mBackupManagerProxy = new BackupManagerProxy();
156     private final WifiApConfigStore mWifiApConfigStore;
157     private final WifiNative mWifiNative;
158     private final WifiMonitor mWifiMonitor;
159     private final WifiP2pNative mWifiP2pNative;
160     private final WifiP2pMonitor mWifiP2pMonitor;
161     private final SupplicantStaIfaceHal mSupplicantStaIfaceHal;
162     private final SupplicantP2pIfaceHal mSupplicantP2pIfaceHal;
163     private final HostapdHal mHostapdHal;
164     private final WifiVendorHal mWifiVendorHal;
165     private final ScoringParams mScoringParams;
166     private final ActiveModeWarden mActiveModeWarden;
167     private final WifiSettingsStore mSettingsStore;
168     private final OpenNetworkNotifier mOpenNetworkNotifier;
169     private final WifiLockManager mLockManager;
170     private final WifiNl80211Manager mWifiCondManager;
171     private final Clock mClock = new Clock();
172     private final WifiMetrics mWifiMetrics;
173     private final WifiP2pMetrics mWifiP2pMetrics;
174     private final WifiLastResortWatchdog mWifiLastResortWatchdog;
175     private final PropertyService mPropertyService = new SystemPropertyService();
176     private final BuildProperties mBuildProperties = new SystemBuildProperties();
177     private final WifiBackupRestore mWifiBackupRestore;
178     // This will only be null if SdkLevel is not at least S
179     @Nullable private final CoexManager mCoexManager;
180     private final SoftApBackupRestore mSoftApBackupRestore;
181     private final WifiMulticastLockManager mWifiMulticastLockManager;
182     private final WifiConfigStore mWifiConfigStore;
183     private final WifiKeyStore mWifiKeyStore;
184     private final WifiConfigManager mWifiConfigManager;
185     private final WifiConnectivityHelper mWifiConnectivityHelper;
186     private final LocalLog mConnectivityLocalLog;
187     private final LocalLog mWifiAwareLocalLog;
188     private final LocalLog mWifiHandlerLocalLog;
189     private final ThroughputScorer mThroughputScorer;
190     private final WifiNetworkSelector mWifiNetworkSelector;
191     private final SavedNetworkNominator mSavedNetworkNominator;
192     private final NetworkSuggestionNominator mNetworkSuggestionNominator;
193     private final ClientModeManagerBroadcastQueue mBroadcastQueue;
194     private WifiScanner mWifiScanner;
195     private final WifiPermissionsWrapper mWifiPermissionsWrapper;
196     private final WifiPermissionsUtil mWifiPermissionsUtil;
197     private final PasspointManager mPasspointManager;
198     private HandlerThread mWifiAwareHandlerThread;
199     private HandlerThread mRttHandlerThread;
200     private final HalDeviceManager mHalDeviceManager;
201     private final WifiStateTracker mWifiStateTracker;
202     private final SelfRecovery mSelfRecovery;
203     private final WakeupController mWakeupController;
204     private final ScanRequestProxy mScanRequestProxy;
205     private final SarManager mSarManager;
206     private final WifiDiagnostics mWifiDiagnostics;
207     private final WifiDataStall mWifiDataStall;
208     private final WifiScoreCard mWifiScoreCard;
209     private final WifiNetworkSuggestionsManager mWifiNetworkSuggestionsManager;
210     private final DppMetrics mDppMetrics;
211     private final DppManager mDppManager;
212     private final WifiPulledAtomLogger mWifiPulledAtomLogger;
213     private final LinkProbeManager mLinkProbeManager;
214     private IpMemoryStore mIpMemoryStore;
215     private final WifiThreadRunner mWifiThreadRunner;
216     private final WifiBlocklistMonitor mWifiBlocklistMonitor;
217     private final MacAddressUtil mMacAddressUtil = new MacAddressUtil(new KeystoreWrapper());
218     private final MboOceController mMboOceController;
219     private final WifiPseudonymManager mWifiPseudonymManager;
220     private final WifiCarrierInfoManager mWifiCarrierInfoManager;
221     private final WifiChannelUtilization mWifiChannelUtilizationScan;
222     private final KeyStore mKeyStore;
223     private final ConnectionFailureNotificationBuilder mConnectionFailureNotificationBuilder;
224     private final ThroughputPredictor mThroughputPredictor;
225     private NetdWrapper mNetdWrapper;
226     private final WifiHealthMonitor mWifiHealthMonitor;
227     private final WifiSettingsConfigStore mSettingsConfigStore;
228     private final WifiScanAlwaysAvailableSettingsCompatibility
229             mWifiScanAlwaysAvailableSettingsCompatibility;
230     private final SettingsMigrationDataHolder mSettingsMigrationDataHolder;
231     private final LruConnectionTracker mLruConnectionTracker;
232     private final WifiConnectivityManager mWifiConnectivityManager;
233     private final ExternalPnoScanRequestManager mExternalPnoScanRequestManager;
234     private final ConnectHelper mConnectHelper;
235     private final ConnectionFailureNotifier mConnectionFailureNotifier;
236     private final WifiNetworkFactory mWifiNetworkFactory;
237     private final UntrustedWifiNetworkFactory mUntrustedWifiNetworkFactory;
238     private final OemWifiNetworkFactory mOemWifiNetworkFactory;
239     private final RestrictedWifiNetworkFactory mRestrictedWifiNetworkFactory;
240     private final MultiInternetWifiNetworkFactory mMultiInternetWifiNetworkFactory;
241     private final WifiP2pConnection mWifiP2pConnection;
242     private final WifiGlobals mWifiGlobals;
243     private final SimRequiredNotifier mSimRequiredNotifier;
244     private final DefaultClientModeManager mDefaultClientModeManager;
245     private final AdaptiveConnectivityEnabledSettingObserver
246             mAdaptiveConnectivityEnabledSettingObserver;
247     private final MakeBeforeBreakManager mMakeBeforeBreakManager;
248     private final MultiInternetManager mMultiInternetManager;
249     private final ClientModeImplMonitor mCmiMonitor = new ClientModeImplMonitor();
250     private final ExternalScoreUpdateObserverProxy mExternalScoreUpdateObserverProxy;
251     private final WifiNotificationManager mWifiNotificationManager;
252     private final LastCallerInfoManager mLastCallerInfoManager;
253     private final InterfaceConflictManager mInterfaceConflictManager;
254     @NonNull private final WifiDialogManager mWifiDialogManager;
255     @NonNull private final SsidTranslator mSsidTranslator;
256     @NonNull private final ApplicationQosPolicyRequestHandler mApplicationQosPolicyRequestHandler;
257 
WifiInjector(WifiContext context)258     public WifiInjector(WifiContext context) {
259         if (context == null) {
260             throw new IllegalStateException(
261                     "WifiInjector should not be initialized with a null Context.");
262         }
263 
264         if (sWifiInjector != null) {
265             throw new IllegalStateException(
266                     "WifiInjector was already created, use getInstance instead.");
267         }
268 
269         sWifiInjector = this;
270         mLastCallerInfoManager = new LastCallerInfoManager();
271         mContext = context;
272 
273         // Now create and start handler threads
274         mWifiHandlerThread = new HandlerThread("WifiHandlerThread");
275         mWifiHandlerThread.start();
276         Looper wifiLooper = mWifiHandlerThread.getLooper();
277         mWifiHandlerLocalLog = new LocalLog(1024);
278         WifiAwareMetrics awareMetrics = new WifiAwareMetrics(mClock);
279         RttMetrics rttMetrics = new RttMetrics(mClock);
280         mDppMetrics = new DppMetrics();
281         mWifiMonitor = new WifiMonitor();
282         mBatteryStats = context.getSystemService(BatteryStatsManager.class);
283         mWifiP2pMetrics = new WifiP2pMetrics(mClock, mContext);
284         mWifiMetrics = new WifiMetrics(mContext, mFrameworkFacade, mClock, wifiLooper,
285                 awareMetrics, rttMetrics, new WifiPowerMetrics(mBatteryStats), mWifiP2pMetrics,
286                 mDppMetrics, mWifiMonitor);
287         RunnerHandler wifiHandler = new RunnerHandler(wifiLooper, context.getResources().getInteger(
288                 R.integer.config_wifiConfigurationWifiRunnerThresholdInMs),
289                 mWifiHandlerLocalLog, mWifiMetrics);
290         mWifiDiagnosticsHandlerThread = new HandlerThread("WifiDiagnostics");
291         mWifiDiagnosticsHandlerThread.start();
292 
293 
294         mWifiNotificationManager = new WifiNotificationManager(mContext);
295         mWifiGlobals = new WifiGlobals(mContext);
296         mScoringParams = new ScoringParams(mContext);
297         mWifiChannelUtilizationScan = new WifiChannelUtilization(mClock, mContext);
298         mSettingsMigrationDataHolder = new SettingsMigrationDataHolder(mContext);
299         mConnectionFailureNotificationBuilder = new ConnectionFailureNotificationBuilder(
300                 mContext, mFrameworkFacade);
301 
302         mWifiPermissionsWrapper = new WifiPermissionsWrapper(mContext);
303         mUserManager = mContext.getSystemService(UserManager.class);
304         mWifiPermissionsUtil = new WifiPermissionsUtil(mWifiPermissionsWrapper, mContext,
305                 mUserManager, this);
306         mWifiBackupRestore = new WifiBackupRestore(mWifiPermissionsUtil);
307         mSoftApBackupRestore = new SoftApBackupRestore(mContext, mSettingsMigrationDataHolder);
308         mWifiStateTracker = new WifiStateTracker(mBatteryStats);
309         mWifiThreadRunner = new WifiThreadRunner(wifiHandler);
310         mWifiDialogManager = new WifiDialogManager(mContext, mWifiThreadRunner, mFrameworkFacade);
311         mSsidTranslator = new SsidTranslator(mContext, wifiHandler);
312         mWifiP2pServiceHandlerThread = new HandlerThread("WifiP2pService");
313         mWifiP2pServiceHandlerThread.start();
314         mPasspointProvisionerHandlerThread =
315                 new HandlerThread("PasspointProvisionerHandlerThread");
316         mPasspointProvisionerHandlerThread.start();
317         mDeviceConfigFacade = new DeviceConfigFacade(mContext, wifiHandler, mWifiMetrics);
318         mAdaptiveConnectivityEnabledSettingObserver =
319                 new AdaptiveConnectivityEnabledSettingObserver(wifiHandler, mWifiMetrics,
320                         mFrameworkFacade, mContext);
321         // Modules interacting with Native.
322         mHalDeviceManager = new HalDeviceManager(mContext, mClock, this, wifiHandler);
323         mInterfaceConflictManager = new InterfaceConflictManager(this, mContext, mFrameworkFacade,
324                 mHalDeviceManager, mWifiThreadRunner, mWifiDialogManager, new LocalLog(
325                 mContext.getSystemService(ActivityManager.class).isLowRamDevice() ? 128 : 256));
326         mWifiVendorHal = new WifiVendorHal(mContext, mHalDeviceManager, wifiHandler, mWifiGlobals,
327                 mSsidTranslator);
328         mSupplicantStaIfaceHal = new SupplicantStaIfaceHal(
329                 mContext, mWifiMonitor, mFrameworkFacade, wifiHandler, mClock, mWifiMetrics,
330                 mWifiGlobals, mSsidTranslator, this);
331         mHostapdHal = new HostapdHal(mContext, wifiHandler);
332         mWifiCondManager = (WifiNl80211Manager) mContext.getSystemService(
333                 Context.WIFI_NL80211_SERVICE);
334         mWifiNative = new WifiNative(
335                 mWifiVendorHal, mSupplicantStaIfaceHal, mHostapdHal, mWifiCondManager,
336                 mWifiMonitor, mPropertyService, mWifiMetrics,
337                 wifiHandler, new Random(), mBuildProperties, this);
338         mWifiP2pMonitor = new WifiP2pMonitor();
339         mSupplicantP2pIfaceHal = new SupplicantP2pIfaceHal(mWifiP2pMonitor, mWifiGlobals, this);
340         mWifiP2pNative = new WifiP2pNative(mWifiCondManager, mWifiNative, mWifiMetrics,
341                 mWifiVendorHal, mSupplicantP2pIfaceHal, mHalDeviceManager, mPropertyService);
342         SubscriptionManager subscriptionManager =
343                 mContext.getSystemService(SubscriptionManager.class);
344         if (SdkLevel.isAtLeastS()) {
345             mCoexManager = new CoexManager(mContext, mWifiNative, makeTelephonyManager(),
346                     subscriptionManager, mContext.getSystemService(CarrierConfigManager.class),
347                     wifiHandler);
348         } else {
349             mCoexManager = null;
350         }
351 
352         // Now get instances of all the objects that depend on the HandlerThreads
353         mWifiTrafficPoller = new WifiTrafficPoller(mContext);
354         // WifiConfigManager/Store objects and their dependencies.
355         KeyStore keyStore = null;
356         try {
357             keyStore = AndroidKeyStoreProvider.getKeyStoreForUid(Process.WIFI_UID);
358         } catch (KeyStoreException | NoSuchProviderException e) {
359             Log.wtf(TAG, "Failed to load keystore", e);
360         }
361         mKeyStore = keyStore;
362         mWifiKeyStore = new WifiKeyStore(mContext, mKeyStore, mFrameworkFacade);
363         // New config store
364         mWifiConfigStore = new WifiConfigStore(mContext, wifiHandler, mClock, mWifiMetrics,
365                 WifiConfigStore.createSharedFiles(mFrameworkFacade.isNiapModeOn(mContext)));
366         mWifiPseudonymManager = new WifiPseudonymManager(
367                 mContext, this, mClock, wifiLooper);
368         mWifiCarrierInfoManager = new WifiCarrierInfoManager(makeTelephonyManager(),
369                 subscriptionManager, this, mFrameworkFacade, mContext,
370                 mWifiConfigStore, wifiHandler, mWifiMetrics, mClock, mWifiPseudonymManager);
371         String l2KeySeed = Secure.getString(mContext.getContentResolver(), Secure.ANDROID_ID);
372         mWifiScoreCard = new WifiScoreCard(mClock, l2KeySeed, mDeviceConfigFacade,
373                 mContext, mWifiGlobals);
374         mWifiMetrics.setWifiScoreCard(mWifiScoreCard);
375         mLruConnectionTracker = new LruConnectionTracker(MAX_RECENTLY_CONNECTED_NETWORK,
376                 mContext);
377         mWifiConnectivityHelper = new WifiConnectivityHelper(this);
378         int maxLinesLowRam = mContext.getResources().getInteger(
379                 R.integer.config_wifiConnectivityLocalLogMaxLinesLowRam);
380         int maxLinesHighRam = mContext.getResources().getInteger(
381                 R.integer.config_wifiConnectivityLocalLogMaxLinesHighRam);
382         mConnectivityLocalLog = new LocalLog(
383                 mContext.getSystemService(ActivityManager.class).isLowRamDevice() ? maxLinesLowRam
384                         : maxLinesHighRam);
385         mWifiAwareLocalLog = new LocalLog(
386                 mContext.getSystemService(ActivityManager.class).isLowRamDevice() ? maxLinesLowRam
387                         : maxLinesHighRam);
388         mWifiDiagnostics = new WifiDiagnostics(
389                 mContext, this, mWifiNative, mBuildProperties,
390                 new LastMileLogger(this), mClock, mWifiDiagnosticsHandlerThread.getLooper());
391         mWifiLastResortWatchdog = new WifiLastResortWatchdog(this, mContext, mClock,
392                 mWifiMetrics, mWifiDiagnostics, wifiLooper,
393                 mDeviceConfigFacade, mWifiThreadRunner, mWifiMonitor);
394         mWifiBlocklistMonitor = new WifiBlocklistMonitor(mContext, mWifiConnectivityHelper,
395                 mWifiLastResortWatchdog, mClock, new LocalLog(
396                 mContext.getSystemService(ActivityManager.class).isLowRamDevice() ? 128 : 256),
397                 mWifiScoreCard, mScoringParams, mWifiMetrics, mWifiPermissionsUtil);
398         mWifiMetrics.setWifiBlocklistMonitor(mWifiBlocklistMonitor);
399         // Config Manager
400         mWifiConfigManager = new WifiConfigManager(mContext, mWifiKeyStore, mWifiConfigStore,
401                 new NetworkListSharedStoreData(mContext),
402                 new NetworkListUserStoreData(mContext),
403                 new RandomizedMacStoreData(),
404                 mLruConnectionTracker, this);
405         mSettingsConfigStore = new WifiSettingsConfigStore(context, wifiHandler,
406                 mSettingsMigrationDataHolder, mWifiConfigManager, mWifiConfigStore);
407         mSettingsStore = new WifiSettingsStore(mContext, mSettingsConfigStore, mWifiThreadRunner,
408                 mFrameworkFacade, mWifiNotificationManager, mDeviceConfigFacade,
409                 mWifiMetrics, mClock);
410         mWifiMetrics.setWifiConfigManager(mWifiConfigManager);
411         mWifiMetrics.setWifiSettingsStore(mSettingsStore);
412 
413         mWifiMetrics.setScoringParams(mScoringParams);
414         mThroughputPredictor = new ThroughputPredictor(mContext);
415         mScanRequestProxy = new ScanRequestProxy(mContext,
416                 mContext.getSystemService(AppOpsManager.class),
417                 mContext.getSystemService(ActivityManager.class),
418                 this, mWifiConfigManager,
419                 mWifiPermissionsUtil, mWifiMetrics, mClock, wifiHandler, mSettingsConfigStore);
420         mWifiBlocklistMonitor.setScanRequestProxy(mScanRequestProxy);
421         mSarManager = new SarManager(mContext, makeTelephonyManager(), wifiLooper,
422                 mWifiNative);
423         mWifiNetworkSelector = new WifiNetworkSelector(mContext, mWifiScoreCard, mScoringParams,
424                 mWifiConfigManager, mClock, mConnectivityLocalLog, mWifiMetrics, this,
425                 mThroughputPredictor, mWifiChannelUtilizationScan, mWifiGlobals,
426                 mScanRequestProxy, mWifiNative);
427         CompatibilityScorer compatibilityScorer = new CompatibilityScorer(mScoringParams);
428         mWifiNetworkSelector.registerCandidateScorer(compatibilityScorer);
429         ScoreCardBasedScorer scoreCardBasedScorer = new ScoreCardBasedScorer(mScoringParams);
430         mWifiNetworkSelector.registerCandidateScorer(scoreCardBasedScorer);
431         BubbleFunScorer bubbleFunScorer = new BubbleFunScorer(mScoringParams);
432         mWifiNetworkSelector.registerCandidateScorer(bubbleFunScorer);
433         mThroughputScorer = new ThroughputScorer(mContext, mScoringParams);
434         mWifiNetworkSelector.registerCandidateScorer(mThroughputScorer);
435         mWifiMetrics.setWifiNetworkSelector(mWifiNetworkSelector);
436         mWifiNetworkSuggestionsManager = new WifiNetworkSuggestionsManager(mContext, wifiHandler,
437                 this, mWifiPermissionsUtil, mWifiConfigManager, mWifiConfigStore, mWifiMetrics,
438                 mWifiCarrierInfoManager, mWifiKeyStore, mLruConnectionTracker,
439                 mClock);
440         mPasspointManager = new PasspointManager(mContext, this,
441                 wifiHandler, mWifiNative, mWifiKeyStore, mClock, new PasspointObjectFactory(),
442                 mWifiConfigManager, mWifiConfigStore, mSettingsStore, mWifiMetrics,
443                 mWifiCarrierInfoManager, mMacAddressUtil, mWifiPermissionsUtil);
444         PasspointNetworkNominateHelper nominateHelper =
445                 new PasspointNetworkNominateHelper(mPasspointManager, mWifiConfigManager,
446                         mConnectivityLocalLog, mWifiCarrierInfoManager, mContext.getResources(),
447                         mClock);
448         mPasspointManager.setPasspointNetworkNominateHelper(nominateHelper);
449         mSavedNetworkNominator = new SavedNetworkNominator(
450                 mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mWifiCarrierInfoManager,
451                 mWifiPseudonymManager, mWifiPermissionsUtil, mWifiNetworkSuggestionsManager);
452         mNetworkSuggestionNominator = new NetworkSuggestionNominator(mWifiNetworkSuggestionsManager,
453                 mWifiConfigManager, nominateHelper, mConnectivityLocalLog, mWifiCarrierInfoManager,
454                 mWifiPseudonymManager, mWifiMetrics);
455 
456         mWifiMetrics.setPasspointManager(mPasspointManager);
457         WifiChannelUtilization wifiChannelUtilizationConnected =
458                 new WifiChannelUtilization(mClock, mContext);
459         mWifiMetrics.setWifiChannelUtilization(wifiChannelUtilizationConnected);
460         mLinkProbeManager = new LinkProbeManager(mClock, mWifiNative, mWifiMetrics,
461                 mFrameworkFacade, wifiHandler, mContext);
462         mDefaultClientModeManager = new DefaultClientModeManager();
463         mExternalScoreUpdateObserverProxy =
464                 new ExternalScoreUpdateObserverProxy(mWifiThreadRunner);
465         mDppManager = new DppManager(this, wifiHandler, mWifiNative,
466                 mWifiConfigManager, mContext, mDppMetrics, mScanRequestProxy, mWifiPermissionsUtil);
467         mActiveModeWarden = new ActiveModeWarden(this, wifiLooper,
468                 mWifiNative, mDefaultClientModeManager, mBatteryStats, mWifiDiagnostics,
469                 mContext, mSettingsStore, mFrameworkFacade, mWifiPermissionsUtil, mWifiMetrics,
470                 mExternalScoreUpdateObserverProxy, mDppManager);
471         mWifiMetrics.setActiveModeWarden(mActiveModeWarden);
472         mWifiHealthMonitor = new WifiHealthMonitor(mContext, this, mClock, mWifiConfigManager,
473             mWifiScoreCard, wifiHandler, mWifiNative, l2KeySeed, mDeviceConfigFacade,
474             mActiveModeWarden);
475         mWifiDataStall = new WifiDataStall(mWifiMetrics, mContext,
476                 mDeviceConfigFacade, wifiChannelUtilizationConnected, mClock, wifiHandler,
477                 mThroughputPredictor, mActiveModeWarden, mCmiMonitor, mWifiGlobals);
478         mWifiMetrics.setWifiDataStall(mWifiDataStall);
479         mWifiMetrics.setWifiHealthMonitor(mWifiHealthMonitor);
480         mWifiP2pConnection = new WifiP2pConnection(mContext, wifiLooper, mActiveModeWarden);
481         mConnectHelper = new ConnectHelper(mActiveModeWarden, mWifiConfigManager);
482         mBroadcastQueue = new ClientModeManagerBroadcastQueue(mActiveModeWarden, mContext);
483         mMakeBeforeBreakManager = new MakeBeforeBreakManager(mActiveModeWarden, mFrameworkFacade,
484                 mContext, mCmiMonitor, mBroadcastQueue, mWifiMetrics);
485         mOpenNetworkNotifier = new OpenNetworkNotifier(mContext,
486                 wifiLooper, mFrameworkFacade, mClock, mWifiMetrics,
487                 mWifiConfigManager, mWifiConfigStore, mConnectHelper,
488                 new ConnectToNetworkNotificationBuilder(mContext, mFrameworkFacade),
489                 mMakeBeforeBreakManager, mWifiNotificationManager, mWifiPermissionsUtil);
490         mMultiInternetManager = new MultiInternetManager(mActiveModeWarden, mFrameworkFacade,
491                 mContext, mCmiMonitor, mSettingsStore, wifiHandler, mClock);
492         mExternalPnoScanRequestManager = new ExternalPnoScanRequestManager(wifiHandler, mContext);
493         mCountryCode = new WifiCountryCode(mContext, mActiveModeWarden, mWifiP2pMetrics,
494                 mCmiMonitor, mWifiNative, mSettingsConfigStore, mClock, mWifiPermissionsUtil);
495         mWifiConnectivityManager = new WifiConnectivityManager(
496                 mContext, mScoringParams, mWifiConfigManager,
497                 mWifiNetworkSuggestionsManager, mWifiNetworkSelector,
498                 mWifiConnectivityHelper, mWifiLastResortWatchdog, mOpenNetworkNotifier,
499                 mWifiMetrics, wifiHandler,
500                 mClock, mConnectivityLocalLog, mWifiScoreCard, mWifiBlocklistMonitor,
501                 mWifiChannelUtilizationScan, mPasspointManager, mMultiInternetManager,
502                 mDeviceConfigFacade, mActiveModeWarden, mFrameworkFacade, mWifiGlobals,
503                 mExternalPnoScanRequestManager, mSsidTranslator, mWifiPermissionsUtil,
504                 mWifiCarrierInfoManager, mCountryCode, mWifiDialogManager);
505         mMboOceController = new MboOceController(makeTelephonyManager(), mActiveModeWarden,
506                 mWifiThreadRunner);
507         mConnectionFailureNotifier = new ConnectionFailureNotifier(
508                 mContext, mFrameworkFacade, mWifiConfigManager,
509                 mWifiConnectivityManager, wifiHandler,
510                 mWifiNotificationManager, mConnectionFailureNotificationBuilder,
511                 mWifiDialogManager);
512         mWifiNetworkFactory = new WifiNetworkFactory(
513                 wifiLooper, mContext, REGULAR_NETWORK_CAPABILITIES_FILTER,
514                 (ActivityManager) mContext.getSystemService(Context.ACTIVITY_SERVICE),
515                 (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE),
516                 (AppOpsManager) mContext.getSystemService(Context.APP_OPS_SERVICE),
517                 mClock, this, mWifiConnectivityManager, mWifiConfigManager,
518                 mWifiConfigStore, mWifiPermissionsUtil, mWifiMetrics, mWifiNative,
519                 mActiveModeWarden, mConnectHelper, mCmiMonitor, mFrameworkFacade,
520                 mMultiInternetManager);
521         // We can't filter untrusted network in the capabilities filter because a trusted
522         // network would still satisfy a request that accepts untrusted ones.
523         // We need a second network factory for untrusted network requests because we need a
524         // different score filter for these requests.
525         mUntrustedWifiNetworkFactory = new UntrustedWifiNetworkFactory(
526                 wifiLooper, mContext, REGULAR_NETWORK_CAPABILITIES_FILTER,
527                 mWifiConnectivityManager);
528         mOemWifiNetworkFactory = new OemWifiNetworkFactory(
529                 wifiLooper, mContext, OEM_NETWORK_CAPABILITIES_FILTER,
530                 mWifiConnectivityManager);
531         mRestrictedWifiNetworkFactory = new RestrictedWifiNetworkFactory(
532                 wifiLooper, mContext, RESTRICTED_NETWORK_CAPABILITIES_FILTER,
533                 mWifiConnectivityManager);
534         mMultiInternetWifiNetworkFactory = new MultiInternetWifiNetworkFactory(
535                 wifiLooper, mContext, REGULAR_NETWORK_CAPABILITIES_FILTER,
536                 mFrameworkFacade, mContext.getSystemService(AlarmManager.class),
537                 mWifiPermissionsUtil, mMultiInternetManager, mWifiConnectivityManager,
538                 mConnectivityLocalLog);
539         mWifiScanAlwaysAvailableSettingsCompatibility =
540                 new WifiScanAlwaysAvailableSettingsCompatibility(mContext, wifiHandler,
541                         mSettingsStore, mActiveModeWarden, mFrameworkFacade);
542         mWifiApConfigStore = new WifiApConfigStore(
543                 mContext, this, wifiHandler, mBackupManagerProxy,
544                 mWifiConfigStore, mWifiConfigManager, mActiveModeWarden, mWifiMetrics);
545         WakeupNotificationFactory wakeupNotificationFactory =
546                 new WakeupNotificationFactory(mContext, mFrameworkFacade);
547         WakeupOnboarding wakeupOnboarding = new WakeupOnboarding(mContext, mWifiConfigManager,
548                 wifiHandler, mFrameworkFacade, wakeupNotificationFactory, mWifiNotificationManager);
549         mWakeupController = new WakeupController(mContext, wifiHandler,
550                 new WakeupLock(mWifiConfigManager, mWifiMetrics.getWakeupMetrics(), mClock),
551                 new WakeupEvaluator(mScoringParams), wakeupOnboarding, mWifiConfigManager,
552                 mWifiConfigStore, mWifiNetworkSuggestionsManager, mWifiMetrics.getWakeupMetrics(),
553                 this, mFrameworkFacade, mClock, mActiveModeWarden);
554         mLockManager = new WifiLockManager(mContext, mBatteryStats, mActiveModeWarden,
555                 mFrameworkFacade, wifiHandler, mClock, mWifiMetrics, mDeviceConfigFacade,
556                 mWifiPermissionsUtil);
557         mSelfRecovery = new SelfRecovery(mContext, mActiveModeWarden, mClock, mWifiNative,
558                 mWifiGlobals);
559         mWifiMulticastLockManager = new WifiMulticastLockManager(mActiveModeWarden, mBatteryStats,
560                 wifiLooper);
561         mApplicationQosPolicyRequestHandler = new ApplicationQosPolicyRequestHandler(
562                 mActiveModeWarden, mWifiNative, mWifiHandlerThread, mDeviceConfigFacade, mContext);
563 
564         // Register the various network Nominators with the network selector.
565         mWifiNetworkSelector.registerNetworkNominator(mSavedNetworkNominator);
566         mWifiNetworkSelector.registerNetworkNominator(mNetworkSuggestionNominator);
567 
568         mSimRequiredNotifier = new SimRequiredNotifier(mContext, mFrameworkFacade,
569                 mWifiNotificationManager);
570         mWifiPulledAtomLogger = new WifiPulledAtomLogger(
571                 mContext.getSystemService(StatsManager.class), wifiHandler,
572                 mContext);
573     }
574 
575     /**
576      * Obtain an instance of the WifiInjector class.
577      *
578      * This is the generic method to get an instance of the class. The first instance should be
579      * retrieved using the getInstanceWithContext method.
580      */
getInstance()581     public static WifiInjector getInstance() {
582         if (sWifiInjector == null) {
583             throw new IllegalStateException(
584                     "Attempted to retrieve a WifiInjector instance before constructor was called.");
585         }
586         return sWifiInjector;
587     }
588 
589     /**
590      * Enable verbose logging in Injector objects. Called from the WifiServiceImpl (based on
591      * binder call).
592      */
enableVerboseLogging(boolean verboseEnabled, boolean halVerboseEnabled)593     public void enableVerboseLogging(boolean verboseEnabled, boolean halVerboseEnabled) {
594         Log.i(TAG, "enableVerboseLogging " + verboseEnabled + " hal " + halVerboseEnabled);
595         mWifiLastResortWatchdog.enableVerboseLogging(verboseEnabled);
596         mWifiBackupRestore.enableVerboseLogging(verboseEnabled);
597         mHalDeviceManager.enableVerboseLogging(verboseEnabled);
598         mScanRequestProxy.enableVerboseLogging(verboseEnabled);
599         mInterfaceConflictManager.enableVerboseLogging(verboseEnabled);
600         mWakeupController.enableVerboseLogging(verboseEnabled);
601         mWifiNetworkSuggestionsManager.enableVerboseLogging(verboseEnabled);
602         LogcatLog.enableVerboseLogging(verboseEnabled);
603         mDppManager.enableVerboseLogging(verboseEnabled);
604         mWifiCarrierInfoManager.enableVerboseLogging(verboseEnabled);
605         mWifiPseudonymManager.enableVerboseLogging(verboseEnabled);
606         mCountryCode.enableVerboseLogging(verboseEnabled);
607         mWifiDiagnostics.enableVerboseLogging(verboseEnabled, halVerboseEnabled);
608         mWifiMonitor.enableVerboseLogging(verboseEnabled);
609         mWifiNative.enableVerboseLogging(verboseEnabled, halVerboseEnabled);
610         mWifiConfigManager.enableVerboseLogging(verboseEnabled);
611         mPasspointManager.enableVerboseLogging(verboseEnabled);
612         mWifiNetworkFactory.enableVerboseLogging(verboseEnabled);
613         mLinkProbeManager.enableVerboseLogging(verboseEnabled);
614         mMboOceController.enableVerboseLogging(verboseEnabled);
615         mWifiScoreCard.enableVerboseLogging(verboseEnabled);
616         mWifiHealthMonitor.enableVerboseLogging(verboseEnabled);
617         mThroughputPredictor.enableVerboseLogging(verboseEnabled);
618         mWifiDataStall.enableVerboseLogging(verboseEnabled);
619         mWifiConnectivityManager.enableVerboseLogging(verboseEnabled);
620         mThroughputScorer.enableVerboseLogging(verboseEnabled);
621         mWifiNetworkSelector.enableVerboseLogging(verboseEnabled);
622         mMakeBeforeBreakManager.setVerboseLoggingEnabled(verboseEnabled);
623         mMultiInternetManager.setVerboseLoggingEnabled(verboseEnabled);
624         mBroadcastQueue.setVerboseLoggingEnabled(verboseEnabled);
625         if (SdkLevel.isAtLeastS()) {
626             mCoexManager.enableVerboseLogging(verboseEnabled);
627         }
628         mWifiPermissionsUtil.enableVerboseLogging(verboseEnabled);
629         mWifiDialogManager.enableVerboseLogging(verboseEnabled);
630         mExternalPnoScanRequestManager.enableVerboseLogging(verboseEnabled);
631         mMultiInternetWifiNetworkFactory.enableVerboseLogging(verboseEnabled);
632     }
633 
getUserManager()634     public UserManager getUserManager() {
635         return mUserManager;
636     }
637 
getWifiMetrics()638     public WifiMetrics getWifiMetrics() {
639         return mWifiMetrics;
640     }
641 
getWifiP2pMetrics()642     public WifiP2pMetrics getWifiP2pMetrics() {
643         return mWifiP2pMetrics;
644     }
645 
getSupplicantStaIfaceHal()646     public SupplicantStaIfaceHal getSupplicantStaIfaceHal() {
647         return mSupplicantStaIfaceHal;
648     }
649 
getBackupManagerProxy()650     public BackupManagerProxy getBackupManagerProxy() {
651         return mBackupManagerProxy;
652     }
653 
getFrameworkFacade()654     public FrameworkFacade getFrameworkFacade() {
655         return mFrameworkFacade;
656     }
657 
getWifiP2pServiceHandlerThread()658     public HandlerThread getWifiP2pServiceHandlerThread() {
659         return mWifiP2pServiceHandlerThread;
660     }
661 
getPasspointProvisionerHandlerThread()662     public HandlerThread getPasspointProvisionerHandlerThread() {
663         return mPasspointProvisionerHandlerThread;
664     }
665 
getWifiHandlerThread()666     public HandlerThread getWifiHandlerThread() {
667         return mWifiHandlerThread;
668     }
669 
670     /**
671      * Wrapper method for getting the current native Java Thread ID of the current thread.
672      */
getCurrentThreadId()673     public long getCurrentThreadId() {
674         return Thread.currentThread().getId();
675     }
676 
getWifiTrafficPoller()677     public WifiTrafficPoller getWifiTrafficPoller() {
678         return mWifiTrafficPoller;
679     }
680 
getWifiCountryCode()681     public WifiCountryCode getWifiCountryCode() {
682         return mCountryCode;
683     }
684 
getWifiApConfigStore()685     public WifiApConfigStore getWifiApConfigStore() {
686         return mWifiApConfigStore;
687     }
688 
getSarManager()689     public SarManager getSarManager() {
690         return mSarManager;
691     }
692 
getActiveModeWarden()693     public ActiveModeWarden getActiveModeWarden() {
694         return mActiveModeWarden;
695     }
696 
getWifiSettingsStore()697     public WifiSettingsStore getWifiSettingsStore() {
698         return mSettingsStore;
699     }
700 
getWifiLockManager()701     public WifiLockManager getWifiLockManager() {
702         return mLockManager;
703     }
704 
getWifiLastResortWatchdog()705     public WifiLastResortWatchdog getWifiLastResortWatchdog() {
706         return mWifiLastResortWatchdog;
707     }
708 
getClock()709     public Clock getClock() {
710         return mClock;
711     }
712 
getWifiBackupRestore()713     public WifiBackupRestore getWifiBackupRestore() {
714         return mWifiBackupRestore;
715     }
716 
getSoftApBackupRestore()717     public SoftApBackupRestore getSoftApBackupRestore() {
718         return mSoftApBackupRestore;
719     }
720 
getWifiMulticastLockManager()721     public WifiMulticastLockManager getWifiMulticastLockManager() {
722         return mWifiMulticastLockManager;
723     }
724 
getWifiConfigManager()725     public WifiConfigManager getWifiConfigManager() {
726         return mWifiConfigManager;
727     }
728 
getPasspointManager()729     public PasspointManager getPasspointManager() {
730         return mPasspointManager;
731     }
732 
getWakeupController()733     public WakeupController getWakeupController() {
734         return mWakeupController;
735     }
736 
getScoringParams()737     public ScoringParams getScoringParams() {
738         return mScoringParams;
739     }
740 
getWifiScoreCard()741     public WifiScoreCard getWifiScoreCard() {
742         return mWifiScoreCard;
743     }
744 
makeTelephonyManager()745     public TelephonyManager makeTelephonyManager() {
746         return mContext.getSystemService(TelephonyManager.class);
747     }
748 
749     /**
750      * Returns BatteryManager service
751      */
makeBatteryManager()752     public BatteryManager makeBatteryManager() {
753         return mContext.getSystemService(BatteryManager.class);
754     }
755 
getWifiCarrierInfoManager()756     public WifiCarrierInfoManager getWifiCarrierInfoManager() {
757         return mWifiCarrierInfoManager;
758     }
759 
getWifiPseudonymManager()760     public WifiPseudonymManager getWifiPseudonymManager() {
761         return mWifiPseudonymManager;
762     }
763 
getDppManager()764     public DppManager getDppManager() {
765         return mDppManager;
766     }
767 
768     /**
769      * Create a WifiShellCommand.
770      *
771      * @param wifiService WifiServiceImpl object shell commands get sent to.
772      * @return an instance of WifiShellCommand
773      */
makeWifiShellCommand(WifiServiceImpl wifiService)774     public WifiShellCommand makeWifiShellCommand(WifiServiceImpl wifiService) {
775         return new WifiShellCommand(this, wifiService, mContext,
776                 mWifiGlobals, mWifiThreadRunner);
777     }
778 
779     /**
780      * Create a SoftApManager.
781      *
782      * @param config SoftApModeConfiguration object holding the config and mode
783      * @return an instance of SoftApManager
784      */
makeSoftApManager( @onNull ActiveModeManager.Listener<SoftApManager> listener, @NonNull WifiServiceImpl.SoftApCallbackInternal callback, @NonNull SoftApModeConfiguration config, @NonNull WorkSource requestorWs, @NonNull ActiveModeManager.SoftApRole role, boolean verboseLoggingEnabled)785     public SoftApManager makeSoftApManager(
786             @NonNull ActiveModeManager.Listener<SoftApManager> listener,
787             @NonNull WifiServiceImpl.SoftApCallbackInternal callback,
788             @NonNull SoftApModeConfiguration config,
789             @NonNull WorkSource requestorWs,
790             @NonNull ActiveModeManager.SoftApRole role,
791             boolean verboseLoggingEnabled) {
792         return new SoftApManager(mContext, mWifiHandlerThread.getLooper(), mFrameworkFacade,
793                 mWifiNative, this, mCoexManager, mInterfaceConflictManager,
794                 listener, callback, mWifiApConfigStore,
795                 config, mWifiMetrics, mSarManager, mWifiDiagnostics,
796                 new SoftApNotifier(mContext, mFrameworkFacade, mWifiNotificationManager),
797                 mCmiMonitor, mActiveModeWarden, mClock.getElapsedSinceBootMillis(),
798                 requestorWs, role, verboseLoggingEnabled);
799     }
800 
801     /**
802      * Create a ClientModeImpl
803      * @param ifaceName interface name for the ClientModeImpl
804      * @param clientModeManager ClientModeManager that will own the ClientModeImpl
805      */
makeClientModeImpl( @onNull String ifaceName, @NonNull ConcreteClientModeManager clientModeManager, boolean verboseLoggingEnabled)806     public ClientModeImpl makeClientModeImpl(
807             @NonNull String ifaceName,
808             @NonNull ConcreteClientModeManager clientModeManager,
809             boolean verboseLoggingEnabled) {
810         ExtendedWifiInfo wifiInfo = new ExtendedWifiInfo(mWifiGlobals, ifaceName);
811         SupplicantStateTracker supplicantStateTracker = new SupplicantStateTracker(
812                 mContext, mWifiConfigManager, mBatteryStats, mWifiHandlerThread.getLooper(),
813                 mWifiMonitor, ifaceName, clientModeManager, mBroadcastQueue);
814         supplicantStateTracker.enableVerboseLogging(verboseLoggingEnabled);
815         return new ClientModeImpl(mContext, mWifiMetrics, mClock,
816                 mWifiScoreCard, mWifiStateTracker, mWifiPermissionsUtil, mWifiConfigManager,
817                 mPasspointManager, mWifiMonitor, mWifiDiagnostics,
818                 mWifiDataStall, mScoringParams, mWifiThreadRunner,
819                 mWifiNetworkSuggestionsManager, mWifiHealthMonitor, mThroughputPredictor,
820                 mDeviceConfigFacade, mScanRequestProxy, wifiInfo, mWifiConnectivityManager,
821                 mWifiBlocklistMonitor, mConnectionFailureNotifier,
822                 REGULAR_NETWORK_CAPABILITIES_FILTER, mWifiNetworkFactory,
823                 mUntrustedWifiNetworkFactory, mOemWifiNetworkFactory, mRestrictedWifiNetworkFactory,
824                 mMultiInternetManager, mWifiLastResortWatchdog, mWakeupController,
825                 mLockManager, mFrameworkFacade, mWifiHandlerThread.getLooper(),
826                 mWifiNative, new WrongPasswordNotifier(mContext, mFrameworkFacade,
827                 mWifiNotificationManager),
828                 mWifiTrafficPoller, mLinkProbeManager, mClock.getElapsedSinceBootMillis(),
829                 mBatteryStats, supplicantStateTracker, mMboOceController, mWifiCarrierInfoManager,
830                 mWifiPseudonymManager,
831                 new EapFailureNotifier(mContext, mFrameworkFacade, mWifiCarrierInfoManager,
832                         mWifiNotificationManager),
833                 mSimRequiredNotifier,
834                 new WifiScoreReport(mScoringParams, mClock, mWifiMetrics, wifiInfo,
835                         mWifiNative, mWifiBlocklistMonitor, mWifiThreadRunner, mWifiScoreCard,
836                         mDeviceConfigFacade, mContext, mAdaptiveConnectivityEnabledSettingObserver,
837                         ifaceName, mExternalScoreUpdateObserverProxy, mSettingsStore, mWifiGlobals,
838                         mActiveModeWarden, mWifiConnectivityManager, mWifiConfigManager),
839                 mWifiP2pConnection, mWifiGlobals, ifaceName, clientModeManager,
840                 mCmiMonitor, mBroadcastQueue, mWifiNetworkSelector, makeTelephonyManager(),
841                 this, mSettingsConfigStore, verboseLoggingEnabled, mWifiNotificationManager);
842     }
843 
makeWifiNetworkAgent( @onNull NetworkCapabilities nc, @NonNull LinkProperties linkProperties, @NonNull NetworkAgentConfig naConfig, @Nullable NetworkProvider provider, @NonNull WifiNetworkAgent.Callback callback)844     public WifiNetworkAgent makeWifiNetworkAgent(
845             @NonNull NetworkCapabilities nc,
846             @NonNull LinkProperties linkProperties,
847             @NonNull NetworkAgentConfig naConfig,
848             @Nullable NetworkProvider provider,
849             @NonNull WifiNetworkAgent.Callback callback) {
850         return new WifiNetworkAgent(mContext, mWifiHandlerThread.getLooper(),
851                 nc, linkProperties, naConfig, provider, callback);
852     }
853 
854     /**
855      * Create a ClientModeManager
856      *
857      * @param listener listener for ClientModeManager state changes
858      * @return a new instance of ClientModeManager
859      */
makeClientModeManager( @onNull ClientModeManager.Listener<ConcreteClientModeManager> listener, @NonNull WorkSource requestorWs, @NonNull ActiveModeManager.ClientRole role, boolean verboseLoggingEnabled)860     public ConcreteClientModeManager makeClientModeManager(
861             @NonNull ClientModeManager.Listener<ConcreteClientModeManager> listener,
862             @NonNull WorkSource requestorWs,
863             @NonNull ActiveModeManager.ClientRole role,
864             boolean verboseLoggingEnabled) {
865         return new ConcreteClientModeManager(
866                 mContext, mWifiHandlerThread.getLooper(), mClock,
867                 mWifiNative, listener, mWifiMetrics, mWakeupController,
868                 this, mSelfRecovery, mWifiGlobals, mDefaultClientModeManager,
869                 mClock.getElapsedSinceBootMillis(), requestorWs, role, mBroadcastQueue,
870                 verboseLoggingEnabled);
871     }
872 
makeScanOnlyModeImpl(@onNull String ifaceName)873     public ScanOnlyModeImpl makeScanOnlyModeImpl(@NonNull String ifaceName) {
874         return new ScanOnlyModeImpl(mClock.getElapsedSinceBootMillis(), mWifiNative, ifaceName);
875     }
876 
877     /**
878      * Create a WifiLog instance.
879      *
880      * @param tag module name to include in all log messages
881      */
makeLog(String tag)882     public WifiLog makeLog(String tag) {
883         return new LogcatLog(tag);
884     }
885 
886     /**
887      * Obtain an instance of WifiScanner.
888      * If it was not already created, then obtain an instance.  Note, this must be done lazily since
889      * WifiScannerService is separate and created later.
890      */
getWifiScanner()891     public synchronized WifiScanner getWifiScanner() {
892         if (mWifiScanner == null) {
893             mWifiScanner = mContext.getSystemService(WifiScanner.class);
894         }
895         return mWifiScanner;
896     }
897 
898     /**
899      * Construct an instance of {@link NetworkRequestStoreData}.
900      */
makeNetworkRequestStoreData( NetworkRequestStoreData.DataSource dataSource)901     public NetworkRequestStoreData makeNetworkRequestStoreData(
902             NetworkRequestStoreData.DataSource dataSource) {
903         return new NetworkRequestStoreData(dataSource);
904     }
905 
906     /**
907      * Construct an instance of {@link NetworkSuggestionStoreData}.
908      */
makeNetworkSuggestionStoreData( NetworkSuggestionStoreData.DataSource dataSource)909     public NetworkSuggestionStoreData makeNetworkSuggestionStoreData(
910             NetworkSuggestionStoreData.DataSource dataSource) {
911         return new NetworkSuggestionStoreData(dataSource);
912     }
913 
914     /**
915      * Construct an instance of {@link WifiCarrierInfoStoreManagerData}
916      */
makeWifiCarrierInfoStoreManagerData( WifiCarrierInfoStoreManagerData.DataSource dataSource)917     public WifiCarrierInfoStoreManagerData makeWifiCarrierInfoStoreManagerData(
918             WifiCarrierInfoStoreManagerData.DataSource dataSource) {
919         return new WifiCarrierInfoStoreManagerData(dataSource);
920     }
921 
922     /**
923      * Construct an instance of {@link ImsiPrivacyProtectionExemptionStoreData}
924      */
makeImsiPrivacyProtectionExemptionStoreData( ImsiPrivacyProtectionExemptionStoreData.DataSource dataSource)925     public ImsiPrivacyProtectionExemptionStoreData makeImsiPrivacyProtectionExemptionStoreData(
926             ImsiPrivacyProtectionExemptionStoreData.DataSource dataSource) {
927         return new ImsiPrivacyProtectionExemptionStoreData(dataSource);
928     }
929 
930     /**
931      * Construct an instance of {@link SoftApStoreData}.
932      */
makeSoftApStoreData( SoftApStoreData.DataSource dataSource)933     public SoftApStoreData makeSoftApStoreData(
934             SoftApStoreData.DataSource dataSource) {
935         return new SoftApStoreData(mContext, mSettingsMigrationDataHolder, dataSource);
936     }
937 
getWifiPermissionsUtil()938     public WifiPermissionsUtil getWifiPermissionsUtil() {
939         return mWifiPermissionsUtil;
940     }
941 
getWifiPermissionsWrapper()942     public WifiPermissionsWrapper getWifiPermissionsWrapper() {
943         return mWifiPermissionsWrapper;
944     }
945 
946     /**
947      * Returns a singleton instance of a HandlerThread for injection. Uses lazy initialization.
948      *
949      * TODO: share worker thread with other Wi-Fi handlers (b/27924886)
950      */
getWifiAwareHandlerThread()951     public HandlerThread getWifiAwareHandlerThread() {
952         if (mWifiAwareHandlerThread == null) { // lazy initialization
953             mWifiAwareHandlerThread = new HandlerThread("wifiAwareService");
954             mWifiAwareHandlerThread.start();
955         }
956         return mWifiAwareHandlerThread;
957     }
958 
959     /**
960      * Returns a singleton instance of a HandlerThread for injection. Uses lazy initialization.
961      *
962      * TODO: share worker thread with other Wi-Fi handlers (b/27924886)
963      */
getRttHandlerThread()964     public HandlerThread getRttHandlerThread() {
965         if (mRttHandlerThread == null) { // lazy initialization
966             mRttHandlerThread = new HandlerThread("wifiRttService");
967             mRttHandlerThread.start();
968         }
969         return mRttHandlerThread;
970     }
971 
getMacAddressUtil()972     public MacAddressUtil getMacAddressUtil() {
973         return mMacAddressUtil;
974     }
975 
976     /**
977      * Returns a single instance of HalDeviceManager for injection.
978      */
getHalDeviceManager()979     public HalDeviceManager getHalDeviceManager() {
980         return mHalDeviceManager;
981     }
982 
getWifiNative()983     public WifiNative getWifiNative() {
984         return mWifiNative;
985     }
986 
getWifiMonitor()987     public WifiMonitor getWifiMonitor() {
988         return mWifiMonitor;
989     }
990 
getWifiP2pNative()991     public WifiP2pNative getWifiP2pNative() {
992         return mWifiP2pNative;
993     }
994 
995     /**
996      * Returns a single instance of CoexManager for injection.
997      * This will be null if SdkLevel is not at least S.
998      */
getCoexManager()999     @Nullable public CoexManager getCoexManager() {
1000         return mCoexManager;
1001     }
1002 
getWifiP2pMonitor()1003     public WifiP2pMonitor getWifiP2pMonitor() {
1004         return mWifiP2pMonitor;
1005     }
1006 
getSelfRecovery()1007     public SelfRecovery getSelfRecovery() {
1008         return mSelfRecovery;
1009     }
1010 
getScanRequestProxy()1011     public ScanRequestProxy getScanRequestProxy() {
1012         return mScanRequestProxy;
1013     }
1014 
getJavaRuntime()1015     public Runtime getJavaRuntime() {
1016         return Runtime.getRuntime();
1017     }
1018 
getWifiDataStall()1019     public WifiDataStall getWifiDataStall() {
1020         return mWifiDataStall;
1021     }
1022 
getWifiPulledAtomLogger()1023     public WifiPulledAtomLogger getWifiPulledAtomLogger() {
1024         return mWifiPulledAtomLogger;
1025     }
1026 
getWifiNetworkSuggestionsManager()1027     public WifiNetworkSuggestionsManager getWifiNetworkSuggestionsManager() {
1028         return mWifiNetworkSuggestionsManager;
1029     }
1030 
getIpMemoryStore()1031     public IpMemoryStore getIpMemoryStore() {
1032         if (mIpMemoryStore == null) {
1033             mIpMemoryStore = IpMemoryStore.getMemoryStore(mContext);
1034         }
1035         return mIpMemoryStore;
1036     }
1037 
getWifiBlocklistMonitor()1038     public WifiBlocklistMonitor getWifiBlocklistMonitor() {
1039         return mWifiBlocklistMonitor;
1040     }
1041 
getHostapdHal()1042     public HostapdHal getHostapdHal() {
1043         return mHostapdHal;
1044     }
1045 
getWifiThreadRunner()1046     public WifiThreadRunner getWifiThreadRunner() {
1047         return mWifiThreadRunner;
1048     }
1049 
makeNetdWrapper()1050     public NetdWrapper makeNetdWrapper() {
1051         if (mNetdWrapper == null) {
1052             mNetdWrapper = new NetdWrapper(mContext, new Handler(mWifiHandlerThread.getLooper()));
1053         }
1054         return mNetdWrapper;
1055     }
1056 
getWifiCondManager()1057     public WifiNl80211Manager getWifiCondManager() {
1058         return mWifiCondManager;
1059     }
1060 
getWifiHealthMonitor()1061     public WifiHealthMonitor getWifiHealthMonitor() {
1062         return mWifiHealthMonitor;
1063     }
1064 
getSettingsConfigStore()1065     public WifiSettingsConfigStore getSettingsConfigStore() {
1066         return mSettingsConfigStore;
1067     }
1068 
1069     public WifiScanAlwaysAvailableSettingsCompatibility
getWifiScanAlwaysAvailableSettingsCompatibility()1070             getWifiScanAlwaysAvailableSettingsCompatibility() {
1071         return mWifiScanAlwaysAvailableSettingsCompatibility;
1072     }
1073 
getDeviceConfigFacade()1074     public DeviceConfigFacade getDeviceConfigFacade() {
1075         return mDeviceConfigFacade;
1076     }
1077 
getWifiConnectivityManager()1078     public WifiConnectivityManager getWifiConnectivityManager() {
1079         return mWifiConnectivityManager;
1080     }
1081 
getConnectHelper()1082     public ConnectHelper getConnectHelper() {
1083         return mConnectHelper;
1084     }
1085 
getWifiNetworkFactory()1086     public WifiNetworkFactory getWifiNetworkFactory() {
1087         return mWifiNetworkFactory;
1088     }
1089 
getUntrustedWifiNetworkFactory()1090     public UntrustedWifiNetworkFactory getUntrustedWifiNetworkFactory() {
1091         return mUntrustedWifiNetworkFactory;
1092     }
1093 
getOemWifiNetworkFactory()1094     public OemWifiNetworkFactory getOemWifiNetworkFactory() {
1095         return mOemWifiNetworkFactory;
1096     }
1097 
getRestrictedWifiNetworkFactory()1098     public RestrictedWifiNetworkFactory getRestrictedWifiNetworkFactory() {
1099         return mRestrictedWifiNetworkFactory;
1100     }
1101 
getMultiInternetWifiNetworkFactory()1102     public MultiInternetWifiNetworkFactory getMultiInternetWifiNetworkFactory() {
1103         return mMultiInternetWifiNetworkFactory;
1104     }
1105 
getWifiDiagnostics()1106     public WifiDiagnostics getWifiDiagnostics() {
1107         return mWifiDiagnostics;
1108     }
1109 
getWifiP2pConnection()1110     public WifiP2pConnection getWifiP2pConnection() {
1111         return mWifiP2pConnection;
1112     }
1113 
getWifiGlobals()1114     public WifiGlobals getWifiGlobals() {
1115         return mWifiGlobals;
1116     }
1117 
getSimRequiredNotifier()1118     public SimRequiredNotifier getSimRequiredNotifier() {
1119         return mSimRequiredNotifier;
1120     }
1121 
1122     /**
1123      * Useful for mocking {@link WorkSourceHelper} instance in {@link HalDeviceManager} unit tests.
1124      */
makeWsHelper(@onNull WorkSource ws)1125     public WorkSourceHelper makeWsHelper(@NonNull WorkSource ws) {
1126         return new WorkSourceHelper(ws, mWifiPermissionsUtil,
1127                 mContext.getSystemService(ActivityManager.class), mContext.getPackageManager(),
1128                 mContext.getResources());
1129     }
1130 
1131     public AdaptiveConnectivityEnabledSettingObserver
getAdaptiveConnectivityEnabledSettingObserver()1132             getAdaptiveConnectivityEnabledSettingObserver() {
1133         return mAdaptiveConnectivityEnabledSettingObserver;
1134     }
1135 
1136     /**
1137      * Creates a BroadcastOptions.
1138      */
1139     // TODO(b/193460475): Remove when tooling supports SystemApi to public API.
1140     @SuppressLint("NewApi")
makeBroadcastOptions()1141     public BroadcastOptions makeBroadcastOptions() {
1142         return BroadcastOptions.makeBasic();
1143     }
1144 
getMakeBeforeBreakManager()1145     public MakeBeforeBreakManager getMakeBeforeBreakManager() {
1146         return mMakeBeforeBreakManager;
1147     }
1148 
getOpenNetworkNotifier()1149     public OpenNetworkNotifier getOpenNetworkNotifier() {
1150         return mOpenNetworkNotifier;
1151     }
1152 
getWifiNotificationManager()1153     public WifiNotificationManager getWifiNotificationManager() {
1154         return mWifiNotificationManager;
1155     }
1156 
getInterfaceConflictManager()1157     public InterfaceConflictManager getInterfaceConflictManager() {
1158         return mInterfaceConflictManager;
1159     }
1160 
getLastCallerInfoManager()1161     public LastCallerInfoManager getLastCallerInfoManager() {
1162         return mLastCallerInfoManager;
1163     }
1164 
1165     @NonNull
getWifiDialogManager()1166     public WifiDialogManager getWifiDialogManager() {
1167         return mWifiDialogManager;
1168     }
1169 
1170     @NonNull
getSsidTranslator()1171     public SsidTranslator getSsidTranslator() {
1172         return mSsidTranslator;
1173     }
1174 
getBuildProperties()1175     public BuildProperties getBuildProperties() {
1176         return mBuildProperties;
1177     }
1178 
getDefaultClientModeManager()1179     public DefaultClientModeManager getDefaultClientModeManager() {
1180         return mDefaultClientModeManager;
1181     }
1182 
getLinkProbeManager()1183     public LinkProbeManager getLinkProbeManager() {
1184         return mLinkProbeManager;
1185     }
1186 
getMultiInternetManager()1187     public MultiInternetManager getMultiInternetManager() {
1188         return mMultiInternetManager;
1189     }
1190 
getContext()1191     public WifiContext getContext() {
1192         return mContext;
1193     }
1194 
1195     /**
1196      * Creates a BufferedReader for the given filename. Useful for unit tests that depend on IO.
1197      */
1198     @NonNull
createBufferedReader(String filename)1199     public BufferedReader createBufferedReader(String filename) throws FileNotFoundException {
1200         return new BufferedReader(new FileReader(filename));
1201     }
1202 
1203     @NonNull
getWifiAwareLocalLog()1204     public LocalLog getWifiAwareLocalLog() {
1205         return mWifiAwareLocalLog;
1206     }
1207 
1208     @NonNull
getWifiHandlerLocalLog()1209     public LocalLog getWifiHandlerLocalLog() {
1210         return mWifiHandlerLocalLog;
1211     }
1212 
1213     @NonNull
getWifiKeyStore()1214     public WifiKeyStore getWifiKeyStore() {
1215         return mWifiKeyStore;
1216     }
1217 
1218     @NonNull
getApplicationQosPolicyRequestHandler()1219     public ApplicationQosPolicyRequestHandler getApplicationQosPolicyRequestHandler() {
1220         return mApplicationQosPolicyRequestHandler;
1221     }
1222 }
1223