package edu.fsu.cs.contextprovider;
import java.util.Timer;
import java.util.TimerTask;
import edu.fsu.cs.contextprovider.data.ContextConstants;
import edu.fsu.cs.contextprovider.monitor.DerivedMonitor;
import edu.fsu.cs.contextprovider.monitor.MovementMonitor;
import android.app.Activity;
import android.app.KeyguardManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.DialogInterface.OnClickListener;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Bundle;
import android.os.PowerManager;
import android.os.Vibrator;
import android.preference.PreferenceManager;
import android.provider.Settings;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.SeekBar;
import android.widget.Toast;
import android.widget.RadioGroup.OnCheckedChangeListener;
public class ContextAccuracyActivity extends Activity implements View.OnClickListener {
private static final String TAG = "ContextAccuracyActivity";
private static final boolean DEBUG = true;
private Ringtone tone;
private AudioManager volume;
private AudioManager audio;
private Vibrator vibrate;
SharedPreferences prefs;
private boolean accuracyAudioEnabled;
private boolean accuracyVibrateEnabled;
private String accuracyDismissDelay;
private int dismissDelay;
SeekBar placeBar = null;
SeekBar movementBar = null;
SeekBar activityBar = null;
// SeekBar shelterBar = null;
// SeekBar onPersonBar = null;
RadioGroup shelterGroup = null;
RadioGroup onPersonGroup = null;
RadioButton shelterCorrect = null;
RadioButton onPersonCorrect = null;
EditText placeText = null;
EditText movementText = null;
EditText activityText = null;
EditText shelterText = null;
EditText onPersonText = null;
Button submitBtn = null;
Button resetBtn = null;
final int INDEX_PLACE = 1;
final int INDEX_MOVEMENT = 2;
final int INDEX_ACTIVITY = 3;
final int INDEX_SHELTER = 4;
final int INDEX_ONPERSON = 5;
private PowerManager.WakeLock wakelock;
private static Timer timer = new Timer();
// private Activity ctx;
private int backCount = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// getWindow().setFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wakelock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "ContextAccuracyActivity");
wakelock.acquire();
KeyguardManager km = (KeyguardManager) getSystemService (KEYGUARD_SERVICE);
KeyguardManager.KeyguardLock keylock = km.newKeyguardLock(TAG);
keylock.disableKeyguard();
getPrefs();
setContentView(R.layout.accuracy);
vibrate = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
audio = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
volume = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
placeBar = (SeekBar) findViewById(R.id.place);
movementBar = (SeekBar) findViewById(R.id.movement);
activityBar = (SeekBar) findViewById(R.id.activity);
// shelterBar = (SeekBar) findViewById(R.id.shelter);
// onPersonBar = (SeekBar) findViewById(R.id.onPerson);
shelterGroup = (RadioGroup) findViewById(R.id.shelter);
shelterCorrect = (RadioButton) findViewById(R.id.shelterCorrect);
onPersonGroup = (RadioGroup) findViewById(R.id.onPerson);
onPersonCorrect = (RadioButton) findViewById(R.id.onPersonCorrect);
placeText = (EditText) findViewById(R.id.editPlace);
movementText = (EditText) findViewById(R.id.editMovement);
activityText = (EditText) findViewById(R.id.editActivity);
shelterText = (EditText) findViewById(R.id.editShelter);
onPersonText = (EditText) findViewById(R.id.editOnPerson);
placeText.setText(DerivedMonitor.getPlace());
movementText.setText(MovementMonitor.getMovementState());
activityText.setText(DerivedMonitor.getActivity());
shelterText.setText(DerivedMonitor.getShelterString());
onPersonText.setText(DerivedMonitor.getOnPersonString());
submitBtn = (Button) findViewById(R.id.SubmitButton);
resetBtn = (Button) findViewById(R.id.ResetButton);
submitBtn.setOnClickListener(this);
resetBtn.setOnClickListener(this);
resetBars();
if (accuracyAudioEnabled)
tone.play();
if (accuracyVibrateEnabled)
startVibrate();
timer = new Timer();
timer.schedule(new ContextDismissTask(), (dismissDelay * 1000));
}
@Override
protected void onPause() {
super.onPause();
}
@Override
protected void onDestroy() {
wakelock.release();
super.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
}
@Override
public void onBackPressed() {
if (backCount++ < 1) {
Toast.makeText(this, "Press Back again to submit", Toast.LENGTH_SHORT).show();
} else {
timer.cancel();
sendAccuracy(true);
finish();
}
}
private void getPrefs() {
prefs = getSharedPreferences(ContextConstants.CONTEXT_PREFS, MODE_PRIVATE);
// prefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
accuracyAudioEnabled = prefs.getBoolean(ContextConstants.PREFS_ACCURACY_POPUP_AUDIO_ENABLED, false);
accuracyVibrateEnabled = prefs.getBoolean(ContextConstants.PREFS_ACCURACY_POPUP_VIBRATE_ENABLED, true);
// accuracyDismissDelay = prefs.getInt(ContextConstants.PREFS_ACCURACY_POPUP_DISMISS_FREQ, 5);
accuracyDismissDelay = prefs.getString(ContextConstants.PREFS_ACCURACY_POPUP_DISMISS_FREQ, "15");
dismissDelay = Integer.parseInt(accuracyDismissDelay);
if (DEBUG) {
Log.d(TAG, "accuracyDismissDelay: " + accuracyDismissDelay + " dismissDelay: " + dismissDelay);
}
if (accuracyAudioEnabled)
setRingtone();
}
private void resetBars() {
initBar(placeBar, INDEX_PLACE);
initBar(movementBar, INDEX_MOVEMENT);
initBar(activityBar, INDEX_ACTIVITY);
// initBar(shelterBar, INDEX_SHELTER);
// initBar(onPersonBar, INDEX_ONPERSON);
}
private void initBar(SeekBar bar, final int stream) {
bar.setMax(10);
bar.setProgress(10);
bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
public void onProgressChanged(SeekBar bar, int progress, boolean fromUser) {
}
public void onStartTrackingTouch(SeekBar bar) {
}
public void onStopTrackingTouch(SeekBar bar) {
}
});
}
@Override
public void onClick(View v) {
if (v == resetBtn) {
Toast.makeText(this, "Reset defaults", Toast.LENGTH_SHORT).show();
resetBars();
} else if (v == submitBtn) {
timer.cancel();
sendAccuracy(true);
finish();
}
}
private class ContextDismissTask extends TimerTask
{
public void run()
{
sendAccuracy(false);
finish();
}
}
private void sendAccuracy(boolean response) {
Intent intent = new Intent(ContextConstants.CONTEXT_STORE_INTENT);
intent.putExtra(ContextConstants.PLACE_ACCURATE, (int) placeBar.getProgress());
intent.putExtra(ContextConstants.MOVEMENT_ACCURATE, (int) movementBar.getProgress());
intent.putExtra(ContextConstants.ACTIVITY_ACCURATE, (int) activityBar.getProgress());
if (shelterCorrect.isChecked()) {
intent.putExtra(ContextConstants.SHELTER_ACCURATE, true);
} else {
intent.putExtra(ContextConstants.SHELTER_ACCURATE, false);
}
if (onPersonCorrect.isChecked()) {
intent.putExtra(ContextConstants.ONPERSON_ACCURATE, true);
} else {
intent.putExtra(ContextConstants.ONPERSON_ACCURATE, false);
}
intent.putExtra(ContextConstants.DERIVED_RESPONSE, response);
sendBroadcast(intent);
}
private void setRingtone() {
Uri ringUri;
String ringtone = prefs.getString(ContextConstants.PREFS_ACCURACY_POPUP_AUDIO, "Default");
if(ringtone.equalsIgnoreCase("default"))
ringUri = Settings.System.DEFAULT_RINGTONE_URI;
else
ringUri = Uri.parse(ringtone);
tone = RingtoneManager.getRingtone(this, ringUri);
}
private void startVibrate() {
long[] pattern = {500, 300, 800, 300};
vibrate.vibrate(pattern, -1);
}
}