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