package cri.sanity; import cri.sanity.util.*; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.os.Bundle; import android.os.SystemClock; public final class Alarmer extends BroadcastReceiver { public static final String ACT_SILENTLIMIT = "actSilentLimit"; public static final String ACT_FLIGHTOFF = "actFlightOff"; public static final String ACT_SETPROFILE = "actSetProfile"; public static final String ACT_ONIDLE = "actOnIdleAsync"; public static final String ACT_BOOT = "actBootAsync"; public static final String EXTRA_PROFILE = "prf"; private static final int RETRY_TIME = 60*1000; private Context ctx; private Bundle extras; public Alarmer() {} public Alarmer(Bundle extras) { this.extras = extras; } //---- receiver implementation @Override public void onReceive(Context ctx, Intent i) { if(i == null) return; final String action = i.getAction(); if(action == null) return; if(action.endsWith("Async")) runService(i); else { this.ctx = ctx; this.extras = i.getExtras(); runAction(action); } } //---- public api public static final void exec(String action, long delay) { exec(action, null, delay, true); } public static final void exec(String action, long delay, boolean replace) { exec(action, null, delay, replace); } public static final void exec(String action, Bundle extras, long delay, boolean replace) { final PendingIntent pi = alarmIntent(action, extras); final AlarmManager am = A.alarmMan(); if(replace) am.cancel(pi); am.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+delay, pi); } public static void stop(String action) { A.alarmMan().cancel(alarmIntent(action)); } public static void runService(String action, Bundle extras) { final Intent i = new Intent(action); if(extras != null) i.putExtras(extras); runService(i); } public final static void runService(Intent i) { final Context ctx = A.app(); i.setClass(ctx, AlarmService.class); ctx.startService(i); } //---- private api public void runAction(String action) { try { Alarmer.class.getMethod(action).invoke(this); } catch(Exception e) {} } private static PendingIntent alarmIntent(String action) { return alarmIntent(action, null); } private static PendingIntent alarmIntent(String action, Bundle extras) { final Context ctx = A.app(); Intent i = new Intent(ctx, Alarmer.class); i.setAction(action); if(extras != null) i.putExtras(extras); return PendingIntent.getBroadcast(ctx, 0, i, PendingIntent.FLAG_ONE_SHOT); } //---- actions public final void actSilentLimit() { if(PhoneListener.isRunning()) exec(ACT_SILENTLIMIT, RETRY_TIME); else { ModeReceiver.skip = true; A.audioMan().setRingerMode(AudioManager.RINGER_MODE_NORMAL); A.notifyCanc(ModeActivity.NID_SILENT); } } public final void actFlightOff() { if(PhoneListener.isRunning() || !Dev.isFlightModeOn()) return; ModeReceiver.skip = true; Dev.enableFlightMode(false); A.notifyCanc(ModeActivity.NID_FLIGHT); } public final void actSetProfile() { if(extras == null) return; final String prf = extras.getString(EXTRA_PROFILE); if(A.empty(prf)) return; // TODO //P.load A.toast(ctx, String.format(A.s(R.string.msg_prf_restore_ok), prf)); } public final void actOnIdleAsync() { if(A.is(K.REC)) RecService.cron(); if(A.is(K.QUICK_START) && !BootService.isRunning()) A.app().startService(new Intent(A.app(), BootService.class)); } public final void actBootAsync() { actOnIdleAsync(); } }