package cri.sanity; import java.io.BufferedReader; import java.io.InputStreamReader; import java.text.SimpleDateFormat; import java.util.Calendar; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import cri.sanity.util.*; public final class PickupService extends Service implements Runnable { private static final int OFFHOOK_TIMEOUT = 6*1000; private static final int TASK_TIMEOUT = 120*1000; private static final int TASK_ID = Task.idNew(); private static boolean running = false; private static volatile boolean terminate = false; private static volatile boolean notified = false; private static final Object monitor = new Object(); //---- static api public static void start() { if(running) return; terminate = false; notified = false; final Context ctx = A.app(); ctx.startService(new Intent(ctx, PickupService.class)); } public static void stop() { if(!running) return; terminate = true; synchronized(monitor) { monitor.notifyAll(); } final Context ctx = A.app(); ctx.stopService(new Intent(ctx, PickupService.class)); Task.stop(TASK_ID); } public static void notifyOffhook() { synchronized(monitor) { notified = true; monitor.notifyAll(); } } //---- Service implementation @Override public IBinder onBind(Intent i) { return null; } @Override public int onStartCommand(Intent i, int flags, int id) { if(i==null || running) return START_STICKY; running = true; new Thread(this).start(); new Task(){ public void run(){ stop(); }}.exec(TASK_ID, TASK_TIMEOUT); return START_STICKY; } @Override public void onDestroy() { running = false; super.onDestroy(); } //---- Runnable implementation @Override public void run() { Process logProc = null; BufferedReader br = null; final SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); final Calendar cal = Calendar.getInstance(); final String year = cal.get(Calendar.YEAR) + "-"; final long now = A.time(); synchronized(monitor) { if(!notified) { try { monitor.wait(OFFHOOK_TIMEOUT); } catch(InterruptedException e) {} if(!notified || terminate) { stop(); return; } } notified = false; } try { logProc = Runtime.getRuntime().exec("logcat -b radio -v time"); br = new BufferedReader(new InputStreamReader(logProc.getInputStream()), 8192); for(String line; !terminate && (line=br.readLine())!=null;) { if(!line.contains("GET_CURRENT_CALLS") || !line.contains("ACTIVE")) continue; try { cal.setTimeInMillis(df.parse(year + line.substring(0, 14)).getTime()); if(cal.getTimeInMillis() < now) continue; Vibra.vibra(); break; } catch(Exception e) {} } } catch(Exception e) {} if(br != null) try { br.close(); } catch(Exception e) {} if(logProc != null) try { logProc.destroy(); } catch(Exception e) {} stop(); } }