package com.crossbow.wear.core; import java.io.ByteArrayOutputStream; import java.util.zip.DataFormatException; import java.util.zip.Deflater; import java.util.zip.Inflater; /** * Util Class for zipping and unzipping data for sending it the wearable */ public class Gzipper { private static final byte FLAG_COMPRESSED = 2; private static final byte FLAG_UNCOMPRESSED = 1; public static byte[] unzip(byte[] rawData) { //seperate the first byte into data and flag byte flag = rawData[0]; if(flag == FLAG_COMPRESSED) { Inflater inflater = new Inflater(); inflater.setInput(rawData, 1, rawData.length - 1); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(rawData.length - 1); byte[] buffer = new byte[1024]; while (!inflater.finished()) { int count = 0; try { count = inflater.inflate(buffer); outputStream.write(buffer, 0, count); } catch (DataFormatException e) { e.printStackTrace(); } } return outputStream.toByteArray(); } else { //data was not compressed, strip the first flag byte off the data byte[] data = new byte[rawData.length - 1]; System.arraycopy(rawData, 1, data, 0, data.length); return data; } } public static byte[] zip(byte[] data) { Deflater deflater = new Deflater(Deflater.BEST_COMPRESSION); deflater.setInput(data); deflater.finish(); ByteArrayOutputStream baos = new ByteArrayOutputStream(data.length + 1); //write a placeholder byte for the flag baos.write(FLAG_UNCOMPRESSED); byte[] buf = new byte[1024]; while (!deflater.finished()) { int byteCount = deflater.deflate(buf); baos.write(buf, 0, byteCount); } deflater.end(); byte[] compressed = baos.toByteArray(); if(compressed.length < data.length) { //compressed is smaller, change the front flag compressed[0] = FLAG_COMPRESSED; return compressed; } else { //compression was no help add flag to data and return byte[] finalData = new byte[data.length + 1]; finalData[0] = FLAG_COMPRESSED; System.arraycopy(data, 0, finalData, 1, data.length); return finalData; } } }