WifiP2pService.java revision e0c28d5f1358fc2d4c464f910bd04fed4b283fef
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 1260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int CONNECT_FAILURE = -1; 1270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int CONNECT_SUCCESS = 0; 1280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private static final int NEEDS_PROVISION_REQ = 1; 1290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 130ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /* Two minutes comes from the wpa_supplicant setting */ 131618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static final int GROUP_CREATING_WAIT_TIME_MS = 120 * 1000; 132618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private static int mGroupCreatingTimeoutIndex = 0; 133aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1347d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff /* Set a two minute discover timeout to avoid STA scans from being blocked */ 1357d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int DISCOVER_TIMEOUT_S = 120; 1367d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff 13755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff /* Idle time after a peer is gone when the group is torn down */ 138e0c28d5f1358fc2d4c464f910bd04fed4b283fefIrfan Sheriff private static final int GROUP_IDLE_TIME_S = 20; 13955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff 140ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /** 141ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff * Delay between restarts upon failure to setup connection with supplicant 142ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff */ 143ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private static final int P2P_RESTART_INTERVAL_MSECS = 5000; 144ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 145ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff /** 146ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff * Number of times we attempt to restart p2p 147ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff */ 148ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private static final int P2P_RESTART_TRIES = 5; 149ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 150ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private int mP2pRestartCount = 0; 151ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 15255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private static final int BASE = Protocol.BASE_WIFI_P2P_SERVICE; 15355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 154618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* Delayed message to timeout group creation */ 1557d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff public static final int GROUP_CREATING_TIMED_OUT = BASE + 1; 15655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 157618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* User accepted a peer request */ 1587d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int PEER_CONNECTION_USER_ACCEPT = BASE + 2; 159618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* User rejected a peer request */ 1607d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff private static final int PEER_CONNECTION_USER_REJECT = BASE + 3; 161295da73f051e1a1280284d94d800c57f163a3986Irfan Sheriff 16255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private final boolean mP2pSupported; 163651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 164651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private WifiP2pDevice mThisDevice = new WifiP2pDevice(); 1654be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 1664be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff /* When a group has been explicitly created by an app, we persist the group 1674be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * even after all clients have been disconnected until an explicit remove 1684be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff * is invoked */ 169bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean mAutonomousGroup; 17055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 17110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff /* Invitation to join an existing p2p group */ 17210ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff private boolean mJoinExistingGroup; 17310ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff 174c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff /* Track whether we are in p2p discovery. This is used to avoid sending duplicate 175c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff * broadcasts 176c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff */ 177c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff private boolean mDiscoveryStarted; 178c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 179aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private NetworkInfo mNetworkInfo; 180aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 18121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* The transaction Id of service discovery request */ 18221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private byte mServiceTransactionId = 0; 18321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 18421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* Service discovery request ID of wpa_supplicant. 18521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * null means it's not set yet. */ 18621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private String mServiceDiscReqId; 18721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 18821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* clients(application) information list. */ 18921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private HashMap<Messenger, ClientInfo> mClientInfoList = new HashMap<Messenger, ClientInfo>(); 19021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 191bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* The foreground application's messenger. 192bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * The connection request is notified only to foreground application */ 193bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private Messenger mForegroundAppMessenger; 194bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 195bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* the package name of foreground application. */ 196bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private String mForegroundAppPkgName; 197bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 198859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff /* Is chosen as a unique range to avoid conflict with 199859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff the range defined in Tethering.java */ 200859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff private static final String[] DHCP_RANGE = {"192.168.49.2", "192.168.49.254"}; 201859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff private static final String SERVER_ADDRESS = "192.168.49.1"; 202859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff 2030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 2040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Error code definition. 2050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * see the Table.8 in the WiFi Direct specification for the detail. 2060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 2070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static enum P2pStatus { 2080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Success. */ 2090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga SUCCESS, 2100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* The target device is currently unavailable. */ 2120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INFORMATION_IS_CURRENTLY_UNAVAILABLE, 2130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Protocol error. */ 2150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INCOMPATIBLE_PARAMETERS, 2160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* The target device reached the limit of the number of the connectable device. 2180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * For example, device limit or group limit is set. */ 2190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga LIMIT_REACHED, 2200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Protocol error. */ 2220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INVALID_PARAMETER, 2230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unable to accommodate request. */ 2250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNABLE_TO_ACCOMMODATE_REQUEST, 2260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Previous protocol error, or disruptive behavior. */ 2280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga PREVIOUS_PROTOCOL_ERROR, 2290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* There is no common channels the both devices can use. */ 2310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga NO_COMMON_CHANNE, 2320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unknown p2p group. For example, Device A tries to invoke the previous persistent group, 2340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * but device B has removed the specified credential already. */ 2350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNKNOWN_P2P_GROUP, 2360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Both p2p devices indicated an intent of 15 in group owner negotiation. */ 2380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga BOTH_GO_INTENT_15, 2390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Incompatible provisioning method. */ 2410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga INCOMPATIBLE_PROVISIONING_METHOD, 2420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Rejected by user */ 2440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga REJECTED_BY_USER, 2450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* Unknown error */ 2470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga UNKNOWN; 2480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 2490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public static P2pStatus valueOf(int error) { 2500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga switch(error) { 2510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 0 : 2520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return SUCCESS; 2530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 1: 2540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INFORMATION_IS_CURRENTLY_UNAVAILABLE; 2550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 2: 2560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INCOMPATIBLE_PARAMETERS; 2570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 3: 2580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return LIMIT_REACHED; 2590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 4: 2600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INVALID_PARAMETER; 2610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 5: 2620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNABLE_TO_ACCOMMODATE_REQUEST; 2630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 6: 2640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return PREVIOUS_PROTOCOL_ERROR; 2650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 7: 2660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NO_COMMON_CHANNE; 2670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 8: 2680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNKNOWN_P2P_GROUP; 2690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 9: 2700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return BOTH_GO_INTENT_15; 2710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 10: 2720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return INCOMPATIBLE_PROVISIONING_METHOD; 2730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case 11: 2740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return REJECTED_BY_USER; 2750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga default: 2760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return UNKNOWN; 2770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 2800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 28155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public WifiP2pService(Context context) { 28255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext = context; 28355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 2847d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //STOPSHIP: get this from native side 285fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mInterface = "p2p0"; 286bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mActivityMgr = (ActivityManager)context.getSystemService(Activity.ACTIVITY_SERVICE); 287bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 288aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo = new NetworkInfo(ConnectivityManager.TYPE_WIFI_P2P, 0, NETWORKTYPE, ""); 289aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 290a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff mP2pSupported = mContext.getPackageManager().hasSystemFeature( 291a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff PackageManager.FEATURE_WIFI_DIRECT); 292a8f63a38a0570d2521d5db73f05218d114fa902aIrfan Sheriff 293651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mThisDevice.primaryDeviceType = mContext.getResources().getString( 2949322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff com.android.internal.R.string.config_wifi_p2p_device_type); 29555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 29655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mP2pStateMachine = new P2pStateMachine(TAG, mP2pSupported); 29755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mP2pStateMachine.start(); 298aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 29955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 300cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff public void connectivityServiceReady() { 301cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff IBinder b = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE); 302cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff mNwService = INetworkManagementService.Stub.asInterface(b); 303cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff } 304cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff 30555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void enforceAccessPermission() { 30655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext.enforceCallingOrSelfPermission(android.Manifest.permission.ACCESS_WIFI_STATE, 30755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync "WifiP2pService"); 30855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 30955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 31055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void enforceChangePermission() { 31155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mContext.enforceCallingOrSelfPermission(android.Manifest.permission.CHANGE_WIFI_STATE, 31255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync "WifiP2pService"); 31355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 31455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 31555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 31655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Get a reference to handler. This is used by a client to establish 31755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * an AsyncChannel communication with WifiP2pService 31855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 31955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public Messenger getMessenger() { 32055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync enforceAccessPermission(); 32155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync enforceChangePermission(); 32255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return new Messenger(mP2pStateMachine.getHandler()); 32355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 32455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 32555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 32655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync protected void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 32755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (mContext.checkCallingOrSelfPermission(android.Manifest.permission.DUMP) 32855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync != PackageManager.PERMISSION_GRANTED) { 32955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync pw.println("Permission Denial: can't dump WifiP2pService from from pid=" 33055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync + Binder.getCallingPid() 33155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync + ", uid=" + Binder.getCallingUid()); 33255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return; 33355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 33555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 33755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync /** 33855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync * Handles interaction with WifiStateMachine 33955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync */ 34055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private class P2pStateMachine extends StateMachine { 34155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 34255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private DefaultState mDefaultState = new DefaultState(); 34355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pNotSupportedState mP2pNotSupportedState = new P2pNotSupportedState(); 34455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pDisablingState mP2pDisablingState = new P2pDisablingState(); 34555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pDisabledState mP2pDisabledState = new P2pDisabledState(); 34655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pEnablingState mP2pEnablingState = new P2pEnablingState(); 34755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private P2pEnabledState mP2pEnabledState = new P2pEnabledState(); 34855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // Inactive is when p2p is enabled with no connectivity 34955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private InactiveState mInactiveState = new InactiveState(); 350618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private GroupCreatingState mGroupCreatingState = new GroupCreatingState(); 351618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private UserAuthorizingInvitationState mUserAuthorizingInvitationState 352618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff = new UserAuthorizingInvitationState(); 353618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private ProvisionDiscoveryState mProvisionDiscoveryState = new ProvisionDiscoveryState(); 35455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private GroupNegotiationState mGroupNegotiationState = new GroupNegotiationState(); 355618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 35655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private GroupCreatedState mGroupCreatedState = new GroupCreatedState(); 357618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private UserAuthorizingJoinState mUserAuthorizingJoinState = new UserAuthorizingJoinState(); 35855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 359fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private WifiNative mWifiNative = new WifiNative(mInterface); 360fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff private WifiMonitor mWifiMonitor = new WifiMonitor(this, mWifiNative); 36155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 362d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pDeviceList mPeers = new WifiP2pDeviceList(); 363d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pGroupList mGroups = new WifiP2pGroupList(null, 3640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga new GroupDeleteListener() { 3650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga @Override 3660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga public void onDeleteGroup(int netId) { 3670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("called onDeleteGroup() netId=" + netId); 3680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.removeNetwork(netId); 3690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 3700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sendP2pPersistentGroupsChangedBroadcast(); 3710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 3720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga }); 373d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown private final WifiP2pInfo mWifiP2pInfo = new WifiP2pInfo(); 37455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pGroup mGroup; 37555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 376618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff // Saved WifiP2pConfig for a peer connection 377618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private WifiP2pConfig mSavedPeerConfig; 37855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 37955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // Saved WifiP2pGroup from invitation request 38055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private WifiP2pGroup mSavedP2pGroup; 38155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 382bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // Saved WifiP2pDevice from provisioning request 383bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private WifiP2pDevice mSavedProvDiscDevice; 384bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 38555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync P2pStateMachine(String name, boolean p2pSupported) { 38655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync super(name); 38755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 38855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mDefaultState); 38955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pNotSupportedState, mDefaultState); 39055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pDisablingState, mDefaultState); 39155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pDisabledState, mDefaultState); 39255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pEnablingState, mDefaultState); 39355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mP2pEnabledState, mDefaultState); 39455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mInactiveState, mP2pEnabledState); 395618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mGroupCreatingState, mP2pEnabledState); 396618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mUserAuthorizingInvitationState, mGroupCreatingState); 397618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mProvisionDiscoveryState, mGroupCreatingState); 398618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mGroupNegotiationState, mGroupCreatingState); 39955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync addState(mGroupCreatedState, mP2pEnabledState); 400618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addState(mUserAuthorizingJoinState, mGroupCreatedState); 40155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 40255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (p2pSupported) { 40355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync setInitialState(mP2pDisabledState); 40455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 40555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync setInitialState(mP2pNotSupportedState); 40655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 40755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 40855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 40955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class DefaultState extends State { 41055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 41155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 412ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 41355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 41455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_HALF_CONNECTED: 41555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (message.arg1 == AsyncChannel.STATUS_SUCCESSFUL) { 416ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("Full connection with WifiStateMachine established"); 41755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = (AsyncChannel) message.obj; 41855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 419ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Full connection failure, error = " + message.arg1); 42055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = null; 42155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 42255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 42355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 42455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_DISCONNECTED: 42555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (message.arg1 == AsyncChannel.STATUS_SEND_UNSUCCESSFUL) { 426ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Send failed, client connection lost"); 42755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 428ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Client connection lost with reason: " + message.arg1); 42955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 43055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mWifiChannel = null; 43155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 43255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 43355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case AsyncChannel.CMD_CHANNEL_FULL_CONNECTION: 43455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AsyncChannel ac = new AsyncChannel(); 43555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync ac.connect(mContext, getHandler(), message.replyTo); 43655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 43755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.DISCOVER_PEERS: 4384be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 4394be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 44055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 4417d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 4427d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 4437d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff WifiP2pManager.BUSY); 4447d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff break; 44521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 44621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 44721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 44821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 44955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CONNECT: 4504be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 4514be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 45255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 453651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 454651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, 455651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff WifiP2pManager.BUSY); 456651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff break; 45755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CREATE_GROUP: 4584be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 4594be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 46055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 46155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REMOVE_GROUP: 4624be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 4634be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.BUSY); 46455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 46521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 46621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED, 46721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 46821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 46921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 47021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, 47121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 47221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 47321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 47421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, 47521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 47621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 47721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 47821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, 47921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 48021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 48121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 48221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 48321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, 48421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 48521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 48621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 48721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 48821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, 48921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.BUSY); 49021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 4912bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 4922bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 4932bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.BUSY); 4942bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 4950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 4960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP, 4970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.BUSY); 4980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 499ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 500ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 501ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.BUSY); 502ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 50355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REQUEST_PEERS: 504d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_PEERS, 505d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pDeviceList(mPeers)); 506ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 507ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.REQUEST_CONNECTION_INFO: 508d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_CONNECTION_INFO, 509d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pInfo(mWifiP2pInfo)); 51055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 5114be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff case WifiP2pManager.REQUEST_GROUP_INFO: 512d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown replyToMessage(message, WifiP2pManager.RESPONSE_GROUP_INFO, 513d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown mGroup != null ? new WifiP2pGroup(mGroup) : null); 5144be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff break; 5150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.REQUEST_PERSISTENT_GROUP_INFO: 5160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.RESPONSE_PERSISTENT_GROUP_INFO, 517d8544a51482c86b12da3ac82ea77b83045f689b7Jeff Brown new WifiP2pGroupList(mGroups, null)); 5180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 519bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga case WifiP2pManager.SET_DIALOG_LISTENER: 520bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String appPkgName = (String)message.getData().getString( 521bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.APP_PKG_BUNDLE_KEY); 522bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga boolean isReset = message.getData().getBoolean( 523bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.RESET_DIALOG_LISTENER_BUNDLE_KEY); 524bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (setDialogListenerApp(message.replyTo, appPkgName, isReset)) { 525bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_ATTACHED); 526bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 527bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED, 528bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.NOT_IN_FOREGROUND); 529bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 530bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 531295da73f051e1a1280284d94d800c57f163a3986Irfan Sheriff // Ignore 532618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 5337d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SCAN_RESULTS_EVENT: 5347d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUP_CONNECTION_EVENT: 5357d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUP_DISCONNECTION_EVENT: 5367d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.NETWORK_CONNECTION_EVENT: 5377d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.NETWORK_DISCONNECTION_EVENT: 5387d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: 53955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 5409cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_FOUND_EVENT: 5419cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_LOST_EVENT: 5429cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_FIND_STOPPED_EVENT: 5439cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_SERV_DISC_RESP_EVENT: 5449cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 5459cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 546618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 547618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 548618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case GROUP_CREATING_TIMED_OUT: 54955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 550bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /* unexpected group created, remove */ 55155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 55255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mGroup = (WifiP2pGroup) message.obj; 55355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff loge("Unexpected group creation, remove " + mGroup); 55455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 55555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff break; 556de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // A group formation failure is always followed by 557de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // a group removed event. Flushing things at group formation 558de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // failure causes supplicant issues. Ignore right now. 55955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: 56055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff break; 56155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 562ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Unhandled message " + message); 56355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 56455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 56555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 56655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 56755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 56855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 56955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pNotSupportedState extends State { 57055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 57155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 57255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 5737d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.DISCOVER_PEERS: 5747d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 57555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.P2P_UNSUPPORTED); 57655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 5777d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 5787d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 579ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 580ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 58121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 58221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 58321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 58421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 585ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.CONNECT: 586ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 587ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 588ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 589651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 590651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, 591651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 592651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff break; 5937d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.CREATE_GROUP: 594ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 595ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 596ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 597ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiP2pManager.REMOVE_GROUP: 598ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 599ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 600ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 60121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 60221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED, 60321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 60421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 605bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga case WifiP2pManager.SET_DIALOG_LISTENER: 606bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DIALOG_LISTENER_DETACHED, 607bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.P2P_UNSUPPORTED); 608bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 60921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 61021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_FAILED, 61121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 61221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 61321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 61421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_FAILED, 61521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 61621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 61721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 61821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED, 61921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 62021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 62121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 62221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 62321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.REMOVE_SERVICE_REQUEST_FAILED, 62421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 62521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 62621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 62721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, 62821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.CLEAR_SERVICE_REQUESTS_FAILED, 62921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 63021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 6312bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 6322bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 6332bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.P2P_UNSUPPORTED); 6342bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 6350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 6360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP, 6370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.P2P_UNSUPPORTED); 6380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 639ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 640ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 641ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.P2P_UNSUPPORTED); 642ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 643ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff default: 64455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 64555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 64655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 64755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 64855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 64955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 65055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pDisablingState extends State { 65155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 65255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 653ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 65455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 65555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUP_DISCONNECTION_EVENT: 6567d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (DBG) logd("p2p socket connection lost"); 65755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mP2pDisabledState); 65855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 6597d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 6607d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 661ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff deferMessage(message); 662ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 66355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 66455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 66555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 66655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 66755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 66855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 66955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 67055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pDisabledState extends State { 67155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 67255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 673ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 67455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 67555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 67655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 67755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 678ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 67955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 6807d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 681cb30b22ff507a5a9a5d9c584f8b082f5e96c4d02Irfan Sheriff try { 6827d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mNwService.setInterfaceUp(mInterface); 6837d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } catch (RemoteException re) { 6847d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("Unable to change interface settings: " + re); 6857d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } catch (IllegalStateException ie) { 6867d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("Unable to change interface settings: " + ie); 68755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 6887d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mWifiMonitor.startMonitoring(); 6897d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff transitionTo(mP2pEnablingState); 69055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 6917d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 6927d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //Nothing to do 693ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 69455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 69555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 69655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 69755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 69855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 69955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 70055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 70155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pEnablingState extends State { 70255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 70355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 704ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 70555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 70655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 70755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 70855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 709ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 71055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 71155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.SUP_CONNECTION_EVENT: 7127d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (DBG) logd("P2p socket connection successful"); 71355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 71455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 715ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff case WifiMonitor.SUP_DISCONNECTION_EVENT: 7167d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff loge("P2p socket connection failed"); 717aea743aaa43a833fd8ff3dc56205197583152d5frepo sync transitionTo(mP2pDisabledState); 718ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 7197d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 7207d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 721ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff deferMessage(message); 722ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 72355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 72455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 72555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 72655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 72755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 72855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 72955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 73055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class P2pEnabledState extends State { 73155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 73255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 733ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 73455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pStateChangedBroadcast(true); 735aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setIsAvailable(true); 73655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff sendP2pConnectionChangedBroadcast(); 7379322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff initializeP2pSettings(); 73855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 73955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 74055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 74155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 742ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 74355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 7447d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_ENABLE_P2P: 7457d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //Nothing to do 746ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff break; 7477d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 748ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (mPeers.clear()) sendP2pPeersChangedBroadcast(); 7490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroups.clear()) sendP2pPersistentGroupsChangedBroadcast(); 7500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 7517d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff mWifiNative.closeSupplicantConnection(); 75255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mP2pDisablingState); 75355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 7542bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff case WifiP2pManager.SET_DEVICE_NAME: 755ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber { 7562bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pDevice d = (WifiP2pDevice) message.obj; 7572bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (d != null && setAndPersistDeviceName(d.deviceName)) { 7582bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (DBG) logd("set device name " + d.deviceName); 7592bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_SUCCEEDED); 7602bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } else { 7612bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff replyToMessage(message, WifiP2pManager.SET_DEVICE_NAME_FAILED, 7622bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff WifiP2pManager.ERROR); 7632bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 7642bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff break; 765ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 766ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber case WifiP2pManager.SET_WFD_INFO: 767ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber { 768ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pWfdInfo d = (WifiP2pWfdInfo) message.obj; 769ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (d != null && setWfdInfo(d)) { 770ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_SUCCEEDED); 771ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } else { 772ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber replyToMessage(message, WifiP2pManager.SET_WFD_INFO_FAILED, 773ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber WifiP2pManager.ERROR); 774ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 775ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber break; 776ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 77755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.DISCOVER_PEERS: 77821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff // do not send service discovery request while normal find operation. 77921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearSupplicantServiceRequest(); 7807d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (mWifiNative.p2pFind(DISCOVER_TIMEOUT_S)) { 781ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_SUCCEEDED); 782c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff sendP2pDiscoveryChangedBroadcast(true); 783ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 7844be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 7854be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.ERROR); 786ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 78755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 788c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff case WifiMonitor.P2P_FIND_STOPPED_EVENT: 789c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff sendP2pDiscoveryChangedBroadcast(false); 790c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff break; 7917d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiP2pManager.STOP_DISCOVERY: 7927d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff if (mWifiNative.p2pStopFind()) { 7937d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_SUCCEEDED); 7947d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } else { 7957d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 7967d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff WifiP2pManager.ERROR); 7977d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff } 7987d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff break; 79921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.DISCOVER_SERVICES: 80021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " discover services"); 80121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!updateSupplicantServiceRequest()) { 80221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 80321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.NO_SERVICE_REQUESTS); 80421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 80521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 80621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mWifiNative.p2pFind(DISCOVER_TIMEOUT_S)) { 80721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_SUCCEEDED); 80821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 80921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_SERVICES_FAILED, 81021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pManager.ERROR); 81121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 81221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 81355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_FOUND_EVENT: 81455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pDevice device = (WifiP2pDevice) message.obj; 815651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff if (mThisDevice.deviceAddress.equals(device.deviceAddress)) break; 8164be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff mPeers.update(device); 81755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pPeersChangedBroadcast(); 81855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 81955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_LOST_EVENT: 82055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync device = (WifiP2pDevice) message.obj; 82155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (mPeers.remove(device)) sendP2pPeersChangedBroadcast(); 82255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 82321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_LOCAL_SERVICE: 82421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " add service"); 82521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceInfo servInfo = (WifiP2pServiceInfo)message.obj; 82621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (addLocalService(message.replyTo, servInfo)) { 82721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_SUCCEEDED); 82821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } else { 82921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_LOCAL_SERVICE_FAILED); 83021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 83121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 83221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_LOCAL_SERVICE: 83321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " remove service"); 83421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff servInfo = (WifiP2pServiceInfo)message.obj; 83521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff removeLocalService(message.replyTo, servInfo); 83621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_LOCAL_SERVICE_SUCCEEDED); 83721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 83821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_LOCAL_SERVICES: 83921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " clear service"); 84021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearLocalServices(message.replyTo); 84196aa0db9a997bc214471aa0d114a452aea6daa6dIrfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_LOCAL_SERVICES_SUCCEEDED); 84221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 84321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.ADD_SERVICE_REQUEST: 84421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " add service request"); 84521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!addServiceRequest(message.replyTo, (WifiP2pServiceRequest)message.obj)) { 84621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_FAILED); 84721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 84821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 84921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.ADD_SERVICE_REQUEST_SUCCEEDED); 85021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 85121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.REMOVE_SERVICE_REQUEST: 85221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " remove service request"); 85321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff removeServiceRequest(message.replyTo, (WifiP2pServiceRequest)message.obj); 85421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_SERVICE_REQUEST_SUCCEEDED); 85521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 85621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiP2pManager.CLEAR_SERVICE_REQUESTS: 85721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " clear service request"); 85821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearServiceRequests(message.replyTo); 85921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff replyToMessage(message, WifiP2pManager.CLEAR_SERVICE_REQUESTS_SUCCEEDED); 86021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 86121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff case WifiMonitor.P2P_SERV_DISC_RESP_EVENT: 86221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd(getName() + " receive service response"); 86321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff List<WifiP2pServiceResponse> sdRespList = 86421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff (List<WifiP2pServiceResponse>) message.obj; 86521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (WifiP2pServiceResponse resp : sdRespList) { 86621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pDevice dev = 86721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mPeers.get(resp.getSrcDevice().deviceAddress); 86821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff resp.setSrcDevice(dev); 86921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sendServiceResponse(resp); 87021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 87121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff break; 8720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.DELETE_PERSISTENT_GROUP: 8730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " delete persistent group"); 8740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.remove(message.arg1); 8750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.DELETE_PERSISTENT_GROUP_SUCCEEDED); 8760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 87721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff default: 87855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 87955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 88055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 88155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 88255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 88355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 88455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void exit() { 88555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendP2pStateChangedBroadcast(false); 886aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setIsAvailable(false); 88755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 88855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 88955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 89055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class InactiveState extends State { 8914be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff @Override 8924be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff public void enter() { 893ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 8944be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff //Start listening every time we get inactive 8957d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //TODO: Fix listen after driver behavior is fixed 8967d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff //mWifiNative.p2pListen(); 89755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 89855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 89955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 90055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 901ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 90255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 903618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.CONNECT: 904618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " sending connect"); 905bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pConfig config = (WifiP2pConfig) message.obj; 906bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mAutonomousGroup = false; 907bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 90857e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff /* Update group capability before connect */ 90957e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff int gc = mWifiNative.getGroupCapability(config.deviceAddress); 91057e42f4117e92c03d39f1e1e572f53ef5bb821b8Irfan Sheriff mPeers.updateGroupCapability(config.deviceAddress, gc); 9110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int connectRet = connect(config, TRY_REINVOCATION); 9120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connectRet == CONNECT_FAILURE) { 9130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_FAILED); 9140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 915618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 916bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED); 917618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 918618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 9190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connectRet == NEEDS_PROVISION_REQ) { 9200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Sending prov disc"); 9210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mProvisionDiscoveryState); 9220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 9230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 9240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mGroupNegotiationState); 9250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 9260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiP2pManager.STOP_DISCOVERY: 9270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mWifiNative.p2pStopFind()) { 9280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // When discovery stops in inactive state, flush to clear 9290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // state peer data 9300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.p2pFlush(); 9310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mServiceDiscReqId = null; 9320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_SUCCEEDED); 9330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 9340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.STOP_DISCOVERY_FAILED, 9350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.ERROR); 9360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 937618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 93855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_REQUEST_EVENT: 939618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = (WifiP2pConfig) message.obj; 94010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mAutonomousGroup = false; 94110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = false; 942bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 943bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig)) { 944bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 945bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 946618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 947618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_INVITATION_RECEIVED_EVENT: 948618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pGroup group = (WifiP2pGroup) message.obj; 949bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff WifiP2pDevice owner = group.getOwner(); 950bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 951bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (owner == null) { 952bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (DBG) loge("Ignored invitation from null owner"); 953bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff break; 954bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 955bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 956bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig = new WifiP2pConfig(); 957bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.deviceAddress = group.getOwner().deviceAddress; 958bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 959bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //Check if we have the owner in peer list and use appropriate 960bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff //wps method. Default is to use PBC. 961bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if ((owner = mPeers.get(owner.deviceAddress)) != null) { 962bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff if (owner.wpsPbcSupported()) { 963bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.PBC; 964bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } else if (owner.wpsKeypadSupported()) { 965bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.KEYPAD; 966bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } else if (owner.wpsDisplaySupported()) { 967bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY; 968bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 969bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 970bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 97110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mAutonomousGroup = false; 97210ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = true; 973bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //TODO In the p2p client case, we should set source address correctly. 974bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 975bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig)) { 976bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 977bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 978618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 979618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 980618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 981618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 982bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //We let the supplicant handle the provision discovery response 983bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //and wait instead for the GO_NEGOTIATION_REQUEST_EVENT. 984bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //Handling provision discovery and issuing a p2p_connect before 985bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga //group negotiation comes through causes issues 986bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga break; 98755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CREATE_GROUP: 988de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mAutonomousGroup = true; 9890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = message.arg1; 9900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean ret = false; 9910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId == WifiP2pGroup.PERSISTENT_NET_ID) { 9920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // check if the go persistent group is present. 9930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = mGroups.getNetworkId(mThisDevice.deviceAddress); 9940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId != -1) { 9950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(netId); 9960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 9970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(true); 9980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 9990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga ret = mWifiNative.p2pGroupAdd(false); 10010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 10020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 10030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (ret) { 10040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CREATE_GROUP_SUCCEEDED); 10050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mGroupNegotiationState); 10060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 10070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CREATE_GROUP_FAILED, 10080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pManager.ERROR); 10090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // remain at this state. 10100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 10110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 10120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiMonitor.P2P_GROUP_STARTED_EVENT: 10130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroup = (WifiP2pGroup) message.obj; 10140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " group started"); 10150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 10160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroup.getNetworkId() == WifiP2pGroup.PERSISTENT_NET_ID) { 10170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // This is an invocation case. 10180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mAutonomousGroup = false; 10190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga deferMessage(message); 10200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mGroupNegotiationState); 1021ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 10220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NOT_HANDLED; 1023ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 102455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1025618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 10260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NOT_HANDLED; 1027bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1028bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff return HANDLED; 1029bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1030bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1031bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1032618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class GroupCreatingState extends State { 1033bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1034bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void enter() { 1035bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName()); 1036618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessageDelayed(obtainMessage(GROUP_CREATING_TIMED_OUT, 1037618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ++mGroupCreatingTimeoutIndex, 0), GROUP_CREATING_WAIT_TIME_MS); 1038bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1039bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1040bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1041bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public boolean processMessage(Message message) { 1042bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName() + message.toString()); 10439cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff boolean ret = HANDLED; 1044bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff switch (message.what) { 1045618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case GROUP_CREATING_TIMED_OUT: 1046618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mGroupCreatingTimeoutIndex == message.arg1) { 1047618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Group negotiation timed out"); 104855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 1049618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mInactiveState); 1050618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1051bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 10529cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff case WifiMonitor.P2P_DEVICE_LOST_EVENT: 10539cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff WifiP2pDevice device = (WifiP2pDevice) message.obj; 1054ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff 1055ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff // If we lose a device during an autonomous group creation, 1056ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff // mSavedPeerConfig can be empty 1057ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff if (mSavedPeerConfig != null && 1058ba5065eaf3bd633aa30e0eb00b8a76b7bf33d36dIrfan Sheriff !mSavedPeerConfig.deviceAddress.equals(device.deviceAddress)) { 10599cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff // Do the regular device lost handling 10609cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff ret = NOT_HANDLED; 10619cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff break; 10629cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff } 10639cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff // Do nothing 10649cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff if (DBG) logd("Retain connecting device " + device); 10659cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff break; 1066618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.DISCOVER_PEERS: 1067618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* Discovery will break negotiation */ 1068618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff replyToMessage(message, WifiP2pManager.DISCOVER_PEERS_FAILED, 1069618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pManager.BUSY); 1070bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 1071618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiP2pManager.CANCEL_CONNECT: 107255bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //Do a supplicant p2p_cancel which only cancels an ongoing 107355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //group negotiation. This will fail for a pending provision 107455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //discovery or for a pending user action, but at the framework 1075de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff //level, we always treat cancel as succeeded and enter 107655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //an inactive state 107755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pCancelConnect(); 107855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 107955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff transitionTo(mInactiveState); 108055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED); 108155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1082ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff default: 10839cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff ret = NOT_HANDLED; 108455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 10859cb980422ac53b81d6ad15242b0de35b5f3ce13cIrfan Sheriff return ret; 108655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 108755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 108855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1089618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class UserAuthorizingInvitationState extends State { 1090bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1091bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void enter() { 1092bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName()); 10930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga notifyInvitationReceived(); 1094bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1095bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1096bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1097bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public boolean processMessage(Message message) { 1098bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1099bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga boolean ret = HANDLED; 1100bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff switch (message.what) { 1101618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 11020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connect(mSavedPeerConfig, TRY_REINVOCATION) == CONNECT_FAILURE) { 11030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga handleGroupCreationFailure(); 11040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mInactiveState); 11050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 1106618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1107bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.INVITED); 1108618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 1109618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1110618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1111618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 1112618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("User rejected invitation " + mSavedPeerConfig); 1113618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1114bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff transitionTo(mInactiveState); 1115bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff break; 1116bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff default: 1117bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff return NOT_HANDLED; 1118bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1119bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return ret; 1120bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1121618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1122618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1123618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void exit() { 1124618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //TODO: dismiss dialog if not already done 1125618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1126bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1127bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 1128618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class ProvisionDiscoveryState extends State { 1129618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1130618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void enter() { 1131618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName()); 1132fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pProvisionDiscovery(mSavedPeerConfig); 1133618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1134618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1135618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1136618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public boolean processMessage(Message message) { 1137618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1138618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pProvDiscEvent provDisc; 1139618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pDevice device; 1140618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (message.what) { 1141618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_RSP_EVENT: 1142618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1143618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1144618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1145618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1146618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { 1147618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 11484bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1149618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1150618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1151618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1152618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1153618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1154618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1155618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1156618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1157618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.KEYPAD) { 1158618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 1159618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff /* we already have the pin */ 1160618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!TextUtils.isEmpty(mSavedPeerConfig.wps.pin)) { 11614bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1162618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1163618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 116410ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff mJoinExistingGroup = false; 11650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mPeers.get(mSavedPeerConfig.deviceAddress), 11660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig)) { 11670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mUserAuthorizingInvitationState); 11680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1169618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1170618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1171618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1172618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1173618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff provDisc = (WifiP2pProvDiscEvent) message.obj; 1174618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff device = provDisc.device; 1175618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (!device.deviceAddress.equals(mSavedPeerConfig.deviceAddress)) break; 1176618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1177618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.DISPLAY) { 1178618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Found a match " + mSavedPeerConfig); 1179618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = provDisc.pin; 11804bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(mSavedPeerConfig); 1181bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(provDisc.pin)) { 1182bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(provDisc.pin, device.deviceAddress); 1183bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1184618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupNegotiationState); 1185618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1186618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1187618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1188618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return NOT_HANDLED; 1189618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1190618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return HANDLED; 1191618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1192618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1193bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff 119455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class GroupNegotiationState extends State { 1195aea743aaa43a833fd8ff3dc56205197583152d5frepo sync @Override 1196aea743aaa43a833fd8ff3dc56205197583152d5frepo sync public void enter() { 1197ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 119855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 119955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 120055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 120155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 1202ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 120355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 120455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // We ignore these right now, since we get a GROUP_STARTED notification 120555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // afterwards 120655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_SUCCESS_EVENT: 120755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GROUP_FORMATION_SUCCESS_EVENT: 1208ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + " go success"); 120955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1210618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 1211618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mGroup = (WifiP2pGroup) message.obj; 1212618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " group started"); 12130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 12140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroup.getNetworkId() == WifiP2pGroup.PERSISTENT_NET_ID) { 12150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* 12160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * update cache information and set network id to mGroup. 12170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 12180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga updatePersistentNetworks(); 12190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String devAddr = mGroup.getOwner().deviceAddress; 12200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroup.setNetworkId(mGroups.getNetworkId(devAddr, 12210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroup.getNetworkName())); 12220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1224e0c28d5f1358fc2d4c464f910bd04fed4b283fefIrfan Sheriff mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); 1225618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mGroup.isGroupOwner()) { 1226618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff startDhcpServer(mGroup.getInterface()); 1227618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1228618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mDhcpStateMachine = DhcpStateMachine.makeDhcpStateMachine(mContext, 1229618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff P2pStateMachine.this, mGroup.getInterface()); 1230618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_START_DHCP); 1231618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pDevice groupOwner = mGroup.getOwner(); 1232bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(groupOwner.deviceAddress, WifiP2pDevice.CONNECTED); 1233618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendP2pPeersChangedBroadcast(); 1234618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1235618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1236618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1237618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 123855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT: 1239de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 1240ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + " go failure"); 124155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff handleGroupCreationFailure(); 124255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 124355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1244de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // A group formation failure is always followed by 1245de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // a group removed event. Flushing things at group formation 1246de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // failure causes supplicant issues. Ignore right now. 1247de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: 1248de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff break; 12490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 12500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga P2pStatus status = (P2pStatus)message.obj; 12510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (status == P2pStatus.SUCCESS) { 12520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // invocation was succeeded. 12530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // wait P2P_GROUP_STARTED_EVENT. 12540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 12550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (status == P2pStatus.UNKNOWN_P2P_GROUP) { 12560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // target device has already removed the credential. 12570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // So, remove this credential accordingly. 12580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mSavedPeerConfig.netId; 12590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 12600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown client from the list"); 12610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga removeClientFromList(netId, mSavedPeerConfig.deviceAddress, true); 12620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 12650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // invocation is failed or deferred. Try another way to connect. 12660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig.netId = WifiP2pGroup.PERSISTENT_NET_ID; 12670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (connect(mSavedPeerConfig, NO_REINVOCATION) == CONNECT_FAILURE) { 12680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga handleGroupCreationFailure(); 12690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga transitionTo(mInactiveState); 12700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 12710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 127255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 127355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 127455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 127555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 127655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 127755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 127855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1279618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1280618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 128155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync class GroupCreatedState extends State { 128255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 128355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void enter() { 1284ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName()); 1285aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.CONNECTED, null, null); 1286859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff 1287651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.CONNECTED); 1288651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 1289859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff //DHCP server has already been started if I am a group owner 1290859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff if (mGroup.isGroupOwner()) { 1291859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff setWifiP2pInfoOnGroupFormation(SERVER_ADDRESS); 1292859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff } 129355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 129455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 129555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync @Override 129655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public boolean processMessage(Message message) { 1297ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd(getName() + message.toString()); 129855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync switch (message.what) { 129955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.AP_STA_CONNECTED_EVENT: 1300bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff WifiP2pDevice device = (WifiP2pDevice) message.obj; 1301bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff String deviceAddress = device.deviceAddress; 13029322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (deviceAddress != null) { 1303bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mSavedProvDiscDevice != null && 1304bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga deviceAddress.equals(mSavedProvDiscDevice.deviceAddress)) { 1305bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = null; 1306bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 13079322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff mGroup.addClient(deviceAddress); 1308bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(deviceAddress, WifiP2pDevice.CONNECTED); 13099322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd(getName() + " ap sta connected"); 13109322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff sendP2pPeersChangedBroadcast(); 13119322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 1312bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff loge("Connect on null device address, ignore"); 13139322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 1314e0c28d5f1358fc2d4c464f910bd04fed4b283fefIrfan Sheriff sendP2pConnectionChangedBroadcast(); 131555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 131655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.AP_STA_DISCONNECTED_EVENT: 131761472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga device = (WifiP2pDevice) message.obj; 131861472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga deviceAddress = device.deviceAddress; 13199322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (deviceAddress != null) { 1320bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(deviceAddress, WifiP2pDevice.AVAILABLE); 13219322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (mGroup.removeClient(deviceAddress)) { 13229322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("Removed client " + deviceAddress); 1323bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!mAutonomousGroup && mGroup.isClientListEmpty()) { 13244be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff Slog.d(TAG, "Client list empty, remove non-persistent p2p group"); 1325fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 13264be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff } 13279322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 13289322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("Failed to remove client " + deviceAddress); 13299322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff for (WifiP2pDevice c : mGroup.getClientList()) { 13309322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff if (DBG) logd("client " + c.deviceAddress); 13319322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 133255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 13334be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff sendP2pPeersChangedBroadcast(); 13340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " ap sta disconnected"); 13359322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } else { 133661472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga loge("Disconnect on unknown device: " + device); 133755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 133855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 1339aea743aaa43a833fd8ff3dc56205197583152d5frepo sync case DhcpStateMachine.CMD_POST_DHCP_ACTION: 1340aea743aaa43a833fd8ff3dc56205197583152d5frepo sync DhcpInfoInternal dhcpInfo = (DhcpInfoInternal) message.obj; 1341ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (message.arg1 == DhcpStateMachine.DHCP_SUCCESS && 1342ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff dhcpInfo != null) { 1343ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("DhcpInfo: " + dhcpInfo); 1344ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff setWifiP2pInfoOnGroupFormation(dhcpInfo.serverAddress); 1345aea743aaa43a833fd8ff3dc56205197583152d5frepo sync sendP2pConnectionChangedBroadcast(); 134655bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff //Turn on power save on client 134755bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.setP2pPowerSave(mGroup.getInterface(), true); 1348ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 134961472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga loge("DHCP failed"); 1350fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.p2pGroupRemove(mGroup.getInterface()); 1351aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1352aea743aaa43a833fd8ff3dc56205197583152d5frepo sync break; 135355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.REMOVE_GROUP: 13540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " remove group"); 1355fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff if (mWifiNative.p2pGroupRemove(mGroup.getInterface())) { 1356ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_SUCCEEDED); 1357ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 13584be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, 13594be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff WifiP2pManager.ERROR); 1360ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 136155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 136255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_GROUP_REMOVED_EVENT: 13630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd(getName() + " group removed"); 136455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Collection <WifiP2pDevice> devices = mGroup.getClientList(); 136555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync boolean changed = false; 136655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync for (WifiP2pDevice d : mPeers.getDeviceList()) { 136755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (devices.contains(d) || mGroup.getOwner().equals(d)) { 1368651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff d.status = WifiP2pDevice.AVAILABLE; 136955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync changed = true; 137055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 137155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1372aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1373aea743aaa43a833fd8ff3dc56205197583152d5frepo sync if (mGroup.isGroupOwner()) { 1374b81bb9b40881659428f30b4539dd8877f9ea85f9Irfan Sheriff stopDhcpServer(mGroup.getInterface()); 1375aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } else { 1376ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("stop DHCP client"); 1377aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_STOP_DHCP); 1378bbf30dfd767f823f5f40d14b498e2a593454c5c9Wink Saville mDhcpStateMachine.doQuit(); 1379aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mDhcpStateMachine = null; 1380aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1381aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 138255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync mGroup = null; 138361472a8314e6716f231ec1c0aba73e005935829bYoshihiko Ikenaga mWifiNative.p2pFlush(); 1384de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mServiceDiscReqId = null; 138555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (changed) sendP2pPeersChangedBroadcast(); 138655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync transitionTo(mInactiveState); 138755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 138855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_DEVICE_LOST_EVENT: 1389bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff device = (WifiP2pDevice) message.obj; 1390530040e0b9458994c02f4392765db168128d48daIrfan Sheriff //Device loss for a connected device indicates it is not in discovery any more 1391530040e0b9458994c02f4392765db168128d48daIrfan Sheriff if (mGroup.contains(device)) { 1392530040e0b9458994c02f4392765db168128d48daIrfan Sheriff if (DBG) logd("Lost " + device +" , do nothing"); 1393530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return HANDLED; 139455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1395530040e0b9458994c02f4392765db168128d48daIrfan Sheriff // Do the regular device lost handling 1396530040e0b9458994c02f4392765db168128d48daIrfan Sheriff return NOT_HANDLED; 13977d6d9c005e5cfad787bb62b7fee6be2d75b13ca3Irfan Sheriff case WifiStateMachine.CMD_DISABLE_P2P: 139855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync sendMessage(WifiP2pManager.REMOVE_GROUP); 139955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync deferMessage(message); 140055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 140155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiP2pManager.CONNECT: 140255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pConfig config = (WifiP2pConfig) message.obj; 1403bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.deviceAddress == null || 1404bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga (mSavedProvDiscDevice != null && 1405bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice.deviceAddress.equals( 1406bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress))) { 1407bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.wps.setup == WpsInfo.PBC) { 1408bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPbc(mGroup.getInterface(), null); 1409bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1410bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.wps.pin == null) { 1411bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String pin = mWifiNative.startWpsPinDisplay(mGroup.getInterface()); 1412bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 1413bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Integer.parseInt(pin); 1414bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(pin)) { 1415bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(pin, 1416bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress != null ? 1417bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.deviceAddress : "any"); 1418bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1419bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (NumberFormatException ignore) { 1420bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // do nothing if pin is invalid 1421bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1422bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1423bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPinKeypad(mGroup.getInterface(), 1424bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga config.wps.pin); 1425bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1426bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1427bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (config.deviceAddress != null) { 1428bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED); 1429bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendP2pPeersChangedBroadcast(); 1430bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1431ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 1432ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } else { 1433bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga logd("Inviting device : " + config.deviceAddress); 14340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig = config; 1435bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mWifiNative.p2pInvite(mGroup, config.deviceAddress)) { 1436bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mPeers.updateStatus(config.deviceAddress, WifiP2pDevice.INVITED); 1437bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendP2pPeersChangedBroadcast(); 1438bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_SUCCEEDED); 1439bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } else { 1440bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga replyToMessage(message, WifiP2pManager.CONNECT_FAILED, 1441bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pManager.ERROR); 1442bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 1443ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 144455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync // TODO: figure out updating the status to declined when invitation is rejected 144555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 14460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga case WifiMonitor.P2P_INVITATION_RESULT_EVENT: 14470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga P2pStatus status = (P2pStatus)message.obj; 14480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga logd("===> INVITATION RESULT EVENT : " + status); 14490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (status == P2pStatus.SUCCESS) { 14500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // invocation was succeeded. 14510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 14520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (status == P2pStatus.UNKNOWN_P2P_GROUP) { 14530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // target device has already removed the credential. 14540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // So, remove this credential accordingly. 14550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mGroup.getNetworkId(); 14560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 14570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown client from the list"); 14580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!removeClientFromList(netId, 14590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig.deviceAddress, false)) { 14600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // not found the client on the list 14610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Slog.e(TAG, "Already removed the client, ignore"); 14620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 14630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 14640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // try invitation. 14650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sendMessage(WifiP2pManager.CONNECT, mSavedPeerConfig); 14660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 14670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 14680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga break; 146955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 147055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1471618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1472618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff WifiP2pProvDiscEvent provDisc = (WifiP2pProvDiscEvent) message.obj; 1473bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = provDisc.device; 1474618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = new WifiP2pConfig(); 1475618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.deviceAddress = provDisc.device.deviceAddress; 1476618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (message.what == WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT) { 1477618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.KEYPAD; 1478618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else if (message.what == WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT) { 1479618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.DISPLAY; 1480618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = provDisc.pin; 1481618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1482618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.setup = WpsInfo.PBC; 1483618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1484bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendConnectNoticeToApp(mSavedProvDiscDevice, mSavedPeerConfig)) { 1485bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga transitionTo(mUserAuthorizingJoinState); 1486bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 148755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync break; 14889322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff case WifiMonitor.P2P_GROUP_STARTED_EVENT: 14899322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff Slog.e(TAG, "Duplicate group creation event notice, ignore"); 14909322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff break; 149155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync default: 149255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return NOT_HANDLED; 149355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 149455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync return HANDLED; 149555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 1496aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1497aea743aaa43a833fd8ff3dc56205197583152d5frepo sync public void exit() { 1498bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedProvDiscDevice = null; 1499651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.AVAILABLE); 15000a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff resetWifiP2pInfo(); 1501aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.DISCONNECTED, null, null); 1502ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff sendP2pConnectionChangedBroadcast(); 1503aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 150455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 150555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1506618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff class UserAuthorizingJoinState extends State { 1507618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1508618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void enter() { 1509618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName()); 1510618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff notifyInvitationReceived(); 1511618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1512618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1513618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1514618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public boolean processMessage(Message message) { 1515618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + message.toString()); 1516618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (message.what) { 1517618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_PBC_REQ_EVENT: 1518618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_ENTER_PIN_EVENT: 1519618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WifiMonitor.P2P_PROV_DISC_SHOW_PIN_EVENT: 1520618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //Ignore more client requests 1521618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1522618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_ACCEPT: 1523618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (mSavedPeerConfig.wps.setup == WpsInfo.PBC) { 1524bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPbc(mGroup.getInterface(), null); 1525618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } else { 1526bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mWifiNative.startWpsPinKeypad(mGroup.getInterface(), 1527bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mSavedPeerConfig.wps.pin); 1528618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1529618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1530618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1531618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1532618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case PEER_CONNECTION_USER_REJECT: 1533618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("User rejected incoming request"); 1534618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig = null; 1535618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff transitionTo(mGroupCreatedState); 1536618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1537618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1538618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return NOT_HANDLED; 1539618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1540618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return HANDLED; 1541618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1542618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1543618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff @Override 1544618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff public void exit() { 1545618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //TODO: dismiss dialog if not already done 1546618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1547618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1548618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 154955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void sendP2pStateChangedBroadcast(boolean enabled) { 155055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION); 155155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 155255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync if (enabled) { 155355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.putExtra(WifiP2pManager.EXTRA_WIFI_STATE, 155455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.WIFI_P2P_STATE_ENABLED); 155555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } else { 155655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.putExtra(WifiP2pManager.EXTRA_WIFI_STATE, 155755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync WifiP2pManager.WIFI_P2P_STATE_DISABLED); 155855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 15595ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 156055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 156155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1562c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff private void sendP2pDiscoveryChangedBroadcast(boolean started) { 1563c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff if (mDiscoveryStarted == started) return; 1564c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff mDiscoveryStarted = started; 1565c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1566c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff if (DBG) logd("discovery change broadcast " + started); 1567c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1568c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_DISCOVERY_CHANGED_ACTION); 1569c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1570c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_DISCOVERY_STATE, started ? 1571c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff WifiP2pManager.WIFI_P2P_DISCOVERY_STARTED : 1572c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff WifiP2pManager.WIFI_P2P_DISCOVERY_STOPPED); 15735ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1574c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff } 1575c111d1caa8d4cc5d2139b5abd4d2db1f78560effIrfan Sheriff 1576651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private void sendThisDeviceChangedBroadcast() { 1577651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION); 1578651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 1579651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_DEVICE, new WifiP2pDevice(mThisDevice)); 15805ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1581651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 1582651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 158355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void sendP2pPeersChangedBroadcast() { 158455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final Intent intent = new Intent(WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION); 158555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 15865ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(intent, UserHandle.ALL); 158755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 158855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1589aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private void sendP2pConnectionChangedBroadcast() { 1590ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (DBG) logd("sending p2p connection changed broadcast"); 1591aea743aaa43a833fd8ff3dc56205197583152d5frepo sync Intent intent = new Intent(WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION); 1592aea743aaa43a833fd8ff3dc56205197583152d5frepo sync intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT 1593aea743aaa43a833fd8ff3dc56205197583152d5frepo sync | Intent.FLAG_RECEIVER_REPLACE_PENDING); 1594ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff intent.putExtra(WifiP2pManager.EXTRA_WIFI_P2P_INFO, new WifiP2pInfo(mWifiP2pInfo)); 1595aea743aaa43a833fd8ff3dc56205197583152d5frepo sync intent.putExtra(WifiP2pManager.EXTRA_NETWORK_INFO, new NetworkInfo(mNetworkInfo)); 15965ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 1597aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1598aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 15990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private void sendP2pPersistentGroupsChangedBroadcast() { 16000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("sending p2p persistent groups changed broadcast"); 16010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Intent intent = new Intent(WifiP2pManager.WIFI_P2P_PERSISTENT_GROUPS_CHANGED_ACTION); 16020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); 16035ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendStickyBroadcastAsUser(intent, UserHandle.ALL); 16040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 16050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1606aea743aaa43a833fd8ff3dc56205197583152d5frepo sync private void startDhcpServer(String intf) { 1607aea743aaa43a833fd8ff3dc56205197583152d5frepo sync InterfaceConfiguration ifcg = null; 1608aea743aaa43a833fd8ff3dc56205197583152d5frepo sync try { 1609aea743aaa43a833fd8ff3dc56205197583152d5frepo sync ifcg = mNwService.getInterfaceConfig(intf); 1610ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setLinkAddress(new LinkAddress(NetworkUtils.numericToInetAddress( 1611ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey SERVER_ADDRESS), 24)); 1612ddba10622dfd3122cf99c795706754e0d41858c3Jeff Sharkey ifcg.setInterfaceUp(); 1613aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNwService.setInterfaceConfig(intf, ifcg); 1614aea743aaa43a833fd8ff3dc56205197583152d5frepo sync /* This starts the dnsmasq server */ 1615859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff mNwService.startTethering(DHCP_RANGE); 1616aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } catch (Exception e) { 1617ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Error configuring interface " + intf + ", :" + e); 1618aea743aaa43a833fd8ff3dc56205197583152d5frepo sync return; 1619aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1620aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1621ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff logd("Started Dhcp server on " + intf); 1622859e7de2359420dcc5275bdce588b96dcc9203f0Irfan Sheriff } 1623aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1624b81bb9b40881659428f30b4539dd8877f9ea85f9Irfan Sheriff private void stopDhcpServer(String intf) { 1625aea743aaa43a833fd8ff3dc56205197583152d5frepo sync try { 1626aea743aaa43a833fd8ff3dc56205197583152d5frepo sync mNwService.stopTethering(); 1627b81bb9b40881659428f30b4539dd8877f9ea85f9Irfan Sheriff mNwService.clearInterfaceAddresses(intf); 1628aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } catch (Exception e) { 1629ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff loge("Error stopping Dhcp server" + e); 1630aea743aaa43a833fd8ff3dc56205197583152d5frepo sync return; 1631aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1632aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 1633ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff logd("Stopped Dhcp server"); 1634aea743aaa43a833fd8ff3dc56205197583152d5frepo sync } 1635aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 163655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync private void notifyP2pEnableFailure() { 163755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 163855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 163955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setTitle(r.getString(R.string.wifi_p2p_dialog_title)) 164055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setMessage(r.getString(R.string.wifi_p2p_failed_message)) 164155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setPositiveButton(r.getString(R.string.ok), null) 164255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 164355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 164455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 164555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 164655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1647618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void addRowToDialog(ViewGroup group, int stringId, String value) { 164855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1649618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff View row = LayoutInflater.from(mContext).inflate(R.layout.wifi_p2p_dialog_row, 1650618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff group, false); 1651618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ((TextView) row.findViewById(R.id.name)).setText(r.getString(stringId)); 1652618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ((TextView) row.findViewById(R.id.value)).setText(value); 1653618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff group.addView(row); 165455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 165555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1656618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void notifyInvitationSent(String pin, String peerAddress) { 165755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1658aea743aaa43a833fd8ff3dc56205197583152d5frepo sync 165955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final View textEntryView = LayoutInflater.from(mContext) 1660618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .inflate(R.layout.wifi_p2p_dialog, null); 1661618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 1662618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ViewGroup group = (ViewGroup) textEntryView.findViewById(R.id.info); 1663618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_to_message, getDeviceName(peerAddress)); 1664618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_show_pin_message, pin); 166555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 166655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 1667618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setTitle(r.getString(R.string.wifi_p2p_invitation_sent_title)) 166855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setView(textEntryView) 1669618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setPositiveButton(r.getString(R.string.ok), null) 167055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 167155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 167255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 167355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 167455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1675618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private void notifyInvitationReceived() { 167655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync Resources r = Resources.getSystem(); 1677618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff final WpsInfo wps = mSavedPeerConfig.wps; 167855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync final View textEntryView = LayoutInflater.from(mContext) 1679618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .inflate(R.layout.wifi_p2p_dialog, null); 168055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1681618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff ViewGroup group = (ViewGroup) textEntryView.findViewById(R.id.info); 1682618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_from_message, getDeviceName( 1683618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.deviceAddress)); 168455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1685618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff final EditText pin = (EditText) textEntryView.findViewById(R.id.wifi_p2p_wps_pin); 168655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 168755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync AlertDialog dialog = new AlertDialog.Builder(mContext) 1688618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setTitle(r.getString(R.string.wifi_p2p_invitation_to_connect_title)) 168955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .setView(textEntryView) 1690618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setPositiveButton(r.getString(R.string.accept), new OnClickListener() { 169155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync public void onClick(DialogInterface dialog, int which) { 1692618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (wps.setup == WpsInfo.KEYPAD) { 1693618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff mSavedPeerConfig.wps.pin = pin.getText().toString(); 1694618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1695618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " accept invitation " + mSavedPeerConfig); 1696618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessage(PEER_CONNECTION_USER_ACCEPT); 1697bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff } 1698bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff }) 1699618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff .setNegativeButton(r.getString(R.string.decline), new OnClickListener() { 1700bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff @Override 1701bbe77ca6be1f6fe5c13c97ccd8baa68ab0272cf5Irfan Sheriff public void onClick(DialogInterface dialog, int which) { 1702618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd(getName() + " ignore connect"); 1703618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff sendMessage(PEER_CONNECTION_USER_REJECT); 170455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 170555bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync }) 170610ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff .setOnCancelListener(new DialogInterface.OnCancelListener() { 170710ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff @Override 170810ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff public void onCancel(DialogInterface arg0) { 170910ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff if (DBG) logd(getName() + " ignore connect"); 171010ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff sendMessage(PEER_CONNECTION_USER_REJECT); 171110ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff } 171210ca870d3b58ec6fd62b85466ec1211fca77d33eIrfan Sheriff }) 171355bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync .create(); 171455bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 1715618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //make the enter pin area or the display pin area visible 1716618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff switch (wps.setup) { 1717618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.KEYPAD: 1718618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Enter pin section visible"); 1719618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff textEntryView.findViewById(R.id.enter_pin_section).setVisibility(View.VISIBLE); 1720618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1721618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff case WpsInfo.DISPLAY: 1722618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff if (DBG) logd("Shown pin section visible"); 1723618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff addRowToDialog(group, R.string.wifi_p2p_show_pin_message, wps.pin); 1724618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1725618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff default: 1726618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff break; 1727618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 172855bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 172955bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); 173055bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync dialog.show(); 173155bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 173255bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync 17330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 17340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Synchronize the persistent group list between 17350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * wpa_supplicant and mGroups. 17360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 17370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private void updatePersistentNetworks() { 17380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String listStr = mWifiNative.listNetworks(); 17390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 17400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isSaveRequired = false; 17410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] lines = listStr.split("\n"); 17420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Skip the first line, which is a header 17430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (int i = 1; i < lines.length; i++) { 17440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] result = lines[i].split("\t"); 17450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (result == null || result.length < 4) { 17460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 17470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // network-id | ssid | bssid | flags 17490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = -1; 17500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String ssid = result[1]; 17510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String bssid = result[2]; 17520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String flags = result[3]; 17530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga try { 17540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = Integer.parseInt(result[0]); 17550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } catch(NumberFormatException e) { 17560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga e.printStackTrace(); 17570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 17580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 17600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (flags.indexOf("[CURRENT]") != -1) { 17610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 17620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (flags.indexOf("[P2P-PERSISTENT]") == -1) { 17640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /* 17650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * The unused profile is sometimes remained when the p2p group formation is failed. 17660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * So, we clean up the p2p group here. 17670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 17680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("clean up the unused persistent group. netId=" + netId); 17690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.removeNetwork(netId); 17700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isSaveRequired = true; 17710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 17720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 17740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mGroups.contains(netId)) { 17750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga continue; 17760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 17780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pGroup group = new WifiP2pGroup(); 17790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkId(netId); 17800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setNetworkName(ssid); 17810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String mode = mWifiNative.getNetworkVariable(netId, "mode"); 17820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (mode != null && mode.equals("3")) { 17830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setIsGroupOwner(true); 17840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (bssid.equalsIgnoreCase(mThisDevice.deviceAddress)) { 17860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setOwner(mThisDevice); 17870879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 17880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice device = new WifiP2pDevice(); 17890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga device.deviceAddress = bssid; 17900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga group.setOwner(device); 17910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.add(group); 17930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isSaveRequired = true; 17940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 17950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 17960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (isSaveRequired) { 17970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga sendP2pPersistentGroupsChangedBroadcast(); 17980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 17990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 18030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Try to connect to the target device. 18040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 18050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Use the persistent credential if it has been stored. 18060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 18070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param config 18080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param tryInvocation if true, try to invoke. Otherwise, never try to invoke. 18090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return 18100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 18110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int connect(WifiP2pConfig config, boolean tryInvocation) { 18120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config == null) { 18140879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga loge("invalid argument."); 18150879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 18160879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isResp = (mSavedPeerConfig != null && 18190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga config.deviceAddress.equals(mSavedPeerConfig.deviceAddress)); 18200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig = config; 18210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga WifiP2pDevice dev = mPeers.get(config.deviceAddress); 18230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (dev == null) { 18240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga loge("target device is not found."); 18250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 18260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean join = dev.isGroupOwner(); 18290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String ssid = mWifiNative.p2pGetSsid(dev.deviceAddress); 18300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("target ssid is " + ssid + " join:" + join); 18310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (join && dev.isGroupLimit()) { 18330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("target device reaches group limit."); 18340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // if the target group has reached the limit, 18360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // try group formation. 18370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga join = false; 18380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else if (join) { 18390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = mGroups.getNetworkId(dev.deviceAddress, ssid); 18400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 18410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Skip WPS and start 4way handshake immediately. 18420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!mWifiNative.p2pGroupAdd(netId)) { 18430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 18440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_SUCCESS; 18460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!join && dev.isDeviceLimit()) { 18500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga loge("target device reaches the device limit."); 18510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 18520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!join && tryInvocation && dev.isInvitationCapable()) { 18550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = WifiP2pGroup.PERSISTENT_NET_ID; 18560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config.netId >= 0) { 18570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (config.deviceAddress.equals(mGroups.getOwnerAddr(config.netId))) { 18580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = config.netId; 18590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 18610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = mGroups.getNetworkId(dev.deviceAddress); 18620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId < 0) { 18640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga netId = getNetworkIdFromClientList(dev.deviceAddress); 18650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("netId related with " + dev.deviceAddress + " = " + netId); 18670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (netId >= 0) { 18680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Invoke the persistent group. 18700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!mWifiNative.p2pReinvoke(netId, dev.deviceAddress)) { 18710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga loge("p2pReinvoke() failed"); 18720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_FAILURE; 18730879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18740879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // Save network id. It'll be used when an invitation result event is received. 18750879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mSavedPeerConfig.netId = netId; 18760879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_SUCCESS; 18770879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18780879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18790879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18800879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga //Stop discovery before issuing connect 18810879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.p2pStopFind(); 18820879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18830879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!isResp) { 18840879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return NEEDS_PROVISION_REQ; 18850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18874bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff p2pConnectWithPinDisplay(config); 18880879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return CONNECT_SUCCESS; 18890879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 18900879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 18910879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 18920879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Return the network id of the group owner profile which has the p2p client with 18930879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * the specified device address in it's client list. 18940879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * If more than one persistent group of the same address is present in its client 18950879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * lists, return the first one. 18960879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * 18970879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param deviceAddress p2p device address. 18980879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return the network id. if not found, return -1. 18990879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 19000879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private int getNetworkIdFromClientList(String deviceAddress) { 19010879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (deviceAddress == null) return -1; 19020879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19030879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga Collection<WifiP2pGroup> groups = mGroups.getGroupList(); 19040879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (WifiP2pGroup group : groups) { 19050879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga int netId = group.getNetworkId(); 19060879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] p2pClientList = getClientList(netId); 19070879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (p2pClientList == null) continue; 19080879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (String client : p2pClientList) { 19090879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (deviceAddress.equalsIgnoreCase(client)) { 19100879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return netId; 19110879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19120879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19130879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 1914ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff return -1; 1915ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 1916ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 19170879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 19180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Return p2p client list associated with the specified network id. 19190879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param netId network id. 19200879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return p2p client list. if not found, return null. 19210879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 19220879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private String[] getClientList(int netId) { 19230879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String p2pClients = mWifiNative.getNetworkVariable(netId, "p2p_client_list"); 19240879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (p2pClients == null) { 19250879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return null; 19260879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19270879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return p2pClients.split(" "); 19280879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19290879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19300879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga /** 19310879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * Remove the specified p2p client from the specified profile. 19320879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param netId network id of the profile. 19330879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param addr p2p client address to be removed. 19340879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @param isRemovable if true, remove the specified profile if its client list becomes empty. 19350879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga * @return whether removing the specified p2p client is successful or not. 19360879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga */ 19370879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga private boolean removeClientFromList(int netId, String addr, boolean isRemovable) { 19380879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga StringBuilder modifiedClientList = new StringBuilder(); 19390879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga String[] currentClientList = getClientList(netId); 19400879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga boolean isClientRemoved = false; 19410879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (currentClientList != null) { 19420879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (String client : currentClientList) { 19430879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!client.equalsIgnoreCase(addr)) { 19440879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append(" "); 19450879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append(client); 19460879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } else { 19470879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga isClientRemoved = true; 19480879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19490879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19500879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19510879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (modifiedClientList.length() == 0 && isRemovable) { 19520879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // the client list is empty. so remove it. 19530879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Remove unknown network"); 19540879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mGroups.remove(netId); 19550879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return true; 19560879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19570879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19580879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (!isClientRemoved) { 19590879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga // specified p2p client is not found. already removed. 19600879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return false; 19610879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19620879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 19630879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (DBG) logd("Modified client list: " + modifiedClientList); 19640879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga if (modifiedClientList.length() == 0) { 19650879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga modifiedClientList.append("\"\""); 19660879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19670879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.setNetworkVariable(netId, 19680879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga "p2p_client_list", modifiedClientList.toString()); 19690879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga mWifiNative.saveConfig(); 19700879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga return true; 19710879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga } 19720879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 1973ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void setWifiP2pInfoOnGroupFormation(String serverAddress) { 1974ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupFormed = true; 1975ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.isGroupOwner = mGroup.isGroupOwner(); 1976ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupOwnerAddress = NetworkUtils.numericToInetAddress(serverAddress); 1977ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 1978ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 19790a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff private void resetWifiP2pInfo() { 1980ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupFormed = false; 1981ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.isGroupOwner = false; 1982ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff mWifiP2pInfo.groupOwnerAddress = null; 1983ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 1984ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 1985618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff private String getDeviceName(String deviceAddress) { 1986bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga WifiP2pDevice d = mPeers.get(deviceAddress); 1987bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (d != null) { 1988618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return d.deviceName; 1989618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1990618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff //Treat the address as name if there is no match 1991618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff return deviceAddress; 1992618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff } 1993618455f7e7255019c8cc08a734ba7c52b67a7dc8Irfan Sheriff 19944bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff private void p2pConnectWithPinDisplay(WifiP2pConfig config) { 19954bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff WifiP2pDevice dev = mPeers.get(config.deviceAddress); 19964bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff if (dev == null) { 19974bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff loge("target device is not found " + config.deviceAddress); 19984bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff return; 19994bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff } 20004bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff 20014bbb13976e54f6325cb013882891c02adea61ec5Irfan Sheriff String pin = mWifiNative.p2pConnect(config, dev.isGroupOwner()); 2002bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff try { 2003bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff Integer.parseInt(pin); 2004bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!sendShowPinReqToFrontApp(pin)) { 2005bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga notifyInvitationSent(pin, config.deviceAddress); 2006bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2007bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } catch (NumberFormatException ignore) { 2008bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff // do nothing if p2pConnect did not return a pin 2009bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 2010bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff } 2011bfed2d6c618e0bf2c271dad1f4acf6d29ebbea51Irfan Sheriff 20122bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff private String getPersistedDeviceName() { 20132bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff String deviceName = Settings.Secure.getString(mContext.getContentResolver(), 20142bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff Settings.Secure.WIFI_P2P_DEVICE_NAME); 20152bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (deviceName == null) { 20162bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff /* We use the 4 digits of the ANDROID_ID to have a friendly 20172bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff * default that has low likelihood of collision with a peer */ 20182bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff String id = Settings.Secure.getString(mContext.getContentResolver(), 20192bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff Settings.Secure.ANDROID_ID); 20202bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return "Android_" + id.substring(0,4); 20212bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 20222bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return deviceName; 20232bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 20242bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 20252bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff private boolean setAndPersistDeviceName(String devName) { 20262bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (devName == null) return false; 20272bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 20282bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff if (!mWifiNative.setDeviceName(devName)) { 20292bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff loge("Failed to set device name " + devName); 20302bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return false; 20312bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 20322bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 20332bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mThisDevice.deviceName = devName; 20342bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); 20352bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 20362bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff Settings.Secure.putString(mContext.getContentResolver(), 20372bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff Settings.Secure.WIFI_P2P_DEVICE_NAME, devName); 20382bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff sendThisDeviceChangedBroadcast(); 20392bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff return true; 20402bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff } 20412bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff 2042ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber private boolean setWfdInfo(WifiP2pWfdInfo wfdInfo) { 2043ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber boolean success; 2044ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2045ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (!wfdInfo.isWfdEnabled()) { 2046ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber success = mWifiNative.setWfdEnable(false); 2047ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } else { 2048ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber success = 2049ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber mWifiNative.setWfdEnable(true) 2050ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber && mWifiNative.setWfdDeviceInfo(wfdInfo.getDeviceInfoHex()); 2051ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2052ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2053ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber if (!success) { 2054ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber loge("Failed to set wfd properties"); 2055ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber return false; 2056ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2057ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 2058ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber mThisDevice.wfdInfo = wfdInfo; 2059ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber sendThisDeviceChangedBroadcast(); 2060ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber return true; 2061ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber } 2062ab4cd45133ccea6a66fb081f9b2a8d14eb3e4f1dAndreas Huber 20639322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff private void initializeP2pSettings() { 2064fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setPersistentReconnect(true); 20652bdefcab74d4ee21ad4bc1e90b30aeb7eac589e0Irfan Sheriff mThisDevice.deviceName = getPersistedDeviceName(); 2066fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setDeviceName(mThisDevice.deviceName); 2067de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // DIRECT-XY-DEVICENAME (XY is randomly generated) 2068fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setP2pSsidPostfix("-" + mThisDevice.deviceName); 2069fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mWifiNative.setDeviceType(mThisDevice.primaryDeviceType); 2070de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // Supplicant defaults to using virtual display with display 2071de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // which refers to a remote display. Use physical_display 2072de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mWifiNative.setConfigMethods("virtual_push_button physical_display keypad"); 2073de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff // STA has higher priority over P2P 207455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.setConcurrencyPriority("sta"); 20754be4d31f34a0fd0e23de1cbda311c07412f8d0b8Irfan Sheriff 2076fc7f95abcda6fa35c175f9225358ea75c22952abIrfan Sheriff mThisDevice.deviceAddress = mWifiNative.p2pGetDeviceAddress(); 2077651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff updateThisDevice(WifiP2pDevice.AVAILABLE); 2078651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff if (DBG) Slog.d(TAG, "DeviceAddress: " + mThisDevice.deviceAddress); 207921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 208021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.clear(); 208121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pFlush(); 208221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceFlush(); 208321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceTransactionId = 0; 208421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = null; 20850879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga 20860879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga updatePersistentNetworks(); 2087651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 2088651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 2089651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private void updateThisDevice(int status) { 2090651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mThisDevice.status = status; 2091651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff sendThisDeviceChangedBroadcast(); 20929322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff } 20939322687d98ec425da03cc10ab64ea19ad7fe2d69Irfan Sheriff 209455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff private void handleGroupCreationFailure() { 20950a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff resetWifiP2pInfo(); 20960a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff mNetworkInfo.setDetailedState(NetworkInfo.DetailedState.FAILED, null, null); 20970a66763744db9c9215567ed70051add7f55d53c7Irfan Sheriff sendP2pConnectionChangedBroadcast(); 209855bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mSavedPeerConfig = null; 209955bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff /* After cancelling group formation, new connections on existing peers can fail 210055bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff * at supplicant. Flush and restart discovery */ 210155bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff mWifiNative.p2pFlush(); 2102de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff mServiceDiscReqId = null; 210355bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff sendMessage(WifiP2pManager.DISCOVER_PEERS); 210455bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff } 210555bfa42b05868a62ea66d291dcc51f0150fadcc2Irfan Sheriff 2106ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff //State machine initiated requests can have replyTo set to null indicating 2107de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff //there are no recipients, we ignore those reply actions 2108ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void replyToMessage(Message msg, int what) { 2109ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (msg.replyTo == null) return; 2110651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2111651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2112651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2113ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2114ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2115f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff private void replyToMessage(Message msg, int what, int arg1) { 2116f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff if (msg.replyTo == null) return; 2117651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2118651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2119651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.arg1 = arg1; 2120651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2121f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff } 2122f0ef26af3430b9c6402a34eeb9248f805d570922Irfan Sheriff 2123ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void replyToMessage(Message msg, int what, Object obj) { 2124ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff if (msg.replyTo == null) return; 2125651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message dstMsg = obtainMessage(msg); 2126651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.what = what; 2127651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff dstMsg.obj = obj; 2128651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff mReplyChannel.replyToMessage(msg, dstMsg); 2129651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff } 2130651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff 2131651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff /* arg2 on the source message has a hash code that needs to be retained in replies 2132651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff * see WifiP2pManager for details */ 2133651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff private Message obtainMessage(Message srcMsg) { 2134651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff Message msg = Message.obtain(); 2135651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff msg.arg2 = srcMsg.arg2; 2136651cdfcbac6245f570475991588ddc2d30265e8dIrfan Sheriff return msg; 2137ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2138ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2139ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void logd(String s) { 2140ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff Slog.d(TAG, s); 2141ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2142ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 2143ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff private void loge(String s) { 2144ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff Slog.e(TAG, s); 2145ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff } 2146ea5b16ac5751022de73e8f1225407eb01e7f1824Irfan Sheriff 214721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 214821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Update service discovery request to wpa_supplicant. 214921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 215021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean updateSupplicantServiceRequest() { 215121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearSupplicantServiceRequest(); 215221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 215321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff StringBuffer sb = new StringBuffer(); 215421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c: mClientInfoList.values()) { 215521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff int key; 215621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceRequest req; 215721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (int i=0; i < c.mReqList.size(); i++) { 21583b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff req = c.mReqList.valueAt(i); 215921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (req != null) { 216021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff sb.append(req.getSupplicantQuery()); 216121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 216221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 216321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 216421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 216521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (sb.length() == 0) { 216621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 216721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 216821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 216921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = mWifiNative.p2pServDiscReq("00:00:00:00:00:00", sb.toString()); 217021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 217121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 217221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 217321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 217421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 217521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 217621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 217721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Clear service discovery request in wpa_supplicant 217821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 217921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearSupplicantServiceRequest() { 218021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) return; 218121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 218221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServDiscCancelReq(mServiceDiscReqId); 218321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServiceDiscReqId = null; 218421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 218521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2186de1e9fa9fbc4b7f4b08415d805a6e5212e655d95Irfan Sheriff /* TODO: We could track individual service adds separately and avoid 218721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * having to do update all service requests on every new request 218821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 218921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean addServiceRequest(Messenger m, WifiP2pServiceRequest req) { 219021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientDeadChannels(); 219121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, true); 219221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 219321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 219421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 219521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 21963b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff ++mServiceTransactionId; 21973b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //The Wi-Fi p2p spec says transaction id should be non-zero 21983b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (mServiceTransactionId == 0) ++mServiceTransactionId; 21993b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff req.setTransactionId(mServiceTransactionId); 220021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mReqList.put(mServiceTransactionId, req); 220121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 220221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 220321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 220421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 220521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 220621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return updateSupplicantServiceRequest(); 220721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 220821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 220921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void removeServiceRequest(Messenger m, WifiP2pServiceRequest req) { 221021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 221121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 221221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 221321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 221421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 22153b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //Application does not have transaction id information 22163b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff //go through stored requests to remove 22173b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff boolean removed = false; 22180879d03f0a5caa108a0a7320442d57629f9ced81Yoshihiko Ikenaga for (int i=0; i<clientInfo.mReqList.size(); i++) { 22193b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (req.equals(clientInfo.mReqList.valueAt(i))) { 22203b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff removed = true; 22213b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff clientInfo.mReqList.removeAt(i); 22223b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff break; 22233b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 22243b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 22253b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 22263b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff if (!removed) return; 222721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 222821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0 && clientInfo.mServList.size() == 0) { 222921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 223021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 223121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 223221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 223321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 223421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 223521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 223621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 223721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff updateSupplicantServiceRequest(); 223821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 223921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 224021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearServiceRequests(Messenger m) { 224121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 224221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 224321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 224421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 224521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 224621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 224721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0) { 224821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 224921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 225021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 225121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mReqList.clear(); 225221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 225321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mServList.size() == 0) { 225421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove channel information from framework"); 225521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 225621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 225721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 225821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (mServiceDiscReqId == null) { 225921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 226021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 226121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 226221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff updateSupplicantServiceRequest(); 226321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 226421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 226521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private boolean addLocalService(Messenger m, WifiP2pServiceInfo servInfo) { 226621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientDeadChannels(); 226721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, true); 226821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 226921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 227021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 227121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 227221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!clientInfo.mServList.add(servInfo)) { 227321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 227421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 227521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 227621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (!mWifiNative.p2pServiceAdd(servInfo)) { 227721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.remove(servInfo); 227821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return false; 227921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 228021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 228121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return true; 228221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 228321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 228421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void removeLocalService(Messenger m, WifiP2pServiceInfo servInfo) { 228521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 228621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 228721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 228821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 228921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 229021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceDel(servInfo); 229121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 229221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.remove(servInfo); 229321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0 && clientInfo.mServList.size() == 0) { 229421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 229521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 229621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 229721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 229821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 229921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearLocalServices(Messenger m) { 230021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = getClientInfo(m, false); 230121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null) { 230221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return; 230321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 230421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 230521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (WifiP2pServiceInfo servInfo: clientInfo.mServList) { 230621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mWifiNative.p2pServiceDel(servInfo); 230721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 230821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 230921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo.mServList.clear(); 231021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo.mReqList.size() == 0) { 231121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("remove client information from framework"); 231221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.remove(clientInfo.mMessenger); 231321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 231421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 231521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 231621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearClientInfo(Messenger m) { 231721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearLocalServices(m); 231821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearServiceRequests(m); 231921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 232021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 232121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 232221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Send the service response to the WifiP2pManager.Channel. 232321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 232421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param resp 232521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 232621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void sendServiceResponse(WifiP2pServiceResponse resp) { 232721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c : mClientInfoList.values()) { 232821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff WifiP2pServiceRequest req = c.mReqList.get(resp.getTransactionId()); 232921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (req != null) { 233021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff Message msg = Message.obtain(); 233121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.what = WifiP2pManager.RESPONSE_SERVICE; 233221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg1 = 0; 233321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg2 = 0; 233421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.obj = resp; 233521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff try { 233621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff c.mMessenger.send(msg); 233721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } catch (RemoteException e) { 233821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("detect dead channel"); 233921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clearClientInfo(c.mMessenger); 23403b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff return; 234121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 234221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 234321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 234421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 234521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 234621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 234721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * We dont get notifications of clients that have gone away. 234821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * We detect this actively when services are added and throw 234921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * them away. 235021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * 235121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * TODO: This can be done better with full async channels. 235221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 235321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private void clearClientDeadChannels() { 23543b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff ArrayList<Messenger> deadClients = new ArrayList<Messenger>(); 23553b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 235621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff for (ClientInfo c : mClientInfoList.values()) { 235721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff Message msg = Message.obtain(); 235821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.what = WifiP2pManager.PING; 235921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg1 = 0; 236021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.arg2 = 0; 236121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff msg.obj = null; 236221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff try { 236321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff c.mMessenger.send(msg); 236421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } catch (RemoteException e) { 236521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("detect dead channel"); 23663b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff deadClients.add(c.mMessenger); 236721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 236821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 23693b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff 23703b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff for (Messenger m : deadClients) { 23713b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff clearClientInfo(m); 23723b8be87f89e2f98345980954994bdde82b7ee9adIrfan Sheriff } 237321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 237421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 237521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 237621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Return the specified ClientInfo. 237721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param m Messenger 237821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @param createIfNotExist if true and the specified channel info does not exist, 237921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * create new client info. 238021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * @return the specified ClientInfo. 238121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 238221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private ClientInfo getClientInfo(Messenger m, boolean createIfNotExist) { 238321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff ClientInfo clientInfo = mClientInfoList.get(m); 238421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 238521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (clientInfo == null && createIfNotExist) { 238621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff if (DBG) logd("add a new client"); 238721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff clientInfo = new ClientInfo(m); 238821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mClientInfoList.put(m, clientInfo); 238921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 239021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 239121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff return clientInfo; 239221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 239321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 2394bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2395bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send detached message to dialog listener in the foreground application. 2396bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param reason 2397bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2398bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private void sendDetachedMsg(int reason) { 2399bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mForegroundAppMessenger == null) return; 2400bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2401bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2402bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.DIALOG_LISTENER_DETACHED; 2403bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.arg1 = reason; 2404bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 2405bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger.send(msg); 2406bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (RemoteException e) { 2407bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2408bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2409bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2410bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2411bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2412bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2413bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send a request to show wps pin to dialog listener in the foreground application. 2414bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param pin WPS pin 2415bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2416bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2417bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendShowPinReqToFrontApp(String pin) { 2418bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(mForegroundAppPkgName)) { 2419bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2420bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2421bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2422bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2423bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.SHOW_PIN_REQUESTED; 2424bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Bundle bundle = new Bundle(); 2425bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putString(WifiP2pManager.WPS_PIN_BUNDLE_KEY, pin); 2426bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.setData(bundle); 2427bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return sendDialogMsgToFrontApp(msg); 2428bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2429bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2430bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2431bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send a request to establish the connection to dialog listener in the foreground 2432bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * application. 2433bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param dev source device 2434bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param config 2435bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2436bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2437bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendConnectNoticeToApp(WifiP2pDevice dev, WifiP2pConfig config) { 2438bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (dev == null) { 2439bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga dev = new WifiP2pDevice(config.deviceAddress); 2440bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2441bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2442bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(mForegroundAppPkgName)) { 2443bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("application is NOT foreground"); 2444bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2445bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2446bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2447bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2448bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Message msg = Message.obtain(); 2449bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.what = WifiP2pManager.CONNECTION_REQUESTED; 2450bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga Bundle bundle = new Bundle(); 2451bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putParcelable(WifiP2pManager.P2P_DEV_BUNDLE_KEY, dev); 2452bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga bundle.putParcelable(WifiP2pManager.P2P_CONFIG_BUNDLE_KEY, config); 2453bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga msg.setData(bundle); 2454bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return sendDialogMsgToFrontApp(msg); 2455bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2456bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2457bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2458bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Send dialog event message to front application's dialog listener. 2459bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param msg 2460bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return true if success. 2461bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2462bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean sendDialogMsgToFrontApp(Message msg) { 2463bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga try { 2464bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger.send(msg); 2465bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } catch (RemoteException e) { 2466bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2467bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2468bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2469bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2470bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2471bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2472bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2473bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2474bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Set dialog listener application. 2475bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param m 2476bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param appPkgName if null, reset the listener. 2477bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param isReset if true, try to reset. 2478bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2479bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2480bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean setDialogListenerApp(Messenger m, 2481bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga String appPkgName, boolean isReset) { 2482bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2483bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (mForegroundAppPkgName != null && !mForegroundAppPkgName.equals(appPkgName)) { 2484bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (isForegroundApp(mForegroundAppPkgName)) { 2485bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // The current dialog listener is foreground app's. 2486bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("application is NOT foreground"); 2487bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2488bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2489bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga // detach an old listener. 2490bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga sendDetachedMsg(WifiP2pManager.NOT_IN_FOREGROUND); 2491bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2492bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2493bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (isReset) { 2494bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("reset dialog listener"); 2495bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = null; 2496bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = null; 2497bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2498bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2499bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2500bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (!isForegroundApp(appPkgName)) { 2501bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2502bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2503bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2504bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppMessenger = m; 2505bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga mForegroundAppPkgName = appPkgName; 2506bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (DBG) logd("set dialog listener. app=" + appPkgName); 2507bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return true; 2508bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2509bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2510bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga /** 2511bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * Return true if the specified package name is foreground app's. 2512bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * 2513bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @param pkgName application package name. 2514bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga * @return 2515bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga */ 2516bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga private boolean isForegroundApp(String pkgName) { 2517bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (pkgName == null) return false; 2518bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2519bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga List<RunningTaskInfo> tasks = mActivityMgr.getRunningTasks(1); 2520bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga if (tasks.size() == 0) { 2521bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return false; 2522bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2523bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 2524bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga return pkgName.equals(tasks.get(0).baseActivity.getPackageName()); 2525bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga } 2526bfb27bbefb013220af699881d486cc04be5ec1f5Yoshihiko Ikenaga 252721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 252821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 252921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /** 253021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * Information about a particular client and we track the service discovery requests 253121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * and the local services registered by the client. 253221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 253321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private class ClientInfo { 253421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 253521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 253621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A reference to WifiP2pManager.Channel handler. 253721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * The response of this request is notified to WifiP2pManager.Channel handler 253821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 253921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private Messenger mMessenger; 254021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 254121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 254221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A service discovery request list. 254321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 254421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private SparseArray<WifiP2pServiceRequest> mReqList; 254521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 254621ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff /* 254721ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff * A local service information list. 254821ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff */ 254921ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private List<WifiP2pServiceInfo> mServList; 255021ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff 255121ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff private ClientInfo(Messenger m) { 255221ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mMessenger = m; 255321ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mReqList = new SparseArray(); 255421ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff mServList = new ArrayList<WifiP2pServiceInfo>(); 255521ba8153325e010224c6bc75a0acdc98b6ca82e8Irfan Sheriff } 255655bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync } 255755bc5f3e0408bcb5a39a6732de0b2d1aa99a55berepo sync} 2558