package com.pledgeapps.buyingtime; import android.content.Context; import android.media.RingtoneManager; import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.Vibrator; import android.support.v4.app.DialogFragment; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.WindowManager; import android.widget.Button; import android.widget.TextView; import com.pledgeapps.buyingtime.data.Alarm; import com.pledgeapps.buyingtime.data.Alarms; import com.pledgeapps.buyingtime.data.Transaction; import com.pledgeapps.buyingtime.data.Transactions; import com.pledgeapps.buyingtime.utils.AlarmHelper; import java.text.SimpleDateFormat; import java.util.Date; public class AlertActivity extends ActionBarActivity { TextView currentHour; TextView currentMinute; TextView currentPeriod; TextView currentDate; TextView alarmTimeText; TextView oversleptText; TextView chargeText; Button snoozeButton; Button dismissButton; Handler refreshHandler; String previousDisplayTime = ""; SimpleDateFormat timeFormat = new SimpleDateFormat("h:mma"); SimpleDateFormat hourFormat = new SimpleDateFormat("h"); SimpleDateFormat minuteFormat = new SimpleDateFormat(":mm"); SimpleDateFormat periodFormat = new SimpleDateFormat("a"); SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, MMMM d"); DialogFragment dismissFragment; Alarm alarm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(android.view.Window.FEATURE_NO_TITLE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); setContentView(R.layout.activity_alert); loadAlarm(); currentHour = (TextView) findViewById(R.id.currentHour); currentMinute = (TextView) findViewById(R.id.currentMinute); currentPeriod = (TextView) findViewById(R.id.currentPeriod); currentDate = (TextView) findViewById(R.id.currentDate); alarmTimeText = (TextView) findViewById(R.id.alarmTimeText); oversleptText = (TextView) findViewById(R.id.oversleptText); chargeText = (TextView) findViewById(R.id.chargeText); snoozeButton = (Button) findViewById(R.id.snoozeButton); dismissButton = (Button) findViewById(R.id.dismissButton); snoozeButton.setOnClickListener( new View.OnClickListener() {public void onClick(View view) {snooze();}} ); dismissButton.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { checkDismiss(); } }); refreshHandler= new Handler(); refreshHandler.postDelayed(refreshRunnable, 1000); updateScreen(true); soundAlarm(); } @Override protected void onResume() { super.onResume(); if (dismissFragment!=null && dismissFragment.getShowsDialog()) dismissFragment.dismiss(); loadAlarm(); soundAlarm(); } private void silenceAlarm() { AlarmHelper.getCurrent().ringtone.stop(); AlarmHelper.getCurrent().vibrator.cancel(); AlarmHelper.getCurrent().isSounding = false; //vibrator.cancel(); } private void soundAlarm() { AlarmHelper helper = AlarmHelper.getCurrent(); if (!helper.isSounding && helper.pendingAlarm) { snoozeButton.setText("Snooze"); snoozeButton.setEnabled(true); if (helper.ringtone==null) { Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM); if(alert == null){ alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); if(alert == null) alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE); } AlarmHelper.getCurrent().ringtone = RingtoneManager.getRingtone(getApplicationContext(), alert); } if (helper.vibrator==null) { helper.vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); } helper.ringtone.play(); helper.vibrator.vibrate(3600 * 1000); //For 1 hour unless dismissed. helper.isSounding = true; helper.pendingAlarm = false; } } private Runnable refreshRunnable = new Runnable() { public void run() { try { updateScreen(false); } catch (Exception e) {} refreshHandler.postDelayed(this, 1000); } }; public void updateScreen(boolean forceRefresh) { String displayTime = timeFormat.format(new Date()).toLowerCase().replace("m", ""); if (!displayTime.equals(previousDisplayTime)) { Date displayDate = new Date(); currentHour.setText( hourFormat.format(displayDate) ); currentMinute.setText( minuteFormat.format(displayDate) ); currentPeriod.setText( periodFormat.format(displayDate) ); currentDate.setText( dateFormat.format(displayDate) ); alarmTimeText.setText(timeFormat.format(alarm.nextAlarmTime).toLowerCase()); oversleptText.setText(Integer.toString(alarm.getMinutesOverslept()) + " min" ); String displayPledge = "$" + String.format("%1.2f", alarm.getCost()); chargeText.setText(displayPledge ); previousDisplayTime=displayTime; } } private void snooze() { silenceAlarm(); int snoozeMinutes = alarm.snoozeDuration; if (snoozeMinutes<1) snoozeMinutes=9; //Just in case an invalid number gets entered alarm.nextNotificationTime.setTime( alarm.nextNotificationTime.getTime() + snoozeMinutes * 60 * 1000 ); AlarmHelper.getCurrent().setAlarm(getApplicationContext(), alarm); snoozeButton.setText("Snoozing..."); snoozeButton.setEnabled(false); } private void checkDismiss() { if (alarm.requirePuzzle) { snooze(); solvePuzzle(); } else dismiss(); } private void dismiss() { silenceAlarm(); if (alarm.getCost()>0) { Transaction t = new Transaction(); t.amount = alarm.getCost(); t.date = new Date(); Transactions.getCurrent().add(t); Transactions.getCurrent().save(this); } AlarmHelper.getCurrent().updateAlarms(getApplicationContext()); finish(); } private void loadAlarm() { Bundle extras = getIntent().getExtras(); if (extras != null){ String guid = extras.getString("ALARM_GUID"); this.alarm = Alarms.getCurrent().getByGuid(guid); } } private void solvePuzzle() { dismissFragment = DismissFragment.newInstance(puzzleHandler); dismissFragment.show(this.getSupportFragmentManager(), "puzzleHandler"); } Handler puzzleHandler = new Handler() { public void handleMessage(Message m) { dismiss(); } }; }