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