package hk.hku.cs.srli.supermonkey;
import com.example.android.apis.graphics.TouchPaint;
import hk.hku.cs.srli.supermonkey.service.TrackingController;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ToggleButton;
public class MonkeyActivity extends Activity {
private EditText monkeyStatus;
private EditText dStatus;
private EditText etStatus;
private ToggleButton monkeyToggle;
private ToggleButton dToggle;
private ToggleButton etToggle;
private Button caliButton;
private TextView infoText;
private TrackingController trackingCtrl;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.v("MonkeyActivity", "onCreate");
setContentView(R.layout.activity_monkey);
monkeyStatus = (EditText) findViewById(R.id.mStatusEditText);
dStatus = (EditText) findViewById(R.id.dStatusEditText);
etStatus = (EditText) findViewById(R.id.etStatusEditText);
monkeyToggle = (ToggleButton) findViewById(R.id.mToggleButton);
dToggle = (ToggleButton) findViewById(R.id.dToggleButton);
etToggle = (ToggleButton) findViewById(R.id.etToggleButton);
caliButton = (Button) findViewById(R.id.calibrateButton);
infoText = (TextView) findViewById(R.id.infoTextView);
// Set initial interface status.
monkeyStatus.setText("not available");
dStatus.setText("disconnected");
etStatus.setText("unknown");
monkeyToggle.setEnabled(false);
dToggle.setEnabled(false);
dToggle.setChecked(false);
etToggle.setEnabled(false);
etToggle.setChecked(false);
caliButton.setEnabled(false);
infoText.setText(buildScreenInfoString(getScreenInfo()));
trackingCtrl = new TrackingController(this, new EyeTrackerCallback());
}
@Override
protected void onStart() {
Log.v("MonkeyActivity", "onStart");
trackingCtrl.bind();
super.onStart();
}
@Override
protected void onStop() {
Log.v("MonkeyActivity", "onStop");
trackingCtrl.unbind();
super.onStop();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_monkey, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle settings
if (item.getItemId() == R.id.menu_settings) {
startActivity(new Intent(this, SettingsActivity.class));
return true;
} else return super.onOptionsItemSelected(item);
}
public void onCalibrateButtonClicked(View view) {
// start calibration
startActivity(new Intent(this, CalibrationActivity.class));
}
public void onTestButtonClicked(View view) {
// start TouchPaint
startActivity(new Intent(this, TouchPaint.class));
}
public void onMToggleClicked(View view) {
Log.v("MonkeyActivity", "onMToggleClicked");
}
public void onDToggleClicked(View view) {
boolean on = dToggle.isChecked();
Log.v("MonkeyActivity", "onDToggleClicked:" + on);
if (on) {
tryConnect();
} else {
trackingCtrl.close();
}
dToggle.setChecked(!on); // Maintain original state.
}
public void onEtToggleClicked(View view) {
boolean on = etToggle.isChecked();
Log.v("MonkeyActivity", "onEtToggleClicked:" + on);
trackingCtrl.switchTracking(on);
etToggle.setChecked(!on); // Maintain original state.
etStatus.setText(on ? "starting..." : "stopping...");
}
private void tryConnect() {
if (!trackingCtrl.isConnected()) {
SharedPreferences sharedPref = getPref();
try {
String host = sharedPref.getString(SettingsActivity.KEY_PREF_ET_HOST, "");
int port = Integer.parseInt(
sharedPref.getString(SettingsActivity.KEY_PREF_ET_PORT, ""));
if (host.length() > 0 && port > 0) {
trackingCtrl.connect(host, port);
dStatus.setText("connecting...");
} else throw new IllegalArgumentException("Wrong host and port format.");
} catch (IllegalArgumentException e) {
Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
}
private String buildScreenInfoString(DisplayMetrics dm) {
double xinch = dm.widthPixels / dm.xdpi;
double yinch = dm.heightPixels / dm.ydpi;
return new StringBuilder().append("Screen resolution: ")
.append(dm.widthPixels + " x " + dm.heightPixels + " px\n")
.append("Screen size: " + String.format("%.2f", xinch) + " x ")
.append(String.format("%.2f", yinch) + " inch\n")
.append("(" + String.format("%.2f", xinch * 2.54) + " x ")
.append(String.format("%.2f", yinch * 2.54) + " cm)\n")
.toString();
}
private DisplayMetrics getScreenInfo() {
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
return dm;
}
private SharedPreferences getPref() {
return PreferenceManager.getDefaultSharedPreferences(this);
}
private class EyeTrackerCallback implements TrackingController.Callback {
@Override
public void onServiceBound() {
dToggle.setEnabled(true);
// Auto connect if needed.
if (getPref().getBoolean(SettingsActivity.KEY_PREF_ET_AUTOCONNECT, false)) {
tryConnect();
}
}
@Override
public void handleDConnect(boolean connected) {
dToggle.setChecked(connected);
etToggle.setEnabled(false);
caliButton.setEnabled(false);
dStatus.setText(connected ? "connected" : "disconnected");
if (connected) {
// Report parameters to the daemon.
int port = Integer.parseInt(
getPref().getString(SettingsActivity.KEY_PREF_M_PORT, ""));
if (port > 0) trackingCtrl.setParam("monkey_port", Integer.toString(port));
DisplayMetrics dm = getScreenInfo();
trackingCtrl.setParam("display_width", Integer.toString(dm.widthPixels));
trackingCtrl.setParam("display_height", Integer.toString(dm.heightPixels));
}
}
@Override
public void handleETStatus(boolean ready) {
etToggle.setEnabled(ready);
etToggle.setChecked(false);
caliButton.setEnabled(ready);
etStatus.setText(ready ? "ready" : "not connected");
}
@Override
public void handleETStartStop(boolean started) {
etToggle.setChecked(started);
caliButton.setEnabled(!started);
etStatus.setText(started ? "tracking..." : "tracking stopped");
}
@Override
public void handleMessage(String message) {
etStatus.setText(message);
}
@Override
public void handleError(String message) {
String text = "Error: " + message;
Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show();
}
}
}