package com.example.heartrateadjuster; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.ImageButton; import android.widget.NumberPicker; import android.widget.SeekBar; import android.widget.TextView; import android.widget.Toast; import java.util.Timer; import java.util.TimerTask; /** * The main screen of the application. * Initializes chestStrap and audioSystem objects and sets up the UI with callbacks. */ public class MainActivity extends Activity { /** * Chest strap object, instantiated as a {@link com.example.heartrateadjuster.ChestStrapFake} */ public IHeartRateDevice chestStrap = new ChestStrapFake(); /** * Audio system object, instantiated as a {@link com.example.heartrateadjuster.AudioSystemFake} */ public IAudioSystem audioSystem = new AudioSystemFake(); /** * Timer used to update heart rate display once a second. */ private Timer timer = new Timer(); //constants private static int PERIOD = 1000; private static String up = "Raising"; private static String down = "Lowering"; /** * Android fundamental method, used to instantiate all UI elements with callbacks. * @param savedInstanceState */ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //initialize number pickers. np1 is low, np2 is high final NumberPicker np1 = (NumberPicker)findViewById(R.id.numberPicker1); final NumberPicker np2 = (NumberPicker)findViewById(R.id.numberPicker2); final Button toggleDirection = (Button)findViewById(R.id.button1); np1.setMinValue(40); np1.setMaxValue(200); np1.setValue(70); np1.setOnScrollListener(new NumberPicker.OnScrollListener() { @Override public void onScrollStateChange(NumberPicker view, int scrollState) { if(scrollState==NumberPicker.OnScrollListener.SCROLL_STATE_IDLE){ if (toggleDirection.getText().equals(down)) { updateTargetHeartrate(np1.getValue()); } } } }); np2.setMinValue(50); np2.setMaxValue(200); np2.setValue(120); np2.setOnScrollListener(new NumberPicker.OnScrollListener() { @Override public void onScrollStateChange(NumberPicker view, int scrollState) { if(scrollState==NumberPicker.OnScrollListener.SCROLL_STATE_IDLE){ if (toggleDirection.getText().equals(up)) { updateTargetHeartrate(np2.getValue()); } } } }); //initialize toggleDirection button. Toggles text and calls updateTargetHeartrate() toggleDirection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(toggleDirection.getText().equals(up)){ toggleDirection.setText(down); updateTargetHeartrate(np1.getValue()); }else{ toggleDirection.setText(up); updateTargetHeartrate(np2.getValue()); } } }); //initialize SeekBar for faking Chest Strap SeekBar seekBar = (SeekBar)findViewById(R.id.seekBar1); seekBar.setMax(200); seekBar.setProgress(60); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { ((ChestStrapFake)chestStrap).setCurrentHeartRate(progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); //initialize Timer to update heart rate display once a second timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { TextView textView = (TextView)findViewById(R.id.textView4); textView.setText(chestStrap.getCurrentHeartRate() + " BPM"); } }); } }, 200, PERIOD); //initialize play button. Calls togglePlayback() final ImageButton togglePlay = (ImageButton)findViewById(R.id.imageButton1); togglePlay.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { togglePlayback(); } }); //initialize skip button. Calls skipTrack() final ImageButton skipTrack = (ImageButton)findViewById(R.id.imageButton2); skipTrack.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { skipTrack(); } }); //initialize fake now playing button. Calls updateNowPlaying with current time. final ImageButton fakeNowPlaying = (ImageButton)findViewById(R.id.imageButton); fakeNowPlaying.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { updateNowPlaying(); } }); updateNowPlaying(); } @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 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. int id = item.getItemId(); if (id == R.id.action_statistics) { //TODO start statistics activity Toast.makeText(this, "Start Statistics Activity", Toast.LENGTH_SHORT).show(); return true; } return super.onOptionsItemSelected(item); } /** * Passes on new heart rate value to audioSystem. * @param val Heart Rate value from UI. */ void updateTargetHeartrate(int val){ Toast.makeText(this, "updateTargetHeartrate("+val+")", Toast.LENGTH_SHORT).show(); audioSystem.setTargetHeartRate(val); } /** * Passes on togglePlayback command to audioSystem. */ void togglePlayback(){ Toast.makeText(this, "togglePlayback()", Toast.LENGTH_SHORT).show(); audioSystem.togglePlayback(); } /** * Passes on skipTrack command to audioSystem. */ void skipTrack(){ Toast.makeText(this, "skipTrack()", Toast.LENGTH_SHORT).show(); audioSystem.skipTrack(); } /** * Updates UI with now playing information from audioSystem. */ void updateNowPlaying(){ TextView textView = (TextView)findViewById(R.id.textView3); textView.setText("Now Playing: "+audioSystem.getNowPlaying()); } }