WifiNative.java revision 55bc5f3e0408bcb5a39a6732de0b2d1aa99a55be
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net.wifi; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pConfig; 2055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pGroup; 2155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.p2p.WifiP2pDevice; 2255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.util.Log; 2355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.io.InputStream; 2555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.lang.Process; 2655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.ArrayList; 2755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.List; 2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native calls for sending requests to the supplicant daemon, and for 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiving asynchronous events. All methods of the form "xxxxCommand()" 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be single-threaded, to avoid requests and responses initiated 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from multiple threads from being intermingled. 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that methods whose names are not of the form "xxxCommand()" do 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not talk to the supplicant daemon. 37a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * Also, note that all WifiNative calls should happen in the 38a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * WifiStateTracker class except for waitForEvent() call which is 39a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * on a separate monitor channel for WifiMonitor 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * TODO: clean up the API and move the functionality from JNI to here. We should 4255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * be able to get everything done with doBooleanCommand, doIntCommand and 4355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * doStringCommand native commands 4455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide} 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiNative { 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2; 525d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getErrorString(int errorCode); 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean loadDriver(); 56a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff 57a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff public native static boolean isDriverLoaded(); 585d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean unloadDriver(); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean startSupplicant(); 625d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 635d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff /* Does a graceful shutdown of supplicant. 645d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * 655d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * Note that underneath we use a harsh-sounding "terminate" supplicant command 665d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * for a graceful stop and a mild-sounding "stop" interface 675d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * to kill the process 685d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff */ 695d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff public native static boolean stopSupplicant(); 705d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 715d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff /* Sends a kill signal to supplicant. To be used when we have lost connection 725d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff or when the supplicant is hung */ 7396071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff public native static boolean killSupplicant(); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean connectToSupplicant(); 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static void closeSupplicantConnection(); 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean pingCommand(); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 81a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood public native static boolean scanCommand(boolean forceActive); 825d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setScanModeCommand(boolean setActive); 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String listNetworksCommand(); 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int addNetworkCommand(); 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setNetworkVariableCommand(int netId, String name, String value); 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getNetworkVariableCommand(int netId, String name); 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean removeNetworkCommand(int netId); 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean enableNetworkCommand(int netId, boolean disableOthers); 965d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean disableNetworkCommand(int netId); 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reconnectCommand(); 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reassociateCommand(); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean disconnectCommand(); 10496071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String statusCommand(); 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int getRssiCommand(); 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10991f22f901bee5d52d81ca4070a1b187ac8b90dadRobert Greenwalt public native static int getRssiApproxCommand(); 11091f22f901bee5d52d81ca4070a1b187ac8b90dadRobert Greenwalt 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static int getLinkSpeedCommand(); 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String getMacAddressCommand(); 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String scanResultsCommand(); 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean startDriverCommand(); 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean stopDriverCommand(); 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 121b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 122b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff /** 123b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Start filtering out Multicast V4 packets 124b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 125b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff */ 126b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean startFilteringMulticastV4Packets(); 127b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 128b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff /** 129b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Stop filtering out Multicast V4 packets. 130b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * @return {@code true} if the operation succeeded, {@code false} otherwise 131b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff */ 132b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean stopFilteringMulticastV4Packets(); 133b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 135b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Start filtering out Multicast V6 packets 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, {@code false} otherwise 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 138b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean startFilteringMulticastV6Packets(); 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 141b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff * Stop filtering out Multicast V6 packets. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return {@code true} if the operation succeeded, {@code false} otherwise 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 144b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff public native static boolean stopFilteringMulticastV6Packets(); 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setPowerModeCommand(int mode); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14825c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff public native static int getBandCommand(); 14925c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff 15025c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff public native static boolean setBandCommand(int band); 15125c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff 152ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup public native static int getPowerModeCommand(); 153ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the bluetooth coexistence mode. 1565d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff * 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED}, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}. 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the mode was successfully set. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setBluetoothCoexistenceModeCommand(int mode); 163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 164b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project /** 165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * Enable or disable Bluetooth coexistence scan mode. When this mode is on, 166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * some of the low-level scan parameters used by the driver are changed to 167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * reduce interference with A2DP streaming. 168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * 169b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * @param isSet whether to enable or disable this mode 170b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project * @return {@code true} if the command succeeded, {@code false} otherwise. 171b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project */ 172b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public native static boolean setBluetoothCoexistenceScanModeCommand(boolean setCoexScanMode); 1735d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean saveConfigCommand(); 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean reloadConfigCommand(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean setScanResultHandlingCommand(int mode); 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean addToBlacklistCommand(String bssid); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static boolean clearBlacklistCommand(); 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1845ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff public native static boolean startWpsPbcCommand(String bssid); 1855ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 18602fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff public native static boolean startWpsWithPinFromAccessPointCommand(String bssid, String apPin); 187f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff 18802fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff public native static String startWpsWithPinFromDeviceCommand(String bssid); 1895ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff 1905876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff public native static boolean setSuspendOptimizationsCommand(boolean enabled); 1915876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff 192ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff public native static boolean setCountryCodeCommand(String countryCode); 193ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Wait for the supplicant to send an event, returning the event string. 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the event string sent by the supplicant. 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public native static String waitForEvent(); 199fcc0845cf9990470d498dcaa036f0ae6487ddf34Irfan Sheriff 2002b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff public native static void enableBackgroundScanCommand(boolean enable); 2012b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff 2022b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff public native static void setScanIntervalCommand(int scanInterval); 20355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 20455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static boolean doBooleanCommand(String command); 20555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 20655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync //STOPSHIP: remove this after native interface works and replace all 20755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync //calls to doBooleanTempCommand() with doBooleanCommand() 20855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private static boolean doBooleanTempCommand(String command) { 20955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync try { 21055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String str = "/system/bin/wpa_cli " + command; 21155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Log.e("WifiNative", "===> " + str); 21255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Runtime.getRuntime() 21355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .exec(str).waitFor(); 21455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } catch (Exception e) { 21555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Log.e("WifiNative", "exception with doBooleanTempCommand"); 21655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return false; 21755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 21855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return true; 21955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 22055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 22155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private static String doStringTempCommand(String command) { 22255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String lines[] = null; 22355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync try { 22455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String str = "/system/bin/wpa_cli " + command; 22555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Log.e("WifiNative", "===> " + str); 22655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Process p = Runtime.getRuntime() 22755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .exec(str); 22855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync InputStream in = p.getInputStream(); 22955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync p.waitFor(); 23055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync byte[] bytes=new byte[in.available()]; 23155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync in.read(bytes); 23255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String s = new String(bytes); 23355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Log.e("WifiNative", "====> doString: " + s); 23455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync lines = s.split("\\r?\\n"); 23555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } catch (Exception e) { 23655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Log.e("WifiNative", "exception with doBooleanTempCommand"); 23755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return null; 23855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 23955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return lines[1]; 24055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 24155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 24255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static int doIntCommand(String command); 24355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 24455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private native static String doStringCommand(String command); 24555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 24655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFind() { 24755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_find"); 24855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 24955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 25055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFind(int timeout) { 25155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (timeout <= 0) { 25255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return p2pFind(); 25355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 25455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_find " + timeout); 25555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 25655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 25755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pListen() { 25855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_listen"); 25955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 26055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 26155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pListen(int timeout) { 26255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (timeout <= 0) { 26355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return p2pListen(); 26455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 26555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_listen " + timeout); 26655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 26755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 26855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pFlush() { 26955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_flush"); 27055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 27155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 27255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /* p2p_connect <peer device address> <pbc|pin|PIN#> [label|display|keypad] 27355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync [persistent] [join|auth] [go_intent=<0..15>] [freq=<in MHz>] */ 27455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static String p2pConnect(WifiP2pConfig config) { 27555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (config == null) return null; 27655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync List<String> args = new ArrayList<String>(); 27755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WpsConfiguration wpsConfig = config.wpsConfig; 27855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add(config.deviceAddress); 27955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 28055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (wpsConfig.setup) { 28155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case PBC: 28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("pbc"); 28355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 28455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case DISPLAY: 28555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync //TODO: pass the pin back for display 28655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("pin"); 28755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("display"); 28855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 28955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case KEYPAD: 29055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add(wpsConfig.pin); 29155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("keypad"); 29255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 29355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case LABEL: 29455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add(wpsConfig.pin); 29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("label"); 29655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 29755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 29855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 29955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 30055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (config.isPersistent) args.add("persistent"); 30155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (config.joinExistingGroup) args.add("join"); 30255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 30355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync args.add("go_intent=" + config.groupOwnerIntent); 30455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (config.channel > 0) args.add("freq=" + config.channel); 30555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 30655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync String command = "p2p_connect "; 30755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (String s : args) command += s + " "; 30855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doStringTempCommand(command); 31055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 31155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 31255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pGroupAdd() { 31355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_group_add"); 31455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 31555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 31655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pGroupRemove(String iface) { 31755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (iface == null) return false; 31855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_group_remove " + iface); 31955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 32155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pReject(String deviceAddress) { 32255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_reject " + deviceAddress); 32355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 32555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /* Invite a peer to a group */ 32655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pInvite(WifiP2pGroup group, String deviceAddress) { 32755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (group == null || deviceAddress == null) return false; 32855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("p2p_invite group=" + group.getInterface() 32955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress); 33055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pWpsPbc() { 33355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("wps_pbc"); 33455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public static boolean p2pWpsPin(String pin) { 33755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return doBooleanTempCommand("wps_pin any " + pin); 33855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 341