package cri.sanity.util; import java.io.FileWriter; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import cri.sanity.*; import cri.sanity.screen.*; public final class Blocker { public static final char SEP = Conf.BLOCK_SEP; public static final int MODE_HANGUP = 0; public static final int MODE_RADIO = 1; public static final int MODE_SILENT = 2; public static final int MODE_ANSWER = 3; private static final int MODE_NONE = -1; private static final int NID = 3; private static final int ANSWER_TIMEOUT = 60*1000; private static int mode = MODE_NONE; private static boolean pickup; private static String name, num; //---- public api //public static final boolean isBlocking() { return mode != MODE_NONE; } public static final boolean apply(int blockMode) { name = num = null; switch(blockMode) { case MODE_HANGUP: if(pickup = A.is(K.BLOCK_PICKUP)) Dev.answerCall(); else if(!Dev.endCall()) { blockFailed(); return false; } break; case MODE_RADIO: if(pickup = A.is(K.BLOCK_PICKUP)) Dev.answerCall(); else if(!Dev.enableFlightMode(true)) { blockFailed(); return false; } break; case MODE_SILENT: final PhoneListener pl = PhoneListener.getActiveInstance(); if(pl==null || !pl.changeRinger(AudioManager.RINGER_MODE_SILENT, AudioManager.VIBRATE_SETTING_OFF)) return false; new Task(){ public void run(){ Dev.lock(); }}.exec(Conf.BLOCK_LOCK_DELAY); break; case MODE_ANSWER: Dev.answerCall(); break; default: blockFailed(); return false; } mode = blockMode; return true; } public static final boolean onOffhook() { switch(mode) { case MODE_NONE: return false; case MODE_HANGUP: if(pickup) { if(!Dev.endCall()) blockFailed(); } break; case MODE_RADIO: if(pickup) { if(!Dev.enableFlightMode(true)) blockFailed(); } break; case MODE_SILENT: break; case MODE_ANSWER: final Runnable runMute = new Runnable(){ public void run(){ final AudioManager am = A.audioMan(); am.setMode(AudioManager.MODE_NORMAL); am.setStreamMute(AudioManager.STREAM_VOICE_CALL, true); am.setStreamSolo(AudioManager.STREAM_ALARM, true); am.setMicrophoneMute(true); }}; runMute.run(); BlankActivity.postSingleton(runMute); BlankActivity.postSingleton(new Runnable(){ public void run(){ Dev.lock(); }}); Intent i = new Intent(A.app(), BlankActivity.class); i.putExtra(BlankActivity.EXTRA_BLOCK, true); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); A.app().startActivity(i); new Task(){ public void run(){ Dev.endCall(); }}.exec(ANSWER_TIMEOUT); break; default: return false; } return true; } public static final void shutdown() { Alarmer.stop(Alarmer.ACT_FLIGHTOFF); switch(mode) { case MODE_HANGUP: case MODE_SILENT: break; case MODE_RADIO: final int delay = A.geti(K.BLOCK_RESUME); if(delay > 0) Alarmer.exec(Alarmer.ACT_FLIGHTOFF, delay); else Dev.enableFlightMode(false); break; case MODE_ANSWER: final AudioManager am = A.audioMan(); am.setMode(AudioManager.MODE_NORMAL); am.setStreamSolo(AudioManager.STREAM_ALARM, false); am.setStreamMute(AudioManager.STREAM_VOICE_CALL, false); am.setMicrophoneMute(false); //am.setMode(AudioManager.MODE_IN_CALL); final BlankActivity ba = BlankActivity.getInstance(); if(ba != null) ba.postFinish(); break; default: return; } if(A.is(K.BLOCK_NOTIFY)) notification(false); log(); Dev.lock(); mode = MODE_NONE; } public static final void notification(boolean sms) { String msg = A.name()+": "+A.s(sms? R.string.blocksms_cat : R.string.block_cat); String title = name(); if(num.length() > 0) title += " (" + num + ')'; final Context ctx = A.app(); Intent i = new Intent(ctx, sms? SmsHistoryActivity.class : CallHistoryActivity.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); Notification notif = new Notification(R.drawable.ic_block_bar, msg, A.time()); notif.flags = Notification.FLAG_AUTO_CANCEL; notif.setLatestEventInfo(ctx, title, msg, PendingIntent.getActivity(ctx, 0, i, 0)); A.notifMan().notify(NID, notif); } //---- private api private static void blockFailed() { A.notify(A.s(R.string.err_block)); mode = MODE_NONE; } private static void log() { try { final FileWriter fw = new FileWriter(A.sdcardDir()+'/'+Conf.BLOCK_FN, true); fw.append(A.date() + SEP + name() + SEP + num() + '\n'); fw.flush(); fw.close(); } catch(Exception e) {} } private static String num () { if(num == null) readNameNum(); return num ; } private static String name() { if(name == null) readNameNum(); return name; } private static void readNameNum() { final CallFilter cf = PhoneListener.isRunning() ? CallFilter.instance() : SmsReceiver.callFilter(); num = cf.lastNum(); if(num == null) num = ""; if(num.length() <= 0) name = A.s(R.string.anonymous); else { name = cf.searchName(num); if(A.empty(name)) name = A.s(R.string.unknown); } } }