package com.crossbow.wear.core; import android.text.TextUtils; import com.android.volley.NetworkResponse; import com.google.android.gms.wearable.DataMap; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * Internal class that wraps the volley NetworkResponse and can serialized */ public class WearNetworkResponse { public final String uuid; public final boolean success;/** The HTTP status code. */ public int statusCode; /** Raw data from this response. */ public byte[] data; /** Response headers. */ public Map<String, String> headers; /** True if the server returned a 304 (Not Modified). */ public boolean notModified; /** Network roundtrip time in milliseconds. */ public long networkTimeMs; public WearNetworkResponse(boolean success, byte[] data, String uuid, int statusCode, Map<String, String> headers, boolean notModified, long networkTimeMs) { this.data = data; this.statusCode = statusCode; this.headers = headers; this.notModified = notModified; this.networkTimeMs = networkTimeMs; this.uuid = uuid; this.success = success; } public WearNetworkResponse(boolean success, String uuid) { this.uuid = uuid; this.success = success; } public WearNetworkResponse(boolean success, String uuid, NetworkResponse response) { this(success, uuid); if(response != null) { data = response.data; headers = response.headers; notModified = response.notModified; networkTimeMs = response.networkTimeMs; statusCode = response.statusCode; } } public static WearNetworkResponse fromByteArray(byte[] data) throws IOException { byte[] decompressed = Gzipper.unzip(data); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(decompressed); DataInputStream dataStream = new DataInputStream(byteArrayInputStream); String uuid = SerialUtil.readString(dataStream); boolean success = dataStream.readBoolean(); int statusCode = dataStream.readInt(); long networkTime = dataStream.readLong(); boolean modified = dataStream.readBoolean(); byte[] responseData = SerialUtil.readBytes(dataStream); Map<String, String> headers = SerialUtil.readMap(dataStream); return new WearNetworkResponse(success, responseData, uuid, statusCode, headers, modified, networkTime); } public NetworkResponse getNetworkResponse() { return new NetworkResponse(statusCode, data, headers, notModified, networkTimeMs); } public byte[] toByteArray(){ int size = data != null ? data.length : 32; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(size); DataOutputStream dataOutputStream = new DataOutputStream(outputStream); try { SerialUtil.writeString(dataOutputStream, uuid); dataOutputStream.writeBoolean(success); dataOutputStream.writeInt(statusCode); dataOutputStream.writeLong(networkTimeMs); dataOutputStream.writeBoolean(notModified); SerialUtil.writeBytes(dataOutputStream, data); SerialUtil.writeMap(dataOutputStream, headers); dataOutputStream.flush(); dataOutputStream.close(); } catch (IOException e) { e.printStackTrace(); } return Gzipper.zip(outputStream.toByteArray()); } }