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