package edu.mit.mitmobile2; import android.app.Activity; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.RadioGroup; import edu.mit.mitmobile2.alerts.NotificationsAlarmReceiver; public class SettingsActivity extends Activity { Context ctx; SharedPreferences pref; static String PREF_EMERGENCY_CHOICE = "emergency_choice"; static String PREF_CLASS_CHOICE = "class_choice"; /****************************************************/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.settings); setTitle("Settings"); ctx = this; pref = ctx.getSharedPreferences(Global.PREFS,MODE_PRIVATE); //pref = getPreferences(MODE_PRIVATE); updateView(); } /****************************************************/ void updateView() { // Classes final RadioGroup rgClasses = (RadioGroup) findViewById(R.id.settingsClassesRG); int id = R.id.settingsClassesRB00; switch (pref.getInt(PREF_CLASS_CHOICE, 0)) { case 0: id = R.id.settingsClassesRB00; break; case 1: id = R.id.settingsClassesRB01; break; case 2: id = R.id.settingsClassesRB02; break; } rgClasses.check(id); // Emergency final RadioGroup rgEmrgcy = (RadioGroup) findViewById(R.id.settingsEmergencyRG); id = R.id.settingsEmergencyRB00; switch (pref.getInt(PREF_EMERGENCY_CHOICE, 0)) { case 0: id = R.id.settingsEmergencyRB00; break; case 1: id = R.id.settingsEmergencyRB01; break; case 2: id = R.id.settingsEmergencyRB02; break; } rgEmrgcy.check(id); // Save Button btnSave = (Button) findViewById(R.id.settingsSaveBtn); OnClickListener l = new OnClickListener() { @Override public void onClick(View v) { int index = 0; int choice; String type = null; long period = 0; pref.edit(); SharedPreferences.Editor editor = pref.edit(); // Classes choice = rgClasses.getCheckedRadioButtonId(); type = NotificationsAlarmReceiver.ACTION_ALARM_CLASS; switch (choice) { case R.id.settingsClassesRB00: period = -1; index = 0; break; case R.id.settingsClassesRB01: period = 15*60*1000; index = 1; break; case R.id.settingsClassesRB02: period = 30*60*1000; index = 2; break; } // note: do NOT set alarm - that is done per Class elsewhere editor.putInt(PREF_CLASS_CHOICE, index); /////////////// // Emergency // note: id's change with compile - want relative choice = rgEmrgcy.getCheckedRadioButtonId(); type = NotificationsAlarmReceiver.ACTION_ALARM_EMERGENCY; switch (choice) { case R.id.settingsEmergencyRB00: period = -1; index = 0; // disabled break; case R.id.settingsEmergencyRB01: period = 30*60*1000; index = 1; // 30 mins break; case R.id.settingsEmergencyRB02: period = 60*60*1000; index = 2; // 1 hr break; } setAlarm(period,type,null); editor.putInt(PREF_EMERGENCY_CHOICE, index); editor.commit(); } }; btnSave.setOnClickListener(l); } /****************************************************/ // Emergency and Class alarms occur periodically to trigger polling but there are multiple // classes which need to be stored in database or be part of the alarm intent, but former // is more efficient (poll all classes once per alarm not many alarms with one class each) void setAlarm(long period, String type, String data) { AlarmManager alarmManager = (AlarmManager) ctx.getSystemService(Service.ALARM_SERVICE); // Cancel or Schedule alarm? if (period<0) { // Cancel // (use matching action/data , NOT "extra" data) Intent i = new Intent(ctx, NotificationsAlarmReceiver.class); i.setAction(type); PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0); alarmManager.cancel(pendingIntent); } else { // Schedule long curTime = System.currentTimeMillis(); long wakeTime; // #1 //wakeTime = busTime - 5*60*1000; // wake up 5 mins before... // #2 DEBUG wakeTime = curTime + 10*1000; period = 30*1000; Intent i = new Intent(ctx, NotificationsAlarmReceiver.class); i.setAction(type); if (data!=null) { i.setData(Uri.parse(data)); } PendingIntent pendingIntent = PendingIntent.getBroadcast(ctx, 0, i, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, wakeTime, period, pendingIntent); } } }