package de.tu.darmstadt.seemoo.ansian.gui.views;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.res.AssetManager;
import android.net.Uri;
import android.support.v7.widget.Toolbar;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MenuItem;
import de.greenrobot.event.EventBus;
import de.greenrobot.event.Subscribe;
import de.tu.darmstadt.seemoo.ansian.MainActivity;
import de.tu.darmstadt.seemoo.ansian.R;
import de.tu.darmstadt.seemoo.ansian.SettingsActivity;
import de.tu.darmstadt.seemoo.ansian.control.StateHandler;
import de.tu.darmstadt.seemoo.ansian.control.StateHandler.State;
import de.tu.darmstadt.seemoo.ansian.control.events.DemodulationEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.RecordingEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.RequestStateEvent;
import de.tu.darmstadt.seemoo.ansian.control.events.StateEvent;
import de.tu.darmstadt.seemoo.ansian.gui.dialogs.AdjustGainDialog;
import de.tu.darmstadt.seemoo.ansian.gui.dialogs.DemodulatorDialog;
import de.tu.darmstadt.seemoo.ansian.gui.dialogs.FrequencyDialog;
import de.tu.darmstadt.seemoo.ansian.gui.dialogs.RecordingDialog;
import de.tu.darmstadt.seemoo.ansian.model.demodulation.Demodulation.DemoType;
import de.tu.darmstadt.seemoo.ansian.model.preferences.MiscPreferences;
import de.tu.darmstadt.seemoo.ansian.model.preferences.Preferences;
/**
*
* Toolbar on the bottom of the screen with often used buttons
*
*/
public class MyToolbarView extends Toolbar {
private static final String LOGTAG = "MyActionBarView";
private MainActivity activity;
private MiscPreferences preferences;
public MyToolbarView(Context context) {
super(context);
init(context);
}
public MyToolbarView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MyToolbarView(Context context, AttributeSet attrs, int defaultStyle) {
super(context, attrs, defaultStyle);
init(context);
}
private void init(Context context) {
activity = MainActivity.instance;
preferences = Preferences.MISC_PREFERENCE;
EventBus.getDefault().register(this);
inflateMenu(R.menu.toolbar);
setPaddingRelative(0, 0, 20, 0);
// Experimental opening for Settings
// setOnTouchListener(new OnTouchListener() {
// @Override
// public boolean onTouch(View v, MotionEvent event) {
// if (event.getDownTime()>2000)
// { openSettings();
// return true;}
// else return false;
// }
// });
setDemodulationMode(preferences.getDemodulation());
setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem menuItem) {
switch (menuItem.getItemId()) {
case R.id.action_stop:
EventBus.getDefault().post(new RequestStateEvent(State.STOPPED));
return true;
case R.id.action_pause:
EventBus.getDefault().post(new RequestStateEvent(State.PAUSED));
return true;
case R.id.action_start:
EventBus.getDefault().post(new RequestStateEvent(State.MONITORING));
return true;
case R.id.action_setDemodulation:
new DemodulatorDialog().show();
return true;
case R.id.action_setFrequency:
new FrequencyDialog().show();
return true;
case R.id.action_setGain:
new AdjustGainDialog().show();
return true;
case R.id.action_settings:
openSettings();
return true;
case R.id.action_record:
if (!StateHandler.isRecording())
new RecordingDialog(true).show();
else
EventBus.getDefault().post(new RecordingEvent(false));
return true;
case R.id.action_help:
Intent intentShowHelp = new Intent(Intent.ACTION_VIEW);
intentShowHelp.setData(Uri.parse(activity.getString(R.string.help_url)));
activity.startActivity(intentShowHelp);
// openManualPDF();
return true;
default:
return false;
}
}
@SuppressWarnings("deprecation")
private void openManualPDF() {
AssetManager assetManager = activity.getAssets();
InputStream in = null;
OutputStream out = null;
File file = new File(activity.getFilesDir(), "manual.pdf");
try {
in = assetManager.open("manual.pdf");
out = activity.openFileOutput(file.getName(), Context.MODE_WORLD_READABLE);
copyFile(in, out);
in.close();
in = null;
out.flush();
out.close();
out = null;
} catch (Exception e) {
Log.e("tag", e.getMessage());
}
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" + activity.getFilesDir() + "/manual.pdf"), "application/pdf");
try {
activity.startActivity(intent);
} catch (ActivityNotFoundException e) {
// TODO
}
}
});
}
private void copyFile(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[1024];
int read;
while ((read = in.read(buffer)) != -1) {
out.write(buffer, 0, read);
}
}
@Subscribe
public void onEventMainThread(final StateEvent event) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
MenuItem pause = getMenu().findItem(R.id.action_pause);
MenuItem start = getMenu().findItem(R.id.action_start);
MenuItem stop = getMenu().findItem(R.id.action_stop);
switch (event.getState()) {
case SCANNING:
case MONITORING:
stop.setVisible(true);
pause.setVisible(true);
start.setVisible(false);
break;
case STOPPED:
stop.setVisible(false);
pause.setVisible(false);
start.setVisible(true);
break;
case PAUSED:
stop.setVisible(true);
pause.setVisible(false);
start.setVisible(true);
break;
default:
break;
}
}
});
}
@Subscribe
public void onEventMainThread(final DemodulationEvent event) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
setDemodulationMode(event.getDemodulation());
}
});
}
public void openSettings() {
if (SettingsActivity.instance == null) {
Intent intentShowSettings = new Intent(MainActivity.instance.getApplicationContext(),
SettingsActivity.class);
MainActivity.instance.startActivity(intentShowSettings);
}
}
private void setDemodulationMode(DemoType demodulation) {
int iconRes = -1;
int titleRes = -1;
MenuItem item = getMenu().findItem(R.id.action_setDemodulation);
switch (demodulation) {
case OFF:
iconRes = R.drawable.ic_action_demod_off;
titleRes = R.string.action_demodulation_off;
break;
case AM:
iconRes = R.drawable.ic_action_demod_am;
titleRes = R.string.action_demodulation_am;
break;
case NFM:
iconRes = R.drawable.ic_action_demod_nfm;
titleRes = R.string.action_demodulation_nfm;
break;
case WFM:
iconRes = R.drawable.ic_action_demod_wfm;
titleRes = R.string.action_demodulation_wfm;
break;
case LSB:
iconRes = R.drawable.ic_action_demod_lsb;
titleRes = R.string.action_demodulation_lsb;
break;
case USB:
iconRes = R.drawable.ic_action_demod_usb;
titleRes = R.string.action_demodulation_usb;
break;
case MORSE:
iconRes = R.drawable.ic_action_demod_morse;
titleRes = R.string.action_demodulation_morse;
break;
default:
Log.e(LOGTAG, "updateActionBar: invalid mode: " + preferences.getDemodulation());
}
item.setTitle(titleRes);
item.setIcon(iconRes);
}
@Subscribe
public void onEventMainThread(final RecordingEvent event) {
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
MenuItem item = getMenu().findItem(R.id.action_record);
if (event.isRecording()) {
item.setTitle(R.string.action_recordOn);
item.setIcon(R.drawable.ic_action_record_on);
} else {
item.setTitle(R.string.action_recordOff);
item.setIcon(R.drawable.ic_action_record_off);
}
}
});
}
}