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.app.AppGlobals;
20 import android.app.PendingIntent;
21 import android.content.Context;
22 import android.content.Intent;
23 import android.net.ConnectivityManager;
24 import android.net.TrafficStats;
25 import android.net.ip.IpManager;
26 import android.net.wifi.IWifiScanner;
27 import android.net.wifi.WifiScanner;
28 import android.os.Handler;
29 import android.os.IBinder;
30 import android.os.INetworkManagementService;
31 import android.os.Looper;
32 import android.os.RemoteException;
33 import android.os.ServiceManager;
34 import android.os.UserManager;
35 import android.provider.Settings;
36 import android.security.KeyStore;
37 import android.telephony.CarrierConfigManager;
38 
39 import java.util.ArrayList;
40 
41 /**
42  * This class allows overriding objects with mocks to write unit tests
43  */
44 public class FrameworkFacade {
45     public static final String TAG = "FrameworkFacade";
46 
makeBaseLogger()47     public BaseWifiLogger makeBaseLogger() {
48         return new BaseWifiLogger();
49     }
50 
makeRealLogger( WifiStateMachine stateMachine, WifiNative wifiNative, BuildProperties buildProperties)51     public BaseWifiLogger makeRealLogger(
52             WifiStateMachine stateMachine, WifiNative wifiNative, BuildProperties buildProperties) {
53         return new WifiLogger(stateMachine, wifiNative, buildProperties);
54     }
55 
setIntegerSetting(Context context, String name, int def)56     public boolean setIntegerSetting(Context context, String name, int def) {
57         return Settings.Global.putInt(context.getContentResolver(), name, def);
58     }
59 
getIntegerSetting(Context context, String name, int def)60     public int getIntegerSetting(Context context, String name, int def) {
61         return Settings.Global.getInt(context.getContentResolver(), name, def);
62     }
63 
getLongSetting(Context context, String name, long def)64     public long getLongSetting(Context context, String name, long def) {
65         return Settings.Global.getLong(context.getContentResolver(), name, def);
66     }
67 
setStringSetting(Context context, String name, String def)68     public boolean setStringSetting(Context context, String name, String def) {
69         return Settings.Global.putString(context.getContentResolver(), name, def);
70     }
71 
getStringSetting(Context context, String name)72     public String getStringSetting(Context context, String name) {
73         return Settings.Global.getString(context.getContentResolver(), name);
74     }
75 
getService(String serviceName)76     public IBinder getService(String serviceName) {
77         return ServiceManager.getService(serviceName);
78     }
79 
makeWifiScanner(Context context, Looper looper)80     public WifiScanner makeWifiScanner(Context context, Looper looper) {
81         return new WifiScanner(context, IWifiScanner.Stub.asInterface(
82                         getService(Context.WIFI_SCANNING_SERVICE)), looper);
83     }
84 
getBroadcast(Context context, int requestCode, Intent intent, int flags)85     public PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags) {
86         return PendingIntent.getBroadcast(context, requestCode, intent, flags);
87     }
88 
makeSupplicantStateTracker(Context context, WifiConfigManager configManager, Handler handler)89     public SupplicantStateTracker makeSupplicantStateTracker(Context context,
90             WifiConfigManager configManager, Handler handler) {
91         return new SupplicantStateTracker(context, configManager, handler);
92     }
93 
getConfigWiFiDisableInECBM(Context context)94     public boolean getConfigWiFiDisableInECBM(Context context) {
95        CarrierConfigManager configManager = (CarrierConfigManager) context
96                .getSystemService(Context.CARRIER_CONFIG_SERVICE);
97        if (configManager != null) {
98            return configManager.getConfig().getBoolean(
99                CarrierConfigManager.KEY_CONFIG_WIFI_DISABLE_IN_ECBM);
100        }
101        /* Default to TRUE */
102        return true;
103     }
104 
105     /**
106      * Create a new instance of WifiApConfigStore.
107      * @param context reference to a Context
108      * @param backupManagerProxy reference to a BackupManagerProxy
109      * @return an instance of WifiApConfigStore
110      */
makeApConfigStore(Context context, BackupManagerProxy backupManagerProxy)111     public WifiApConfigStore makeApConfigStore(Context context,
112                                                BackupManagerProxy backupManagerProxy) {
113         return new WifiApConfigStore(context, backupManagerProxy);
114     }
115 
getTxPackets(String iface)116     public long getTxPackets(String iface) {
117         return TrafficStats.getTxPackets(iface);
118     }
119 
getRxPackets(String iface)120     public long getRxPackets(String iface) {
121         return TrafficStats.getRxPackets(iface);
122     }
123 
makeIpManager( Context context, String iface, IpManager.Callback callback)124     public IpManager makeIpManager(
125             Context context, String iface, IpManager.Callback callback) {
126         return new IpManager(context, iface, callback);
127     }
128 
129     /**
130      * Create a SoftApManager.
131      * @param context current context
132      * @param looper current thread looper
133      * @param wifiNative reference to WifiNative
134      * @param nmService reference to NetworkManagementService
135      * @param cm reference to ConnectivityManager
136      * @param countryCode Country code
137      * @param allowed2GChannels list of allowed 2G channels
138      * @param listener listener for SoftApManager
139      * @return an instance of SoftApManager
140      */
makeSoftApManager( Context context, Looper looper, WifiNative wifiNative, INetworkManagementService nmService, ConnectivityManager cm, String countryCode, ArrayList<Integer> allowed2GChannels, SoftApManager.Listener listener)141     public SoftApManager makeSoftApManager(
142             Context context, Looper looper, WifiNative wifiNative,
143             INetworkManagementService nmService, ConnectivityManager cm,
144             String countryCode, ArrayList<Integer> allowed2GChannels,
145             SoftApManager.Listener listener) {
146         return new SoftApManager(
147                 context, looper, wifiNative, nmService, cm, countryCode,
148                 allowed2GChannels, listener);
149     }
150 
151     /**
152      * Checks whether the given uid has been granted the given permission.
153      * @param permName the permission to check
154      * @param uid The uid to check
155      * @return {@link PackageManager.PERMISSION_GRANTED} if the permission has been granted and
156      *         {@link PackageManager.PERMISSION_DENIED} otherwise
157      */
checkUidPermission(String permName, int uid)158     public int checkUidPermission(String permName, int uid) throws RemoteException {
159         return AppGlobals.getPackageManager().checkUidPermission(permName, uid);
160     }
161 
makeWifiConfigManager(Context context, WifiNative wifiNative, FrameworkFacade frameworkFacade, Clock clock, UserManager userManager, KeyStore keyStore)162     public WifiConfigManager makeWifiConfigManager(Context context, WifiNative wifiNative,
163             FrameworkFacade frameworkFacade, Clock clock, UserManager userManager,
164             KeyStore keyStore) {
165         return new WifiConfigManager(context, wifiNative, frameworkFacade, clock, userManager,
166                 keyStore);
167     }
168 }
169