summaryrefslogtreecommitdiffstats
path: root/wifi/java/android/net/wifi/RttManager.java
diff options
context:
space:
mode:
authorVinit Deshpande <vinitd@google.com>2014-07-25 17:46:14 -0700
committerVinit Deshpande <vinitd@google.com>2014-07-28 09:00:10 -0700
commitc4272f32aec68ae2377141a2d6d4e6059fb36714 (patch)
tree46b7339f855ad0b47bacdd2aaecac8cf590dc88f /wifi/java/android/net/wifi/RttManager.java
parentd65e8f4b6b37b274fcd5b7701a73eaef7c4ba8b4 (diff)
downloadframeworks_base-c4272f32aec68ae2377141a2d6d4e6059fb36714.zip
frameworks_base-c4272f32aec68ae2377141a2d6d4e6059fb36714.tar.gz
frameworks_base-c4272f32aec68ae2377141a2d6d4e6059fb36714.tar.bz2
Enable RTT End-to-end
This change includes various fixes to first RTT implementation and enables RTT APIs end-to-end. Fixes include proper marshalling of objects across API and service and JNI fixes. Change-Id: Ie4ba1ffc6c5b42593e931438b3f03e201ff6be71
Diffstat (limited to 'wifi/java/android/net/wifi/RttManager.java')
-rw-r--r--wifi/java/android/net/wifi/RttManager.java210
1 files changed, 192 insertions, 18 deletions
diff --git a/wifi/java/android/net/wifi/RttManager.java b/wifi/java/android/net/wifi/RttManager.java
index 50fd260..57343c5 100644
--- a/wifi/java/android/net/wifi/RttManager.java
+++ b/wifi/java/android/net/wifi/RttManager.java
@@ -2,16 +2,20 @@ package android.net.wifi;
import android.annotation.SystemApi;
import android.content.Context;
+import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.os.Messenger;
+import android.os.Parcel;
+import android.os.Parcelable;
import android.os.RemoteException;
import android.util.Log;
import android.util.SparseArray;
import com.android.internal.util.AsyncChannel;
+import com.android.internal.util.Protocol;
import java.util.concurrent.CountDownLatch;
@@ -51,12 +55,15 @@ public class RttManager {
public static final int RTT_STATUS_ABORTED = 8;
public static final int REASON_UNSPECIFIED = -1;
- public static final int REASON_INVALID_LISTENER = -2;
- public static final int REASON_INVALID_REQUEST = -3;
+ public static final int REASON_NOT_AVAILABLE = -2;
+ public static final int REASON_INVALID_LISTENER = -3;
+ public static final int REASON_INVALID_REQUEST = -4;
+
+ public static final String DESCRIPTION_KEY = "android.net.wifi.RttManager.Description";
public class Capabilities {
- int supportedType;
- int supportedPeerType;
+ public int supportedType;
+ public int supportedPeerType;
}
public Capabilities getCapabilities() {
@@ -91,6 +98,73 @@ public class RttManager {
public int num_retries;
}
+ /** pseudo-private class used to parcel arguments */
+ public static class ParcelableRttParams implements Parcelable {
+
+ public RttParams mParams[];
+
+ ParcelableRttParams(RttParams[] params) {
+ mParams = params;
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public void writeToParcel(Parcel dest, int flags) {
+ if (mParams != null) {
+ dest.writeInt(mParams.length);
+
+ for (RttParams params : mParams) {
+ dest.writeInt(params.deviceType);
+ dest.writeInt(params.requestType);
+ dest.writeString(params.bssid);
+ dest.writeInt(params.frequency);
+ dest.writeInt(params.channelWidth);
+ dest.writeInt(params.num_samples);
+ dest.writeInt(params.num_retries);
+ }
+ } else {
+ dest.writeInt(0);
+ }
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public static final Creator<ParcelableRttParams> CREATOR =
+ new Creator<ParcelableRttParams>() {
+ public ParcelableRttParams createFromParcel(Parcel in) {
+
+ int num = in.readInt();
+
+ if (num == 0) {
+ return new ParcelableRttParams(null);
+ }
+
+ RttParams params[] = new RttParams[num];
+ for (int i = 0; i < num; i++) {
+ params[i] = new RttParams();
+ params[i].deviceType = in.readInt();
+ params[i].requestType = in.readInt();
+ params[i].bssid = in.readString();
+ params[i].frequency = in.readInt();
+ params[i].channelWidth = in.readInt();
+ params[i].num_samples = in.readInt();
+ params[i].num_retries = in.readInt();
+
+ }
+
+ ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
+ return parcelableParams;
+ }
+
+ public ParcelableRttParams[] newArray(int size) {
+ return new ParcelableRttParams[size];
+ }
+ };
+ }
+
/** specifies RTT results */
public static class RttResult {
/** mac address of the device being ranged */
@@ -99,6 +173,9 @@ public class RttManager {
/** status of the request */
public int status;
+ /** type of the request used */
+ public int requestType;
+
/** timestamp of completion, in microsecond since boot */
public long ts;
@@ -121,24 +198,105 @@ public class RttManager {
public long rtt_spread_ns;
/** average distance in centimeter, computed based on rtt_ns */
- public long distance_cm;
+ public int distance_cm;
/** standard deviation observed in distance */
- public long distance_sd_cm;
+ public int distance_sd_cm;
/** spread (i.e. max - min) distance */
- public long distance_spread_cm;
+ public int distance_spread_cm;
}
+
+ /** pseudo-private class used to parcel results */
+ public static class ParcelableRttResults implements Parcelable {
+
+ public RttResult mResults[];
+
+ public ParcelableRttResults(RttResult[] results) {
+ mResults = results;
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public int describeContents() {
+ return 0;
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public void writeToParcel(Parcel dest, int flags) {
+ if (mResults != null) {
+ dest.writeInt(mResults.length);
+ for (RttResult result : mResults) {
+ dest.writeString(result.bssid);
+ dest.writeInt(result.status);
+ dest.writeInt(result.requestType);
+ dest.writeLong(result.ts);
+ dest.writeInt(result.rssi);
+ dest.writeInt(result.rssi_spread);
+ dest.writeInt(result.tx_rate);
+ dest.writeLong(result.rtt_ns);
+ dest.writeLong(result.rtt_sd_ns);
+ dest.writeLong(result.rtt_spread_ns);
+ dest.writeInt(result.distance_cm);
+ dest.writeInt(result.distance_sd_cm);
+ dest.writeInt(result.distance_spread_cm);
+ }
+ } else {
+ dest.writeInt(0);
+ }
+ }
+
+ /** Implement the Parcelable interface {@hide} */
+ public static final Creator<ParcelableRttResults> CREATOR =
+ new Creator<ParcelableRttResults>() {
+ public ParcelableRttResults createFromParcel(Parcel in) {
+
+ int num = in.readInt();
+
+ if (num == 0) {
+ return new ParcelableRttResults(null);
+ }
+
+ RttResult results[] = new RttResult[num];
+ for (int i = 0; i < num; i++) {
+ results[i] = new RttResult();
+ results[i].bssid = in.readString();
+ results[i].status = in.readInt();
+ results[i].requestType = in.readInt();
+ results[i].ts = in.readLong();
+ results[i].rssi = in.readInt();
+ results[i].rssi_spread = in.readInt();
+ results[i].tx_rate = in.readInt();
+ results[i].rtt_ns = in.readLong();
+ results[i].rtt_sd_ns = in.readLong();
+ results[i].rtt_spread_ns = in.readLong();
+ results[i].distance_cm = in.readInt();
+ results[i].distance_sd_cm = in.readInt();
+ results[i].distance_spread_cm = in.readInt();
+ }
+
+ ParcelableRttResults parcelableResults = new ParcelableRttResults(results);
+ return parcelableResults;
+ }
+
+ public ParcelableRttResults[] newArray(int size) {
+ return new ParcelableRttResults[size];
+ }
+ };
+ }
+
+
public static interface RttListener {
- public void onSuccess(RttResult results[]);
+ public void onSuccess(RttResult[] results);
public void onFailure(int reason, String description);
public void onAborted();
}
- public void startRanging(RttParams params[], RttListener listener) {
+ public void startRanging(RttParams[] params, RttListener listener) {
validateChannel();
- sAsyncChannel.sendMessage(CMD_OP_START_RANGING, 0, removeListener(listener), params);
+ ParcelableRttParams parcelableParams = new ParcelableRttParams(params);
+ sAsyncChannel.sendMessage(CMD_OP_START_RANGING,
+ 0, putListener(listener), parcelableParams);
}
public void stopRanging(RttListener listener) {
@@ -147,11 +305,13 @@ public class RttManager {
}
/* private methods */
- public static final int CMD_OP_START_RANGING = 0;
- public static final int CMD_OP_STOP_RANGING = 1;
- public static final int CMD_OP_FAILED = 2;
- public static final int CMD_OP_SUCCEEDED = 3;
- public static final int CMD_OP_ABORTED = 4;
+ public static final int BASE = Protocol.BASE_WIFI_RTT_MANAGER;
+
+ public static final int CMD_OP_START_RANGING = BASE + 0;
+ public static final int CMD_OP_STOP_RANGING = BASE + 1;
+ public static final int CMD_OP_FAILED = BASE + 2;
+ public static final int CMD_OP_SUCCEEDED = BASE + 3;
+ public static final int CMD_OP_ABORTED = BASE + 4;
private Context mContext;
private IRttManager mService;
@@ -173,7 +333,7 @@ public class RttManager {
* Create a new WifiScanner instance.
* Applications will almost always want to use
* {@link android.content.Context#getSystemService Context.getSystemService()} to retrieve
- * the standard {@link android.content.Context#WIFI_SERVICE Context.WIFI_SERVICE}.
+ * the standard {@link android.content.Context#WIFI_RTT_SERVICE Context.WIFI_RTT_SERVICE}.
* @param context the application context
* @param service the Binder interface
* @hide
@@ -190,6 +350,7 @@ public class RttManager {
if (++sThreadRefCount == 1) {
Messenger messenger = null;
try {
+ Log.d(TAG, "Get the messenger from " + mService);
messenger = mService.getMessenger();
} catch (RemoteException e) {
/* do nothing */
@@ -313,10 +474,11 @@ public class RttManager {
switch (msg.what) {
/* ActionListeners grouped together */
case CMD_OP_SUCCEEDED :
- ((RttListener) listener).onSuccess((RttResult[])msg.obj);
+ reportSuccess(listener, msg);
+ removeListener(msg.arg2);
break;
case CMD_OP_FAILED :
- ((RttListener) listener).onFailure(msg.arg1, (String)msg.obj);
+ reportFailure(listener, msg);
removeListener(msg.arg2);
break;
case CMD_OP_ABORTED :
@@ -328,6 +490,18 @@ public class RttManager {
return;
}
}
+
+ void reportSuccess(Object listener, Message msg) {
+ RttListener rttListener = (RttListener) listener;
+ ParcelableRttResults parcelableResults = (ParcelableRttResults) msg.obj;
+ ((RttListener) listener).onSuccess(parcelableResults.mResults);
+ }
+
+ void reportFailure(Object listener, Message msg) {
+ RttListener rttListener = (RttListener) listener;
+ Bundle bundle = (Bundle) msg.obj;
+ ((RttListener) listener).onFailure(msg.arg1, bundle.getString(DESCRIPTION_KEY));
+ }
}
}