SupplicantStaIfaceHal.java revision 3aa9b7e616f685ded8fade523317e96cedcdcc2d
1240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/*
298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Copyright (C) 2017 The Android Open Source Project
3240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne *
4240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License");
5240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * you may not use this file except in compliance with the License.
6240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * You may obtain a copy of the License at
7240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne *
8240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne *      http://www.apache.org/licenses/LICENSE-2.0
9240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne *
10240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Unless required by applicable law or agreed to in writing, software
11240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS,
12240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * See the License for the specific language governing permissions and
14240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * limitations under the License.
15240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */
16240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhnepackage com.android.server.wifi;
17240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
18c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Piusimport android.content.Context;
19240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicant;
20240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantIface;
2196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantNetwork;
22240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIface;
2396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork;
24240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.IfaceType;
25240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatus;
26240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode;
27240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceManager;
28240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceNotification;
29f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.net.IpConfiguration;
3066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiConfiguration;
31240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.os.RemoteException;
32240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.util.Log;
33f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.util.SparseArray;
3496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
35d95fa596d07855b70ff18a50a48e773155a919f5Roshan Piusimport com.android.server.wifi.util.NativeUtil;
36240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
37240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport java.util.ArrayList;
38f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.HashMap;
39f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.List;
40f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.Map;
41d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
42240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/**
43240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Hal calls for bring up/shut down of the supplicant daemon and for
44240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * sending requests to the supplicant daemon
45240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */
46b4419d876beda78c29836726e43d80203b4a656cRoshan Piuspublic class SupplicantStaIfaceHal {
47240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private static final boolean DBG = false;
48b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    private static final String TAG = "SupplicantStaIfaceHal";
4998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private static final String SERVICE_MANAGER_NAME = "manager";
5098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private IServiceManager mIServiceManager = null;
5198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    // Supplicant HAL interface objects
5298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private ISupplicant mISupplicant;
5398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private ISupplicantStaIface mISupplicantStaIface;
547c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    // Currently configured network in wpa_supplicant
557c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    private SupplicantStaNetworkHal mCurrentNetwork;
567c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    // Currently configured network's framework network Id.
577c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    private int mFrameworkNetworkId;
58240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private final Object mLock = new Object();
59c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private final Context mContext;
60c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    private final WifiMonitor mWifiMonitor;
617c0ec884188660f72977c8a80366049705c48ffaRoshan Pius
62c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius    public SupplicantStaIfaceHal(Context context, WifiMonitor monitor) {
63c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        mContext = context;
64c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        mWifiMonitor = monitor;
658c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
66240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
67240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    /**
6898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Registers a service notification for the ISupplicant service, which triggers intialization of
6998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * the ISupplicantStaIface
70240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne     * @return true if the service notification was successfully registered
71240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne     */
72240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    public boolean initialize() {
7398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        if (DBG) Log.i(TAG, "Registering ISupplicant service ready callback.");
74240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
7598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicant = null;
7698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = null;
7798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (mIServiceManager != null) {
7898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                // Already have an IServiceManager and serviceNotification registered, don't
7998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                // don't register another.
8098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return true;
8198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            }
82240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
8398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mIServiceManager = getServiceManagerMockable();
8498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (mIServiceManager == null) {
85240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.e(TAG, "Failed to get HIDL Service Manager");
86240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
87240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
8898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (!mIServiceManager.linkToDeath(cookie -> {
89240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.wtf(TAG, "IServiceManager died: cookie=" + cookie);
90240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    synchronized (mLock) {
91240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        supplicantServiceDiedHandler();
9298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        mIServiceManager = null; // Will need to register a new ServiceNotification
93240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
94240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }, 0)) {
95240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.wtf(TAG, "Error on linkToDeath on IServiceManager");
96240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    supplicantServiceDiedHandler();
9798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                    mIServiceManager = null; // Will need to register a new ServiceNotification
98240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
99240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
100240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                IServiceNotification serviceNotificationCb = new IServiceNotification.Stub() {
101240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    public void onRegistration(String fqName, String name, boolean preexisting) {
10298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        synchronized (mLock) {
10398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            if (DBG) {
10498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.i(TAG, "IServiceNotification.onRegistration for: " + fqName
10598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                        + ", " + name + " preexisting=" + preexisting);
10698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            }
10798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            if (!initSupplicantService() || !initSupplicantStaIface()) {
10898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.e(TAG, "initalizing ISupplicantIfaces failed.");
10998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                supplicantServiceDiedHandler();
11098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            } else {
11198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.i(TAG, "Completed initialization of ISupplicant interfaces.");
11298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            }
113240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        }
114240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
115240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                };
116240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                /* TODO(b/33639391) : Use the new ISupplicant.registerForNotifications() once it
117240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                   exists */
11898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (!mIServiceManager.registerForNotifications(ISupplicant.kInterfaceName,
119240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        "", serviceNotificationCb)) {
120240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.e(TAG, "Failed to register for notifications to "
121240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                            + ISupplicant.kInterfaceName);
12298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                    mIServiceManager = null; // Will need to register a new ServiceNotification
123240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
124240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
125240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
126240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Exception while trying to register a listener for ISupplicant service: "
127240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        + e);
12898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                supplicantServiceDiedHandler();
129240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
130240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            return true;
131240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
132240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
133240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
13498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private boolean initSupplicantService() {
135240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
136240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
13798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mISupplicant = getSupplicantMockable();
138240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
139240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "ISupplicant.getService exception: " + e);
140240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
141240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
14298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (mISupplicant == null) {
143240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup");
144240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
145240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
146240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
147240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        return true;
148240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
149240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
15098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private boolean initSupplicantStaIface() {
151240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
152240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            /** List all supplicant Ifaces */
153240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>();
154240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
15598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mISupplicant.listInterfaces((SupplicantStatus status,
156240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        ArrayList<ISupplicant.IfaceInfo> ifaces) -> {
157240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    if (status.code != SupplicantStatusCode.SUCCESS) {
158240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        Log.e(TAG, "Getting Supplicant Interfaces failed: " + status.code);
159240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        return;
160240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
161240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    supplicantIfaces.addAll(ifaces);
162240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                });
163240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
164240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "ISupplicant.listInterfaces exception: " + e);
16598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return false;
166240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
167240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            if (supplicantIfaces.size() == 0) {
168240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Got zero HIDL supplicant ifaces. Stopping supplicant HIDL startup.");
16998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return false;
170240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
171240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            Mutable<ISupplicantIface> supplicantIface = new Mutable<>();
172240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) {
17398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (ifaceInfo.type == IfaceType.STA) {
174240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    try {
17598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        mISupplicant.getInterface(ifaceInfo,
176240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                (SupplicantStatus status, ISupplicantIface iface) -> {
177240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                if (status.code != SupplicantStatusCode.SUCCESS) {
178240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                    Log.e(TAG, "Failed to get ISupplicantIface " + status.code);
179240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                    return;
180240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                }
181240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                supplicantIface.value = iface;
182240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                            });
183240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    } catch (RemoteException e) {
184240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        Log.e(TAG, "ISupplicant.getInterface exception: " + e);
18598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        return false;
186240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
187240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    break;
188240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
189240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
19098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (supplicantIface.value == null) {
19198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                Log.e(TAG, "initSupplicantStaIface got null iface");
192240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
193240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
19498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = getStaIfaceMockable(supplicantIface.value);
195240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            return true;
196240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
197240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
198240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
19998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private void supplicantServiceDiedHandler() {
200240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
20198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicant = null;
20298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = null;
203240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
204240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
205240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
20698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    /**
20798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Signals whether Initialization completed successfully. Only necessary for testing, is not
20898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * needed to guard calls etc.
20998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     */
21098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    public boolean isInitializationComplete() {
21198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return mISupplicantStaIface != null;
2128c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
2138c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius
2148c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    /**
21598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Wrapper functions to access static HAL methods, created to be mockable in unit tests
2168c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius     */
21798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected IServiceManager getServiceManagerMockable() throws RemoteException {
21898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return IServiceManager.getService(SERVICE_MANAGER_NAME);
21998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    }
22098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne
22198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected ISupplicant getSupplicantMockable() throws RemoteException {
22298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return ISupplicant.getService();
22398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    }
22498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne
22598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected ISupplicantStaIface getStaIfaceMockable(ISupplicantIface iface) {
22698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return ISupplicantStaIface.asInterface(iface.asBinder());
2278c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
2288c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius
22996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
2307c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * Add a network configuration to wpa_supplicant.
231d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
23266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @param config Config corresponding to the network.
23366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * @return SupplicantStaNetwork of the added network in wpa_supplicant.
23466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
235d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    private SupplicantStaNetworkHal addNetwork(WifiConfiguration config) {
23666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        logi("addSupplicantStaNetwork via HIDL");
23766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (config == null) {
23866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            loge("Cannot add NULL network!");
23966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return null;
24066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
24166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        SupplicantStaNetworkHal network = addNetwork();
24266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (network == null) {
24366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            loge("Failed to add a network!");
24466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return null;
24566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
24666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (network.saveWifiConfiguration(config)) {
24766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return network;
24866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        } else {
24966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            loge("Failed to save variables for: " + config.configKey());
25066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return null;
25166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
25266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
25366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
25466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
2557c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * Add the provided network configuration to wpa_supplicant and initiate connection to it.
2567c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * This method does the following:
2577c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 1. Triggers disconnect command to wpa_supplicant (if |shouldDisconnect| is true).
2587c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 2. Remove any existing network in wpa_supplicant.
2597c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 3. Add a new network to wpa_supplicant.
2607c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 4. Save the provided configuration to wpa_supplicant.
2617c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 5. Select the new network in wpa_supplicant.
262d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
2637c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @param config WifiConfiguration parameters for the provided network.
2647c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @param shouldDisconnect whether to trigger a disconnection or not.
2657c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @return {@code true} if it succeeds, {@code false} otherwise
26666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
267d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean connectToNetwork(WifiConfiguration config, boolean shouldDisconnect) {
2687c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        mFrameworkNetworkId = WifiConfiguration.INVALID_NETWORK_ID;
2697c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        mCurrentNetwork = null;
270d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        logd("connectToNetwork " + config.configKey()
27166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                + " (shouldDisconnect " + shouldDisconnect + ")");
27266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (shouldDisconnect && !disconnect()) {
27366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            loge("Failed to trigger disconnect");
27466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return false;
27566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
27666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        if (!removeAllNetworks()) {
27766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            loge("Failed to remove existing networks");
27866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return false;
27966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
2807c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        mCurrentNetwork = addNetwork(config);
2817c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        if (mCurrentNetwork == null) {
282d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius            loge("Failed to add/save network configuration: " + config.configKey());
28366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return false;
28466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
2857c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        if (!mCurrentNetwork.select()) {
286d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius            loge("Failed to select network configuration: " + config.configKey());
28766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            return false;
28866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
2897c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        mFrameworkNetworkId = config.networkId;
2907c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        return true;
2917c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    }
2927c0ec884188660f72977c8a80366049705c48ffaRoshan Pius
2937c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    /**
2947c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * Initiates roaming to the already configured network in wpa_supplicant. If the network
2957c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * configuration provided does not match the already configured network, then this triggers
2967c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * a new connection attempt (instead of roam).
2977c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 1. First check if we're attempting to connect to the same network as we currently have
2987c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * configured.
2997c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 2. Set the new bssid for the network in wpa_supplicant.
3007c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * 3. Trigger reassociate command to wpa_supplicant.
3017c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     *
3027c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @param config WifiConfiguration parameters for the provided network.
3037c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     * @return {@code true} if it succeeds, {@code false} otherwise
3047c0ec884188660f72977c8a80366049705c48ffaRoshan Pius     */
3057c0ec884188660f72977c8a80366049705c48ffaRoshan Pius    public boolean roamToNetwork(WifiConfiguration config) {
3067c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        if (mFrameworkNetworkId != config.networkId || mCurrentNetwork == null) {
3077c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            Log.w(TAG, "Cannot roam to a different network, initiate new connection. "
3087c0ec884188660f72977c8a80366049705c48ffaRoshan Pius                    + "Current network ID: " + mFrameworkNetworkId);
3097c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            return connectToNetwork(config, false);
3107c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        }
3117c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        String bssid = config.getNetworkSelectionStatus().getNetworkSelectionBSSID();
3127c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        logd("roamToNetwork" + config.configKey() + " (bssid " + bssid + ")");
3137c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        if (!mCurrentNetwork.setBssid(bssid)) {
3147c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            loge("Failed to set new bssid on network: " + config.configKey());
3157c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            return false;
3167c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        }
3177c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        if (!reassociate()) {
3187c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            loge("Failed to trigger reassociate");
3197c0ec884188660f72977c8a80366049705c48ffaRoshan Pius            return false;
3207c0ec884188660f72977c8a80366049705c48ffaRoshan Pius        }
32166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return true;
32266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
32366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
32466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
325f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * Load all the configured networks from wpa_supplicant.
326f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     *
327f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * @param configs       Map of configuration key to configuration objects corresponding to all
328f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     *                      the networks.
329f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf
330f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * @return true if succeeds, false otherwise.
331f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     */
332f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    public boolean loadNetworks(Map<String, WifiConfiguration> configs,
333f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                                SparseArray<Map<String, String>> networkExtras) {
334f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        List<Integer> networkIds = listNetworks();
335f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        if (networkIds == null) {
336f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            Log.e(TAG, "Failed to list networks");
337f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            return false;
338f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        }
339f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        for (Integer networkId : networkIds) {
340f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            SupplicantStaNetworkHal network = getNetwork(networkId);
341f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            if (network == null) {
342f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                Log.e(TAG, "Failed to get network with ID: " + networkId);
343f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                return false;
344f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            }
345f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            WifiConfiguration config = new WifiConfiguration();
346f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            Map<String, String> networkExtra = new HashMap<>();
347f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            if (!network.loadWifiConfiguration(config, networkExtra)) {
348f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                Log.e(TAG, "Failed to load wifi configuration for network with ID: " + networkId);
349f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                return false;
350f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            }
351f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            // Set the default IP assignments.
352f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            config.setIpAssignment(IpConfiguration.IpAssignment.DHCP);
353f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            config.setProxySettings(IpConfiguration.ProxySettings.NONE);
354f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius
355f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            networkExtras.put(networkId, networkExtra);
356f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            String configKey = networkExtra.get(SupplicantStaNetworkHal.ID_STRING_KEY_CONFIG_KEY);
357f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            final WifiConfiguration duplicateConfig = configs.put(configKey, config);
358f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            if (duplicateConfig != null) {
359f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                // The network is already known. Overwrite the duplicate entry.
360f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                Log.i(TAG, "Replacing duplicate network: " + duplicateConfig.networkId);
361f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                removeNetwork(duplicateConfig.networkId);
362f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius                networkExtras.remove(duplicateConfig.networkId);
363f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius            }
364f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        }
365f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius        return true;
366f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    }
367f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius
368f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    /**
36966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     * Remove all networks from supplicant
37066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne     */
37166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    public boolean removeAllNetworks() {
37266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        synchronized (mLock) {
37366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            ArrayList<Integer> networks = listNetworks();
37466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            if (networks == null) {
37566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                Log.e(TAG, "removeAllNetworks failed, got null networks");
37666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                return false;
37766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
37866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            for (int id : networks) {
37966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                if (!removeNetwork(id)) {
38066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    Log.e(TAG, "removeAllNetworks failed to remove network: " + id);
38166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                    return false;
38266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne                }
38366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne            }
38466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        }
38566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        return true;
38666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
38766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
38866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    /**
389d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Gets the interface name.
390d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
39196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return returns the name of Iface or null if the call fails
39296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
39396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String getName() {
39496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
39596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getName";
39696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
39796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
3983aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            final Mutable<String> gotName = new Mutable<>();
39996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
40096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getName((SupplicantStatus status, String name) -> {
4013aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                    if (checkStatusAndLogFailure(status, methodStr)) {
4023aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                        gotName.value = name;
4033aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius
40496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
40596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
40696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
40796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
40896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
40996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
4103aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            return gotName.value;
41196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
41296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
413d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
41496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
415d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Adds a new network.
416d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
41796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return The ISupplicantNetwork object for the new network, or null if the call fails
41896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
41996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private SupplicantStaNetworkHal addNetwork() {
42096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
42196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "addNetwork";
42296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
42396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
4243aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            Mutable<ISupplicantNetwork> newNetwork = new Mutable<>();
42596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
42696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.addNetwork((SupplicantStatus status,
42796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ISupplicantNetwork network) -> {
4283aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                    if (checkStatusAndLogFailure(status, methodStr)) {
42996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        newNetwork.value = network;
43096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
43196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
43296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
43396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
43496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
43596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
4363aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            if (newNetwork.value != null) {
437c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                return getStaNetworkMockable(
438c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                        ISupplicantStaNetwork.asInterface(newNetwork.value.asBinder()));
43996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
44096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
44196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
44296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
44396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
444d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
44596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
44696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Remove network from supplicant with network Id
447d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
448d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
44996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
45096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean removeNetwork(int id) {
45196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
45296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "removeNetwork";
45396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
45496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
45596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
45696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.removeNetwork(id);
45796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
45896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
45996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
46096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
46196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
46296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
46396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
46496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
465d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
46696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
467f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * Use this to mock the creation of SupplicantStaNetworkHal instance.
468f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     *
469f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * @param iSupplicantStaNetwork ISupplicantStaNetwork instance retrieved from HIDL.
470f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if
471f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     * the call fails
472f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius     */
473f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    protected SupplicantStaNetworkHal getStaNetworkMockable(
474c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius            ISupplicantStaNetwork iSupplicantStaNetwork) {
475c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius        return new SupplicantStaNetworkHal(iSupplicantStaNetwork, mContext, mWifiMonitor);
476f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    }
477f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius
478f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius    /**
47996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if
48096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * the call fails
48196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
48296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private SupplicantStaNetworkHal getNetwork(int id) {
48396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
48496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getNetwork";
48596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
4863aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            Mutable<ISupplicantNetwork> gotNetwork = new Mutable<>();
48796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
48896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
48996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getNetwork(id, (SupplicantStatus status,
49096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ISupplicantNetwork network) -> {
4913aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                    if (checkStatusAndLogFailure(status, methodStr)) {
49296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        gotNetwork.value = network;
49396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
49496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
49596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
49696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
49796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
49896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
4993aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            if (gotNetwork.value != null) {
500c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                return getStaNetworkMockable(
501c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius                        ISupplicantStaNetwork.asInterface(gotNetwork.value.asBinder()));
50296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
50396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
50496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
50596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
50696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
50796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
50896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
50996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return a list of SupplicantNetworkID ints for all networks controlled by supplicant, returns
51096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * null if the call fails
51196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
51296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private java.util.ArrayList<Integer> listNetworks() {
51396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
51496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "listNetworks";
51596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
5163aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            Mutable<ArrayList<Integer>> networkIdList = new Mutable<>();
51796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
51896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
51996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.listNetworks((SupplicantStatus status,
52096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        java.util.ArrayList<Integer> networkIds) -> {
5213aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                    if (checkStatusAndLogFailure(status, methodStr)) {
52296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        networkIdList.value = networkIds;
52396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
52496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
52596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
52696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
52796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
52896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
5293aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            return networkIdList.value;
53096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
53196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
532d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
5337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
5347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsDeviceName(String name) {
5357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
5367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsDeviceName";
5377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
5387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
5397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
5407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsDeviceName(name);
5417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
5427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
5437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
5447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
5457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
5467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
5477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
5487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
5497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
5507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
5517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsDeviceType(byte[/* 8 */] type) {
5527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
5537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsDeviceType";
5547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
5557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
5567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
5577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsDeviceType(type);
5587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
5597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
5607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
5617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
5627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
5637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
5647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
5657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
5667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
5677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
5687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsManufacturer(String manufacturer) {
5697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
5707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsManufacturer";
5717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
5727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
5737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
5747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsManufacturer(manufacturer);
5757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
5767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
5777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
5787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
5797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
5807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
5817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
5827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
5837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
5847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
5857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsModelName(String modelName) {
5867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
5877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsModelName";
5887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
5897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
5907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
5917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsModelName(modelName);
5927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
5937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
5947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
5957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
5967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
5977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
5987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
5997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
6007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
6017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
6027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsModelNumber(String modelNumber) {
6037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
6047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsModelNumber";
6057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
6067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
6077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
6087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsModelNumber(modelNumber);
6097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
6107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
6117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
6127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
6137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
6147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
6157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
6167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
6177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
6187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
6197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsSerialNumber(String serialNumber) {
6207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
6217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsSerialNumber";
6227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
6237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
6247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
6257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsSerialNumber(serialNumber);
6267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
6277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
6287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
6297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
6307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
6317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
6327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
6337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
6347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
6357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantIface.hal for documentation */
6367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setWpsConfigMethods(short configMethods) {
6377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
6387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setWpsConfigMethods";
6397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
6407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
6417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
6427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setWpsConfigMethods(configMethods);
6437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
6447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
6457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
6467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
6477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
6487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
6497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
6507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
6517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
652d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
653d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Trigger a reassociation even if the iface is currently connected.
654d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
655d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
656d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
657d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean reassociate() {
65896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
65996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "reassociate";
66096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
66196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
66296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
66396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.reassociate();
66496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
66596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
66696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
66796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
66896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
66996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
67096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
67196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
672d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
673d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
674d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Trigger a reconnection if the iface is disconnected.
675d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
676d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
677d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
678d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean reconnect() {
67996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
68096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "reconnect";
68196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
68296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
68396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
68496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.reconnect();
68596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
68696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
68796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
68896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
68996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
69096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
69196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
69296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
693d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
694d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
695d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Trigger a disconnection from the currently connected network.
696d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
697d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
698d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
699d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean disconnect() {
70096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
70196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "disconnect";
70296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
70396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
70496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
70596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.disconnect();
70696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
70796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
70896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
70996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
71096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
71196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
71296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
71396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
714d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
715d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
716d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Enable or disable power save mode.
717d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
718d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param enable true to enable, false to disable.
719d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
720d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
721d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean setPowerSave(boolean enable) {
72296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
72396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setPowerSave";
72496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
72596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
72696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
72796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setPowerSave(enable);
72896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
72996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
73096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
73196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
73296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
73396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
73496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
73596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
736d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
737d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
738d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Initiate TDLS discover with the specified AP.
739d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
740d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param macAddress MAC Address of the AP.
741d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
742d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
743d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean initiateTdlsDiscover(String macAddress) {
744d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return initiateTdlsDiscover(NativeUtil.macAddressToByteArray(macAddress));
745d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
746b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
74796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsDiscover(byte[/* 6 */] macAddress) {
74896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
74996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsDiscover";
75096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
75196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
75296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
75396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsDiscover(macAddress);
75496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
75596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
75696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
75796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
75896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
75996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
76096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
76196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
762d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
763d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
764d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Initiate TDLS setup with the specified AP.
765d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
766d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param macAddress MAC Address of the AP.
767d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
768d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
769d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean initiateTdlsSetup(String macAddress) {
770d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return initiateTdlsSetup(NativeUtil.macAddressToByteArray(macAddress));
771d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
772b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
77396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsSetup(byte[/* 6 */] macAddress) {
77496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
77596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsSetup";
77696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
77796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
77896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
77996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsSetup(macAddress);
78096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
78196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
78296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
78396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
78496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
78596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
78696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
78796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
788d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
789d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
790d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Initiate TDLS teardown with the specified AP.
791d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param macAddress MAC Address of the AP.
792d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
793d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
794d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean initiateTdlsTeardown(String macAddress) {
795d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return initiateTdlsTeardown(NativeUtil.macAddressToByteArray(macAddress));
796d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
797d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
798b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
79996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsTeardown(byte[/* 6 */] macAddress) {
80096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
80196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsTeardown";
80296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
80396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
80496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
80596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsTeardown(macAddress);
80696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
80796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
80896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
80996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
81096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
81196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
81296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
81396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
814d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
815d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
816d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Request the specified ANQP elements |elements| from the specified AP |bssid|.
817d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
818d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param bssid BSSID of the AP
819d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param infoElements ANQP elements to be queried. Refer to ISupplicantStaIface.AnqpInfoId.
820d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param hs20SubTypes HS subtypes to be queried. Refer to ISupplicantStaIface.Hs20AnqpSubTypes.
821d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
822d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
823d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean initiateAnqpQuery(String bssid, ArrayList<Short> infoElements,
824d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius                                     ArrayList<Integer> hs20SubTypes) {
825d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return initiateAnqpQuery(
826d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius                NativeUtil.macAddressToByteArray(bssid), infoElements, hs20SubTypes);
827d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
828d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
829b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
83096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateAnqpQuery(byte[/* 6 */] macAddress,
83196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            java.util.ArrayList<Short> infoElements, java.util.ArrayList<Integer> subTypes) {
83296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
83396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateAnqpQuery";
83496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
83596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
83696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
83796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateAnqpQuery(macAddress,
83896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        infoElements, subTypes);
83996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
84096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
84196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
84296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
84396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
84496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
84596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
84696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
847d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
848d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
849d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Request the specified ANQP ICON from the specified AP |bssid|.
850d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
851d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param bssid BSSID of the AP
852d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param fileName Name of the file to request.
853d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
854d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
855d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean initiateHs20IconQuery(String bssid, String fileName) {
856d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return initiateHs20IconQuery(NativeUtil.macAddressToByteArray(bssid), fileName);
857d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
858d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
859b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
86096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateHs20IconQuery(byte[/* 6 */] macAddress, String fileName) {
86196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
86296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateHs20IconQuery";
86396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
86496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
86596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
86696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateHs20IconQuery(macAddress,
86796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        fileName);
86896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
86996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
87096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
87196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
87296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
87396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
87496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
87596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
876d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
87796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
87896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Makes a callback to HIDL to getMacAddress from supplicant
879d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
88096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return string containing the MAC address, or null on a failed call
88196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
882d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public String getMacAddress() {
88396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
88496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getMacAddress";
88596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
88696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
88796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<String> gotMac = new Mutable<>();
88896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
88996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getMacAddress((SupplicantStatus status,
89096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        byte[/* 6 */] macAddr) -> {
8913aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius                    if (checkStatusAndLogFailure(status, methodStr)) {
892d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius                        gotMac.value = NativeUtil.macAddressFromByteArray(macAddr);
89396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
89496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
89596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
89696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
89796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
89896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
8993aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius            return gotMac.value;
90096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
90196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
902d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
903d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
904d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Start using the added RX filters.
905d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
906d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
907d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
908d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean startRxFilter() {
90996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
91096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "startRxFilter";
91196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
91296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
91396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
91496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.startRxFilter();
91596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
91696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
91796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
91896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
91996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
92096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
92196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
92296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
923d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
924d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
925d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Stop using the added RX filters.
926d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
927d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
928d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
929d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean stopRxFilter() {
93096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
93196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "stopRxFilter";
93296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
93396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
93496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
93596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.stopRxFilter();
93696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
93796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
93896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
93996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
94096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
94196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
94296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
94396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
944d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
945d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public static final byte RX_FILTER_TYPE_V4_MULTICAST =
946d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius            ISupplicantStaIface.RxFilterType.V6_MULTICAST;
947d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public static final byte RX_FILTER_TYPE_V6_MULTICAST =
948d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius            ISupplicantStaIface.RxFilterType.V6_MULTICAST;
949d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
950d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Add an RX filter.
951d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
952d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or
953d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *        {@link #RX_FILTER_TYPE_V6_MULTICAST} values.
954d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
955d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
95696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean addRxFilter(byte type) {
95796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
95896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "addRxFilter";
95996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
96096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
96196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
96296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.addRxFilter(type);
96396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
96496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
96596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
96696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
96796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
96896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
96996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
97096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
971d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
972d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
973d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Remove an RX filter.
974d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
975d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or
976d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *        {@link #RX_FILTER_TYPE_V6_MULTICAST} values.
977d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
978d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
97996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean removeRxFilter(byte type) {
98096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
98196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "removeRxFilter";
98296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
98396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
98496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
98596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.removeRxFilter(type);
98696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
98796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
98896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
98996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
99096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
99196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
99296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
99396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
994d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
995d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public static final byte BT_COEX_MODE_ENABLED = ISupplicantStaIface.BtCoexistenceMode.ENABLED;
996d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public static final byte BT_COEX_MODE_DISABLED = ISupplicantStaIface.BtCoexistenceMode.DISABLED;
997d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public static final byte BT_COEX_MODE_SENSE = ISupplicantStaIface.BtCoexistenceMode.SENSE;
998d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
999d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Set Bt co existense mode.
1000d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
1001d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param mode one of the above {@link #BT_COEX_MODE_ENABLED}, {@link #BT_COEX_MODE_DISABLED}
1002d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *             or {@link #BT_COEX_MODE_SENSE} values.
1003d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
1004d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
1005d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean setBtCoexistenceMode(byte mode) {
100696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
100796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setBtCoexistenceMode";
100896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
100996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
101096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
101196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setBtCoexistenceMode(mode);
101296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
101396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
101496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
101596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
101696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
101796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
101896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
101996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
1020d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
1021d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /** Enable or disable BT coexistence mode.
1022d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
1023d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param enable true to enable, false to disable.
1024d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
1025d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
1026d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean setBtCoexistenceScanModeEnabled(boolean enable) {
102796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
102896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setBtCoexistenceScanModeEnabled";
102996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
103096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
103196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
103296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
103396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaIface.setBtCoexistenceScanModeEnabled(enable);
103496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
103596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
103696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
103796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
103896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
103996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
104096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
104196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
1042d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
1043d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
1044d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Enable or disable suspend mode optimizations.
1045d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
1046d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param enable true to enable, false otherwise.
1047d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
1048d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean setSuspendModeEnabled(boolean enable) {
104996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
105096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setSuspendModeEnabled";
105196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
105296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
105396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
105496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setSuspendModeEnabled(enable);
105596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
105696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
105796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
105896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
105996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
106096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
106196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
106296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
1063d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
1064d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    /**
1065d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * Set country code.
1066d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     *
1067d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @param codeStr 2 byte ASCII string. For ex: US, CA.
1068d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     * @return true if request is sent successfully, false otherwise.
1069d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius     */
1070d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    public boolean setCountryCode(String codeStr) {
1071d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius        return setCountryCode(NativeUtil.stringToByteArray(codeStr));
1072d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius    }
1073d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius
1074b4419d876beda78c29836726e43d80203b4a656cRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
107596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setCountryCode(byte[/* 2 */] code) {
107696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
107796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setCountryCode";
107896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
107996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
108096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
108196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setCountryCode(code);
108296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
108396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
108496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
108596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
108696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
108796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
108896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
108996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
109096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
10917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
10927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean startWpsRegistrar(byte[/* 6 */] bssid, String pin) {
10937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
10947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "startWpsRegistrar";
10957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
10967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
10977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
10987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.startWpsRegistrar(bssid, pin);
10997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
11007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
11047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
11087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
11097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean startWpsPbc(byte[/* 6 */] bssid) {
11107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
11117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "startWpsPbc";
11127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
11137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
11147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
11157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.startWpsPbc(bssid);
11167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
11177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
11217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
11257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
11267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean startWpsPinKeypad(String pin) {
11277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
11287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "startWpsPinKeypad";
11297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
11307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
11317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
11327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.startWpsPinKeypad(pin);
11337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
11347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
11387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
11427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
11437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private String startWpsPinDisplay(byte[/* 6 */] bssid) {
11447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
11457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "startWpsPinDisplay";
11467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
11477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
11487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final Mutable<String> gotPin = new Mutable<>();
11497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
11507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                mISupplicantStaIface.startWpsPinDisplay(bssid,
11517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                        (SupplicantStatus status, String pin) -> {
11527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                            if (checkStatusAndLogFailure(status, methodStr)) {
11537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                                gotPin.value = pin;
11547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                            }
11557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                        });
11567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            return gotPin.value;
11617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
11647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
11657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean cancelWps() {
11667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
11677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "cancelWps";
11687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
11697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
11707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
11717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.cancelWps();
11727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
11737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
11777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
11817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    /** See ISupplicantStaIface.hal for documentation */
11827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    private boolean setExternalSim(boolean useExternalSim) {
11837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        synchronized (mLock) {
11847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            final String methodStr = "setExternalSim";
11857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (DBG) Log.i(TAG, methodStr);
11867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
11877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            try {
11887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                SupplicantStatus status = mISupplicantStaIface.setExternalSim(useExternalSim);
11897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return checkStatusAndLogFailure(status, methodStr);
11907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            } catch (RemoteException e) {
11917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
11927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                supplicantServiceDiedHandler();
11937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius                return false;
11947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius            }
11957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius        }
11967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius    }
11977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius
119896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
119996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns false if SupplicantStaIface is null, and logs failure to call methodStr
120096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
120196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean checkSupplicantStaIfaceAndLogFailure(final String methodStr) {
120296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (DBG) Log.i(TAG, methodStr);
120396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (mISupplicantStaIface == null) {
120496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaIface is null");
120596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            return false;
120696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
120796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        return true;
120896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
120996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
121096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
121196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns true if provided status code is SUCCESS, logs debug message and returns false
121296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * otherwise
121396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
121496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private static boolean checkStatusAndLogFailure(SupplicantStatus status,
121596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr) {
121696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (DBG) Log.i(TAG, methodStr);
121796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (status.code != SupplicantStatusCode.SUCCESS) {
121896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Log.e(TAG, methodStr + " failed: " + supplicantStatusCodeToString(status.code) + ", "
121996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    + status.debugMessage);
122096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            return false;
122196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
122296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        return true;
122396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
122496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
122596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
122696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Converts SupplicantStatus code values to strings for debug logging
122796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * TODO(b/34811152) Remove this, or make it more break resistance
122896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
122996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    public static String supplicantStatusCodeToString(int code) {
123096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        switch (code) {
123196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 0:
123296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "SUCCESS";
123396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 1:
123496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_UNKNOWN";
123596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 2:
123696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_ARGS_INVALID";
123796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 3:
123896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_INVALID";
123996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 4:
124096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_UNKNOWN";
124196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 5:
124296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_EXISTS";
124396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 6:
124496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_DISABLED";
124596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 7:
124696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_NOT_DISCONNECTED";
124796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 8:
124896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_NETWORK_INVALID";
124996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 9:
125096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_NETWORK_UNKNOWN";
125196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            default:
125296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "??? UNKNOWN_CODE";
125396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
125496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
125596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
1256240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private static class Mutable<E> {
1257240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        public E value;
1258240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
1259240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        Mutable() {
1260240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            value = null;
1261240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
1262240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
1263240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        Mutable(E value) {
1264240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            this.value = value;
1265240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
1266240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
126766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
126866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private void logd(String s) {
126966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        Log.d(TAG, s);
127066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
127166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
127266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private void logi(String s) {
127366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        Log.i(TAG, s);
127466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
127566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne
127666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    private void loge(String s) {
127766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne        Log.e(TAG, s);
127866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne    }
1279240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne}
1280