WifiNative.java revision 530040e0b9458994c02f4392765db168128d48da
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;
22618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.text.TextUtils;
2355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.util.Log;
2455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
2555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.io.InputStream;
2655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.lang.Process;
2755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.ArrayList;
2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport java.util.List;
2955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Native calls for sending requests to the supplicant daemon, and for
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * receiving asynchronous events. All methods of the form "xxxxCommand()"
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * must be single-threaded, to avoid requests and responses initiated
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from multiple threads from being intermingled.
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p/>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Note that methods whose names are not of the form "xxxCommand()" do
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * not talk to the supplicant daemon.
38a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * Also, note that all WifiNative calls should happen in the
39a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * WifiStateTracker class except for waitForEvent() call which is
40a8fbe1fb74d3bd40b73c90c85ac25e5176475ca5Irfan Sheriff * on a separate monitor channel for WifiMonitor
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
4255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * TODO: clean up the API and move the functionality from JNI to here. We should
4355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * be able to get everything done with doBooleanCommand, doIntCommand and
4455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * doStringCommand native commands
4555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync *
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@hide}
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class WifiNative {
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_ENABLED = 0;
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_DISABLED = 1;
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static final int BLUETOOTH_COEXISTENCE_MODE_SENSE = 2;
535d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String getErrorString(int errorCode);
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean loadDriver();
57a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff
58a2a1b911a31dd94ee75e94845f762b91f1db1368Irfan Sheriff    public native static boolean isDriverLoaded();
595d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean unloadDriver();
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean startSupplicant();
635d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
64f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff    public native static boolean startP2pSupplicant();
65f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff
66f42c39b3d188ebb3ba9003cffc530717829fe874Irfan Sheriff    /* Does a graceful shutdown of supplicant. Is a common stop function for both p2p and sta.
675d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     *
685d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     * Note that underneath we use a harsh-sounding "terminate" supplicant command
695d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     * for a graceful stop and a mild-sounding "stop" interface
705d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     * to kill the process
715d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     */
725d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff    public native static boolean stopSupplicant();
735d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
745d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff    /* Sends a kill signal to supplicant. To be used when we have lost connection
755d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff       or when the supplicant is hung */
7696071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff    public native static boolean killSupplicant();
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean connectToSupplicant();
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static void closeSupplicantConnection();
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean pingCommand();
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
84a5ec95cdb1a7d2024249277dff1f99d0046c9b56Mike Lockwood    public native static boolean scanCommand(boolean forceActive);
855d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean setScanModeCommand(boolean setActive);
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String listNetworksCommand();
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static int addNetworkCommand();
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean setNetworkVariableCommand(int netId, String name, String value);
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String getNetworkVariableCommand(int netId, String name);
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean removeNetworkCommand(int netId);
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean enableNetworkCommand(int netId, boolean disableOthers);
995d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean disableNetworkCommand(int netId);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean reconnectCommand();
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean reassociateCommand();
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean disconnectCommand();
10796071a7031bac06e3f249610b010ad5651efe8aeIrfan Sheriff
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String statusCommand();
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String getMacAddressCommand();
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String scanResultsCommand();
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean startDriverCommand();
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean stopDriverCommand();
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
118b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
119b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    /**
120b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Start filtering out Multicast V4 packets
121b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * @return {@code true} if the operation succeeded, {@code false} otherwise
122b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     */
123b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    public native static boolean startFilteringMulticastV4Packets();
124b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
125b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    /**
126b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Stop filtering out Multicast V4 packets.
127b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * @return {@code true} if the operation succeeded, {@code false} otherwise
128b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     */
129b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    public native static boolean stopFilteringMulticastV4Packets();
130b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
132b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Start filtering out Multicast V6 packets
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded, {@code false} otherwise
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
135b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    public native static boolean startFilteringMulticastV6Packets();
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
138b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff     * Stop filtering out Multicast V6 packets.
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return {@code true} if the operation succeeded, {@code false} otherwise
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
141b0c1b80f471bd49af60e7b78161d814e355a6972Irfan Sheriff    public native static boolean stopFilteringMulticastV6Packets();
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean setPowerModeCommand(int mode);
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14525c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff    public native static int getBandCommand();
14625c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff
14725c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff    public native static boolean setBandCommand(int band);
14825c9bf2396ceb48fc5cfd5c1dd58aa4d4750d056Irfan Sheriff
149ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup    public native static int getPowerModeCommand();
150ea8bd1d1676dd96f8f9726bb8f67fa18dec7b9c1Mikael Kanstrup
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Sets the bluetooth coexistence mode.
1535d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff     *
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @param mode One of {@link #BLUETOOTH_COEXISTENCE_MODE_DISABLED},
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #BLUETOOTH_COEXISTENCE_MODE_ENABLED}, or
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *            {@link #BLUETOOTH_COEXISTENCE_MODE_SENSE}.
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return Whether the mode was successfully set.
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean setBluetoothCoexistenceModeCommand(int mode);
160b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project
161b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    /**
162b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * Enable or disable Bluetooth coexistence scan mode. When this mode is on,
163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * some of the low-level scan parameters used by the driver are changed to
164b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * reduce interference with A2DP streaming.
165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     *
166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @param isSet whether to enable or disable this mode
167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     * @return {@code true} if the command succeeded, {@code false} otherwise.
168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project     */
169b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project    public native static boolean setBluetoothCoexistenceScanModeCommand(boolean setCoexScanMode);
1705d001ea0271eeedb05984ac00d5e41d767f0cb87Irfan Sheriff
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean saveConfigCommand();
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean reloadConfigCommand();
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean setScanResultHandlingCommand(int mode);
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean addToBlacklistCommand(String bssid);
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static boolean clearBlacklistCommand();
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1815ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff    public native static boolean startWpsPbcCommand(String bssid);
1825ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff
18302fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff    public native static boolean startWpsWithPinFromAccessPointCommand(String bssid, String apPin);
184f235c5ab91b040b88ceb61beb819e15f1b19e9e4Irfan Sheriff
18502fb46a297c4f645f2a30b574151401dd0978521Irfan Sheriff    public native static String startWpsWithPinFromDeviceCommand(String bssid);
1865ee89800bee7c6c755778795a536e0e2f12b85ffIrfan Sheriff
1875876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff    public native static boolean setSuspendOptimizationsCommand(boolean enabled);
1885876a4273e67271f0eca607af9520f7e5abbe4f3Irfan Sheriff
189ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff    public native static boolean setCountryCodeCommand(String countryCode);
190ed4f28b492da3ff140bbaabbbda798a08c40ea5bIrfan Sheriff
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * Wait for the supplicant to send an event, returning the event string.
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     * @return the event string sent by the supplicant.
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public native static String waitForEvent();
196fcc0845cf9990470d498dcaa036f0ae6487ddf34Irfan Sheriff
1972b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff    public native static void enableBackgroundScanCommand(boolean enable);
1982b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff
1992b7f63887e39079a52592fb4507d8daaf90e8afaIrfan Sheriff    public native static void setScanIntervalCommand(int scanInterval);
20055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
20155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    private native static boolean doBooleanCommand(String command);
20255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
20355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    private native static int doIntCommand(String command);
20455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
20555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    private native static String doStringCommand(String command);
20655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
207921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff    /** Example output:
208921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * RSSI=-65
209921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * LINKSPEED=48
210921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * NOISE=9999
211921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     * FREQUENCY=0
212921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff     */
213921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff    public static String signalPoll() {
214921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff        return doStringCommand("SIGNAL_POLL");
215921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff    }
216921df5cbc44c00abe85f04093afe7692e73d490aIrfan Sheriff
2172b8edd0c485f74067605c19983e3e7f44b20ec50repo sync    public static boolean wpsPbc() {
2182b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("WPS_PBC");
2192b8edd0c485f74067605c19983e3e7f44b20ec50repo sync    }
2202b8edd0c485f74067605c19983e3e7f44b20ec50repo sync
2212b8edd0c485f74067605c19983e3e7f44b20ec50repo sync    public static boolean wpsPin(String pin) {
2222b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("WPS_PIN any " + pin);
2232b8edd0c485f74067605c19983e3e7f44b20ec50repo sync    }
2242b8edd0c485f74067605c19983e3e7f44b20ec50repo sync
2259322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    public static boolean setPersistentReconnect(boolean enabled) {
2269322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff        int value = (enabled == true) ? 1 : 0;
2279322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff        return WifiNative.doBooleanCommand("SET persistent_reconnect " + value);
2289322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
2299322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
2309322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    public static boolean setDeviceName(String name) {
2319322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff        return WifiNative.doBooleanCommand("SET device_name " + name);
2329322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
2339322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
2349322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    public static boolean setDeviceType(String type) {
2359322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff        return WifiNative.doBooleanCommand("SET device_type " + type);
2369322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff    }
2379322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff
238618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    public static boolean setConfigMethods(String cfg) {
239618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        return WifiNative.doBooleanCommand("SET config_methods " + cfg);
240618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    }
241618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
242530040e0b9458994c02f4392765db168128d48daIrfan Sheriff    public static boolean setP2pSsidPostfix(String postfix) {
243530040e0b9458994c02f4392765db168128d48daIrfan Sheriff        return WifiNative.doBooleanCommand("SET p2p_ssid_postfix " + postfix);
244530040e0b9458994c02f4392765db168128d48daIrfan Sheriff    }
245530040e0b9458994c02f4392765db168128d48daIrfan Sheriff
24655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pFind() {
2472b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("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        }
2542b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_FIND " + timeout);
25555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
25655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
25755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pListen() {
2582b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("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        }
2652b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_LISTEN " + timeout);
26655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
26755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
26855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pFlush() {
2692b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("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>] */
274ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    public static String p2pConnect(WifiP2pConfig config, boolean joinExistingGroup) {
27555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        if (config == null) return null;
27655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        List<String> args = new ArrayList<String>();
277651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff        WpsInfo wps = config.wps;
27855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        args.add(config.deviceAddress);
27955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
2806f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff        switch (wps.setup) {
281651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.PBC:
28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("pbc");
28355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
284651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.DISPLAY:
285618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                if (TextUtils.isEmpty(wps.pin)) {
286618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                    args.add("pin");
287618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                } else {
288618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                    args.add(wps.pin);
289618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                }
29055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("display");
29155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
292651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.KEYPAD:
2936f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff                args.add(wps.pin);
29455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("keypad");
29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
296651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff            case WpsInfo.LABEL:
2976f7d385d964949e507dcc9c88012372f48d0bce7Irfan Sheriff                args.add(wps.pin);
29855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                args.add("label");
29955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync            default:
30055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync                break;
30155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        }
30255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
303f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        //TODO: Add persist behavior once the supplicant interaction is fixed for both
304f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        // group and client scenarios
305ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        /* Persist unless there is an explicit request to not do so*/
306f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff        //if (config.persist != WifiP2pConfig.Persist.NO) args.add("persistent");
307f9cb1d7082870d9fc5f90290e717065441f611acIrfan Sheriff
308ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        if (joinExistingGroup) args.add("join");
30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
3102b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        int groupOwnerIntent = config.groupOwnerIntent;
3112b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        if (groupOwnerIntent < 0 || groupOwnerIntent > 15) {
3122b8edd0c485f74067605c19983e3e7f44b20ec50repo sync            groupOwnerIntent = 3; //default value
3132b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        }
3142b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        args.add("go_intent=" + groupOwnerIntent);
31555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
3162b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        String command = "P2P_CONNECT ";
31755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        for (String s : args) command += s + " ";
31855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
3192b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doStringCommand(command);
32055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
32155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
322651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff    public static boolean p2pCancelConnect() {
323651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff        return doBooleanCommand("P2P_CANCEL");
324651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff    }
325651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff
326618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    public static boolean p2pProvisionDiscovery(WifiP2pConfig config) {
327618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        if (config == null) return false;
328618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
329618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        switch (config.wps.setup) {
330618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.PBC:
331618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " pbc");
332618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.DISPLAY:
333618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                //We are doing display, so provision discovery is keypad
334618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " keypad");
335618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            case WpsInfo.KEYPAD:
336618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                //We are doing keypad, so provision discovery is display
337618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                return doBooleanCommand("P2P_PROV_DISC " + config.deviceAddress + " display");
338618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff            default:
339618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff                break;
340618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        }
341618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff        return false;
342618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff    }
343618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff
34455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pGroupAdd() {
3452b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_GROUP_ADD");
34655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
34755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
34855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pGroupRemove(String iface) {
34955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync        if (iface == null) return false;
3502b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_GROUP_REMOVE " + iface);
35155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
35255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
35355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pReject(String deviceAddress) {
3542b8edd0c485f74067605c19983e3e7f44b20ec50repo sync        return doBooleanCommand("P2P_REJECT " + deviceAddress);
35555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
35655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync
35755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    /* Invite a peer to a group */
35855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    public static boolean p2pInvite(WifiP2pGroup group, String deviceAddress) {
359ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        if (deviceAddress == null) return false;
360ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
361ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        if (group == null) {
362ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff            return doBooleanCommand("P2P_INVITE peer=" + deviceAddress);
363ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        } else {
364ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff            return doBooleanCommand("P2P_INVITE group=" + group.getInterface()
365ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff                    + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress);
366ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        }
367ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    }
368ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
369ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    /* Reinvoke a persistent connection */
370ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff    public static boolean p2pReinvoke(int netId, String deviceAddress) {
371ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        if (deviceAddress == null || netId < 0) return false;
372ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
373ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff        return doBooleanCommand("P2P_INVITE persistent=" + netId + " peer=" + deviceAddress);
37455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync    }
3758c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync
376ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff
3778c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync    public static String p2pGetInterfaceAddress(String deviceAddress) {
3788c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        if (deviceAddress == null) return null;
3798c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync
3808c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        //  "p2p_peer deviceAddress" returns a multi-line result containing
3818c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        //      intended_addr=fa:7b:7a:42:82:13
3828c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        String peerInfo = p2pPeer(deviceAddress);
3838c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        if (peerInfo == null) return null;
3848c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        String[] tokens= peerInfo.split("\n");
3858c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync
3868c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        for (String token : tokens) {
3878c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync            //TODO: update from interface_addr when wpa_supplicant implementation is fixed
3888c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync            if (token.startsWith("intended_addr=")) {
3898c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync                String[] nameValue = token.split("=");
3908c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync                if (nameValue.length != 2) break;
3918c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync                return nameValue[1];
3928c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync            }
3938c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        }
3948c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        return null;
3958c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync    }
3968c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync
3974be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff    public static String p2pGetDeviceAddress() {
3984be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        String status = statusCommand();
3994be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        if (status == null) return "";
4004be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff
4014be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        String[] tokens = status.split("\n");
4024be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        for (String token : tokens) {
4034be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff            if (token.startsWith("p2p_device_address=")) {
4044be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                String[] nameValue = token.split("=");
4054be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                if (nameValue.length != 2) break;
4064be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff                return nameValue[1];
4074be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff            }
4084be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        }
4094be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff        return "";
4104be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff    }
4114be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff
4128c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync    public static String p2pPeer(String deviceAddress) {
4138c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync        return doStringCommand("P2P_PEER " + deviceAddress);
4148c57bcdbc6b360ee27d59b957a53e64c03257c9drepo sync    }
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
416