1956f54b391677d78379729dd14518edddf3c7660Etan Cohen/* 2956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Copyright (C) 2016 The Android Open Source Project 3956f54b391677d78379729dd14518edddf3c7660Etan Cohen * 4956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Licensed under the Apache License, Version 2.0 (the "License"); 5956f54b391677d78379729dd14518edddf3c7660Etan Cohen * you may not use this file except in compliance with the License. 6956f54b391677d78379729dd14518edddf3c7660Etan Cohen * You may obtain a copy of the License at 7956f54b391677d78379729dd14518edddf3c7660Etan Cohen * 8956f54b391677d78379729dd14518edddf3c7660Etan Cohen * http://www.apache.org/licenses/LICENSE-2.0 9956f54b391677d78379729dd14518edddf3c7660Etan Cohen * 10956f54b391677d78379729dd14518edddf3c7660Etan Cohen * Unless required by applicable law or agreed to in writing, software 11956f54b391677d78379729dd14518edddf3c7660Etan Cohen * distributed under the License is distributed on an "AS IS" BASIS, 12956f54b391677d78379729dd14518edddf3c7660Etan Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13956f54b391677d78379729dd14518edddf3c7660Etan Cohen * See the License for the specific language governing permissions and 14956f54b391677d78379729dd14518edddf3c7660Etan Cohen * limitations under the License. 15956f54b391677d78379729dd14518edddf3c7660Etan Cohen */ 16956f54b391677d78379729dd14518edddf3c7660Etan Cohen 17956f54b391677d78379729dd14518edddf3c7660Etan Cohenpackage com.android.server.wifi.nan; 18956f54b391677d78379729dd14518edddf3c7660Etan Cohen 19956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.net.wifi.nan.ConfigRequest; 20956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.net.wifi.nan.IWifiNanEventListener; 21956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.net.wifi.nan.IWifiNanSessionListener; 22956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.net.wifi.nan.WifiNanEventListener; 23956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.os.RemoteException; 24956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.util.Log; 25956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport android.util.SparseArray; 26956f54b391677d78379729dd14518edddf3c7660Etan Cohen 27956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport java.io.FileDescriptor; 28956f54b391677d78379729dd14518edddf3c7660Etan Cohenimport java.io.PrintWriter; 29956f54b391677d78379729dd14518edddf3c7660Etan Cohen 30956f54b391677d78379729dd14518edddf3c7660Etan Cohenpublic class WifiNanClientState { 31956f54b391677d78379729dd14518edddf3c7660Etan Cohen private static final String TAG = "WifiNanClientState"; 322cb727022e130f0c0b3c549b01c7d88cd57904e3Etan Cohen private static final boolean DBG = false; 33956f54b391677d78379729dd14518edddf3c7660Etan Cohen private static final boolean VDBG = false; // STOPSHIP if true 34956f54b391677d78379729dd14518edddf3c7660Etan Cohen 35956f54b391677d78379729dd14518edddf3c7660Etan Cohen /* package */ static final int CLUSTER_CHANGE_EVENT_STARTED = 0; 36956f54b391677d78379729dd14518edddf3c7660Etan Cohen /* package */ static final int CLUSTER_CHANGE_EVENT_JOINED = 1; 37956f54b391677d78379729dd14518edddf3c7660Etan Cohen 38956f54b391677d78379729dd14518edddf3c7660Etan Cohen private IWifiNanEventListener mListener; 39956f54b391677d78379729dd14518edddf3c7660Etan Cohen private int mEvents; 40956f54b391677d78379729dd14518edddf3c7660Etan Cohen private final SparseArray<WifiNanSessionState> mSessions = new SparseArray<>(); 41956f54b391677d78379729dd14518edddf3c7660Etan Cohen 42956f54b391677d78379729dd14518edddf3c7660Etan Cohen private int mUid; 43956f54b391677d78379729dd14518edddf3c7660Etan Cohen private ConfigRequest mConfigRequest; 44956f54b391677d78379729dd14518edddf3c7660Etan Cohen 45956f54b391677d78379729dd14518edddf3c7660Etan Cohen public WifiNanClientState(int uid, IWifiNanEventListener listener, int events) { 46956f54b391677d78379729dd14518edddf3c7660Etan Cohen mUid = uid; 47956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener = listener; 48956f54b391677d78379729dd14518edddf3c7660Etan Cohen mEvents = events; 49956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 50956f54b391677d78379729dd14518edddf3c7660Etan Cohen 51956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void destroy() { 52956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener = null; 53956f54b391677d78379729dd14518edddf3c7660Etan Cohen for (int i = 0; i < mSessions.size(); ++i) { 54956f54b391677d78379729dd14518edddf3c7660Etan Cohen mSessions.valueAt(i).destroy(); 55956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 56956f54b391677d78379729dd14518edddf3c7660Etan Cohen mSessions.clear(); 57956f54b391677d78379729dd14518edddf3c7660Etan Cohen mConfigRequest = null; 58956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 59956f54b391677d78379729dd14518edddf3c7660Etan Cohen 60956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void setConfigRequest(ConfigRequest configRequest) { 61956f54b391677d78379729dd14518edddf3c7660Etan Cohen mConfigRequest = configRequest; 62956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 63956f54b391677d78379729dd14518edddf3c7660Etan Cohen 64956f54b391677d78379729dd14518edddf3c7660Etan Cohen public ConfigRequest getConfigRequest() { 65956f54b391677d78379729dd14518edddf3c7660Etan Cohen return mConfigRequest; 66956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 67956f54b391677d78379729dd14518edddf3c7660Etan Cohen 6822b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen public int getUid() { 6922b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen return mUid; 7022b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen } 7122b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen 7222b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen public WifiNanSessionState getNanSessionStateForPubSubId(int pubSubId) { 7322b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen for (int i = 0; i < mSessions.size(); ++i) { 7422b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen WifiNanSessionState session = mSessions.valueAt(i); 7522b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen if (session.isPubSubIdSession(pubSubId)) { 7622b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen return session; 7722b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen } 7822b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen } 7922b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen 8022b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen return null; 8122b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen } 8222b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen 83956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void createSession(int sessionId, IWifiNanSessionListener listener, int events) { 84956f54b391677d78379729dd14518edddf3c7660Etan Cohen WifiNanSessionState session = mSessions.get(sessionId); 85956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (session != null) { 86956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.e(TAG, "createSession: sessionId already exists (replaced) - " + sessionId); 87956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 88956f54b391677d78379729dd14518edddf3c7660Etan Cohen 8922b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen mSessions.put(sessionId, new WifiNanSessionState(sessionId, listener, events)); 90956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 91956f54b391677d78379729dd14518edddf3c7660Etan Cohen 92956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void destroySession(int sessionId) { 93956f54b391677d78379729dd14518edddf3c7660Etan Cohen WifiNanSessionState session = mSessions.get(sessionId); 94956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (session == null) { 95956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.e(TAG, "destroySession: sessionId doesn't exist - " + sessionId); 96956f54b391677d78379729dd14518edddf3c7660Etan Cohen return; 97956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 98956f54b391677d78379729dd14518edddf3c7660Etan Cohen 99956f54b391677d78379729dd14518edddf3c7660Etan Cohen mSessions.delete(sessionId); 100956f54b391677d78379729dd14518edddf3c7660Etan Cohen session.destroy(); 101956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 102956f54b391677d78379729dd14518edddf3c7660Etan Cohen 103956f54b391677d78379729dd14518edddf3c7660Etan Cohen public WifiNanSessionState getSession(int sessionId) { 104956f54b391677d78379729dd14518edddf3c7660Etan Cohen return mSessions.get(sessionId); 105956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 106956f54b391677d78379729dd14518edddf3c7660Etan Cohen 107956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void onConfigCompleted(ConfigRequest completedConfig) { 108956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_CONFIG_COMPLETED) != 0) { 109956f54b391677d78379729dd14518edddf3c7660Etan Cohen try { 110956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener.onConfigCompleted(completedConfig); 111956f54b391677d78379729dd14518edddf3c7660Etan Cohen } catch (RemoteException e) { 112956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.w(TAG, "onConfigCompleted: RemoteException - ignored: " + e); 113956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 114956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 115956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 116956f54b391677d78379729dd14518edddf3c7660Etan Cohen 11722b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen public void onConfigFailed(ConfigRequest failedConfig, int reason) { 118956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_CONFIG_FAILED) != 0) { 119956f54b391677d78379729dd14518edddf3c7660Etan Cohen try { 12022b4156d2948e3108ae8439dc72f76fb97526aceEtan Cohen mListener.onConfigFailed(failedConfig, reason); 121956f54b391677d78379729dd14518edddf3c7660Etan Cohen } catch (RemoteException e) { 122956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.w(TAG, "onConfigFailed: RemoteException - ignored: " + e); 123956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 124956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 125956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 126956f54b391677d78379729dd14518edddf3c7660Etan Cohen 127956f54b391677d78379729dd14518edddf3c7660Etan Cohen public int onNanDown(int reason) { 128956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_NAN_DOWN) != 0) { 129956f54b391677d78379729dd14518edddf3c7660Etan Cohen try { 130956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener.onNanDown(reason); 131956f54b391677d78379729dd14518edddf3c7660Etan Cohen } catch (RemoteException e) { 132956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.w(TAG, "onNanDown: RemoteException - ignored: " + e); 133956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 134956f54b391677d78379729dd14518edddf3c7660Etan Cohen 135956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 1; 136956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 137956f54b391677d78379729dd14518edddf3c7660Etan Cohen 138956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 0; 139956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 140956f54b391677d78379729dd14518edddf3c7660Etan Cohen 141956f54b391677d78379729dd14518edddf3c7660Etan Cohen public int onInterfaceAddressChange(byte[] mac) { 142956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_IDENTITY_CHANGED) != 0) { 143956f54b391677d78379729dd14518edddf3c7660Etan Cohen try { 144956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener.onIdentityChanged(); 145956f54b391677d78379729dd14518edddf3c7660Etan Cohen } catch (RemoteException e) { 146956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.w(TAG, "onIdentityChanged: RemoteException - ignored: " + e); 147956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 148956f54b391677d78379729dd14518edddf3c7660Etan Cohen 149956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 1; 150956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 151956f54b391677d78379729dd14518edddf3c7660Etan Cohen 152956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 0; 153956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 154956f54b391677d78379729dd14518edddf3c7660Etan Cohen 155956f54b391677d78379729dd14518edddf3c7660Etan Cohen public int onClusterChange(int flag, byte[] mac) { 156956f54b391677d78379729dd14518edddf3c7660Etan Cohen if (mListener != null && (mEvents & WifiNanEventListener.LISTEN_IDENTITY_CHANGED) != 0) { 157956f54b391677d78379729dd14518edddf3c7660Etan Cohen try { 158956f54b391677d78379729dd14518edddf3c7660Etan Cohen mListener.onIdentityChanged(); 159956f54b391677d78379729dd14518edddf3c7660Etan Cohen } catch (RemoteException e) { 160956f54b391677d78379729dd14518edddf3c7660Etan Cohen Log.w(TAG, "onIdentityChanged: RemoteException - ignored: " + e); 161956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 162956f54b391677d78379729dd14518edddf3c7660Etan Cohen 163956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 1; 164956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 165956f54b391677d78379729dd14518edddf3c7660Etan Cohen 166956f54b391677d78379729dd14518edddf3c7660Etan Cohen return 0; 167956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 168956f54b391677d78379729dd14518edddf3c7660Etan Cohen 169956f54b391677d78379729dd14518edddf3c7660Etan Cohen public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { 170956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println("NanClientState:"); 171956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println(" mUid: " + mUid); 172956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println(" mConfigRequest: " + mConfigRequest); 173956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println(" mListener: " + mListener); 174956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println(" mEvents: " + mEvents); 175956f54b391677d78379729dd14518edddf3c7660Etan Cohen pw.println(" mSessions: [" + mSessions + "]"); 176956f54b391677d78379729dd14518edddf3c7660Etan Cohen for (int i = 0; i < mSessions.size(); ++i) { 177956f54b391677d78379729dd14518edddf3c7660Etan Cohen mSessions.valueAt(i).dump(fd, pw, args); 178956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 179956f54b391677d78379729dd14518edddf3c7660Etan Cohen } 180956f54b391677d78379729dd14518edddf3c7660Etan Cohen} 181