Advertisement
Guest User

Thing

a guest
Jun 21st, 2012
568
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 5.60 KB | None | 0 0
  1. package com.nix.test.AutoStart.service;
  2.  
  3. import java.util.Date;
  4. import java.util.concurrent.Executors;
  5. import java.util.concurrent.ScheduledExecutorService;
  6. import java.util.concurrent.TimeUnit;
  7.  
  8. import com.nix.test.AutoStart.PhoneStateReceiver;
  9.  
  10. import android.app.Service;
  11. import android.content.Context;
  12. import android.content.Intent;
  13. import android.media.AudioManager;
  14. import android.media.ToneGenerator;
  15. import android.os.IBinder;
  16. import android.os.Vibrator;
  17. import android.util.Log;
  18.  
  19. import com.nix.java.audio.MicUtil;
  20.  
  21.  
  22. public class StatusUpdateService extends Service {
  23.  
  24.     @Override
  25.     public IBinder onBind(Intent intent) {
  26.         // TODO Auto-generated method stub
  27.         //new ToneGenerator(AudioManager.STREAM_MUSIC, ToneGenerator.MAX_VOLUME>>1).startTone(ToneGenerator.TONE_DTMF_8, 5000);    
  28.         return null;
  29.     }
  30.    
  31.     @Override
  32.     public void onCreate() {       
  33.         mic = new MicUtil();
  34.     }
  35.    
  36.     private ScheduledExecutorService _exec;
  37.    
  38.     private ScheduledExecutorService _execShutdown;
  39.    
  40.     private String lastKnownCallState;
  41.    
  42.     private MicUtil mic;
  43.    
  44.     private double totalDb; //the total DB  
  45.  
  46.     private short dbSampleCount; //the total number of DB samples taken
  47.    
  48.     private double dbAvg = 0; //average DB
  49.    
  50.     private long initTimeMs; // the time this call was initiated
  51.    
  52.     final public static int SERVICE_STATE_GETTING_AVG   = 1;
  53.     final public static int SERVICE_STATE_AWAITING_VOICE = 2;
  54.     final public static int SERVICE_STATE_ALERT_INTERVAL = 3;
  55.    
  56.    
  57.     private int serviceState;
  58.    
  59.     @Override
  60.     public int onStartCommand(Intent intent, int flags, int startId) {     
  61.         String action = intent.getAction();
  62.        
  63.         lastKnownCallState = action;
  64.        
  65.         Log.d("SERVICE", "onStartCommand " + action);
  66.        
  67.         if(action.equals(PhoneStateReceiver.INITIAL_START)){
  68.             resetValues();
  69.             Log.d("SERVICE", "Service started @" + initTimeMs);
  70.         } else if (action.equals(PhoneStateReceiver.CALL_OFFHOOK)){
  71.             Log.d("SERVICE", "Call offhook");
  72.             serviceState = SERVICE_STATE_GETTING_AVG;
  73.             setInterval();
  74.         } else if (action.equals(PhoneStateReceiver.CALL_IDLE)){
  75.              Log.d("SERVICE", "Call idle");
  76.              setIntervalShutDown();
  77.         }
  78.        
  79.         return START_STICKY;
  80.      }
  81.    
  82.     private void resetValues(){
  83.         initTimeMs = new Date().getTime();
  84.         totalDb = 0;
  85.         dbSampleCount = 0;
  86.         dbAvg = 0;
  87.     }
  88.  
  89.     private void interval(){
  90.         Log.d("SERVICE", "interval, last know state: " + lastKnownCallState);
  91.         if(lastKnownCallState.equals(PhoneStateReceiver.CALL_OFFHOOK)){
  92.             //Log.d("SERVICE", "BEEP!");
  93.             setInterval();     
  94.         } else {
  95.             setIntervalShutDown();
  96.         }
  97.     }
  98.    
  99.     public void setInterval(){
  100.  
  101.         Log.d("SERVICE", "setInterval");
  102.         Runnable runnable = new Runnable() {           
  103.             public void run() {
  104.                 // TODO make class property? re-use runnable?
  105.                 interval();
  106.             }
  107.         };
  108.        
  109.        
  110.         if(_exec == null || _exec.isShutdown() ){
  111.             Log.d("SERVICE", "Build scheduler");
  112.             _exec = Executors.newScheduledThreadPool(1);
  113.         };     
  114.        
  115.         long delay = 1000;
  116.         double db;
  117.        
  118.         switch(serviceState){
  119.         case SERVICE_STATE_GETTING_AVG:
  120.             db = getDbLevel();
  121.             totalDb += db;
  122.             dbSampleCount++;
  123.             Log.d("SERVICE", "SERVICE_STATE_GETTING_AVG, totalDb:" + totalDb + ", dbSampleCount:" + dbSampleCount);
  124.             if(dbSampleCount > 10){
  125.                 //double avg = totalDb / dbSampleCount;            
  126.                 serviceState = SERVICE_STATE_AWAITING_VOICE;
  127.                 dbAvg = totalDb / dbSampleCount;
  128.                 Log.d("SERVICE", "10 samples calculated! :) avg:" + dbAvg);
  129.             }
  130.             delay = 250;
  131.             break;
  132.         case SERVICE_STATE_AWAITING_VOICE:
  133.             Date date = new Date();
  134.             if(date.getTime() > initTimeMs + (max_voiceWaitTime() * 1000 ) ){                      
  135.                 Log.d("SERVICE", "max time exceeded");
  136.                 serviceState = SERVICE_STATE_ALERT_INTERVAL;           
  137.             } else {
  138.                 db = getDbLevel();
  139.                 Log.d("SERVICE", "SERVICE_STATE_AWAITING_VOICE, current db:" + db + ", avg:" + dbAvg);
  140.                 if(db > (dbAvg + 11) ) {
  141.                     Log.d("SERVICE", "average exceeded! :)");
  142.                     serviceState = SERVICE_STATE_ALERT_INTERVAL;
  143.                 }
  144.             }
  145.             delay = 500;
  146.             break;
  147.         case SERVICE_STATE_ALERT_INTERVAL:
  148.             Log.d("SERVICE", "SERVICE_STATE_ALERT_INTERVAL");
  149.             alertInterval();           
  150.             delay = next_AlertInterval() * 1000;
  151.             break;
  152.         }
  153.  
  154.         Log.d("SERVICE", "Schedule new task");
  155.         _exec.schedule(runnable, delay, TimeUnit.MILLISECONDS);
  156.        
  157.     }
  158.    
  159.     public void alertInterval(){
  160.         Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);  
  161.          
  162.         // 1. Vibrate for 1000 milliseconds  
  163.         long milliseconds = 50;  
  164.         v.vibrate(milliseconds);
  165.        
  166.         new ToneGenerator(AudioManager.STREAM_VOICE_CALL, 100/*TODO make option variable*/).startTone(ToneGenerator.TONE_DTMF_4, 500);
  167.     }
  168.    
  169.     public int next_AlertInterval(){
  170.         //Todo: get "alert seconds before minute"(x) from settings, to 60-(x)
  171.         return 50;
  172.     }
  173.    
  174.     public int max_voiceWaitTime(){
  175.         //Todo read from local settings
  176.         return 15;
  177.     }
  178.    
  179.     public void setIntervalShutDown(){
  180.         if(_execShutdown != null){     
  181.             _execShutdown.shutdownNow(); //cancel current shutdown taksk to reset the timer
  182.         }
  183.        
  184.         _execShutdown = Executors.newScheduledThreadPool(1); //always create a new shutdown thread
  185.        
  186.         Runnable runnable = new Runnable() {
  187.            
  188.             public void run() {
  189.                 // TODO Auto-generated method stub
  190.                 Log.d("SERVICE", "Start shutdown task");
  191.                 intervalShutdown();
  192.             }
  193.         };
  194.        
  195.         _execShutdown.schedule(runnable, 4, TimeUnit.SECONDS); 
  196.        
  197.     }
  198.    
  199.     public void intervalShutdown(){
  200.        
  201.         Log.d("SERVICE", "intervalShutdown");
  202.          _exec.shutdownNow(); //stop tasks
  203.          _execShutdown.shutdownNow();
  204.          stopSelf(); // stop service
  205.     }
  206.    
  207.     private double getDbLevel(){
  208.         double db = mic.getDB();
  209.         Log.d("SERVICE", "DB:"  + db);
  210.         return db;
  211.     }
  212.  
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement