155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync/* 255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Copyright (C) 2011 The Android Open Source Project 355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Licensed under the Apache License, Version 2.0 (the "License"); 555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * you may not use this file except in compliance with the License. 655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * You may obtain a copy of the License at 755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * http://www.apache.org/licenses/LICENSE-2.0 955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 1055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Unless required by applicable law or agreed to in writing, software 1155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * distributed under the License is distributed on an "AS IS" BASIS, 1255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * See the License for the specific language governing permissions and 1455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * limitations under the License. 1555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 1655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 17f6d09845be2d58b1de7af9f6edc8b9ee216520a5Irfan Sheriffpackage android.net.wifi.p2p; 1855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 19bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.app.Activity; 20bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.app.ActivityManager; 2155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.app.AlertDialog; 22daf57e5ff495684f93d9ac2f5c5fc826a02f5f7aIrfan Sheriffimport android.app.Notification; 23daf57e5ff495684f93d9ac2f5c5fc826a02f5f7aIrfan Sheriffimport android.app.NotificationManager; 24daf57e5ff495684f93d9ac2f5c5fc826a02f5f7aIrfan Sheriffimport android.app.PendingIntent; 25bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.app.ActivityManager.RunningTaskInfo; 2655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.BroadcastReceiver; 2755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.Context; 2855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.DialogInterface; 2955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.DialogInterface.OnClickListener; 3055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.Intent; 3155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.IntentFilter; 3255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.pm.PackageManager; 3355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.content.res.Resources; 34aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.IConnectivityManager; 35aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.ConnectivityManager; 36aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.DhcpInfoInternal; 37aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.DhcpStateMachine; 38aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.InterfaceConfiguration; 39aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.LinkAddress; 40aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.LinkProperties; 41aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.NetworkInfo; 42aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport android.net.NetworkUtils; 4355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.WifiManager; 4455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.WifiMonitor; 4555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.WifiNative; 4655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.net.wifi.WifiStateMachine; 47651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriffimport android.net.wifi.WpsInfo; 480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenagaimport android.net.wifi.p2p.WifiP2pGroupList.GroupDeleteListener; 4921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.net.wifi.p2p.nsd.WifiP2pServiceInfo; 5021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.net.wifi.p2p.nsd.WifiP2pServiceRequest; 5121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.net.wifi.p2p.nsd.WifiP2pServiceResponse; 5255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.Binder; 53bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.os.Bundle; 5455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.IBinder; 55cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriffimport android.os.INetworkManagementService; 5655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.Handler; 5755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.HandlerThread; 5855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.os.Message; 59f6d09845be2d58b1de7af9f6edc8b9ee216520a5Irfan Sheriffimport android.os.Messenger; 60bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.os.Parcel; 61bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.os.Parcelable; 627d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriffimport android.os.RemoteException; 63cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriffimport android.os.ServiceManager; 64cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriffimport android.os.SystemProperties; 655ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 66bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenagaimport android.os.Parcelable.Creator; 679322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriffimport android.provider.Settings; 68618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.text.TextUtils; 6955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.util.Slog; 7021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport android.util.SparseArray; 7155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.view.LayoutInflater; 7255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.view.View; 73618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.view.ViewGroup; 7455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.view.WindowManager; 7555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport android.widget.EditText; 76618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriffimport android.widget.TextView; 7755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 78f6d09845be2d58b1de7af9f6edc8b9ee216520a5Irfan Sheriffimport com.android.internal.R; 79616f3173e08ec6110cf5766c70f84c9e031fb7d7Irfan Sheriffimport com.android.internal.telephony.TelephonyIntents; 8055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport com.android.internal.util.AsyncChannel; 8155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport com.android.internal.util.Protocol; 8255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport com.android.internal.util.State; 8355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncimport com.android.internal.util.StateMachine; 8455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 85aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport java.io.FileDescriptor; 86aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport java.io.PrintWriter; 8721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.ArrayList; 88aea743aaa43a833fd8ff3dc56205197583152d5frepo syncimport java.util.Collection; 8921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.HashMap; 9021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriffimport java.util.List; 91aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 9255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync/** 93de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff * WifiP2pService includes a state machine to perform Wi-Fi p2p operations. Applications 9455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * communicate with this service to issue device discovery and connectivity requests 9555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * through the WifiP2pManager interface. The state machine communicates with the wifi 9655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * driver through wpa_supplicant and handles the event responses through WifiMonitor. 9755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * 9855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Note that the term Wifi when used without a p2p suffix refers to the client mode 9955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * of Wifi operation 10055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * @hide 10155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 10255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo syncpublic class WifiP2pService extends IWifiP2pManager.Stub { 10355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private static final String TAG = "WifiP2pService"; 1047d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final boolean DBG = false; 105aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private static final String NETWORKTYPE = "WIFI_P2P"; 10655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 10755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private Context mContext; 108cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff private String mInterface; 109daf57e5ff495684f93d9ac2f5c5fc826a02f5f7aIrfan Sheriff private Notification mNotification; 110cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff 111cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff INetworkManagementService mNwService; 112aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private DhcpStateMachine mDhcpStateMachine; 11355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 114bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private ActivityManager mActivityMgr; 115bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 11655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pStateMachine mP2pStateMachine; 117ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private AsyncChannel mReplyChannel = new AsyncChannel(); 11855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private AsyncChannel mWifiChannel; 11955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 120618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static final Boolean JOIN_GROUP = true; 121618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static final Boolean FORM_GROUP = false; 122618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final Boolean TRY_REINVOCATION = true;; 1240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final Boolean NO_REINVOCATION = false; 1250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 126ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff private static final Boolean RELOAD = true; 127ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff private static final Boolean NO_RELOAD = false; 128ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff 1290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int CONNECT_FAILURE = -1; 1300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int CONNECT_SUCCESS = 0; 1310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int NEEDS_PROVISION_REQ = 1; 1320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 133ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /* Two minutes comes from the wpa_supplicant setting */ 134618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static final int GROUP_CREATING_WAIT_TIME_MS = 120 * 1000; 135618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static int mGroupCreatingTimeoutIndex = 0; 136aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 13762fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff private static final int DISABLE_P2P_WAIT_TIME_MS = 5 * 1000; 13862fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff private static int mDisableP2pTimeoutIndex = 0; 13962fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff 1407d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff /* Set a two minute discover timeout to avoid STA scans from being blocked */ 1417d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int DISCOVER_TIMEOUT_S = 120; 1427d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff 14355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff /* Idle time after a peer is gone when the group is torn down */ 144ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff private static final int GROUP_IDLE_TIME_S = 10; 14555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff 14655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private static final int BASE = Protocol.BASE_WIFI_P2P_SERVICE; 14755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 148618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* Delayed message to timeout group creation */ 1497d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff public static final int GROUP_CREATING_TIMED_OUT = BASE + 1; 15055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 151618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* User accepted a peer request */ 1527d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int PEER_CONNECTION_USER_ACCEPT = BASE + 2; 153618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* User rejected a peer request */ 1547d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int PEER_CONNECTION_USER_REJECT = BASE + 3; 1559f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff /* User wants to disconnect wifi in favour of p2p */ 1569f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private static final int DROP_WIFI_USER_ACCEPT = BASE + 4; 1579f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff /* User wants to keep his wifi connection and drop p2p */ 1589f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private static final int DROP_WIFI_USER_REJECT = BASE + 5; 15962fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff /* Delayed message to timeout p2p disable */ 16062fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff public static final int DISABLE_P2P_TIMED_OUT = BASE + 6; 1619f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 162295da73f051e1a1280284d94d800c57f163a3986Irfan Sheriff 1633809f500c3411af2ab5ab6c706cdb4373940123eIrfan Sheriff /* Commands to the WifiStateMachine */ 1649f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public static final int P2P_CONNECTION_CHANGED = BASE + 11; 1659f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 1669f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff /* These commands are used to tempoarily disconnect wifi when we detect 1679f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * a frequency conflict which would make it impossible to have with p2p 1689f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * and wifi active at the same time. 1699f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * 1709f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * If the user chooses to disable wifi tempoarily, we keep wifi disconnected 1719f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * until the p2p connection is done and terminated at which point we will 1729f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * bring back wifi up 1739f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * 1749f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * DISCONNECT_WIFI_REQUEST 1759f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff * msg.arg1 = 1 enables temporary disconnect and 0 disables it. 1769f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff */ 1779f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public static final int DISCONNECT_WIFI_REQUEST = BASE + 12; 1789f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public static final int DISCONNECT_WIFI_RESPONSE = BASE + 13; 1793809f500c3411af2ab5ab6c706cdb4373940123eIrfan Sheriff 18055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private final boolean mP2pSupported; 181651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 182651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private WifiP2pDevice mThisDevice = new WifiP2pDevice(); 1834be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1844be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /* When a group has been explicitly created by an app, we persist the group 1854be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * even after all clients have been disconnected until an explicit remove 1864be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * is invoked */ 187bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean mAutonomousGroup; 18855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 18910ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff /* Invitation to join an existing p2p group */ 19010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff private boolean mJoinExistingGroup; 19110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff 192c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff /* Track whether we are in p2p discovery. This is used to avoid sending duplicate 193c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff * broadcasts 194c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff */ 195c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff private boolean mDiscoveryStarted; 196c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 197aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private NetworkInfo mNetworkInfo; 198aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1999f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private boolean mTempoarilyDisconnectedWifi = false; 2009f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 20121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* The transaction Id of service discovery request */ 20221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private byte mServiceTransactionId = 0; 20321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 20421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* Service discovery request ID of wpa_supplicant. 20521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * null means it's not set yet. */ 20621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private String mServiceDiscReqId; 20721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 20821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* clients(application) information list. */ 20921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private HashMap<Messenger, ClientInfo> mClientInfoList = new HashMap<Messenger, ClientInfo>(); 21021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 211bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* The foreground application's messenger. 212bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * The connection request is notified only to foreground application */ 213bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private Messenger mForegroundAppMessenger; 214bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 215bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* the package name of foreground application. */ 216bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private String mForegroundAppPkgName; 217bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 218859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff /* Is chosen as a unique range to avoid conflict with 219859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff the range defined in Tethering.java */ 220859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff private static final String[] DHCP_RANGE = {"192.168.49.2", "192.168.49.254"}; 221859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff private static final String SERVER_ADDRESS = "192.168.49.1"; 222859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff 2230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 2240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Error code definition. 2250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * see the Table.8 in the WiFi Direct specification for the detail. 2260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 2270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static enum P2pStatus { 2280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Success. */ 2290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga SUCCESS, 2300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* The target device is currently unavailable. */ 2320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INFORMATION_IS_CURRENTLY_UNAVAILABLE, 2330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Protocol error. */ 2350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INCOMPATIBLE_PARAMETERS, 2360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* The target device reached the limit of the number of the connectable device. 2380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * For example, device limit or group limit is set. */ 2390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga LIMIT_REACHED, 2400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Protocol error. */ 2420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INVALID_PARAMETER, 2430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unable to accommodate request. */ 2450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNABLE_TO_ACCOMMODATE_REQUEST, 2460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Previous protocol error, or disruptive behavior. */ 2480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga PREVIOUS_PROTOCOL_ERROR, 2490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* There is no common channels the both devices can use. */ 2519f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff NO_COMMON_CHANNEL, 2520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unknown p2p group. For example, Device A tries to invoke the previous persistent group, 2540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * but device B has removed the specified credential already. */ 2550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNKNOWN_P2P_GROUP, 2560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Both p2p devices indicated an intent of 15 in group owner negotiation. */ 2580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga BOTH_GO_INTENT_15, 2590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Incompatible provisioning method. */ 2610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INCOMPATIBLE_PROVISIONING_METHOD, 2620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Rejected by user */ 2640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga REJECTED_BY_USER, 2650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unknown error */ 2670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNKNOWN; 2680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static P2pStatus valueOf(int error) { 2700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga switch(error) { 2710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 0 : 2720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return SUCCESS; 2730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 1: 2740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INFORMATION_IS_CURRENTLY_UNAVAILABLE; 2750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 2: 2760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INCOMPATIBLE_PARAMETERS; 2770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 3: 2780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return LIMIT_REACHED; 2790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 4: 2800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INVALID_PARAMETER; 2810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 5: 2820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNABLE_TO_ACCOMMODATE_REQUEST; 2830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 6: 2840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return PREVIOUS_PROTOCOL_ERROR; 2850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 7: 2869f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff return NO_COMMON_CHANNEL; 2870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 8: 2880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNKNOWN_P2P_GROUP; 2890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 9: 2900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return BOTH_GO_INTENT_15; 2910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 10: 2920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INCOMPATIBLE_PROVISIONING_METHOD; 2930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 11: 2940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return REJECTED_BY_USER; 2950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga default: 2960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNKNOWN; 2970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 3000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 30155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pService(Context context) { 30255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext = context; 30355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 3047d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //STOPSHIP: get this from native side 305fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mInterface = "p2p0"; 306bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mActivityMgr = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE); 307bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 308aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI_P2P, 0, NETWORKTYPE, ""); 309aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 310a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff mP2pSupported = mContext.getPackageManager().hasSystemFeature( 311a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff PackageManager.FEATURE_WIFI_DIRECT); 312a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff 313651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mThisDevice.primaryDeviceType = mContext.getResources().getString( 3149322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff com.android.internal.R.string.config_wifi_p2p_device_type); 31555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 31655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mP2pStateMachine = new P2pStateMachine(TAG, mP2pSupported); 31755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mP2pStateMachine.start(); 318aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 31955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 320cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff public void connectivityServiceReady() { 321cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 322cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff mNwService = INetworkManagementService.Stub.asInterface(b); 323cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff } 324cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff 32555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void enforceAccessPermission() { 32655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_WIFI_STATE, 32755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync "WifiP2pService"); 32855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void enforceChangePermission() { 33155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_WIFI_STATE, 33255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync "WifiP2pService"); 33355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 33655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Get a reference to handler. This is used by a client to establish 33755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * an AsyncChannel communication with WifiP2pService 33855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 33955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Messenger getMessenger() { 34055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync enforceAccessPermission(); 34155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync enforceChangePermission(); 34255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new Messenger(mP2pStateMachine.getHandler()); 34355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 34455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 34555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 34655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 34755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 34855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync != PackageManager.PERMISSION_GRANTED) { 34955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync pw.println("Permission Denial: can't dump WifiP2pService from from pid=" 35055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync + Binder.getCallingPid() 35155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync + ", uid=" + Binder.getCallingUid()); 35255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return; 35355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 35455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 35555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 35655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 35755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 35855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Handles interaction with WifiStateMachine 35955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 36055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private class P2pStateMachine extends StateMachine { 36155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 36255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private DefaultState mDefaultState = new DefaultState(); 36355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pNotSupportedState mP2pNotSupportedState = new P2pNotSupportedState(); 36455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pDisablingState mP2pDisablingState = new P2pDisablingState(); 36555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pDisabledState mP2pDisabledState = new P2pDisabledState(); 36655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pEnablingState mP2pEnablingState = new P2pEnablingState(); 36755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pEnabledState mP2pEnabledState = new P2pEnabledState(); 36855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // Inactive is when p2p is enabled with no connectivity 36955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private InactiveState mInactiveState = new InactiveState(); 370618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private GroupCreatingState mGroupCreatingState = new GroupCreatingState(); 371618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private UserAuthorizingInvitationState mUserAuthorizingInvitationState 372618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff = new UserAuthorizingInvitationState(); 373618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private ProvisionDiscoveryState mProvisionDiscoveryState = new ProvisionDiscoveryState(); 37455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private GroupNegotiationState mGroupNegotiationState = new GroupNegotiationState(); 3759f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private FrequencyConflictState mFrequencyConflictState =new FrequencyConflictState(); 376618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 37755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private GroupCreatedState mGroupCreatedState = new GroupCreatedState(); 378618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private UserAuthorizingJoinState mUserAuthorizingJoinState = new UserAuthorizingJoinState(); 379c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff private OngoingGroupRemovalState mOngoingGroupRemovalState = new OngoingGroupRemovalState(); 38055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 381fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private WifiNative mWifiNative = new WifiNative(mInterface); 382fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private WifiMonitor mWifiMonitor = new WifiMonitor(this, mWifiNative); 38355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 384d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pDeviceList mPeers = new WifiP2pDeviceList(); 38541de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff /* During a connection, supplicant can tell us that a device was lost. From a supplicant's 38641de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * perspective, the discovery stops during connection and it purges device since it does 38741de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * not get latest updates about the device without being in discovery state. 38841de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * 38941de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * From the framework perspective, the device is still there since we are connecting or 39041de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * connected to it. so we keep these devices in a seperate list, so that they are removed 39141de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff * when connection is cancelled or lost 39241de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff */ 39341de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff private final WifiP2pDeviceList mPeersLostDuringConnection = new WifiP2pDeviceList(); 394d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pGroupList mGroups = new WifiP2pGroupList(null, 3950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga new GroupDeleteListener() { 3960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga @Override 3970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public void onDeleteGroup(int netId) { 3980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("called onDeleteGroup() netId=" + netId); 3990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.removeNetwork(netId); 4000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 4010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sendP2pPersistentGroupsChangedBroadcast(); 4020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 4030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga }); 404d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pInfo mWifiP2pInfo = new WifiP2pInfo(); 40555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pGroup mGroup; 40655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 407618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff // Saved WifiP2pConfig for a peer connection 408618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private WifiP2pConfig mSavedPeerConfig; 40955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 41055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // Saved WifiP2pGroup from invitation request 41155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pGroup mSavedP2pGroup; 41255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 413bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // Saved WifiP2pDevice from provisioning request 414bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private WifiP2pDevice mSavedProvDiscDevice; 415bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 41655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync P2pStateMachine(String name, boolean p2pSupported) { 41755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync super(name); 41855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 41955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mDefaultState); 42055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pNotSupportedState, mDefaultState); 42155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pDisablingState, mDefaultState); 42255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pDisabledState, mDefaultState); 42355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pEnablingState, mDefaultState); 42455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pEnabledState, mDefaultState); 42555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mInactiveState, mP2pEnabledState); 426618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mGroupCreatingState, mP2pEnabledState); 427618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mUserAuthorizingInvitationState, mGroupCreatingState); 428618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mProvisionDiscoveryState, mGroupCreatingState); 429618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mGroupNegotiationState, mGroupCreatingState); 4309f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff addState(mFrequencyConflictState, mGroupCreatingState); 43155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mGroupCreatedState, mP2pEnabledState); 432618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mUserAuthorizingJoinState, mGroupCreatedState); 433c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff addState(mOngoingGroupRemovalState, mGroupCreatedState); 43455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 43555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (p2pSupported) { 43655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync setInitialState(mP2pDisabledState); 43755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 43855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync setInitialState(mP2pNotSupportedState); 43955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 44055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 44155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 44255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class DefaultState extends State { 44355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 44455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 445ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 44655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 44755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 44855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 449ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("Full connection with WifiStateMachine established"); 45055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = (AsyncChannel) message.obj; 45155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 452ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Full connection failure, error = " + message.arg1); 45355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = null; 45455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 45555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 45655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 45755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 45855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (message.arg1 == AsyncChannel.STATUS_SEND_UNSUCCESSFUL) { 459ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Send failed, client connection lost"); 46055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 461ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Client connection lost with reason: " + message.arg1); 46255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 46355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = null; 46455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 46555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 46655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: 46755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AsyncChannel ac = new AsyncChannel(); 46855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync ac.connect(mContext, getHandler(), message.replyTo); 46955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 47055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.DISCOVER_PEERS: 4714be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 4724be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 47355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 4747d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 4757d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 4767d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff WifiP2pManager.BUSY); 4777d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff break; 47821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 47921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 48021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 48121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 48255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CONNECT: 4834be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 4844be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 48555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 486651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 487651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, 488651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff WifiP2pManager.BUSY); 489651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff break; 49055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CREATE_GROUP: 4914be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 4924be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 49355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 49455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REMOVE_GROUP: 4954be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 4964be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 49755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 49821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 49921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED, 50021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 50121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 50221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 50321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, 50421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 50521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 50621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 50721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, 50821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 50921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 51021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 51121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, 51221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 51321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 51421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 51521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 51621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, 51721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 51821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 51921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 52021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 52121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, 52221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 52321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 5242bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 5252bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 5262bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.BUSY); 5272bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 5280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 5290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP, 5300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.BUSY); 5310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 532ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 533ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 534ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.BUSY); 535ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 53655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REQUEST_PEERS: 537d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_PEERS, 538d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pDeviceList(mPeers)); 539ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 540ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.REQUEST_CONNECTION_INFO: 541d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_CONNECTION_INFO, 542d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pInfo(mWifiP2pInfo)); 54355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 5444be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff case WifiP2pManager.REQUEST_GROUP_INFO: 545d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, 546d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown mGroup != null ? new WifiP2pGroup(mGroup) : null); 5474be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff break; 5480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO: 5490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO, 550d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pGroupList(mGroups, null)); 5510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 552bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga case WifiP2pManager.SET_DIALOG_LISTENER: 553bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String appPkgName = (String)message.getData().getString( 554bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.APP_PKG_BUNDLE_KEY); 555bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga boolean isReset = message.getData().getBoolean( 556bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.RESET_DIALOG_LISTENER_BUNDLE_KEY); 557bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (setDialogListenerApp(message.replyTo, appPkgName, isReset)) { 558bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_ATTACHED); 559bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 560bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED, 561bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.NOT_IN_FOREGROUND); 562bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 563bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 564295da73f051e1a1280284d94d800c57f163a3986Irfan Sheriff // Ignore 565618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 5667d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SCAN_RESULTS_EVENT: 5677d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUP_CONNECTION_EVENT: 5687d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUP_DISCONNECTION_EVENT: 5697d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.NETWORK_CONNECTION_EVENT: 5707d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 5717d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 572d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: 573d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case WifiMonitor.WPS_SUCCESS_EVENT: 574d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case WifiMonitor.WPS_FAIL_EVENT: 575d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case WifiMonitor.WPS_OVERLAP_EVENT: 576d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case WifiMonitor.WPS_TIMEOUT_EVENT: 57755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 5789cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_FOUND_EVENT: 5799cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_LOST_EVENT: 5809cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_FIND_STOPPED_EVENT: 5819cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_SERV_DISC_RESP_EVENT: 582618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 583618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 5849f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DISCONNECT_WIFI_RESPONSE: 5859f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DROP_WIFI_USER_ACCEPT: 5869f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DROP_WIFI_USER_REJECT: 587618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case GROUP_CREATING_TIMED_OUT: 58862fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case DISABLE_P2P_TIMED_OUT: 589d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case DhcpStateMachine.CMD_PRE_DHCP_ACTION: 590d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case DhcpStateMachine.CMD_POST_DHCP_ACTION: 591d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff case DhcpStateMachine.CMD_ON_QUIT: 592c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_FAILURE_EVENT: 59355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 59462fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 59562fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff // Enable is lazy and has no response 59662fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff break; 59762fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P_REQ: 59862fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff // If we end up handling in default, p2p is not enabled 59962fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff mWifiChannel.sendMessage(WifiStateMachine.CMD_DISABLE_P2P_RSP); 60062fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff break; 601bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* unexpected group created, remove */ 60255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 60355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mGroup = (WifiP2pGroup) message.obj; 60455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff loge("Unexpected group creation, remove " + mGroup); 60555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 60655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff break; 607de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // A group formation failure is always followed by 608de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // a group removed event. Flushing things at group formation 609de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // failure causes supplicant issues. Ignore right now. 61055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: 61155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff break; 61255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 613ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Unhandled message " + message); 61455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 61555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 61655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 61755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 61855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 61955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 62055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pNotSupportedState extends State { 62155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 62255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 62355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 6247d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.DISCOVER_PEERS: 6257d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 62655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.P2P_UNSUPPORTED); 62755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 6287d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 6297d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 630ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 631ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 63221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 63321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 63421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 63521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 636ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.CONNECT: 637ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 638ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 639ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 640651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 641651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, 642651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 643651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff break; 6447d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.CREATE_GROUP: 645ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 646ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 647ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 648ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.REMOVE_GROUP: 649ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 650ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 651ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 65221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 65321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED, 65421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 65521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 656bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga case WifiP2pManager.SET_DIALOG_LISTENER: 657bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED, 658bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.P2P_UNSUPPORTED); 659bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 66021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 66121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, 66221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 66321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 66421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 66521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, 66621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 66721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 66821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 66921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, 67021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 67121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 67221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 67321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 67421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, 67521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 67621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 67721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 67821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 67921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, 68021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 68121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 6822bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 6832bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 6842bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 6852bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 6860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 6870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP, 6880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.P2P_UNSUPPORTED); 6890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 690ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 691ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 692ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.P2P_UNSUPPORTED); 693ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 694ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff default: 69555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 69655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 69755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 69855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 69955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 70055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 70155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pDisablingState extends State { 70255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 70362fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff public void enter() { 70462fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff if (DBG) logd(getName()); 70562fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff sendMessageDelayed(obtainMessage(DISABLE_P2P_TIMED_OUT, 70662fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff ++mDisableP2pTimeoutIndex, 0), DISABLE_P2P_WAIT_TIME_MS); 70762fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff } 70862fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff 70962fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff @Override 71055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 711ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 71255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 71355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUP_DISCONNECTION_EVENT: 7147d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (DBG) logd("p2p socket connection lost"); 71555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mP2pDisabledState); 71655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 7177d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 71862fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P_REQ: 719ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff deferMessage(message); 720ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 72162fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case DISABLE_P2P_TIMED_OUT: 72262fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff if (mGroupCreatingTimeoutIndex == message.arg1) { 72362fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff loge("P2p disable timed out"); 72462fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff transitionTo(mP2pDisabledState); 72562fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff } 72662fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff break; 72755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 72855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 72955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 73055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 73155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 73262fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff 73362fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff @Override 73462fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff public void exit() { 73562fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff mWifiChannel.sendMessage(WifiStateMachine.CMD_DISABLE_P2P_RSP); 73662fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff } 73755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 73855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 73955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pDisabledState extends State { 74055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 74155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 742ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 74355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 74455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 74555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 74655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 747ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 74855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 7497d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 750cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff try { 7517d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mNwService.setInterfaceUp(mInterface); 7527d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } catch (RemoteException re) { 7537d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("Unable to change interface settings: " + re); 7547d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } catch (IllegalStateException ie) { 7557d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("Unable to change interface settings: " + ie); 75655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 7577d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mWifiMonitor.startMonitoring(); 7587d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff transitionTo(mP2pEnablingState); 75955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 76055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 76155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 76255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 76355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 76455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 76555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 76655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 76755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pEnablingState extends State { 76855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 76955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 770ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 77155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 77255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 77355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 77455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 775ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 77655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 77755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUP_CONNECTION_EVENT: 7787d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (DBG) logd("P2p socket connection successful"); 77955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 78055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 781ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiMonitor.SUP_DISCONNECTION_EVENT: 7827d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("P2p socket connection failed"); 783aea743aaa43a833fd8ff3dc56205197583152d5frepo sync transitionTo(mP2pDisabledState); 784ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 7857d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 78662fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P_REQ: 787ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff deferMessage(message); 788ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 78955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 79055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 79155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 79255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 79355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 79455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 79555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 79655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pEnabledState extends State { 79755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 79855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 799ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 80055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pStateChangedBroadcast(true); 801aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setIsAvailable(true); 80255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff sendP2pConnectionChangedBroadcast(); 8039322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff initializeP2pSettings(); 80455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 80555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 80655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 80755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 808ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 80955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 81041de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff case WifiMonitor.SUP_DISCONNECTION_EVENT: 81141de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff loge("Unexpected loss of p2p socket connection"); 81241de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff transitionTo(mP2pDisabledState); 81341de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff break; 8147d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 8157d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //Nothing to do 816ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 81762fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P_REQ: 818ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (mPeers.clear()) sendP2pPeersChangedBroadcast(); 8190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroups.clear()) sendP2pPersistentGroupsChangedBroadcast(); 8200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 8217d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mWifiNative.closeSupplicantConnection(); 82255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mP2pDisablingState); 82355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 8242bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 825ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber { 8262bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pDevice d = (WifiP2pDevice) message.obj; 8272bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (d != null && setAndPersistDeviceName(d.deviceName)) { 8282bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (DBG) logd("set device name " + d.deviceName); 8292bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED); 8302bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } else { 8312bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 8322bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.ERROR); 8332bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 8342bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 835ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 836ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 837ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber { 838ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pWfdInfo d = (WifiP2pWfdInfo) message.obj; 839ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (d != null && setWfdInfo(d)) { 840ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_SUCCEEDED); 841ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } else { 842ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 843ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.ERROR); 844ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 845ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 846ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 84755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.DISCOVER_PEERS: 84821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // do not send service discovery request while normal find operation. 84921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearSupplicantServiceRequest(); 8507d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (mWifiNative.p2pFind(DISCOVER_TIMEOUT_S)) { 851ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_SUCCEEDED); 852c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff sendP2pDiscoveryChangedBroadcast(true); 853ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 8544be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 8554be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.ERROR); 856ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 85755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 858c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff case WifiMonitor.P2P_FIND_STOPPED_EVENT: 859c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff sendP2pDiscoveryChangedBroadcast(false); 860c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff break; 8617d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 8627d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (mWifiNative.p2pStopFind()) { 8637d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_SUCCEEDED); 8647d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } else { 8657d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 8667d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff WifiP2pManager.ERROR); 8677d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } 8687d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff break; 86921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 87021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " discover services"); 87121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!updateSupplicantServiceRequest()) { 87221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 87321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.NO_SERVICE_REQUESTS); 87421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 87521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 87621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mWifiNative.p2pFind(DISCOVER_TIMEOUT_S)) { 87721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_SUCCEEDED); 87821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 87921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 88021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.ERROR); 88121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 88221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 88355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_FOUND_EVENT: 88455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pDevice device = (WifiP2pDevice) message.obj; 885651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff if (mThisDevice.deviceAddress.equals(device.deviceAddress)) break; 8864be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mPeers.update(device); 88755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pPeersChangedBroadcast(); 88855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 88955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_LOST_EVENT: 89055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync device = (WifiP2pDevice) message.obj; 89155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (mPeers.remove(device)) sendP2pPeersChangedBroadcast(); 89255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 89321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 89421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " add service"); 89521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceInfo servInfo = (WifiP2pServiceInfo)message.obj; 89621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (addLocalService(message.replyTo, servInfo)) { 89721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_SUCCEEDED); 89821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 89921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED); 90021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 90121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 90221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 90321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " remove service"); 90421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff servInfo = (WifiP2pServiceInfo)message.obj; 90521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff removeLocalService(message.replyTo, servInfo); 90621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_SUCCEEDED); 90721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 90821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 90921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " clear service"); 91021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearLocalServices(message.replyTo); 91196aa0db9a997bc214471aa0d114a452aea6daa6dIrfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_SUCCEEDED); 91221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 91321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 91421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " add service request"); 91521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!addServiceRequest(message.replyTo, (WifiP2pServiceRequest)message.obj)) { 91621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED); 91721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 91821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 91921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_SUCCEEDED); 92021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 92121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 92221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " remove service request"); 92321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff removeServiceRequest(message.replyTo, (WifiP2pServiceRequest)message.obj); 92421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_SERVICE_REQUEST_SUCCEEDED); 92521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 92621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 92721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " clear service request"); 92821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearServiceRequests(message.replyTo); 92921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_SERVICE_REQUESTS_SUCCEEDED); 93021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 93121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiMonitor.P2P_SERV_DISC_RESP_EVENT: 93221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " receive service response"); 93321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff List<WifiP2pServiceResponse> sdRespList = 93421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff (List<WifiP2pServiceResponse>) message.obj; 93521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (WifiP2pServiceResponse resp : sdRespList) { 93621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pDevice dev = 93721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mPeers.get(resp.getSrcDevice().deviceAddress); 93821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff resp.setSrcDevice(dev); 93921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sendServiceResponse(resp); 94021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 94121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 9420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 9430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " delete persistent group"); 9440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.remove(message.arg1); 9450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP_SUCCEEDED); 9460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 94721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff default: 94855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 94955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 95055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 95155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 95255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 95355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 95455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void exit() { 95555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pStateChangedBroadcast(false); 956aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setIsAvailable(false); 95755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 95855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 95955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 96055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class InactiveState extends State { 9614be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff @Override 9624be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void enter() { 963ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 9644be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff //Start listening every time we get inactive 9657d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //TODO: Fix listen after driver behavior is fixed 9667d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //mWifiNative.p2pListen(); 96755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 96855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 96955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 97055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 971ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 97255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 973618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.CONNECT: 974618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " sending connect"); 975bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pConfig config = (WifiP2pConfig) message.obj; 976bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mAutonomousGroup = false; 977bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 97857e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff /* Update group capability before connect */ 97957e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff int gc = mWifiNative.getGroupCapability(config.deviceAddress); 98057e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff mPeers.updateGroupCapability(config.deviceAddress, gc); 9810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int connectRet = connect(config, TRY_REINVOCATION); 9820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connectRet == CONNECT_FAILURE) { 9830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_FAILED); 9840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 985618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 986bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED); 987618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 988618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 9890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connectRet == NEEDS_PROVISION_REQ) { 9900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Sending prov disc"); 9910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mProvisionDiscoveryState); 9920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 9930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 9940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mGroupNegotiationState); 9950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 9960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.STOP_DISCOVERY: 9970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mWifiNative.p2pStopFind()) { 9980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // When discovery stops in inactive state, flush to clear 9990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // state peer data 10000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.p2pFlush(); 10010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mServiceDiscReqId = null; 10020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_SUCCEEDED); 10030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 10050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.ERROR); 10060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1007618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 100855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT: 1009618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = (WifiP2pConfig) message.obj; 101010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mAutonomousGroup = false; 101110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = false; 1012bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 1013bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig)) { 1014bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 1015bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1016618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1017618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_INVITATION_RECEIVED_EVENT: 1018618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pGroup group = (WifiP2pGroup) message.obj; 1019bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff WifiP2pDevice owner = group.getOwner(); 1020bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 1021bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (owner == null) { 1022bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (DBG) loge("Ignored invitation from null owner"); 1023bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff break; 1024bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 1025bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 1026bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig = new WifiP2pConfig(); 1027bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.deviceAddress = group.getOwner().deviceAddress; 1028bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 1029bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //Check if we have the owner in peer list and use appropriate 1030bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //wps method. Default is to use PBC. 1031bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if ((owner = mPeers.get(owner.deviceAddress)) != null) { 1032bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (owner.wpsPbcSupported()) { 1033bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.PBC; 1034bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } else if (owner.wpsKeypadSupported()) { 1035bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.KEYPAD; 1036bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } else if (owner.wpsDisplaySupported()) { 1037bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY; 1038bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 1039bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 1040bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 104110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mAutonomousGroup = false; 104210ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = true; 1043bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //TODO In the p2p client case, we should set source address correctly. 1044bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 1045bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig)) { 1046bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 1047bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1048618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1049618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 1050618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1051618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1052bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //We let the supplicant handle the provision discovery response 1053bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //and wait instead for the GO_NEGOTIATION_REQUEST_EVENT. 1054bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //Handling provision discovery and issuing a p2p_connect before 1055bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //group negotiation comes through causes issues 1056bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 105755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CREATE_GROUP: 1058de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mAutonomousGroup = true; 10590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = message.arg1; 10600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean ret = false; 10610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId == WifiP2pGroup.PERSISTENT_NET_ID) { 10620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // check if the go persistent group is present. 10630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = mGroups.getNetworkId(mThisDevice.deviceAddress); 10640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId != -1) { 10650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(netId); 10660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(true); 10680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 10690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(false); 10710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 10720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 10730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (ret) { 10740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED); 10750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mGroupNegotiationState); 10760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 10780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.ERROR); 10790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // remain at this state. 10800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 10810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 108251aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 108351aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff mGroup = (WifiP2pGroup) message.obj; 108451aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff if (DBG) logd(getName() + " group started"); 108551aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff 108651aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff // We hit this scenario when a persistent group is reinvoked 108751aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff if (mGroup.getNetworkId() == WifiP2pGroup.PERSISTENT_NET_ID) { 108851aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff mAutonomousGroup = false; 108951aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff deferMessage(message); 109051aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff transitionTo(mGroupNegotiationState); 109151aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff } else { 109251aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff loge("Unexpected group creation, remove " + mGroup); 109351aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 109451aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff } 109551aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff break; 109651aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff default: 10970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NOT_HANDLED; 1098bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1099bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff return HANDLED; 1100bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1101bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1102bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1103618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class GroupCreatingState extends State { 1104bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1105bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void enter() { 1106bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName()); 1107618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessageDelayed(obtainMessage(GROUP_CREATING_TIMED_OUT, 1108618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ++mGroupCreatingTimeoutIndex, 0), GROUP_CREATING_WAIT_TIME_MS); 1109bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1110bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1111bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1112bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public boolean processMessage(Message message) { 1113bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName() + message.toString()); 11149cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff boolean ret = HANDLED; 1115bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff switch (message.what) { 1116618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case GROUP_CREATING_TIMED_OUT: 1117618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mGroupCreatingTimeoutIndex == message.arg1) { 1118618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Group negotiation timed out"); 111955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 1120618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mInactiveState); 1121618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1122bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 11239cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_LOST_EVENT: 11249cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff WifiP2pDevice device = (WifiP2pDevice) message.obj; 1125ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff 1126ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff // If we lose a device during an autonomous group creation, 1127ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff // mSavedPeerConfig can be empty 1128ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff if (mSavedPeerConfig != null && 1129ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff !mSavedPeerConfig.deviceAddress.equals(device.deviceAddress)) { 11309f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (DBG) { 11319f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff logd("mSavedPeerConfig " + mSavedPeerConfig.deviceAddress + 11329f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff "device " + device.deviceAddress); 11339f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 11349cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff // Do the regular device lost handling 11359cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff ret = NOT_HANDLED; 11369cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff break; 11379cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff } 11389cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff // Do nothing 113941de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff if (DBG) logd("Add device to lost list " + device); 114041de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff mPeersLostDuringConnection.update(device); 11419cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff break; 1142618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.DISCOVER_PEERS: 1143618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* Discovery will break negotiation */ 1144618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 1145618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pManager.BUSY); 1146bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 1147618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 114855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //Do a supplicant p2p_cancel which only cancels an ongoing 114955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //group negotiation. This will fail for a pending provision 115055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //discovery or for a pending user action, but at the framework 1151de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff //level, we always treat cancel as succeeded and enter 115255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //an inactive state 115355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pCancelConnect(); 115455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 115555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff transitionTo(mInactiveState); 115655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED); 115755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1158ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff default: 11599cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff ret = NOT_HANDLED; 116055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 11619cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff return ret; 116255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 116355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 116455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1165618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class UserAuthorizingInvitationState extends State { 1166bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1167bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void enter() { 1168bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName()); 11690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga notifyInvitationReceived(); 1170bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1171bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1172bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1173bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public boolean processMessage(Message message) { 1174bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1175bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga boolean ret = HANDLED; 1176bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff switch (message.what) { 1177618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 11780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connect(mSavedPeerConfig, TRY_REINVOCATION) == CONNECT_FAILURE) { 11790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga handleGroupCreationFailure(); 11800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mInactiveState); 11810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 1182618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1183bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED); 1184618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 1185618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1186618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1187618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 1188618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("User rejected invitation " + mSavedPeerConfig); 1189618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1190bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff transitionTo(mInactiveState); 1191bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 1192bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff default: 1193bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff return NOT_HANDLED; 1194bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1195bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return ret; 1196bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1197618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1198618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1199618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void exit() { 1200618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //TODO: dismiss dialog if not already done 1201618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1202bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1203bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1204618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class ProvisionDiscoveryState extends State { 1205618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1206618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void enter() { 1207618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName()); 1208fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pProvisionDiscovery(mSavedPeerConfig); 1209618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1210618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1211618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1212618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public boolean processMessage(Message message) { 1213618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1214618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pProvDiscEvent provDisc; 1215618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pDevice device; 1216618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (message.what) { 1217618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_RSP_EVENT: 1218618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1219618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1220618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1221618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1222618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { 1223618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 12244bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1225618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1226618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1227618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1228618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1229618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1230618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1231618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1232618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1233618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.KEYPAD) { 1234618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 1235618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* we already have the pin */ 1236618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!TextUtils.isEmpty(mSavedPeerConfig.wps.pin)) { 12374bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1238618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1239618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 124010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = false; 12410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 12420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig)) { 12430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 12440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1245618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1246618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1247618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1248618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1249618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1250618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1251618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1252618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1253618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.DISPLAY) { 1254618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 1255618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = provDisc.pin; 12564bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1257bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(provDisc.pin)) { 1258bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(provDisc.pin, device.deviceAddress); 1259bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1260618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1261618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1262618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1263c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_FAILURE_EVENT: 1264c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff loge("provision discovery failed"); 1265c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff handleGroupCreationFailure(); 1266c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff transitionTo(mInactiveState); 1267c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff break; 1268618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1269618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return NOT_HANDLED; 1270618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1271618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return HANDLED; 1272618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1273618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1274bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 127555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class GroupNegotiationState extends State { 1276aea743aaa43a833fd8ff3dc56205197583152d5frepo sync @Override 1277aea743aaa43a833fd8ff3dc56205197583152d5frepo sync public void enter() { 1278ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 127955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 128055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 128155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 128255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 1283ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 128455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 128555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // We ignore these right now, since we get a GROUP_STARTED notification 128655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // afterwards 128755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_SUCCESS_EVENT: 128855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GROUP_FORMATION_SUCCESS_EVENT: 1289ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + " go success"); 129055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1291618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 1292618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mGroup = (WifiP2pGroup) message.obj; 1293618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " group started"); 12940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 12950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroup.getNetworkId() == WifiP2pGroup.PERSISTENT_NET_ID) { 12960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* 12970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * update cache information and set network id to mGroup. 12980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 1299ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff updatePersistentNetworks(NO_RELOAD); 13000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String devAddr = mGroup.getOwner().deviceAddress; 13010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroup.setNetworkId(mGroups.getNetworkId(devAddr, 13020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroup.getNetworkName())); 13030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 13040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1305618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mGroup.isGroupOwner()) { 1306ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff /* Setting an idle time out on GO causes issues with certain scenarios 1307ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff * on clients where it can be off-channel for longer and with the power 1308ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff * save modes used. 1309ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff * 1310ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff * TODO: Verify multi-channel scenarios and supplicant behavior are 1311ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff * better before adding a time out in future 1312ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff */ 1313618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff startDhcpServer(mGroup.getInterface()); 1314618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1315ce6fc8d7a49d1b246e37c4e87fd5e715e408bca2Irfan Sheriff mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); 1316618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine(mContext, 1317618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff P2pStateMachine.this, mGroup.getInterface()); 1318618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP); 1319618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pDevice groupOwner = mGroup.getOwner(); 1320c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff /* update group owner details with the ones found at discovery */ 1321c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff groupOwner.update(mPeers.get(groupOwner.deviceAddress)); 1322bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(groupOwner.deviceAddress, WifiP2pDevice.CONNECTED); 1323618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 1324618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1325618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1326618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1327618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 132855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT: 13299f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff P2pStatus status = (P2pStatus) message.obj; 13309f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (status == P2pStatus.NO_COMMON_CHANNEL) { 13319f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mFrequencyConflictState); 13329f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 13339f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 13349f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff /* continue with group removal handling */ 1335de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 1336ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + " go failure"); 133755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 133855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 133955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1340de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // A group formation failure is always followed by 1341de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // a group removed event. Flushing things at group formation 1342de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // failure causes supplicant issues. Ignore right now. 1343de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: 13449f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff status = (P2pStatus) message.obj; 13459f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (status == P2pStatus.NO_COMMON_CHANNEL) { 13469f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mFrequencyConflictState); 13479f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 13489f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 1349de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff break; 13500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 13519f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff status = (P2pStatus)message.obj; 13520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (status == P2pStatus.SUCCESS) { 13530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // invocation was succeeded. 13540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // wait P2P_GROUP_STARTED_EVENT. 13550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 13560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (status == P2pStatus.UNKNOWN_P2P_GROUP) { 13570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // target device has already removed the credential. 13580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // So, remove this credential accordingly. 13590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mSavedPeerConfig.netId; 13600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 13610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown client from the list"); 13620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga removeClientFromList(netId, mSavedPeerConfig.deviceAddress, true); 13630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 13640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1365ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff // invocation is failed or deferred. Try another way to connect. 1366ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff mSavedPeerConfig.netId = WifiP2pGroup.PERSISTENT_NET_ID; 1367ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff if (connect(mSavedPeerConfig, NO_REINVOCATION) == CONNECT_FAILURE) { 1368ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff handleGroupCreationFailure(); 1369ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff transitionTo(mInactiveState); 1370ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff } 13719f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } else if (status == P2pStatus.NO_COMMON_CHANNEL) { 13729f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mFrequencyConflictState); 1373ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff } else { 13740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga handleGroupCreationFailure(); 13750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mInactiveState); 13760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 13770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 137855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 137955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 138055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 138155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 138255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 138355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 138455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 13859f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff class FrequencyConflictState extends State { 13869f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private AlertDialog mFrequencyConflictDialog; 13879f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff @Override 13889f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public void enter() { 13899f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (DBG) logd(getName()); 13909f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff notifyFrequencyConflict(); 13919f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 13929f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 13939f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff private void notifyFrequencyConflict() { 13949f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff logd("Notify frequency conflict"); 13959f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff Resources r = Resources.getSystem(); 13969f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 13979f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff AlertDialog dialog = new AlertDialog.Builder(mContext) 13989f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff .setMessage(r.getString(R.string.wifi_p2p_frequency_conflict_message, 13999f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff getDeviceName(mSavedPeerConfig.deviceAddress))) 14009f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff .setPositiveButton(r.getString(R.string.dlg_ok), new OnClickListener() { 14019f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff @Override 14029f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public void onClick(DialogInterface dialog, int which) { 14039f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff sendMessage(DROP_WIFI_USER_ACCEPT); 14049f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14059f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff }) 14069f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff .setNegativeButton(r.getString(R.string.decline), new OnClickListener() { 14079f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff @Override 14089f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public void onClick(DialogInterface dialog, int which) { 14099f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff sendMessage(DROP_WIFI_USER_REJECT); 14109f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14119f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff }) 14129f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff .setOnCancelListener(new DialogInterface.OnCancelListener() { 14139f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff @Override 14149f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public void onCancel(DialogInterface arg0) { 14159f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff sendMessage(DROP_WIFI_USER_REJECT); 14169f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14179f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff }) 14189f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff .create(); 14199f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 14209f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 14219f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff dialog.show(); 14229f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff mFrequencyConflictDialog = dialog; 14239f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 1424618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 14259f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff @Override 14269f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public boolean processMessage(Message message) { 14279f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (DBG) logd(getName() + message.toString()); 14289f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff switch (message.what) { 14299f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GO_NEGOTIATION_SUCCESS_EVENT: 14309f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_SUCCESS_EVENT: 14319f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff loge(getName() + "group sucess during freq conflict!"); 14329f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14339f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 14349f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff loge(getName() + "group started after freq conflict, handle anyway"); 14359f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff deferMessage(message); 14369f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mGroupNegotiationState); 14379f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14389f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT: 14399f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 14409f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: 14419f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff // Ignore failures since we retry again 14429f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14439f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DROP_WIFI_USER_REJECT: 14449f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff // User rejected dropping wifi in favour of p2p 14459f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff handleGroupCreationFailure(); 14469f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mInactiveState); 14479f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14489f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DROP_WIFI_USER_ACCEPT: 14499f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff // User accepted dropping wifi in favour of p2p 14509f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff mWifiChannel.sendMessage(WifiP2pService.DISCONNECT_WIFI_REQUEST, 1); 14519f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff mTempoarilyDisconnectedWifi = true; 14529f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14539f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff case DISCONNECT_WIFI_RESPONSE: 14549f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff // Got a response from wifistatemachine, retry p2p 14559f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (DBG) logd(getName() + "Wifi disconnected, retry p2p"); 14569f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff transitionTo(mInactiveState); 14579f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff sendMessage(WifiP2pManager.CONNECT, mSavedPeerConfig); 14589f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff break; 14599f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff default: 14609f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff return NOT_HANDLED; 14619f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14629f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff return HANDLED; 14639f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14649f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 14659f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff public void exit() { 14669f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (mFrequencyConflictDialog != null) mFrequencyConflictDialog.dismiss(); 14679f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 14689f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 1469618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 147055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class GroupCreatedState extends State { 147155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 147255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 1473ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 1474aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null); 1475859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff 1476651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.CONNECTED); 1477651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 1478859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff //DHCP server has already been started if I am a group owner 1479859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff if (mGroup.isGroupOwner()) { 1480859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff setWifiP2pInfoOnGroupFormation(SERVER_ADDRESS); 1481859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff } 148261e42262000549b78843f0959043fec8367ed189Irfan Sheriff 148361e42262000549b78843f0959043fec8367ed189Irfan Sheriff // In case of a negotiation group, connection changed is sent 148461e42262000549b78843f0959043fec8367ed189Irfan Sheriff // after a client joins. For autonomous, send now 148561e42262000549b78843f0959043fec8367ed189Irfan Sheriff if (mAutonomousGroup) { 148661e42262000549b78843f0959043fec8367ed189Irfan Sheriff sendP2pConnectionChangedBroadcast(); 148761e42262000549b78843f0959043fec8367ed189Irfan Sheriff } 148855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 148955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 149055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 149155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 1492ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 149355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 149455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.AP_STA_CONNECTED_EVENT: 1495bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff WifiP2pDevice device = (WifiP2pDevice) message.obj; 1496bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff String deviceAddress = device.deviceAddress; 14979322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (deviceAddress != null) { 1498bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mSavedProvDiscDevice != null && 1499bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga deviceAddress.equals(mSavedProvDiscDevice.deviceAddress)) { 1500bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = null; 1501bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 150261e42262000549b78843f0959043fec8367ed189Irfan Sheriff if (mPeers.get(deviceAddress) != null) { 150361e42262000549b78843f0959043fec8367ed189Irfan Sheriff mGroup.addClient(mPeers.get(deviceAddress)); 150461e42262000549b78843f0959043fec8367ed189Irfan Sheriff } else { 150561e42262000549b78843f0959043fec8367ed189Irfan Sheriff mGroup.addClient(deviceAddress); 150661e42262000549b78843f0959043fec8367ed189Irfan Sheriff } 1507bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(deviceAddress, WifiP2pDevice.CONNECTED); 15089322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd(getName() + " ap sta connected"); 15099322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff sendP2pPeersChangedBroadcast(); 15109322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 1511bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff loge("Connect on null device address, ignore"); 15129322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 1513e0c28d5f1358fc2d4c464f910bd04fed4b283fefIrfan Sheriff sendP2pConnectionChangedBroadcast(); 151455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 151555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.AP_STA_DISCONNECTED_EVENT: 151661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga device = (WifiP2pDevice) message.obj; 151761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga deviceAddress = device.deviceAddress; 15189322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (deviceAddress != null) { 1519bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(deviceAddress, WifiP2pDevice.AVAILABLE); 15209322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (mGroup.removeClient(deviceAddress)) { 15219322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("Removed client " + deviceAddress); 1522bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!mAutonomousGroup && mGroup.isClientListEmpty()) { 15234be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff Slog.d(TAG, "Client list empty, remove non-persistent p2p group"); 1524fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 15255ef9c59fffce221fcfd3f2fcea8f45a41341fa42Irfan Sheriff // We end up sending connection changed broadcast 15265ef9c59fffce221fcfd3f2fcea8f45a41341fa42Irfan Sheriff // when this happens at exit() 15275ef9c59fffce221fcfd3f2fcea8f45a41341fa42Irfan Sheriff } else { 15285ef9c59fffce221fcfd3f2fcea8f45a41341fa42Irfan Sheriff // Notify when a client disconnects from group 15295ef9c59fffce221fcfd3f2fcea8f45a41341fa42Irfan Sheriff sendP2pConnectionChangedBroadcast(); 15304be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 15319322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 15329322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("Failed to remove client " + deviceAddress); 15339322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff for (WifiP2pDevice c : mGroup.getClientList()) { 15349322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("client " + c.deviceAddress); 15359322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 153655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15374be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sendP2pPeersChangedBroadcast(); 15380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " ap sta disconnected"); 15399322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 154061472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga loge("Disconnect on unknown device: " + device); 154155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 154255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1543aea743aaa43a833fd8ff3dc56205197583152d5frepo sync case DhcpStateMachine.CMD_POST_DHCP_ACTION: 1544aea743aaa43a833fd8ff3dc56205197583152d5frepo sync DhcpInfoInternal dhcpInfo = (DhcpInfoInternal) message.obj; 1545ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (message.arg1 == DhcpStateMachine.DHCP_SUCCESS && 1546ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff dhcpInfo != null) { 1547ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("DhcpInfo: " + dhcpInfo); 1548ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff setWifiP2pInfoOnGroupFormation(dhcpInfo.serverAddress); 1549aea743aaa43a833fd8ff3dc56205197583152d5frepo sync sendP2pConnectionChangedBroadcast(); 155055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //Turn on power save on client 155155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.setP2pPowerSave(mGroup.getInterface(), true); 1552ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 155361472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga loge("DHCP failed"); 1554fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 1555aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1556aea743aaa43a833fd8ff3dc56205197583152d5frepo sync break; 155755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REMOVE_GROUP: 15580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " remove group"); 1559fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mWifiNative.p2pGroupRemove(mGroup.getInterface())) { 1560c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff transitionTo(mOngoingGroupRemovalState); 1561ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_SUCCEEDED); 1562ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 1563d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff handleGroupRemoved(); 1564d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff transitionTo(mInactiveState); 15654be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 15664be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.ERROR); 1567ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 156855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 15692bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff /* We do not listen to NETWORK_DISCONNECTION_EVENT for group removal 15702bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * handling since supplicant actually tries to reconnect after a temporary 15712bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * disconnect until group idle time out. Eventually, a group removal event 15722bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * will come when group has been removed. 15732bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * 15742bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * When there are connectivity issues during temporary disconnect, the application 15752bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * will also just remove the group. 15762bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * 15772bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * Treating network disconnection as group removal causes race conditions since 15782bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff * supplicant would still maintain the group at that stage. 15792bc0c5fef25fe6d64b976133a3434233f3515d78Irfan Sheriff */ 158055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 15810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " group removed"); 1582d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff handleGroupRemoved(); 158355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 158455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 158555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_LOST_EVENT: 1586bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff device = (WifiP2pDevice) message.obj; 1587530040e0b9458994c02f4392765db168128d48daIrfan Sheriff //Device loss for a connected device indicates it is not in discovery any more 1588530040e0b9458994c02f4392765db168128d48daIrfan Sheriff if (mGroup.contains(device)) { 158941de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff if (DBG) logd("Add device to lost list " + device); 159041de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff mPeersLostDuringConnection.update(device); 1591530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return HANDLED; 159255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1593530040e0b9458994c02f4392765db168128d48daIrfan Sheriff // Do the regular device lost handling 1594530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return NOT_HANDLED; 159562fa6de135269a7da135bb89b1eb047a4f11d343Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P_REQ: 159655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendMessage(WifiP2pManager.REMOVE_GROUP); 159755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync deferMessage(message); 159855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 159955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CONNECT: 160055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pConfig config = (WifiP2pConfig) message.obj; 1601bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.deviceAddress == null || 1602bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga (mSavedProvDiscDevice != null && 1603bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice.deviceAddress.equals( 1604bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress))) { 1605bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.wps.setup == WpsInfo.PBC) { 1606bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPbc(mGroup.getInterface(), null); 1607bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1608bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.wps.pin == null) { 1609bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String pin = mWifiNative.startWpsPinDisplay(mGroup.getInterface()); 1610bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 1611bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Integer.parseInt(pin); 1612bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(pin)) { 1613bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(pin, 1614bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress != null ? 1615bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress : "any"); 1616bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1617bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (NumberFormatException ignore) { 1618bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // do nothing if pin is invalid 1619bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1620bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1621bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPinKeypad(mGroup.getInterface(), 1622bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.wps.pin); 1623bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1624bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1625bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.deviceAddress != null) { 1626bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED); 1627bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendP2pPeersChangedBroadcast(); 1628bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1629ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 1630ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 1631bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga logd("Inviting device : " + config.deviceAddress); 16320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig = config; 1633bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mWifiNative.p2pInvite(mGroup, config.deviceAddress)) { 1634bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED); 1635bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendP2pPeersChangedBroadcast(); 1636bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 1637bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1638bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 1639bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.ERROR); 1640bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1641ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 164255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // TODO: figure out updating the status to declined when invitation is rejected 164355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 16440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 16450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga P2pStatus status = (P2pStatus)message.obj; 16460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga logd("===> INVITATION RESULT EVENT : " + status); 16470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (status == P2pStatus.SUCCESS) { 16480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // invocation was succeeded. 16490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 16500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (status == P2pStatus.UNKNOWN_P2P_GROUP) { 16510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // target device has already removed the credential. 16520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // So, remove this credential accordingly. 16530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mGroup.getNetworkId(); 16540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 16550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown client from the list"); 16560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!removeClientFromList(netId, 16570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig.deviceAddress, false)) { 16580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // not found the client on the list 16590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Slog.e(TAG, "Already removed the client, ignore"); 16600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 16610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 16620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // try invitation. 16630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sendMessage(WifiP2pManager.CONNECT, mSavedPeerConfig); 16640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 16650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 16660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 166755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 166855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1669618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1670618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pProvDiscEvent provDisc = (WifiP2pProvDiscEvent) message.obj; 1671bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = provDisc.device; 1672618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = new WifiP2pConfig(); 1673618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.deviceAddress = provDisc.device.deviceAddress; 1674618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (message.what == WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT) { 1675618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.KEYPAD; 1676618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else if (message.what == WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT) { 1677618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY; 1678618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = provDisc.pin; 1679618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1680618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.PBC; 1681618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1682bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mSavedProvDiscDevice, mSavedPeerConfig)) { 1683bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingJoinState); 1684bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 168555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 16869322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 16879322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff Slog.e(TAG, "Duplicate group creation event notice, ignore"); 16889322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff break; 168955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 169055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 169155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 169255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 169355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1694aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1695aea743aaa43a833fd8ff3dc56205197583152d5frepo sync public void exit() { 1696bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = null; 1697651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.AVAILABLE); 16980a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff resetWifiP2pInfo(); 1699aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null); 1700ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff sendP2pConnectionChangedBroadcast(); 1701aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 170255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 170355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1704618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class UserAuthorizingJoinState extends State { 1705618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1706618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void enter() { 1707618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName()); 1708618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff notifyInvitationReceived(); 1709618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1710618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1711618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1712618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public boolean processMessage(Message message) { 1713618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1714618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (message.what) { 1715618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 1716618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1717618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1718618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //Ignore more client requests 1719618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1720618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 1721618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { 1722bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPbc(mGroup.getInterface(), null); 1723618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1724bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPinKeypad(mGroup.getInterface(), 1725bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig.wps.pin); 1726618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1727618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1728618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1729618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1730618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 1731618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("User rejected incoming request"); 1732618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1733618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1734618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1735618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1736618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return NOT_HANDLED; 1737618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1738618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return HANDLED; 1739618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1740618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1741618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1742618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void exit() { 1743618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //TODO: dismiss dialog if not already done 1744618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1745618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1746618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1747c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff class OngoingGroupRemovalState extends State { 1748c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff @Override 1749c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff public void enter() { 1750c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff if (DBG) logd(getName()); 1751c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff } 1752c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff 1753c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff @Override 1754c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff public boolean processMessage(Message message) { 1755c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1756c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff switch (message.what) { 1757c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // Group removal ongoing. Multiple calls 1758c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // end up removing persisted network. Do nothing. 1759c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff case WifiP2pManager.REMOVE_GROUP: 1760c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_SUCCEEDED); 1761c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff break; 1762c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // Parent state will transition out of this state 1763c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // when removal is complete 1764c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff default: 1765c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff return NOT_HANDLED; 1766c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff } 1767c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff return HANDLED; 1768c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff } 1769c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff } 1770c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff 177155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void sendP2pStateChangedBroadcast(boolean enabled) { 177255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 177355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 177455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (enabled) { 177555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.putExtra(WifiP2pManager.EXTRA_WIFI_STATE, 177655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.WIFI_P2P_STATE_ENABLED); 177755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 177855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.putExtra(WifiP2pManager.EXTRA_WIFI_STATE, 177955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.WIFI_P2P_STATE_DISABLED); 178055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 17815ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 178255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 178355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1784c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff private void sendP2pDiscoveryChangedBroadcast(boolean started) { 1785c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff if (mDiscoveryStarted == started) return; 1786c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff mDiscoveryStarted = started; 1787c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1788c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff if (DBG) logd("discovery change broadcast " + started); 1789c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1790c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION); 1791c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1792c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE, started ? 1793c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED : 1794c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED); 17955ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1796c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff } 1797c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1798651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private void sendThisDeviceChangedBroadcast() { 1799651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 1800651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1801651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE, new WifiP2pDevice(mThisDevice)); 18025ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1803651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 1804651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 180555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void sendP2pPeersChangedBroadcast() { 180655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 180755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 18085ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 180955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 181055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1811aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private void sendP2pConnectionChangedBroadcast() { 1812ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("sending p2p connection changed broadcast"); 1813aea743aaa43a833fd8ff3dc56205197583152d5frepo sync Intent intent = new Intent(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 1814aea743aaa43a833fd8ff3dc56205197583152d5frepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 1815aea743aaa43a833fd8ff3dc56205197583152d5frepo sync | Intent.FLAG_RECEIVER_REPLACE_PENDING); 1816ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO, new WifiP2pInfo(mWifiP2pInfo)); 1817aea743aaa43a833fd8ff3dc56205197583152d5frepo sync intent.putExtra(WifiP2pManager.EXTRA_NETWORK_INFO, new NetworkInfo(mNetworkInfo)); 18185ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 18193809f500c3411af2ab5ab6c706cdb4373940123eIrfan Sheriff mWifiChannel.sendMessage(WifiP2pService.P2P_CONNECTION_CHANGED, 18203809f500c3411af2ab5ab6c706cdb4373940123eIrfan Sheriff new NetworkInfo(mNetworkInfo)); 1821aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1822aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 18230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private void sendP2pPersistentGroupsChangedBroadcast() { 18240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("sending p2p persistent groups changed broadcast"); 18250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Intent intent = new Intent(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION); 18260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 18275ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 18280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1830aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private void startDhcpServer(String intf) { 1831aea743aaa43a833fd8ff3dc56205197583152d5frepo sync InterfaceConfiguration ifcg = null; 1832aea743aaa43a833fd8ff3dc56205197583152d5frepo sync try { 1833aea743aaa43a833fd8ff3dc56205197583152d5frepo sync ifcg = mNwService.getInterfaceConfig(intf); 1834ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress( 1835ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey SERVER_ADDRESS), 24)); 1836ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setInterfaceUp(); 1837aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNwService.setInterfaceConfig(intf, ifcg); 1838aea743aaa43a833fd8ff3dc56205197583152d5frepo sync /* This starts the dnsmasq server */ 1839859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff mNwService.startTethering(DHCP_RANGE); 1840aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } catch (Exception e) { 1841ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Error configuring interface " + intf + ", :" + e); 1842aea743aaa43a833fd8ff3dc56205197583152d5frepo sync return; 1843aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1844aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1845ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff logd("Started Dhcp server on " + intf); 1846859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff } 1847aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1848b81bb9b40881659428f30b4539dd8877f9ea85f9Irfan Sheriff private void stopDhcpServer(String intf) { 1849aea743aaa43a833fd8ff3dc56205197583152d5frepo sync try { 1850aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNwService.stopTethering(); 1851aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } catch (Exception e) { 1852ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Error stopping Dhcp server" + e); 1853aea743aaa43a833fd8ff3dc56205197583152d5frepo sync return; 1854aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1855aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1856ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff logd("Stopped Dhcp server"); 1857aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1858aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 185955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void notifyP2pEnableFailure() { 186055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 186155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 186255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setTitle(r.getString(R.string.wifi_p2p_dialog_title)) 186355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setMessage(r.getString(R.string.wifi_p2p_failed_message)) 186455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setPositiveButton(r.getString(R.string.ok), null) 186555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 186655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 186755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 186855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 186955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1870618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void addRowToDialog(ViewGroup group, int stringId, String value) { 187155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1872618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff View row = LayoutInflater.from(mContext).inflate(R.layout.wifi_p2p_dialog_row, 1873618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff group, false); 1874618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ((TextView) row.findViewById(R.id.name)).setText(r.getString(stringId)); 1875618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ((TextView) row.findViewById(R.id.value)).setText(value); 1876618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff group.addView(row); 187755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 187855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1879618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void notifyInvitationSent(String pin, String peerAddress) { 188055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1881aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 188255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final View textEntryView = LayoutInflater.from(mContext) 1883618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .inflate(R.layout.wifi_p2p_dialog, null); 1884618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1885618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ViewGroup group = (ViewGroup) textEntryView.findViewById(R.id.info); 1886618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_to_message, getDeviceName(peerAddress)); 1887618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_show_pin_message, pin); 188855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 188955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 1890618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setTitle(r.getString(R.string.wifi_p2p_invitation_sent_title)) 189155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setView(textEntryView) 1892618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setPositiveButton(r.getString(R.string.ok), null) 189355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 189455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 189555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 189655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 189755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1898618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void notifyInvitationReceived() { 189955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1900618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff final WpsInfo wps = mSavedPeerConfig.wps; 190155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final View textEntryView = LayoutInflater.from(mContext) 1902618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .inflate(R.layout.wifi_p2p_dialog, null); 190355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1904618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ViewGroup group = (ViewGroup) textEntryView.findViewById(R.id.info); 1905618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_from_message, getDeviceName( 1906618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.deviceAddress)); 190755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1908618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff final EditText pin = (EditText) textEntryView.findViewById(R.id.wifi_p2p_wps_pin); 190955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 191055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 1911618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setTitle(r.getString(R.string.wifi_p2p_invitation_to_connect_title)) 191255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setView(textEntryView) 1913618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setPositiveButton(r.getString(R.string.accept), new OnClickListener() { 191455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void onClick(DialogInterface dialog, int which) { 1915618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (wps.setup == WpsInfo.KEYPAD) { 1916618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = pin.getText().toString(); 1917618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1918618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " accept invitation " + mSavedPeerConfig); 1919618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessage(PEER_CONNECTION_USER_ACCEPT); 1920bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1921bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff }) 1922618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setNegativeButton(r.getString(R.string.decline), new OnClickListener() { 1923bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1924bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void onClick(DialogInterface dialog, int which) { 1925618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " ignore connect"); 1926618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessage(PEER_CONNECTION_USER_REJECT); 192755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 192855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }) 192910ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff .setOnCancelListener(new DialogInterface.OnCancelListener() { 193010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff @Override 193110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff public void onCancel(DialogInterface arg0) { 193210ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff if (DBG) logd(getName() + " ignore connect"); 193310ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff sendMessage(PEER_CONNECTION_USER_REJECT); 193410ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff } 193510ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff }) 193655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 193755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1938618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //make the enter pin area or the display pin area visible 1939618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (wps.setup) { 1940618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.KEYPAD: 1941618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Enter pin section visible"); 1942618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff textEntryView.findViewById(R.id.enter_pin_section).setVisibility(View.VISIBLE); 1943618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1944618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.DISPLAY: 1945618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Shown pin section visible"); 1946618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_show_pin_message, wps.pin); 1947618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1948618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1949618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1950618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 195155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 195255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 195355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 195455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 195555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 19560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 19570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Synchronize the persistent group list between 19580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * wpa_supplicant and mGroups. 19590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 1960ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff private void updatePersistentNetworks(boolean reload) { 19610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String listStr = mWifiNative.listNetworks(); 1962d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (listStr == null) return; 19630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isSaveRequired = false; 19650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] lines = listStr.split("\n"); 1966d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (lines == null) return; 1967d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff 1968ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff if (reload) mGroups.clear(); 1969ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff 19700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Skip the first line, which is a header 19710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (int i = 1; i < lines.length; i++) { 19720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] result = lines[i].split("\t"); 19730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (result == null || result.length < 4) { 19740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 19750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // network-id | ssid | bssid | flags 19770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = -1; 19780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String ssid = result[1]; 19790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String bssid = result[2]; 19800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String flags = result[3]; 19810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga try { 19820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = Integer.parseInt(result[0]); 19830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } catch(NumberFormatException e) { 19840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga e.printStackTrace(); 19850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 19860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (flags.indexOf("[CURRENT]") != -1) { 19890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 19900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (flags.indexOf("[P2P-PERSISTENT]") == -1) { 19920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* 19930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * The unused profile is sometimes remained when the p2p group formation is failed. 19940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * So, we clean up the p2p group here. 19950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 19960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("clean up the unused persistent group. netId=" + netId); 19970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.removeNetwork(netId); 19980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isSaveRequired = true; 19990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 20000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroups.contains(netId)) { 20030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 20040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pGroup group = new WifiP2pGroup(); 20070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkId(netId); 20080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkName(ssid); 20090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String mode = mWifiNative.getNetworkVariable(netId, "mode"); 20100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mode != null && mode.equals("3")) { 20110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setIsGroupOwner(true); 20120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (bssid.equalsIgnoreCase(mThisDevice.deviceAddress)) { 20140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setOwner(mThisDevice); 20150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 20160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice device = new WifiP2pDevice(); 20170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga device.deviceAddress = bssid; 20180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setOwner(device); 20190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.add(group); 20210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isSaveRequired = true; 20220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2024ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff if (reload || isSaveRequired) { 20250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 2026ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff sendP2pPersistentGroupsChangedBroadcast(); 20270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 20310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Try to connect to the target device. 20320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 20330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Use the persistent credential if it has been stored. 20340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 20350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param config 20360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param tryInvocation if true, try to invoke. Otherwise, never try to invoke. 20370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return 20380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 20390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int connect(WifiP2pConfig config, boolean tryInvocation) { 20400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config == null) { 204241de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff loge("config is null"); 20430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 20440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isResp = (mSavedPeerConfig != null && 20470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga config.deviceAddress.equals(mSavedPeerConfig.deviceAddress)); 20480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig = config; 20490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice dev = mPeers.get(config.deviceAddress); 20510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (dev == null) { 205241de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff loge("target device not found " + config.deviceAddress); 20530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 20540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean join = dev.isGroupOwner(); 20570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String ssid = mWifiNative.p2pGetSsid(dev.deviceAddress); 20580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("target ssid is " + ssid + " join:" + join); 20590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (join && dev.isGroupLimit()) { 20610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("target device reaches group limit."); 20620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // if the target group has reached the limit, 20640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // try group formation. 20650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga join = false; 20660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (join) { 20670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mGroups.getNetworkId(dev.deviceAddress, ssid); 20680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 20690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Skip WPS and start 4way handshake immediately. 20700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!mWifiNative.p2pGroupAdd(netId)) { 20710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 20720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_SUCCESS; 20740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!join && dev.isDeviceLimit()) { 20780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga loge("target device reaches the device limit."); 20790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 20800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!join && tryInvocation && dev.isInvitationCapable()) { 20830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = WifiP2pGroup.PERSISTENT_NET_ID; 20840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config.netId >= 0) { 20850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config.deviceAddress.equals(mGroups.getOwnerAddr(config.netId))) { 20860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = config.netId; 20870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 20890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = mGroups.getNetworkId(dev.deviceAddress); 20900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId < 0) { 20920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = getNetworkIdFromClientList(dev.deviceAddress); 20930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 20940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("netId related with " + dev.deviceAddress + " = " + netId); 20950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 20960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Invoke the persistent group. 2097c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff if (mWifiNative.p2pReinvoke(netId, dev.deviceAddress)) { 2098c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // Save network id. It'll be used when an invitation result event is received. 2099c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff mSavedPeerConfig.netId = netId; 2100c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff return CONNECT_SUCCESS; 2101c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff } else { 2102c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff loge("p2pReinvoke() failed, update networks"); 2103ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff updatePersistentNetworks(RELOAD); 2104c41096e1b4bf453c195c8c46c5d296f2125d31f6Irfan Sheriff // continue with negotiation 21050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga //Stop discovery before issuing connect 21100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.p2pStopFind(); 21110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!isResp) { 21130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NEEDS_PROVISION_REQ; 21140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21164bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(config); 21170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_SUCCESS; 21180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 21210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Return the network id of the group owner profile which has the p2p client with 21220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * the specified device address in it's client list. 21230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * If more than one persistent group of the same address is present in its client 21240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * lists, return the first one. 21250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 21260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param deviceAddress p2p device address. 21270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return the network id. if not found, return -1. 21280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 21290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int getNetworkIdFromClientList(String deviceAddress) { 21300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (deviceAddress == null) return -1; 21310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Collection<WifiP2pGroup> groups = mGroups.getGroupList(); 21330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (WifiP2pGroup group : groups) { 21340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = group.getNetworkId(); 21350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] p2pClientList = getClientList(netId); 21360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (p2pClientList == null) continue; 21370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (String client : p2pClientList) { 21380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (deviceAddress.equalsIgnoreCase(client)) { 21390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return netId; 21400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2143ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return -1; 2144ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2145ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 21460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 21470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Return p2p client list associated with the specified network id. 21480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param netId network id. 21490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return p2p client list. if not found, return null. 21500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 21510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private String[] getClientList(int netId) { 21520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String p2pClients = mWifiNative.getNetworkVariable(netId, "p2p_client_list"); 21530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (p2pClients == null) { 21540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return null; 21550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return p2pClients.split(" "); 21570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 21600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Remove the specified p2p client from the specified profile. 21610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param netId network id of the profile. 21620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param addr p2p client address to be removed. 21630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param isRemovable if true, remove the specified profile if its client list becomes empty. 21640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return whether removing the specified p2p client is successful or not. 21650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 21660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private boolean removeClientFromList(int netId, String addr, boolean isRemovable) { 21670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga StringBuilder modifiedClientList = new StringBuilder(); 21680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] currentClientList = getClientList(netId); 21690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isClientRemoved = false; 21700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (currentClientList != null) { 21710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (String client : currentClientList) { 21720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!client.equalsIgnoreCase(addr)) { 21730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append(" "); 21740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append(client); 21750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 21760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isClientRemoved = true; 21770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (modifiedClientList.length() == 0 && isRemovable) { 21810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // the client list is empty. so remove it. 21820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown network"); 21830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.remove(netId); 21840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return true; 21850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!isClientRemoved) { 21880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // specified p2p client is not found. already removed. 21890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return false; 21900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 21920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Modified client list: " + modifiedClientList); 21930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (modifiedClientList.length() == 0) { 21940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append("\"\""); 21950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 21960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.setNetworkVariable(netId, 21970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga "p2p_client_list", modifiedClientList.toString()); 21980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 21990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return true; 22000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 22010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2202ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void setWifiP2pInfoOnGroupFormation(String serverAddress) { 2203ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupFormed = true; 2204ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.isGroupOwner = mGroup.isGroupOwner(); 2205ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupOwnerAddress = NetworkUtils.numericToInetAddress(serverAddress); 2206ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2207ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 22080a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff private void resetWifiP2pInfo() { 2209ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupFormed = false; 2210ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.isGroupOwner = false; 2211ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupOwnerAddress = null; 2212ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2213ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2214618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private String getDeviceName(String deviceAddress) { 2215bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pDevice d = mPeers.get(deviceAddress); 2216bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (d != null) { 2217618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return d.deviceName; 2218618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 2219618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //Treat the address as name if there is no match 2220618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return deviceAddress; 2221618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 2222618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 22234bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff private void p2pConnectWithPinDisplay(WifiP2pConfig config) { 22244bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff WifiP2pDevice dev = mPeers.get(config.deviceAddress); 22254bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff if (dev == null) { 22264bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff loge("target device is not found " + config.deviceAddress); 22274bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff return; 22284bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff } 22294bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff 22304bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff String pin = mWifiNative.p2pConnect(config, dev.isGroupOwner()); 2231bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff try { 2232bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff Integer.parseInt(pin); 2233bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(pin)) { 2234bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(pin, config.deviceAddress); 2235bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2236bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } catch (NumberFormatException ignore) { 2237bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff // do nothing if p2pConnect did not return a pin 2238bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 2239bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 2240bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 22412bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff private String getPersistedDeviceName() { 2242bdfce2ec05a3e9ca6acd6711de6133e06f2446e6Jeff Sharkey String deviceName = Settings.Global.getString(mContext.getContentResolver(), 2243bdfce2ec05a3e9ca6acd6711de6133e06f2446e6Jeff Sharkey Settings.Global.WIFI_P2P_DEVICE_NAME); 22442bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (deviceName == null) { 22452bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff /* We use the 4 digits of the ANDROID_ID to have a friendly 22462bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff * default that has low likelihood of collision with a peer */ 22472bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff String id = Settings.Secure.getString(mContext.getContentResolver(), 22482bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff Settings.Secure.ANDROID_ID); 22492bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return "Android_" + id.substring(0,4); 22502bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 22512bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return deviceName; 22522bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 22532bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 22542bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff private boolean setAndPersistDeviceName(String devName) { 22552bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (devName == null) return false; 22562bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 22572bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (!mWifiNative.setDeviceName(devName)) { 22582bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff loge("Failed to set device name " + devName); 22592bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return false; 22602bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 22612bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 22622bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mThisDevice.deviceName = devName; 22632bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); 22642bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 2265bdfce2ec05a3e9ca6acd6711de6133e06f2446e6Jeff Sharkey Settings.Global.putString(mContext.getContentResolver(), 2266bdfce2ec05a3e9ca6acd6711de6133e06f2446e6Jeff Sharkey Settings.Global.WIFI_P2P_DEVICE_NAME, devName); 22672bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff sendThisDeviceChangedBroadcast(); 22682bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return true; 22692bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 22702bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 2271ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber private boolean setWfdInfo(WifiP2pWfdInfo wfdInfo) { 2272ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber boolean success; 2273ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2274ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (!wfdInfo.isWfdEnabled()) { 2275ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber success = mWifiNative.setWfdEnable(false); 2276ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } else { 2277ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber success = 2278ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber mWifiNative.setWfdEnable(true) 2279ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber && mWifiNative.setWfdDeviceInfo(wfdInfo.getDeviceInfoHex()); 2280ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2281ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2282ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (!success) { 2283ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber loge("Failed to set wfd properties"); 2284ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber return false; 2285ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2286ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2287ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber mThisDevice.wfdInfo = wfdInfo; 2288ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber sendThisDeviceChangedBroadcast(); 2289ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber return true; 2290ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2291ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 22929322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff private void initializeP2pSettings() { 2293fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setPersistentReconnect(true); 22942bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mThisDevice.deviceName = getPersistedDeviceName(); 2295fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setDeviceName(mThisDevice.deviceName); 2296de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // DIRECT-XY-DEVICENAME (XY is randomly generated) 2297fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); 2298fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setDeviceType(mThisDevice.primaryDeviceType); 2299de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // Supplicant defaults to using virtual display with display 2300de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // which refers to a remote display. Use physical_display 2301de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mWifiNative.setConfigMethods("virtual_push_button physical_display keypad"); 2302de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // STA has higher priority over P2P 230355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.setConcurrencyPriority("sta"); 23044be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2305fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mThisDevice.deviceAddress = mWifiNative.p2pGetDeviceAddress(); 2306651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.AVAILABLE); 2307651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff if (DBG) Slog.d(TAG, "DeviceAddress: " + mThisDevice.deviceAddress); 230821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 230921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.clear(); 231021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pFlush(); 231121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceFlush(); 231221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceTransactionId = 0; 231321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = null; 23140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2315ca1269fcb8265c36660b3b47e5c06180e94e6485Irfan Sheriff updatePersistentNetworks(RELOAD); 2316651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 2317651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 2318651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private void updateThisDevice(int status) { 2319651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mThisDevice.status = status; 2320651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff sendThisDeviceChangedBroadcast(); 23219322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 23229322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff 232355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff private void handleGroupCreationFailure() { 23240a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff resetWifiP2pInfo(); 23250a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.FAILED, null, null); 23260a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff sendP2pConnectionChangedBroadcast(); 232755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mSavedPeerConfig = null; 232855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff /* After cancelling group formation, new connections on existing peers can fail 232955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff * at supplicant. Flush and restart discovery */ 233055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pFlush(); 233141de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff if (mPeers.remove(mPeersLostDuringConnection)) sendP2pPeersChangedBroadcast(); 233241de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff mPeersLostDuringConnection.clear(); 2333de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mServiceDiscReqId = null; 233455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff sendMessage(WifiP2pManager.DISCOVER_PEERS); 233555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff } 233655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff 2337d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff private void handleGroupRemoved() { 2338d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff Collection <WifiP2pDevice> devices = mGroup.getClientList(); 2339d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff boolean changed = false; 2340d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff for (WifiP2pDevice d : mPeers.getDeviceList()) { 2341d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (devices.contains(d) || mGroup.getOwner().equals(d)) { 2342d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff d.status = WifiP2pDevice.AVAILABLE; 2343d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff changed = true; 2344d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff } 2345d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff } 2346d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff 2347d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (mGroup.isGroupOwner()) { 2348d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff stopDhcpServer(mGroup.getInterface()); 2349d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff } else { 2350d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (DBG) logd("stop DHCP client"); 2351d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_STOP_DHCP); 2352d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mDhcpStateMachine.doQuit(); 2353d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mDhcpStateMachine = null; 2354d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff } 2355d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff 23560befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff try { 23570befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff mNwService.clearInterfaceAddresses(mGroup.getInterface()); 23580befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff } catch (Exception e) { 23590befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff loge("Failed to clear addresses " + e); 23600befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff } 23610befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff NetworkUtils.resetConnections(mGroup.getInterface(), NetworkUtils.RESET_ALL_ADDRESSES); 23620befeb29bcdf05b913a332edb4f222e11b4817acIrfan Sheriff 236351aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff // Clear any timeout that was set. This is essential for devices 236451aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff // that reuse the main p2p interface for a created group. 236551aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff mWifiNative.setP2pGroupIdle(mGroup.getInterface(), 0); 236651aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff 2367d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mGroup = null; 2368d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mWifiNative.p2pFlush(); 236941de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff if (mPeers.remove(mPeersLostDuringConnection)) sendP2pPeersChangedBroadcast(); 237041de2404658c7c6faf6c78e777ba50af11784f5cIrfan Sheriff mPeersLostDuringConnection.clear(); 2371d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff mServiceDiscReqId = null; 2372d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff if (changed) sendP2pPeersChangedBroadcast(); 23739f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff 23749f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff if (mTempoarilyDisconnectedWifi) { 23759f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff mWifiChannel.sendMessage(WifiP2pService.DISCONNECT_WIFI_REQUEST, 0); 23769f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff mTempoarilyDisconnectedWifi = false; 23779f452d0b5ccad77fb6acfd1b20d5f77c9f425d22Irfan Sheriff } 237851aec5ed5f78bfc5dea134fa88ef07fcdd572ba2Irfan Sheriff } 2379d36adc31ce0335635b536174299e15b9f099c9adIrfan Sheriff 2380ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff //State machine initiated requests can have replyTo set to null indicating 2381de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff //there are no recipients, we ignore those reply actions 2382ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void replyToMessage(Message msg, int what) { 2383ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (msg.replyTo == null) return; 2384651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2385651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2386651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2387ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2388ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2389f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff private void replyToMessage(Message msg, int what, int arg1) { 2390f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff if (msg.replyTo == null) return; 2391651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2392651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2393651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.arg1 = arg1; 2394651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2395f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff } 2396f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff 2397ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void replyToMessage(Message msg, int what, Object obj) { 2398ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (msg.replyTo == null) return; 2399651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2400651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2401651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.obj = obj; 2402651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2403651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 2404651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 2405651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /* arg2 on the source message has a hash code that needs to be retained in replies 2406651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff * see WifiP2pManager for details */ 2407651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private Message obtainMessage(Message srcMsg) { 2408651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message msg = Message.obtain(); 2409651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff msg.arg2 = srcMsg.arg2; 2410651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff return msg; 2411ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2412ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2413ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void logd(String s) { 2414ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff Slog.d(TAG, s); 2415ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2416ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2417ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void loge(String s) { 2418ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff Slog.e(TAG, s); 2419ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2420ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 242121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 242221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Update service discovery request to wpa_supplicant. 242321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 242421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean updateSupplicantServiceRequest() { 242521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearSupplicantServiceRequest(); 242621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 242721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff StringBuffer sb = new StringBuffer(); 242821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c: mClientInfoList.values()) { 242921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int key; 243021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceRequest req; 243121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (int i=0; i < c.mReqList.size(); i++) { 24323b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff req = c.mReqList.valueAt(i); 243321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (req != null) { 243421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sb.append(req.getSupplicantQuery()); 243521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 243621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 243721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 243821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 243921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (sb.length() == 0) { 244021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 244121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 244221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 244321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = mWifiNative.p2pServDiscReq("00:00:00:00:00:00", sb.toString()); 244421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 244521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 244621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 244721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 244821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 244921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 245021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 245121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Clear service discovery request in wpa_supplicant 245221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 245321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearSupplicantServiceRequest() { 245421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) return; 245521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 245621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServDiscCancelReq(mServiceDiscReqId); 245721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = null; 245821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 245921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2460de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff /* TODO: We could track individual service adds separately and avoid 246121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * having to do update all service requests on every new request 246221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 246321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean addServiceRequest(Messenger m, WifiP2pServiceRequest req) { 246421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientDeadChannels(); 246521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, true); 246621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 246721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 246821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 246921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 24703b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff ++mServiceTransactionId; 24713b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //The Wi-Fi p2p spec says transaction id should be non-zero 24723b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (mServiceTransactionId == 0) ++mServiceTransactionId; 24733b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff req.setTransactionId(mServiceTransactionId); 247421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mReqList.put(mServiceTransactionId, req); 247521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 247621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 247721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 247821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 247921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 248021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return updateSupplicantServiceRequest(); 248121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 248221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 248321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void removeServiceRequest(Messenger m, WifiP2pServiceRequest req) { 248421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 248521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 248621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 248721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 248821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 24893b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //Application does not have transaction id information 24903b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //go through stored requests to remove 24913b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff boolean removed = false; 24920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (int i=0; i<clientInfo.mReqList.size(); i++) { 24933b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (req.equals(clientInfo.mReqList.valueAt(i))) { 24943b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff removed = true; 24953b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff clientInfo.mReqList.removeAt(i); 24963b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff break; 24973b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 24983b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 24993b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 25003b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (!removed) return; 250121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 250221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0 && clientInfo.mServList.size() == 0) { 250321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 250421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 250521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 250621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 250721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 250821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 250921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 251021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 251121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff updateSupplicantServiceRequest(); 251221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 251321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 251421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearServiceRequests(Messenger m) { 251521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 251621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 251721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 251821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 251921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 252021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 252121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0) { 252221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 252321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 252421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 252521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mReqList.clear(); 252621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 252721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mServList.size() == 0) { 252821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove channel information from framework"); 252921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 253021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 253121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 253221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 253321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 253421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 253521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 253621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff updateSupplicantServiceRequest(); 253721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 253821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 253921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean addLocalService(Messenger m, WifiP2pServiceInfo servInfo) { 254021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientDeadChannels(); 254121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, true); 254221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 254321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 254421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 254521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 254621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!clientInfo.mServList.add(servInfo)) { 254721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 254821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 254921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 255021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!mWifiNative.p2pServiceAdd(servInfo)) { 255121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.remove(servInfo); 255221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 255321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 255421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 255521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 255621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 255721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 255821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void removeLocalService(Messenger m, WifiP2pServiceInfo servInfo) { 255921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 256021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 256121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 256221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 256321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 256421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceDel(servInfo); 256521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 256621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.remove(servInfo); 256721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0 && clientInfo.mServList.size() == 0) { 256821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 256921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 257021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 257121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 257221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 257321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearLocalServices(Messenger m) { 257421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 257521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 257621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 257721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 257821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 257921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (WifiP2pServiceInfo servInfo: clientInfo.mServList) { 258021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceDel(servInfo); 258121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 258221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 258321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.clear(); 258421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0) { 258521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 258621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 258721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 258821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 258921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 259021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearClientInfo(Messenger m) { 259121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearLocalServices(m); 259221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearServiceRequests(m); 259321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 259421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 259521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 259621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Send the service response to the WifiP2pManager.Channel. 259721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 259821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param resp 259921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 260021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void sendServiceResponse(WifiP2pServiceResponse resp) { 260121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c : mClientInfoList.values()) { 260221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceRequest req = c.mReqList.get(resp.getTransactionId()); 260321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (req != null) { 260421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff Message msg = Message.obtain(); 260521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.what = WifiP2pManager.RESPONSE_SERVICE; 260621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg1 = 0; 260721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg2 = 0; 260821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.obj = resp; 260921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff try { 261021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff c.mMessenger.send(msg); 261121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } catch (RemoteException e) { 261221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("detect dead channel"); 261321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientInfo(c.mMessenger); 26143b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff return; 261521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 261621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 261721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 261821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 261921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 262021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 262121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * We dont get notifications of clients that have gone away. 262221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * We detect this actively when services are added and throw 262321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * them away. 262421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 262521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * TODO: This can be done better with full async channels. 262621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 262721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearClientDeadChannels() { 26283b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff ArrayList<Messenger> deadClients = new ArrayList<Messenger>(); 26293b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 263021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c : mClientInfoList.values()) { 263121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff Message msg = Message.obtain(); 263221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.what = WifiP2pManager.PING; 263321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg1 = 0; 263421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg2 = 0; 263521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.obj = null; 263621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff try { 263721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff c.mMessenger.send(msg); 263821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } catch (RemoteException e) { 263921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("detect dead channel"); 26403b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff deadClients.add(c.mMessenger); 264121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 264221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 26433b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 26443b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff for (Messenger m : deadClients) { 26453b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff clearClientInfo(m); 26463b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 264721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 264821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 264921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 265021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return the specified ClientInfo. 265121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param m Messenger 265221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param createIfNotExist if true and the specified channel info does not exist, 265321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * create new client info. 265421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return the specified ClientInfo. 265521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 265621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private ClientInfo getClientInfo(Messenger m, boolean createIfNotExist) { 265721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = mClientInfoList.get(m); 265821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 265921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null && createIfNotExist) { 266021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("add a new client"); 266121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo = new ClientInfo(m); 266221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.put(m, clientInfo); 266321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 266421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 266521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return clientInfo; 266621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 266721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2668bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2669bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send detached message to dialog listener in the foreground application. 2670bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param reason 2671bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2672bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private void sendDetachedMsg(int reason) { 2673bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mForegroundAppMessenger == null) return; 2674bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2675bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2676bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.DIALOG_LISTENER_DETACHED; 2677bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.arg1 = reason; 2678bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 2679bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger.send(msg); 2680bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (RemoteException e) { 2681bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2682bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2683bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2684bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2685bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2686bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2687bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send a request to show wps pin to dialog listener in the foreground application. 2688bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param pin WPS pin 2689bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2690bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2691bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendShowPinReqToFrontApp(String pin) { 2692bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(mForegroundAppPkgName)) { 2693bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2694bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2695bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2696bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2697bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.SHOW_PIN_REQUESTED; 2698bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Bundle bundle = new Bundle(); 2699bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putString(WifiP2pManager.WPS_PIN_BUNDLE_KEY, pin); 2700bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.setData(bundle); 2701bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return sendDialogMsgToFrontApp(msg); 2702bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2703bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2704bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2705bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send a request to establish the connection to dialog listener in the foreground 2706bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * application. 2707bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param dev source device 2708bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param config 2709bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2710bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2711bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendConnectNoticeToApp(WifiP2pDevice dev, WifiP2pConfig config) { 2712bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (dev == null) { 2713bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga dev = new WifiP2pDevice(config.deviceAddress); 2714bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2715bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2716bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(mForegroundAppPkgName)) { 2717bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("application is NOT foreground"); 2718bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2719bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2720bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2721bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2722bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2723bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.CONNECTION_REQUESTED; 2724bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Bundle bundle = new Bundle(); 2725bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putParcelable(WifiP2pManager.P2P_DEV_BUNDLE_KEY, dev); 2726bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putParcelable(WifiP2pManager.P2P_CONFIG_BUNDLE_KEY, config); 2727bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.setData(bundle); 2728bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return sendDialogMsgToFrontApp(msg); 2729bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2730bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2731bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2732bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send dialog event message to front application's dialog listener. 2733bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param msg 2734bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return true if success. 2735bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2736bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendDialogMsgToFrontApp(Message msg) { 2737bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 2738bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger.send(msg); 2739bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (RemoteException e) { 2740bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2741bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2742bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2743bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2744bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2745bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2746bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2747bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2748bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Set dialog listener application. 2749bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param m 2750bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param appPkgName if null, reset the listener. 2751bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param isReset if true, try to reset. 2752bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2753bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2754bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean setDialogListenerApp(Messenger m, 2755bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String appPkgName, boolean isReset) { 2756bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2757bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mForegroundAppPkgName != null && !mForegroundAppPkgName.equals(appPkgName)) { 2758bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (isForegroundApp(mForegroundAppPkgName)) { 2759bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // The current dialog listener is foreground app's. 2760bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("application is NOT foreground"); 2761bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2762bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2763bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // detach an old listener. 2764bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2765bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2766bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2767bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (isReset) { 2768bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("reset dialog listener"); 2769bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2770bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2771bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2772bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2773bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2774bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(appPkgName)) { 2775bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2776bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2777bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2778bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = m; 2779bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = appPkgName; 2780bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("set dialog listener. app=" + appPkgName); 2781bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2782bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2783bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2784bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2785bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Return true if the specified package name is foreground app's. 2786bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * 2787bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param pkgName application package name. 2788bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2789bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2790bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean isForegroundApp(String pkgName) { 2791bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (pkgName == null) return false; 2792bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2793bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga List<RunningTaskInfo> tasks = mActivityMgr.getRunningTasks(1); 2794bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (tasks.size() == 0) { 2795bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2796bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2797bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2798bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return pkgName.equals(tasks.get(0).baseActivity.getPackageName()); 2799bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2800bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 280121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 280221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 280321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 280421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Information about a particular client and we track the service discovery requests 280521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * and the local services registered by the client. 280621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 280721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private class ClientInfo { 280821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 280921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 281021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A reference to WifiP2pManager.Channel handler. 281121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The response of this request is notified to WifiP2pManager.Channel handler 281221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 281321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private Messenger mMessenger; 281421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 281521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 281621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A service discovery request list. 281721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 281821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private SparseArray<WifiP2pServiceRequest> mReqList; 281921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 282021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 282121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A local service information list. 282221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 282321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private List<WifiP2pServiceInfo> mServList; 282421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 282521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private ClientInfo(Messenger m) { 282621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mMessenger = m; 282721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mReqList = new SparseArray(); 282821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServList = new ArrayList<WifiP2pServiceInfo>(); 282921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 283055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 283155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync} 2832