Fixed bug where, on app reinstall, the notification actions stopped working due to losing permission for gracecancellationpendingintent.
@ -45,7 +45,6 @@ public class AlarmAlertActivity extends Activity {
|
|||||||
setContentView(R.layout.alarm_alert);
|
setContentView(R.layout.alarm_alert);
|
||||||
|
|
||||||
notifyIntent = new Intent(getApplicationContext(), AlarmNotify.class);
|
notifyIntent = new Intent(getApplicationContext(), AlarmNotify.class);
|
||||||
|
|
||||||
// Disable any current notifications
|
// Disable any current notifications
|
||||||
stopService(notifyIntent);
|
stopService(notifyIntent);
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ import android.util.Log;
|
|||||||
|
|
||||||
public class AlarmNotify extends Service {
|
public class AlarmNotify extends Service {
|
||||||
public static final int notifyID = 1;
|
public static final int notifyID = 1;
|
||||||
private volatile boolean threadRunning = false;
|
public volatile boolean notificationRunning = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IBinder onBind(Intent intent) {
|
public IBinder onBind(Intent intent) {
|
||||||
@ -25,7 +25,8 @@ public class AlarmNotify extends Service {
|
|||||||
@Override
|
@Override
|
||||||
public void onDestroy() {
|
public void onDestroy() {
|
||||||
// If the notification is cancelled, stop updating.
|
// If the notification is cancelled, stop updating.
|
||||||
threadRunning = false;
|
notificationRunning = false;
|
||||||
|
Log.d("AlarmNotify", "1: Setting notificationRunning to false");
|
||||||
// Remove the notification in the notification bar
|
// Remove the notification in the notification bar
|
||||||
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
NotificationManager nm = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
|
||||||
nm.cancel(notifyID);
|
nm.cancel(notifyID);
|
||||||
@ -41,7 +42,6 @@ public class AlarmNotify extends Service {
|
|||||||
// convert gracePeriod to milliseconds and calculate when it'll fire
|
// convert gracePeriod to milliseconds and calculate when it'll fire
|
||||||
final long endTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000);
|
final long endTime = System.currentTimeMillis() + (gracePeriod * 60 * 1000);
|
||||||
|
|
||||||
//Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.alarm_notification);
|
|
||||||
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_grey);
|
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher_grey);
|
||||||
final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
final NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
|
||||||
final Notification.Builder notification = new Notification.Builder(this)
|
final Notification.Builder notification = new Notification.Builder(this)
|
||||||
@ -50,13 +50,12 @@ public class AlarmNotify extends Service {
|
|||||||
.setSmallIcon(R.drawable.alarm_notification)
|
.setSmallIcon(R.drawable.alarm_notification)
|
||||||
.setLargeIcon(bm)
|
.setLargeIcon(bm)
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setAutoCancel(true)
|
.setAutoCancel(false)
|
||||||
.setPriority(Notification.PRIORITY_HIGH);
|
.setPriority(Notification.PRIORITY_HIGH);
|
||||||
//.setContentText(String.format(getString(R.string.notificationText), phoneNumber) + MainActivity.MinutesToGracePeriodStr(gracePeriod))
|
|
||||||
|
|
||||||
// Set up dismiss action
|
// Set up dismiss action
|
||||||
Intent cancellerIntent = new Intent(getBaseContext(), CancelGraceReceiver.class);
|
Intent cancellerIntent = new Intent(getBaseContext(), CancelGraceReceiver.class);
|
||||||
PendingIntent cancellerPendingIntent = PendingIntent.getBroadcast(getBaseContext(), MainActivity.CANCEL_GRACE_REQUEST, cancellerIntent, 0);
|
PendingIntent cancellerPendingIntent = PendingIntent.getBroadcast(getBaseContext(), MainActivity.CANCEL_GRACE_REQUEST, cancellerIntent, PendingIntent.FLAG_CANCEL_CURRENT);
|
||||||
|
|
||||||
// Cancel the grace period if the user clears the notification
|
// Cancel the grace period if the user clears the notification
|
||||||
notification.setDeleteIntent(cancellerPendingIntent);
|
notification.setDeleteIntent(cancellerPendingIntent);
|
||||||
@ -65,11 +64,14 @@ public class AlarmNotify extends Service {
|
|||||||
// Allow the user to cancel by selecting the ContentText or ContentTitle
|
// Allow the user to cancel by selecting the ContentText or ContentTitle
|
||||||
notification.setContentIntent(cancellerPendingIntent);
|
notification.setContentIntent(cancellerPendingIntent);
|
||||||
|
|
||||||
// TODO load alert activity (without sound or vibration) on select? This would allow the user to test competence
|
/**
|
||||||
|
* TODO load alert activity (without sound or vibration) on select?
|
||||||
|
* TODO This would allow the user to test competence
|
||||||
Intent alertActivityIntent = new Intent(this, AlarmAlertActivity.class);
|
Intent alertActivityIntent = new Intent(this, AlarmAlertActivity.class);
|
||||||
alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
|
alertActivityIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK |
|
||||||
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
|
||||||
//notification.setContentIntent(alertActivityIntent);
|
notification.setContentIntent(alertActivityIntent);
|
||||||
|
*/
|
||||||
|
|
||||||
nm.cancel(notifyID);
|
nm.cancel(notifyID);
|
||||||
nm.notify(notifyID, notification.build());
|
nm.notify(notifyID, notification.build());
|
||||||
@ -77,7 +79,8 @@ public class AlarmNotify extends Service {
|
|||||||
new Thread(new Runnable() {
|
new Thread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
threadRunning = true;
|
notificationRunning = true;
|
||||||
|
Log.d("AlarmNotify", "2: Setting notificationRunning to true");
|
||||||
int max = 1000;
|
int max = 1000;
|
||||||
// Convert endTime from milliseconds to seconds, and translate to time remaining
|
// Convert endTime from milliseconds to seconds, and translate to time remaining
|
||||||
int secondsLeft = (int) ((endTime - System.currentTimeMillis())) / (1000);
|
int secondsLeft = (int) ((endTime - System.currentTimeMillis())) / (1000);
|
||||||
@ -87,7 +90,8 @@ public class AlarmNotify extends Service {
|
|||||||
|
|
||||||
while (progress < max) {
|
while (progress < max) {
|
||||||
// Stop the thread if cancelled elsewhere
|
// Stop the thread if cancelled elsewhere
|
||||||
if (!threadRunning) {
|
Log.d("AlarmNotify", "notificationRunning is "+notificationRunning);
|
||||||
|
if (!notificationRunning) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int minutesLeft = secondsLeft / 60;
|
int minutesLeft = secondsLeft / 60;
|
||||||
|
@ -24,11 +24,6 @@ public class AlarmReceiver extends BroadcastReceiver {
|
|||||||
Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true);
|
Boolean alarmActive = sharedPref.getBoolean(context.getString(R.string.AlarmActivePref), true);
|
||||||
|
|
||||||
if (alarmActive) {
|
if (alarmActive) {
|
||||||
|
|
||||||
// Cancel notification if it's not already cancelled.
|
|
||||||
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
nm.cancel(AlarmNotify.notifyID);
|
|
||||||
|
|
||||||
// Set a grace period alarm to send SMS
|
// Set a grace period alarm to send SMS
|
||||||
int gracePeriod = sharedPref.getInt(context.getString(R.string.GracePeriodPref), 60);
|
int gracePeriod = sharedPref.getInt(context.getString(R.string.GracePeriodPref), 60);
|
||||||
|
|
||||||
|
@ -12,10 +12,6 @@ import android.widget.Toast;
|
|||||||
public class CancelGraceReceiver extends BroadcastReceiver {
|
public class CancelGraceReceiver extends BroadcastReceiver {
|
||||||
@Override
|
@Override
|
||||||
public void onReceive(Context context, Intent intent) {
|
public void onReceive(Context context, Intent intent) {
|
||||||
// Cancel notification if it's not already cancelled.
|
|
||||||
NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
|
|
||||||
nm.cancel(AlarmNotify.notifyID);
|
|
||||||
|
|
||||||
AlarmManager graceManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
AlarmManager graceManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
|
||||||
Intent graceIntent = new Intent(context, GraceReceiver.class);
|
Intent graceIntent = new Intent(context, GraceReceiver.class);
|
||||||
PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0);
|
PendingIntent gracePendingIntent = PendingIntent.getBroadcast(context, MainActivity.GRACE_REQUEST, graceIntent, 0);
|
||||||
|
@ -3,7 +3,6 @@ package za.org.treehouse.hypoalarm;
|
|||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.app.NotificationManager;
|
|
||||||
import android.app.PendingIntent;
|
import android.app.PendingIntent;
|
||||||
import android.app.TimePickerDialog;
|
import android.app.TimePickerDialog;
|
||||||
import android.content.ComponentName;
|
import android.content.ComponentName;
|
||||||
@ -115,10 +114,6 @@ public class MainActivity extends ActionBarActivity {
|
|||||||
editor.commit();
|
editor.commit();
|
||||||
|
|
||||||
if (!b) {
|
if (!b) {
|
||||||
// Cancel notification if it's not already cancelled.
|
|
||||||
NotificationManager nm = (NotificationManager) getActivity().getSystemService(NOTIFICATION_SERVICE);
|
|
||||||
nm.cancel(AlarmNotify.notifyID);
|
|
||||||
|
|
||||||
// Cancel any current alarm
|
// Cancel any current alarm
|
||||||
alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
|
alarmManager = (AlarmManager) getActivity().getSystemService(Context.ALARM_SERVICE);
|
||||||
Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
|
Intent alarmIntent = new Intent(getActivity(), AlarmReceiver.class);
|
||||||
@ -275,8 +270,6 @@ public class MainActivity extends ActionBarActivity {
|
|||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
sharedPref = PreferenceManager.getDefaultSharedPreferences(getActivity());
|
||||||
// Use the current set time as the default value for the picker
|
// Use the current set time as the default value for the picker
|
||||||
//String defaultTimeStr = alarmTimeButton.getText().toString();
|
|
||||||
//String alarmTimeStr = sharedPref.getString(getString(R.string.AlarmTimePref), defaultTimeStr);
|
|
||||||
String alarmTimeStr = alarmTimeButton.getText().toString();
|
String alarmTimeStr = alarmTimeButton.getText().toString();
|
||||||
Calendar cal = TimeStringToCalendar(alarmTimeStr);
|
Calendar cal = TimeStringToCalendar(alarmTimeStr);
|
||||||
int hour = cal.get(Calendar.HOUR_OF_DAY);
|
int hour = cal.get(Calendar.HOUR_OF_DAY);
|
||||||
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 4.8 KiB |
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 13 KiB |
Before Width: | Height: | Size: 31 KiB |