/*
* (C) Copyright 2015 by fr3ts0n <erwin.scheuch-heilig@gmx.at>
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*
*/
package com.fr3ts0n.ecu.gui.androbd;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.TwoLineListItem;
import com.hoho.android.usbserial.driver.UsbSerialDriver;
import com.hoho.android.usbserial.driver.UsbSerialPort;
import com.hoho.android.usbserial.driver.UsbSerialProber;
import java.util.ArrayList;
import java.util.List;
/**
* Shows a {@link ListView} of available USB devices.
*
* @author mike wakerly (opensource@hoho.com)
*/
public final class UsbDeviceListActivity extends Activity
{
public static UsbSerialPort selectedPort = null;
private final String TAG = UsbDeviceListActivity.class.getSimpleName();
private UsbManager mUsbManager;
private static final int MESSAGE_REFRESH = 101;
private static final long REFRESH_TIMEOUT_MILLIS = 5000;
private final Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case MESSAGE_REFRESH:
refreshDeviceList();
mHandler.sendEmptyMessageDelayed(MESSAGE_REFRESH, REFRESH_TIMEOUT_MILLIS);
break;
default:
super.handleMessage(msg);
break;
}
}
};
private List<UsbSerialPort> mEntries = new ArrayList<UsbSerialPort>();
private ArrayAdapter<UsbSerialPort> mAdapter;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.usb_list);
mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
ListView mListView = (ListView) findViewById(R.id.deviceList);
mAdapter = new ArrayAdapter<UsbSerialPort>(this,
android.R.layout.simple_expandable_list_item_2,
mEntries)
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
final TwoLineListItem row;
if (convertView == null)
{
final LayoutInflater inflater =
(LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = (TwoLineListItem) inflater.inflate(android.R.layout.simple_list_item_2, null);
} else
{
row = (TwoLineListItem) convertView;
}
final UsbSerialPort port = mEntries.get(position);
final UsbSerialDriver driver = port.getDriver();
final UsbDevice device = driver.getDevice();
final String title = String.format("USB: 0x%04x/0x%04x",
device.getVendorId(),
device.getProductId());
final String subtitle = driver.getClass().getSimpleName();
row.getText1().setText(title);
row.getText2().setText(subtitle);
return row;
}
};
mListView.setAdapter(mAdapter);
mListView.setOnItemClickListener(new ListView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Log.d(TAG, "Pressed item " + position);
if (position >= mEntries.size())
{
Log.w(TAG, "Illegal position.");
return;
}
selectedPort = mEntries.get(position);
// Create the result Intent and include the MAC address
Intent intent = new Intent();
// Set result and finish this Activity
setResult(Activity.RESULT_OK, intent);
Log.d("Terminal", "Sending Result...");
finish();
}
});
}
@Override
protected void onResume()
{
super.onResume();
mHandler.sendEmptyMessage(MESSAGE_REFRESH);
}
@Override
protected void onPause()
{
super.onPause();
mHandler.removeMessages(MESSAGE_REFRESH);
}
private void refreshDeviceList()
{
new AsyncTask<Void, Void, List<UsbSerialPort>>()
{
@Override
protected List<UsbSerialPort> doInBackground(Void... params)
{
Log.d(TAG, "Refreshing device list ...");
final List<UsbSerialDriver> drivers =
UsbSerialProber.getDefaultProber().findAllDrivers(mUsbManager);
final List<UsbSerialPort> result = new ArrayList<UsbSerialPort>();
for (final UsbSerialDriver driver : drivers)
{
final List<UsbSerialPort> ports = driver.getPorts();
Log.d(TAG, String.format("+ %s: %s selectedPort%s",
driver, ports.size(),
ports.size() == 1 ? "" : "s"));
result.addAll(ports);
}
return result;
}
@Override
protected void onPostExecute(List<UsbSerialPort> result)
{
mEntries.clear();
mEntries.addAll(result);
TextView numFound = (TextView) findViewById(R.id.num_found);
numFound.setText(getString(R.string.devices_found, result.size()));
mAdapter.notifyDataSetChanged();
Log.d(TAG, "Done refreshing, " + mEntries.size() + " entries found.");
}
}.execute((Void) null);
}
}