package com.qmusic.notification; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import com.qmusic.dal.AlarmTable; import com.qmusic.entities.BAlarm; import com.qmusic.uitls.BLog; public final class BAlarmHelper { static final String TAG = BAlarmHelper.class.getSimpleName(); public static void init(Context ctx) { AlarmTable alarmDAL = new AlarmTable(); schedule(ctx, alarmDAL); } public static void schedule(Context ctx, BAlarm alarm) { AlarmTable alarmDAL = new AlarmTable(); BAlarm al = alarmDAL.query(alarm.id); if (al == null) { alarmDAL.insert(alarm); } else { alarmDAL.update(alarm); } BAlarm current = alarmDAL.current(); if (current != null && current.time > alarm.time) { current.status = BAlarm.STATUS_SCHEDUE; alarmDAL.update(current); } schedule(ctx, alarmDAL); } public static void remove(Context ctx, long id) { AlarmTable alarmDAL = new AlarmTable(); BAlarm alarm = alarmDAL.query(id); if (alarm != null) { if (alarm.status == BAlarm.STATUS_SCHEDUING) { alarm.status = BAlarm.STATUS_CANCEL; alarmDAL.update(alarm); schedule(ctx, alarmDAL); } else if (alarm.status == BAlarm.STATUS_SCHEDUE) { alarm.status = BAlarm.STATUS_CANCEL; alarmDAL.update(alarm); } else { // Do nothing } } } public static void doAlarm(Context ctx, long id) { AlarmTable alarmDAL = new AlarmTable(); // BAlarm alarm = alarmDAL.current(); BAlarm alarm = alarmDAL.query(id); if (alarm != null && alarm.status != BAlarm.STATUS_CANCEL) { BNotification.notify(ctx, alarm.title, alarm.subTitle, null); alarm.status = BAlarm.STATUS_DONE; alarmDAL.update(alarm); schedule(ctx, alarmDAL); } } public static void shutdown(Context ctx) { AlarmManager am = (AlarmManager) ctx.getSystemService(Service.ALARM_SERVICE); Intent intent = new Intent(ctx, ScheduledReceiver.class); intent.putExtra(ScheduledReceiver.SCHEDULE_TYPE, ScheduledReceiver.SCHEDULE_ALARM); PendingIntent pi = PendingIntent.getBroadcast(ctx, ScheduledReceiver.SCHEDULE_ALARM, intent, PendingIntent.FLAG_UPDATE_CURRENT); am.cancel(pi); } private static void schedule(Context ctx, AlarmTable alarmDAL) { BAlarm nearestAlarm = alarmDAL.pop(); if (nearestAlarm != null) { Intent intent = new Intent(ctx, ScheduledReceiver.class); intent.putExtra(ScheduledReceiver.SCHEDULE_TYPE, ScheduledReceiver.SCHEDULE_ALARM); intent.putExtra("id", nearestAlarm.id); PendingIntent pi = PendingIntent.getBroadcast(ctx, ScheduledReceiver.SCHEDULE_ALARM, intent, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager am = (AlarmManager) ctx.getSystemService(Service.ALARM_SERVICE); BLog.i(TAG, "doAlarm title = " + nearestAlarm.title + " subTitle=" + nearestAlarm.subTitle); am.set(AlarmManager.RTC_WAKEUP, nearestAlarm.time, pi); nearestAlarm.status = BAlarm.STATUS_SCHEDUING; alarmDAL.update(nearestAlarm); } else { BLog.i(TAG, "has no alarm"); } } }