/*
* This file is part of the Remote Sensor Actuator Interface (ReSAI).
*
* Copyright(c) Andreas Kipp, Frederic Siepmann
* http://opensource.cit-ec.de/projects/resai
*
* This file may be licensed under the terms of of the
* GNU Lesser General Public License Version 3 (the ``LGPL''),
* or (at your option) any later version.
*
* Software distributed under the License is distributed
* on an ``AS IS'' basis, WITHOUT WARRANTY OF ANY KIND, either
* express or implied. See the LGPL for the specific language
* governing rights and limitations.
*
* You should have received a copy of the LGPL along with this
* program. If not, go to http://www.gnu.org/licenses/lgpl.html
* or write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The development of this software was supported by the
* Excellence Cluster EXC 277 Cognitive Interaction Technology.
* The Excellence Cluster EXC 277 is a grant of the Deutsche
* Forschungsgemeinschaft (DFG) in the context of the German
* Excellence Initiative.
*
*/

/**
 * Tab showing information from webcam.
 *
 * @author akipp
 */

package de.unibi.airobots.resaidroid.tabactivities;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;

import org.jivesoftware.smack.util.Base64;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;
import de.unibi.airobots.resaidroid.R;
import de.unibi.airobots.resaidroid.tabactivities.template.TabTemplate;

public class TabUsbcamSensor extends TabTemplate {

	private ImageView ivCam;
	private TextView lblCounter;
	private Bitmap bitmap;
	private byte[] imageByte;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.usbcamsensor);

		ivCam = (ImageView) findViewById(R.id.ivCam);
		lblCounter = (TextView) findViewById(R.id.lblCounter);
	}

	@Override
	public void processProperties() {
		messageHandler.post(new Runnable() {
			public void run() {
				synchronized (receivedProperties) {
					for (String prop : receivedProperties.keySet()) {
						if (prop.equals(cm.getComponent(TAG) + "_IMG")) {

							imageByte = decompressBytes(Base64
									.decode(receivedProperties.get(prop)
											.toString(),Base64.GZIP));

							bitmap = BitmapFactory.decodeByteArray(imageByte,
									0, imageByte.length);

							ivCam.setImageBitmap(bitmap);
						}
						if (prop.equals(cm.getComponent(TAG) + "_COUNTER")) {
							lblCounter.setText(receivedProperties.get(prop));
						}
					}
				}
			}
		});
	}

	private byte[] decompressBytes(byte[] compressedData) {
		// Create the decompressor and give it the data to compress
		Inflater decompressor = new Inflater();
		decompressor.setInput(compressedData);

		// Create an expandable byte array to hold the decompressed data
		ByteArrayOutputStream bos = new ByteArrayOutputStream(
				compressedData.length);

		// Decompress the data
		byte[] buf = new byte[1024];
		while (!decompressor.finished()) {
			try {
				int count = decompressor.inflate(buf);
				bos.write(buf, 0, count);
			} catch (DataFormatException e) {
			}
		}
		try {
			bos.close();
		} catch (IOException e) {
		}

		// Get the decompressed data
		return bos.toByteArray();
	}
}