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