SupplicantStaIfaceHal.java revision 96013ebe01c095e2bac5ff7a490a2f9b69876e3c
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
18240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicant;
19240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantIface;
2096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantNetwork;
21240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIface;
2296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork;
23240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.IfaceType;
24240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatus;
25240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode;
26240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceManager;
27240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceNotification;
288c6d09c03532b3936fab2fed6f8b84c895333565Roshan Piusimport android.os.HandlerThread;
29240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.os.RemoteException;
30240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.util.Log;
3196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.util.MutableBoolean;
3296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
3396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport libcore.util.HexEncoding;
34240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
35240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport java.util.ArrayList;
36240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/**
37240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Hal calls for bring up/shut down of the supplicant daemon and for
38240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * sending requests to the supplicant daemon
39240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne *
40240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * {@hide}
41240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */
42240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhnepublic class WifiSupplicantHal {
4396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** Invalid Supplicant Iface type */
4496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    public static final int INVALID_IFACE_TYPE = -1;
45240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private static final boolean DBG = false;
46240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private static final String TAG = "WifiSupplicantHal";
4798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private static final String SERVICE_MANAGER_NAME = "manager";
4898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private IServiceManager mIServiceManager = null;
4998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    // Supplicant HAL interface objects
5098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private ISupplicant mISupplicant;
5198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private ISupplicantStaIface mISupplicantStaIface;
52240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private final Object mLock = new Object();
5398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private final HandlerThread mHandlerThread;
5498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    public WifiSupplicantHal(HandlerThread handlerThread) {
5598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        mHandlerThread = handlerThread;
568c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
57240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
58240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    /**
5998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Registers a service notification for the ISupplicant service, which triggers intialization of
6098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * the ISupplicantStaIface
61240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne     * @return true if the service notification was successfully registered
62240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne     */
63240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    public boolean initialize() {
6498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        if (DBG) Log.i(TAG, "Registering ISupplicant service ready callback.");
65240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
6698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicant = null;
6798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = null;
6898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (mIServiceManager != null) {
6998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                // Already have an IServiceManager and serviceNotification registered, don't
7098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                // don't register another.
7198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return true;
7298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            }
73240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
7498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mIServiceManager = getServiceManagerMockable();
7598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (mIServiceManager == null) {
76240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.e(TAG, "Failed to get HIDL Service Manager");
77240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
78240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
7998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (!mIServiceManager.linkToDeath(cookie -> {
80240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.wtf(TAG, "IServiceManager died: cookie=" + cookie);
81240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    synchronized (mLock) {
82240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        supplicantServiceDiedHandler();
8398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        mIServiceManager = null; // Will need to register a new ServiceNotification
84240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
85240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }, 0)) {
86240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.wtf(TAG, "Error on linkToDeath on IServiceManager");
87240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    supplicantServiceDiedHandler();
8898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                    mIServiceManager = null; // Will need to register a new ServiceNotification
89240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
90240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
91240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                IServiceNotification serviceNotificationCb = new IServiceNotification.Stub() {
92240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    public void onRegistration(String fqName, String name, boolean preexisting) {
9398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        synchronized (mLock) {
9498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            if (DBG) {
9598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.i(TAG, "IServiceNotification.onRegistration for: " + fqName
9698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                        + ", " + name + " preexisting=" + preexisting);
9798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            }
9898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            if (!initSupplicantService() || !initSupplicantStaIface()) {
9998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.e(TAG, "initalizing ISupplicantIfaces failed.");
10098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                supplicantServiceDiedHandler();
10198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            } else {
10298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                                Log.i(TAG, "Completed initialization of ISupplicant interfaces.");
10398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                            }
104240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        }
105240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
106240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                };
107240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                /* TODO(b/33639391) : Use the new ISupplicant.registerForNotifications() once it
108240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                   exists */
10998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (!mIServiceManager.registerForNotifications(ISupplicant.kInterfaceName,
110240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        "", serviceNotificationCb)) {
111240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    Log.e(TAG, "Failed to register for notifications to "
112240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                            + ISupplicant.kInterfaceName);
11398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                    mIServiceManager = null; // Will need to register a new ServiceNotification
114240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    return false;
115240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
116240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
117240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Exception while trying to register a listener for ISupplicant service: "
118240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        + e);
11998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                supplicantServiceDiedHandler();
120240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
121240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            return true;
122240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
123240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
124240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
12598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private boolean initSupplicantService() {
126240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
127240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
12898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mISupplicant = getSupplicantMockable();
129240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
130240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "ISupplicant.getService exception: " + e);
131240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
132240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
13398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (mISupplicant == null) {
134240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup");
135240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
136240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
137240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
138240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        return true;
139240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
140240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
14198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private boolean initSupplicantStaIface() {
142240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
143240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            /** List all supplicant Ifaces */
144240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>();
145240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            try {
14698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                mISupplicant.listInterfaces((SupplicantStatus status,
147240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        ArrayList<ISupplicant.IfaceInfo> ifaces) -> {
148240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    if (status.code != SupplicantStatusCode.SUCCESS) {
149240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        Log.e(TAG, "Getting Supplicant Interfaces failed: " + status.code);
150240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        return;
151240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
152240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    supplicantIfaces.addAll(ifaces);
153240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                });
154240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            } catch (RemoteException e) {
155240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "ISupplicant.listInterfaces exception: " + e);
15698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return false;
157240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
158240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            if (supplicantIfaces.size() == 0) {
159240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                Log.e(TAG, "Got zero HIDL supplicant ifaces. Stopping supplicant HIDL startup.");
16098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                return false;
161240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
162240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            Mutable<ISupplicantIface> supplicantIface = new Mutable<>();
163240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) {
16498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                if (ifaceInfo.type == IfaceType.STA) {
165240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    try {
16698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        mISupplicant.getInterface(ifaceInfo,
167240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                (SupplicantStatus status, ISupplicantIface iface) -> {
168240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                if (status.code != SupplicantStatusCode.SUCCESS) {
169240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                    Log.e(TAG, "Failed to get ISupplicantIface " + status.code);
170240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                    return;
171240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                }
172240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                                supplicantIface.value = iface;
173240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                            });
174240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    } catch (RemoteException e) {
175240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                        Log.e(TAG, "ISupplicant.getInterface exception: " + e);
17698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                        return false;
177240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    }
178240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                    break;
179240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                }
180240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
18198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            if (supplicantIface.value == null) {
18298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne                Log.e(TAG, "initSupplicantStaIface got null iface");
183240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne                return false;
184240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            }
18598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = getStaIfaceMockable(supplicantIface.value);
186240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            return true;
187240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
188240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
189240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
19098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    private void supplicantServiceDiedHandler() {
191240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        synchronized (mLock) {
19298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicant = null;
19398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne            mISupplicantStaIface = null;
194240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
195240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
196240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
19798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    /**
19898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Signals whether Initialization completed successfully. Only necessary for testing, is not
19998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * needed to guard calls etc.
20098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     */
20198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    public boolean isInitializationComplete() {
20298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return mISupplicantStaIface != null;
2038c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
2048c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius
2058c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    /**
20698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne     * Wrapper functions to access static HAL methods, created to be mockable in unit tests
2078c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius     */
20898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected IServiceManager getServiceManagerMockable() throws RemoteException {
20998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return IServiceManager.getService(SERVICE_MANAGER_NAME);
21098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    }
21198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne
21298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected ISupplicant getSupplicantMockable() throws RemoteException {
21398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return ISupplicant.getService();
21498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    }
21598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne
21698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne    protected ISupplicantStaIface getStaIfaceMockable(ISupplicantIface iface) {
21798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne        return ISupplicantStaIface.asInterface(iface.asBinder());
2188c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius    }
2198c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius
22096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
22196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return returns the name of Iface or null if the call fails
22296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
22396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String getName() {
22496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
22596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
22696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getName";
22796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
22896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
22996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final StringBuilder builder = new StringBuilder();
23096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
23196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getName((SupplicantStatus status, String name) -> {
23296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
23396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
23496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
23596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
23696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        builder.append(name);
23796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
23896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
23996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
24096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
24196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
24296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
24396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
24496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return builder.toString();
24596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
24696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
24796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
24896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
24996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
25096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
25196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return the IfaceType value for this interface, or INVALID_IFACE_TYPE if call fails
25296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
25396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private int getType() {
25496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
25596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
25696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<Integer> gotType = new Mutable<>();
25796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getType";
25896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
25996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return INVALID_IFACE_TYPE;
26096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
26196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getType((SupplicantStatus status, int type) -> {
26296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
26396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
26496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
26596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
26696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        gotType.value = type;
26796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
26896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
26996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
27096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
27196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
27296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
27396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
27496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return gotType.value;
27596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
27696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return INVALID_IFACE_TYPE;
27796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
27896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
27996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
28096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
28196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return The ISupplicantNetwork object for the new network, or null if the call fails
28296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
28396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private SupplicantStaNetworkHal addNetwork() {
28496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
28596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
28696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<ISupplicantNetwork> newNetwork = new Mutable<>();
28796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "addNetwork";
28896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
28996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
29096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
29196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.addNetwork((SupplicantStatus status,
29296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ISupplicantNetwork network) -> {
29396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
29496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
29596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
29696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
29796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        newNetwork.value = network;
29896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
29996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
30096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
30196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
30296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
30396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
30496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
30596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return new SupplicantStaNetworkHal(ISupplicantStaNetwork.asInterface(
30696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        newNetwork.value.asBinder()));
30796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
30896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
30996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
31096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
31196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
31296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
31396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Remove network from supplicant with network Id
31496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return true on success of the command
31596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
31696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean removeNetwork(int id) {
31796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
31896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "removeNetwork";
31996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
32096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
32196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
32296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.removeNetwork(id);
32396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
32496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
32596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
32696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
32796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
32896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
32996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
33096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
33196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
33296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if
33396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * the call fails
33496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
33596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private SupplicantStaNetworkHal getNetwork(int id) {
33696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
33796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
33896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<ISupplicantNetwork> gotNetwork = new Mutable<>();
33996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getNetwork";
34096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
34196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
34296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
34396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getNetwork(id, (SupplicantStatus status,
34496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        ISupplicantNetwork network) -> {
34596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
34696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
34796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
34896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
34996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        gotNetwork.value = network;
35096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
35196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
35296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
35396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
35496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
35596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
35696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
35796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return new SupplicantStaNetworkHal(ISupplicantStaNetwork.asInterface(
35896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        gotNetwork.value.asBinder()));
35996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
36096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
36196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
36296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
36396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
36496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
36596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
36696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return a list of SupplicantNetworkID ints for all networks controlled by supplicant, returns
36796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * null if the call fails
36896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
36996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private java.util.ArrayList<Integer> listNetworks() {
37096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
37196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
37296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<ArrayList<Integer>> networkIdList = new Mutable<>();
37396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "listNetworks";
37496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
37596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
37696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
37796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.listNetworks((SupplicantStatus status,
37896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        java.util.ArrayList<Integer> networkIds) -> {
37996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
38096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
38196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
38296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
38396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        networkIdList.value = networkIds;
38496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
38596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
38696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
38796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
38896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
38996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
39096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
39196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return networkIdList.value;
39296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
39396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
39496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
39596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
39696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
39796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
39896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean reassociate() {
39996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
40096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "reassociate";
40196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
40296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
40396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
40496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.reassociate();
40596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
40696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
40796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
40896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
40996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
41096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
41196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
41296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
41396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
41496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean reconnect() {
41596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
41696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "reconnect";
41796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
41896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
41996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
42096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.reconnect();
42196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
42296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
42396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
42496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
42596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
42696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
42796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
42896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
42996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
43096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean disconnect() {
43196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
43296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "disconnect";
43396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
43496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
43596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
43696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.disconnect();
43796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
43896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
43996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
44096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
44196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
44296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
44396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
44496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
44596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
44696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setPowerSave(boolean enable) {
44796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
44896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setPowerSave";
44996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
45096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
45196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
45296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setPowerSave(enable);
45396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
45496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
45596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
45696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
45796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
45896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
45996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
46096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
46196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
46296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsDiscover(byte[/* 6 */] macAddress) {
46396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
46496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsDiscover";
46596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
46696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
46796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
46896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsDiscover(macAddress);
46996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
47096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
47196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
47296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
47396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
47496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
47596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
47696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
47796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
47896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsSetup(byte[/* 6 */] macAddress) {
47996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
48096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsSetup";
48196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
48296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
48396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
48496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsSetup(macAddress);
48596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
48696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
48796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
48896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
48996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
49096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
49196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
49296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
49396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
49496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateTdlsTeardown(byte[/* 6 */] macAddress) {
49596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
49696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateTdlsTeardown";
49796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
49896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
49996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
50096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateTdlsTeardown(macAddress);
50196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
50296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
50396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
50496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
50596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
50696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
50796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
50896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
50996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
51096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateAnqpQuery(byte[/* 6 */] macAddress,
51196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            java.util.ArrayList<Short> infoElements, java.util.ArrayList<Integer> subTypes) {
51296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
51396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateAnqpQuery";
51496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
51596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
51696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
51796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateAnqpQuery(macAddress,
51896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        infoElements, subTypes);
51996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
52096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
52196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
52296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
52396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
52496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
52596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
52696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
52796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
52896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean initiateHs20IconQuery(byte[/* 6 */] macAddress, String fileName) {
52996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
53096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "initiateHs20IconQuery";
53196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
53296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
53396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
53496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.initiateHs20IconQuery(macAddress,
53596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        fileName);
53696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
53796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
53896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
53996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
54096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
54196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
54296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
54396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
54496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
54596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Makes a callback to HIDL to getMacAddress from supplicant
54696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * @return string containing the MAC address, or null on a failed call
54796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
54896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private String getMacAddress() {
54996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
55096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            MutableBoolean statusSuccess = new MutableBoolean(false);
55196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "getMacAddress";
55296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
55396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null;
55496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Mutable<String> gotMac = new Mutable<>();
55596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
55696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                mISupplicantStaIface.getMacAddress((SupplicantStatus status,
55796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        byte[/* 6 */] macAddr) -> {
55896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS;
55996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    if (!statusSuccess.value) {
56096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        Log.e(TAG, methodStr + " failed: " + status.debugMessage);
56196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    } else {
56296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        gotMac.value = String.valueOf(HexEncoding.encode(macAddr));
56396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    }
56496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                });
56596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
56696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e);
56796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
56896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
56996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (statusSuccess.value) {
57096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return gotMac.value;
57196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } else {
57296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return null;
57396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
57496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
57596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
57696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
57796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean startRxFilter() {
57896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
57996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "startRxFilter";
58096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
58196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
58296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
58396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.startRxFilter();
58496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
58596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
58696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
58796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
58896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
58996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
59096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
59196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
59296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
59396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean stopRxFilter() {
59496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
59596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "stopRxFilter";
59696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
59796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
59896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
59996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.stopRxFilter();
60096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
60196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
60296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
60396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
60496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
60596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
60696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
60796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
60896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
60996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean addRxFilter(byte type) {
61096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
61196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "addRxFilter";
61296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
61396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
61496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
61596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.addRxFilter(type);
61696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
61796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
61896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
61996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
62096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
62196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
62296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
62396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
62496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
62596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean removeRxFilter(byte type) {
62696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
62796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "removeRxFilter";
62896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
62996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
63096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
63196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.removeRxFilter(type);
63296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
63396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
63496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
63596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
63696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
63796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
63896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
63996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
64096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
64196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setBtCoexistenceMode(byte mode) {
64296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
64396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setBtCoexistenceMode";
64496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
64596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
64696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
64796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setBtCoexistenceMode(mode);
64896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
64996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
65096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
65196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
65296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
65396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
65496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
65596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
65696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
65796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setBtCoexistenceScanModeEnabled(boolean enable) {
65896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
65996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setBtCoexistenceScanModeEnabled";
66096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
66196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
66296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
66396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status =
66496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                        mISupplicantStaIface.setBtCoexistenceScanModeEnabled(enable);
66596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
66696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
66796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
66896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
66996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
67096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
67196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
67296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
67396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
67496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setSuspendModeEnabled(boolean enable) {
67596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
67696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setSuspendModeEnabled";
67796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
67896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
67996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
68096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setSuspendModeEnabled(enable);
68196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
68296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
68396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
68496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
68596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
68696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
68796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
68896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
68996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /** See SupplicantStaIface.hal for documentation */
69096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean setCountryCode(byte[/* 2 */] code) {
69196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        synchronized (mLock) {
69296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr = "setCountryCode";
69396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (DBG) Log.i(TAG, methodStr);
69496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false;
69596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            try {
69696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                SupplicantStatus status = mISupplicantStaIface.setCountryCode(code);
69796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return checkStatusAndLogFailure(status, methodStr);
69896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            } catch (RemoteException e) {
69996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e);
70096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                supplicantServiceDiedHandler();
70196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return false;
70296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            }
70396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
70496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
70596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
70696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
70796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns false if SupplicantStaIface is null, and logs failure to call methodStr
70896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
70996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private boolean checkSupplicantStaIfaceAndLogFailure(final String methodStr) {
71096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (DBG) Log.i(TAG, methodStr);
71196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (mISupplicantStaIface == null) {
71296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaIface is null");
71396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            return false;
71496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
71596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        return true;
71696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
71796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
71896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
71996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Returns true if provided status code is SUCCESS, logs debug message and returns false
72096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * otherwise
72196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
72296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    private static boolean checkStatusAndLogFailure(SupplicantStatus status,
72396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            final String methodStr) {
72496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (DBG) Log.i(TAG, methodStr);
72596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        if (status.code != SupplicantStatusCode.SUCCESS) {
72696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            Log.e(TAG, methodStr + " failed: " + supplicantStatusCodeToString(status.code) + ", "
72796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                    + status.debugMessage);
72896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            return false;
72996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
73096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        return true;
73196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
73296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
73396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    /**
73496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * Converts SupplicantStatus code values to strings for debug logging
73596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     * TODO(b/34811152) Remove this, or make it more break resistance
73696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne     */
73796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    public static String supplicantStatusCodeToString(int code) {
73896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        switch (code) {
73996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 0:
74096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "SUCCESS";
74196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 1:
74296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_UNKNOWN";
74396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 2:
74496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_ARGS_INVALID";
74596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 3:
74696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_INVALID";
74796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 4:
74896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_UNKNOWN";
74996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 5:
75096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_EXISTS";
75196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 6:
75296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_DISABLED";
75396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 7:
75496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_IFACE_NOT_DISCONNECTED";
75596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 8:
75696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_NETWORK_INVALID";
75796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            case 9:
75896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "FAILURE_NETWORK_UNKNOWN";
75996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne            default:
76096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne                return "??? UNKNOWN_CODE";
76196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne        }
76296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne    }
76396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne
764240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    private static class Mutable<E> {
765240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        public E value;
766240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
767240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        Mutable() {
768240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            value = null;
769240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
770240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne
771240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        Mutable(E value) {
772240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne            this.value = value;
773240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne        }
774240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne    }
775240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne}
776