package org.oobd.ui.android;
import java.util.ArrayList;
import android.os.Handler;
import org.oobd.base.Core;
import org.oobd.base.IFui;
import org.oobd.base.OOBDConstants;
import org.oobd.base.support.Onion;
import org.oobd.base.visualizer.IFvisualizer;
import org.oobd.base.visualizer.Visualizer;
import org.oobd.ui.android.application.OOBDApp;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AdapterView;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ToggleButton;
import android.os.Message;
import android.os.PowerManager;
import android.os.SystemClock;
/**
* @author Andreas Budde, Peter Mayer Core of the app. Communicates with Lua OBD
* Engine and displays its results in a list view that contains
* {@link DiagnoseItem}
*/
public class Diagnose extends ListActivity {
private ListView mDiagnoseListView;
public static boolean showDialog = true;
public static VizTable mDiagnoseItems; // diese Liste updaten
private static DiagnoseAdapter mDiagnoseAdapter;
public static Diagnose myDiagnoseInstance = null;
public static Handler myRefreshHandler;
private ToggleButton myTimerButton;
private static int timerTickCounter = 0;
private ProgressDialog myProgressDialog;
private Handler myTimerHandler = new Handler();
private PowerManager.WakeLock wl;
private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
if (timerTickCounter > OOBDConstants.LV_UPDATE_INTERVAL) {
timerTickCounter = 0;
MainActivity.myMainActivity.updateOobdUI();
}
if (timerTickCounter == 0 && myTimerButton.isChecked()) {
refreshView(OOBDConstants.VE_TIMER, OOBDConstants.VE_TIMER);
// myTimerHandler.postDelayed(this, OOBDConstants.LV_UPDATE);
}
timerTickCounter++;
/*
* else { myTimerHandler.removeCallbacks(mUpdateTimeTask); }
*/
myTimerHandler.postDelayed(this, OOBDConstants.LV_UPDATE_UI);
}
};
public static Diagnose getInstance() {
return myDiagnoseInstance;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.diagnose);
myDiagnoseInstance = this;
mDiagnoseListView = getListView();
// receive main menu from Lua Script Engine
// mDiagnoseItems = OOBDApp.getInstance().getDiagnoseItems("INIT");
mDiagnoseItems = VizTable.getInstance(null);
mDiagnoseAdapter = new DiagnoseAdapter(Diagnose.this, mDiagnoseItems);
mDiagnoseListView.setAdapter(mDiagnoseAdapter);
myRefreshHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
/* Refresh view */
((DiagnoseAdapter) mDiagnoseListView.getAdapter())
.notifyDataSetChanged();
mDiagnoseListView.setVisibility(0); // = Visible
break;
case 2:
/* Set Listview Title */
myDiagnoseInstance.setTitle(msg.obj.toString());
break;
case 3:
/* Set Listview Title */
myProgressDialog = ProgressDialog.show(Diagnose.this, "",
msg.obj.toString(), true);
break;
case 4:
/* Stop Progress Dialog */
if (myProgressDialog != null) {
myProgressDialog.dismiss();
}
break;
case 5:
/* Switch listview visibility off for refresh */
mDiagnoseListView.setVisibility(2); // = GOME
break;
}
}
};
((ImageButton) findViewById(R.id.updateButton))
.setOnClickListener(new View.OnClickListener() {
// mark all updateable list item as to be updated
public void onClick(View v) {
refreshView(OOBDConstants.VE_UPDATE,
OOBDConstants.VE_UPDATE);
}
});
myTimerButton = (ToggleButton) findViewById(R.id.timerButton);
myTimerButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// start the regular timer tick to refresh items
if (((ToggleButton) v).isChecked()) {
myTimerHandler.removeCallbacks(mUpdateTimeTask);
myTimerHandler.postDelayed(mUpdateTimeTask,
OOBDConstants.LV_UPDATE_UI);
wl.acquire();
} else {
wl.release();
}
}
});
// sweeze the icon into the timer- tooglebutton
Drawable d = getResources().getDrawable(R.drawable.timer);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
((ToggleButton) findViewById(R.id.timerButton)).setCompoundDrawables(
null, d, null, null);
registerForContextMenu(mDiagnoseListView);
if (showDialog) {
startProgressDialog("Load Script");
showDialog = false;
}
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "DoNotDimScreen");
myTimerHandler.postDelayed(mUpdateTimeTask, OOBDConstants.LV_UPDATE_UI);
BroadcastReceiver mConnectionReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
// Ändere TextViewauf Connected
Log.d("BT Listener", "Bluetooth connected");
}
else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)) {
// Ändere TextView auf disconnectet bzw. versuche die BT
// Verbindung neu aufzubauen
Log.d("BT Listener", "Bluetooth lost!");
}
}
};
// };
// Diesen Teil dann in die onCreate() Methode
IntentFilter filter1 = new IntentFilter(
BluetoothDevice.ACTION_ACL_CONNECTED);
IntentFilter filter3 = new IntentFilter(
BluetoothDevice.ACTION_ACL_DISCONNECTED);
this.registerReceiver(mConnectionReceiver, filter1);
this.registerReceiver(mConnectionReceiver, filter3);
}
@Override
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
if (v.getId() == android.R.id.list) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
menu.setHeaderTitle("Toggle Flags");
menu.add(Menu.NONE, 0, 0, "Update");
menu.add(Menu.NONE, 1, 1, "Timer");
menu.add(Menu.NONE, 2, 2, "Log");
menu.add(Menu.NONE, 3, 3, "Back");
}
}
@Override
public boolean onContextItemSelected(MenuItem item) {
// super.onContextItemSelected(item);
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
int ListItemIndex = info.position;
Visualizer myVisualizer = mDiagnoseItems.get(ListItemIndex);
switch (item.getItemId()) {
case 0:
myVisualizer.setUpdateFlag(OOBDConstants.VE_UPDATE,
!myVisualizer.getUpdateFlag(OOBDConstants.VE_UPDATE));
break;
case 1:
myVisualizer.setUpdateFlag(OOBDConstants.VE_TIMER,
!myVisualizer.getUpdateFlag(OOBDConstants.VE_TIMER));
break;
case 2:
myVisualizer.setUpdateFlag(OOBDConstants.VE_LOG,
!myVisualizer.getUpdateFlag(OOBDConstants.VE_LOG));
break;
case 3:
myVisualizer.setUpdateFlag(OOBDConstants.VE_BACK,
!myVisualizer.getUpdateFlag(OOBDConstants.VE_BACK));
break;
}
Intent broadcast = new Intent(OOBDApp.VISUALIZER_UPDATE);
broadcast.putExtra(OOBDApp.UPDATE_LEVEL, 1);
Diagnose.myDiagnoseInstance.getApplicationContext().sendBroadcast(
broadcast);
return true;
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Visualizer myVisualizer = mDiagnoseItems.get(position);
if (myVisualizer.getUpdateFlag(OOBDConstants.VE_BACK)) {
if (myTimerButton.isChecked()) {
myTimerButton.toggle(); // setSelected only has no effect..
wl.release();
}
}
myVisualizer.updateRequest(OOBDConstants.UR_USER);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// if back- button is pressed
if ((keyCode == KeyEvent.KEYCODE_BACK)) {
// is the output tab active?
if (DiagnoseTab.getInstance().getTabHost().getCurrentTab() == 1) {
// go back to the diagnostic tab
DiagnoseTab.getInstance().getTabHost().setCurrentTab(0);
} else {
// stop automatic updates
if (myTimerButton.isChecked()) {
myTimerButton.toggle(); // setSelected only has no effect..
wl.release();
}
synchronized (mDiagnoseItems) {
if (mDiagnoseItems != null) {
// searching for list entry which contains the "back"-
// Flag
int i;
for (i = 0; i < mDiagnoseItems.size()
&& !mDiagnoseItems.get(i).getUpdateFlag(
OOBDConstants.VE_BACK); i++) {
}
if (i < mDiagnoseItems.size()) { // a "back"-item found
mDiagnoseItems.get(i).updateRequest(
OOBDConstants.UR_USER); // simulate
// a
// user
// selection of this
// list item
return true; // stop further handling of the
// back-button
}else{
Core.getSingleInstance().stopScriptEngine();
}
}
}
}
}
return super.onKeyDown(keyCode, event);
}
public DiagnoseAdapter getmDiagnoseAdatper() {
return mDiagnoseAdapter;
}
public void setmDiagnoseAdatper(DiagnoseAdapter mDiagnoseAdatper) {
mDiagnoseAdapter = mDiagnoseAdatper;
}
public void stopVisibility() {
myRefreshHandler.sendEmptyMessage(5);
}
public void setItems(VizTable data) {
myRefreshHandler.sendEmptyMessage(1);
}
public void setMenuTitle(String title) {
myRefreshHandler
.sendMessage(Message.obtain(myRefreshHandler, 2, title));
}
public void startProgressDialog(String title) {
myRefreshHandler
.sendMessage(Message.obtain(myRefreshHandler, 3, title));
}
public void stopProgressDialog() {
myRefreshHandler.sendMessage(Message.obtain(myRefreshHandler, 4, null));
}
@Override
protected void onPause() {
super.onPause();
if (myTimerButton.isChecked()) {
wl.release();
}
mDiagnoseAdapter.guiPaused();
}
@Override
protected void onResume() {
super.onPause();
if (myTimerButton.isChecked()) {
wl.acquire();
}
mDiagnoseAdapter.guiResumed();
}
protected void refreshView(int bitNr, int updateType) {
synchronized (mDiagnoseItems) {
if (mDiagnoseItems != null) {
for (int i = mDiagnoseListView.getFirstVisiblePosition(); i <= mDiagnoseListView
.getLastVisiblePosition(); i++) {
if (i < mDiagnoseListView.getCount()) {
try {
Visualizer myVisualizer = (Visualizer) mDiagnoseListView
.getItemAtPosition(i);
if (myVisualizer.getUpdateFlag(bitNr)) {
myVisualizer.updateRequest(updateType);
}
} catch (Exception e) {
}
}
}
}
}
}
}