1/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.net.wifi.p2p;
18
19import android.os.Parcelable;
20import android.os.Parcel;
21
22import java.util.Locale;
23
24/**
25 * A class representing Wifi Display information for a device
26 * @hide
27 */
28public class WifiP2pWfdInfo implements Parcelable {
29
30    private static final String TAG = "WifiP2pWfdInfo";
31
32    private boolean mWfdEnabled;
33
34    private int mDeviceInfo;
35
36    public static final int WFD_SOURCE              = 0;
37    public static final int PRIMARY_SINK            = 1;
38    public static final int SECONDARY_SINK          = 2;
39    public static final int SOURCE_OR_PRIMARY_SINK  = 3;
40
41    /* Device information bitmap */
42    /** One of {@link #WFD_SOURCE}, {@link #PRIMARY_SINK}, {@link #SECONDARY_SINK}
43     * or {@link #SOURCE_OR_PRIMARY_SINK}
44     */
45    private static final int DEVICE_TYPE                            = 0x3;
46    private static final int COUPLED_SINK_SUPPORT_AT_SOURCE         = 0x4;
47    private static final int COUPLED_SINK_SUPPORT_AT_SINK           = 0x8;
48    private static final int SESSION_AVAILABLE                      = 0x30;
49    private static final int SESSION_AVAILABLE_BIT1                 = 0x10;
50    private static final int SESSION_AVAILABLE_BIT2                 = 0x20;
51
52    private int mCtrlPort;
53
54    private int mMaxThroughput;
55
56    public WifiP2pWfdInfo() {
57    }
58
59    public WifiP2pWfdInfo(int devInfo, int ctrlPort, int maxTput) {
60        mWfdEnabled = true;
61        mDeviceInfo = devInfo;
62        mCtrlPort = ctrlPort;
63        mMaxThroughput = maxTput;
64    }
65
66    public boolean isWfdEnabled() {
67        return mWfdEnabled;
68    }
69
70    public void setWfdEnabled(boolean enabled) {
71        mWfdEnabled = enabled;
72    }
73
74    public int getDeviceType() {
75        return (mDeviceInfo & DEVICE_TYPE);
76    }
77
78    public boolean setDeviceType(int deviceType) {
79        if (deviceType >= WFD_SOURCE && deviceType <= SOURCE_OR_PRIMARY_SINK) {
80            mDeviceInfo &= ~DEVICE_TYPE;
81            mDeviceInfo |= deviceType;
82            return true;
83        }
84        return false;
85    }
86
87    public boolean isCoupledSinkSupportedAtSource() {
88        return (mDeviceInfo & COUPLED_SINK_SUPPORT_AT_SINK) != 0;
89    }
90
91    public void setCoupledSinkSupportAtSource(boolean enabled) {
92        if (enabled ) {
93            mDeviceInfo |= COUPLED_SINK_SUPPORT_AT_SINK;
94        } else {
95            mDeviceInfo &= ~COUPLED_SINK_SUPPORT_AT_SINK;
96        }
97    }
98
99    public boolean isCoupledSinkSupportedAtSink() {
100        return (mDeviceInfo & COUPLED_SINK_SUPPORT_AT_SINK) != 0;
101    }
102
103    public void setCoupledSinkSupportAtSink(boolean enabled) {
104        if (enabled ) {
105            mDeviceInfo |= COUPLED_SINK_SUPPORT_AT_SINK;
106        } else {
107            mDeviceInfo &= ~COUPLED_SINK_SUPPORT_AT_SINK;
108        }
109    }
110
111    public boolean isSessionAvailable() {
112        return (mDeviceInfo & SESSION_AVAILABLE) != 0;
113    }
114
115    public void setSessionAvailable(boolean enabled) {
116        if (enabled) {
117            mDeviceInfo |= SESSION_AVAILABLE_BIT1;
118            mDeviceInfo &= ~SESSION_AVAILABLE_BIT2;
119        } else {
120            mDeviceInfo &= ~SESSION_AVAILABLE;
121        }
122    }
123
124    public int getControlPort() {
125        return mCtrlPort;
126    }
127
128    public void setControlPort(int port) {
129        mCtrlPort = port;
130    }
131
132    public void setMaxThroughput(int maxThroughput) {
133        mMaxThroughput = maxThroughput;
134    }
135
136    public int getMaxThroughput() {
137        return mMaxThroughput;
138    }
139
140    public String getDeviceInfoHex() {
141        return String.format(
142                Locale.US, "%04x%04x%04x%04x", 6, mDeviceInfo, mCtrlPort, mMaxThroughput);
143    }
144
145    public String toString() {
146        StringBuffer sbuf = new StringBuffer();
147        sbuf.append("WFD enabled: ").append(mWfdEnabled);
148        sbuf.append("WFD DeviceInfo: ").append(mDeviceInfo);
149        sbuf.append("\n WFD CtrlPort: ").append(mCtrlPort);
150        sbuf.append("\n WFD MaxThroughput: ").append(mMaxThroughput);
151        return sbuf.toString();
152    }
153
154    /** Implement the Parcelable interface */
155    public int describeContents() {
156        return 0;
157    }
158
159    /** copy constructor */
160    public WifiP2pWfdInfo(WifiP2pWfdInfo source) {
161        if (source != null) {
162            mWfdEnabled = source.mWfdEnabled;
163            mDeviceInfo = source.mDeviceInfo;
164            mCtrlPort = source.mCtrlPort;
165            mMaxThroughput = source.mMaxThroughput;
166        }
167    }
168
169    /** Implement the Parcelable interface */
170    public void writeToParcel(Parcel dest, int flags) {
171        dest.writeInt(mWfdEnabled ? 1 : 0);
172        dest.writeInt(mDeviceInfo);
173        dest.writeInt(mCtrlPort);
174        dest.writeInt(mMaxThroughput);
175    }
176
177    public void readFromParcel(Parcel in) {
178        mWfdEnabled = (in.readInt() == 1);
179        mDeviceInfo = in.readInt();
180        mCtrlPort = in.readInt();
181        mMaxThroughput = in.readInt();
182    }
183
184    /** Implement the Parcelable interface */
185    public static final Creator<WifiP2pWfdInfo> CREATOR =
186        new Creator<WifiP2pWfdInfo>() {
187            public WifiP2pWfdInfo createFromParcel(Parcel in) {
188                WifiP2pWfdInfo device = new WifiP2pWfdInfo();
189                device.readFromParcel(in);
190                return device;
191            }
192
193            public WifiP2pWfdInfo[] newArray(int size) {
194                return new WifiP2pWfdInfo[size];
195            }
196        };
197}
198