package ca.rmen.android.usbhelloworld;

import java.util.HashMap;

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.hardware.usb.UsbConstants;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbDeviceConnection;
import android.hardware.usb.UsbEndpoint;
import android.hardware.usb.UsbInterface;
import android.hardware.usb.UsbManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class UsbHelloWorldActivity extends Activity {
	UsbManager mUsbManager;
	private static final String ACTION_USB_PERMISSION = "ca.rmen.android.usbhelloworld.USB_PERMISSION";
	private static final String TAG = "UsbHelloWorldActivity";
	private static final byte[] HEX_CHAR = new byte[] { '0', '1', '2', '3',
			'4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
		PendingIntent permissionIntent = PendingIntent.getBroadcast(this, 0,
				new Intent(ACTION_USB_PERMISSION), 0);
		IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION);
		registerReceiver(mUsbReceiver, filter);

		setContentView(R.layout.main);
		UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
		HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
		for (UsbDevice device : deviceList.values()) {
			if (device.getVendorId() == 1891)
				mUsbManager.requestPermission(device, permissionIntent);
		}
		TextView mytext = (TextView) findViewById(R.id.mytext);
	}

	private final BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {

		public void onReceive(Context context, Intent intent) {
			String action = intent.getAction();
			if (ACTION_USB_PERMISSION.equals(action)) {
				synchronized (this) {
					final UsbDevice device = (UsbDevice) intent
							.getParcelableExtra(UsbManager.EXTRA_DEVICE);

					if (intent.getBooleanExtra(
							UsbManager.EXTRA_PERMISSION_GRANTED, false)) {
						if (device != null) {
							final UsbDeviceConnection connection = mUsbManager
									.openDevice(device);

							for (int i = 0; i < device.getInterfaceCount(); i++) {
								final UsbInterface intf = device
										.getInterface(i);
								connection.claimInterface(intf, true);

								for (int j = 0; j < intf.getEndpointCount(); j++) {
									final UsbEndpoint endpoint = intf
											.getEndpoint(j);
									if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
										Thread t = new Thread() {
											public void run() {
												// call method to set up device
												// communication
												String deviceInfo = "";
												deviceInfo = "Got permission for "
														+ device + "\n";

												deviceInfo += device.toString()
														+ "\n";
												deviceInfo += device
														.getDeviceClass()
														+ "\n";
												deviceInfo += "has permission? "
														+ mUsbManager
																.hasPermission(device);
												deviceInfo += device
														.getInterfaceCount()
														+ " interfaces\n";
												while (true) {
													byte[] bytes = new byte[4];
													int result = connection
															.bulkTransfer(
																	endpoint,
																	bytes,
																	bytes.length,
																	5000); // do
																			// in
																			// another
																			// thread
													deviceInfo += "bulkTransfer returned "
															+ result + "\n";
													String bytesStr = dumpBytes(bytes);
													deviceInfo += "bytes: "
															+ bytesStr + "\n";
													final String deviceInfo2 = deviceInfo;
													runOnUiThread(new Runnable(){

														@Override
														public void run() {
															TextView mytext = (TextView) findViewById(R.id.mytext);
															
															mytext.setText(deviceInfo2);
															
														}});
												}

											}
										};

									}

								}
							}

						}
					} else {
						Log.d(TAG, "permission denied for device " + device);
					}
				}
			}
		}
	};

	public static final String dumpBytes(byte[] buffer) {
		if (buffer == null) {
			return "";
		}

		StringBuffer sb = new StringBuffer();

		for (int i = 0; i < buffer.length; i++) {
			sb.append("0x")
					.append((char) (HEX_CHAR[(buffer[i] & 0x00F0) >> 4]))
					.append((char) (HEX_CHAR[buffer[i] & 0x000F])).append(" ");
		}

		return sb.toString();
	}
}
