package co.flyver.airqualitymonitorapp;
import android.annotation.TargetApi;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.view.Menu;
import android.view.MenuItem;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import co.flyver.AirQualityMonitorApp.R;
import co.flyver.androidrc.server.CameraProvider;
import co.flyver.androidrc.server.Server;
import co.flyver.dataloggerlib.LocalDataActivity;
import co.flyver.dataloggerlib.LoggerTestActivity;
import co.flyver.flyvercore.maincontrollers.MainController;
import co.flyver.flyvercore.microcontrollers.IOIOController;
import co.flyver.flyvercore.statedata.IOIOSensors.AirQuality.AirQualityMonitorDataContainer;
import co.flyver.flyvercore.statedata.IOIOSensors.AirQuality.AirQualityMonitorProducer;
import co.flyver.utils.flyvermq.FlyverMQ;
import co.flyver.utils.flyvermq.FlyverMQMessage;
import co.flyver.utils.flyvermq.exceptions.FlyverMQException;
import co.flyver.utils.flyvermq.interfaces.FlyverMQConsumer;
import co.flyver.utils.settings.SettingsActivity;
import ioio.lib.api.IOIO;
import ioio.lib.api.IOIO.VersionType;
import ioio.lib.util.android.IOIOActivity;
public class MainActivity extends IOIOActivity {
// TODO: Make Flyver abstraction for Activity
public TextView stateView;
CameraProvider cameraProvider;
static Server server;
/**
* It is called by the IOIO board when connection is established
*/
@Override
public IOIOController createIOIOLooper() {
final IOIOController ic;
ic = new IOIOController().addConnectionHooks(new IOIOController.ConnectionHooks() {
@Override
public void onConnect(IOIOController ioioController) {
MainController.getInstance().onIoioConnect(ioioController);
}
@Override
public void onDisconnect() {
MainController.getInstance().onIoioDisconnect();
}
});
return ic;
}
/**
* Called when the activity is first created. Here we normally initialize
* our GUI.
*/
@TargetApi(Build.VERSION_CODES.CUPCAKE)
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // Keep the screen on
// final PendingIntent watchdog = PendingIntent.getActivity(getApplication().getBaseContext(), 0, new Intent(getIntent()), PendingIntent.FLAG_UPDATE_CURRENT);
// Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
// @Override
// public void uncaughtException(Thread thread, Throwable ex) {
// AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
// alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, watchdog);
// ex.printStackTrace();
// System.exit(2);
// }
// });
final Intent intent = new Intent(getApplicationContext(), Server.class);
ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Server.LocalBinder localBinder = (Server.LocalBinder) service;
server = localBinder.getServerInstance();
server.setCameraProvider(cameraProvider);
startService(intent);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
bindService(intent, connection, BIND_AUTO_CREATE);
}
@Override
public void onStart() {
super.onStart();
monitorAirQuality();
}
private void showVersions(IOIO ioio, String title) {
toast(String.format("%s\n" +
"IOIOLib: %s\n" +
"Application firmware: %s\n" +
"Bootloader firmware: %s\n" +
"Hardware: %s",
title,
ioio.getImplVersion(VersionType.IOIOLIB_VER),
ioio.getImplVersion(VersionType.APP_FIRMWARE_VER),
ioio.getImplVersion(VersionType.BOOTLOADER_VER),
ioio.getImplVersion(VersionType.HARDWARE_VER)));
}
private void toast(final String message) {
final Context context = this;
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
});
}
public void setDebugText(String debugText) {
stateView.setText(debugText);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
//return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
Intent intent;
int id = item.getItemId();
switch (id) {
case R.id.action_logger:
intent = new Intent(this, LoggerTestActivity.class);
this.startActivity(intent);
break;
case R.id.action_loggerlocaldata:
intent = new Intent(this, LocalDataActivity.class);
this.startActivity(intent);
break;
case R.id.action_settings:
intent = new Intent(this, SettingsActivity.class);
this.startActivity(intent);
break;
default:
return super.onOptionsItemSelected(item);
}
return true;
}
private void monitorAirQuality() {
FlyverMQConsumer consumer = new FlyverMQConsumer() {
@Override
public void dataReceived(FlyverMQMessage message) {
ImageView imageView = (ImageView) findViewById(R.id.scaleView);
AirQualityMonitorDataContainer container = (AirQualityMonitorDataContainer) message.data;
int quality = container.airQuality;
switch (quality / 16) {
case 1: {
setImage(imageView, R.drawable.scale1);
}
break;
case 2: {
setImage(imageView, R.drawable.scale2);
}
break;
case 3: {
setImage(imageView, R.drawable.scale3);
}
break;
case 4: {
setImage(imageView, R.drawable.scale4);
}
break;
case 5: {
setImage(imageView, R.drawable.scale5);
}
break;
case 6: {
setImage(imageView, R.drawable.scale6);
}
break;
default: {
//empty
}
}
}
@Override
public void unregistered() {
}
@Override
public void paused() {
}
@Override
public void resumed() {
}
private void setImage(final ImageView imageView, final int resId) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
imageView.setImageResource(resId);
}
});
}
};
try {
FlyverMQ.getInstance().registerConsumer(consumer, AirQualityMonitorProducer.TOPIC);
} catch (FlyverMQException e) {
e.printStackTrace();
}
}
}