JavascriptProva

martedì 9 agosto 2016

Analisi del codice dell'Activity "Telefono".

Questo è il codice della schermata "Telefono":
public class Telefono extends Activity {

	AudioManager audioManager;
	Handler HndNonRisposta;
	Handler handler;
	String frase;
	Ringtone ringtone;
	TimerService mService;
	boolean mBound;
	Button bttRispondi, bttRifiuta;
	Helper helper;
	Timer timerNoRisposta;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_telefono);
		helper=new Helper(getApplicationContext());
		final AudioManager audioManager=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE);
//--------------------------------------------------------------------------------
		//GESTIONE DELLE STRINGHE
		Cursor crs=helper.query();
		if(crs.getCount()!=0){
			Random rnd=new Random();
			int indice=rnd.nextInt(crs.getCount());
			crs.moveToPosition(indice);
			frase=crs.getString(0);
		}else{
			frase="Questa è una frase di prova";
		}
	
		
//--------------------------------------------------------------------------------
		
		
		
//-------------------------------------------------------------------------------
		//SUONERIA
//---------------------------------------------------------------------------------

		Uri ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);
		ringtone=RingtoneManager.getRingtone(this, ringtoneUri);
		ringtone.play();

		bttRispondi=(Button)findViewById(R.id.button1);
		bttRifiuta=(Button)findViewById(R.id.button2);
		
		TimerTask noRisposta=new TimerTask(){

			@Override
			public void run() {
				ringtone.stop();
				mService.startTime();
				finish();
				
			}
			
		};
		timerNoRisposta=new Timer();
		timerNoRisposta.schedule(noRisposta, 10000);
		
//BOTTONE RISPOSTA

		bttRispondi.setOnClickListener(new View.OnClickListener() {
			
			
			@Override
			public void onClick(View v) {
				
				bttRispondi.setEnabled(false);
				bttRifiuta.setEnabled(false);
				timerNoRisposta.cancel();
				timerNoRisposta.purge();
				ringtone.stop();

				TimerTask tt=new TimerTask(){

					@Override
					public void run() {
						mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){

							@Override
							public void onUtteranceCompleted(String utteranceId) {
								audioManager.setSpeakerphoneOn(true);
								audioManager.setMode(AudioManager.MODE_NORMAL);
								mService.startTime();
								finish();
								
							}
							
						});
						HashMap map=new HashMap();
						map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "value");
						audioManager.setMode(AudioManager.MODE_IN_CALL);
						audioManager.setSpeakerphoneOn(false);
						mService.tts.speak(frase, TextToSpeech.QUEUE_FLUSH, map);
						
					}
					
				};
				Timer Timer = new Timer();
				Timer.schedule(tt, 1500);

			}
		});

//BOTTONE RIFIUTA

		bttRifiuta.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				timerNoRisposta.cancel();
				timerNoRisposta.purge();
				ringtone.stop();
				mService.startTime();
				finish();
				
			}
		});
	}
//-------------------------------------------------------------------------
	
	@Override
	public void onWindowFocusChanged(boolean hasFocus){
		if(!hasFocus){
			ringtone.stop();

		}else{
			ringtone.play();
		}	
	}
	
	
	@Override
	public void onStart(){
		super.onStart();
		Intent intent=new Intent(this,TimerService.class);
		bindService(intent,mConnection,Service.BIND_AUTO_CREATE);
	}
	
	@Override
	public void onStop(){
		super.onStop();
		if(mBound){
			unbindService(mConnection);
			mBound=false;
		}
	}
	
	ServiceConnection mConnection=new ServiceConnection(){

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			LocalBinder bnd=(LocalBinder)service;
			mService=bnd.getService();
			mBound=true;
		}

		@Override
		public void onServiceDisconnected(ComponentName name) {
			mBound=false;
		}
	};
}
Ci sono diversi "blocchi".
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_telefono); helper=new Helper(getApplicationContext()); final AudioManager audioManager=(AudioManager)this.getSystemService(Context.AUDIO_SERVICE); Qui, subito dopo l'inizio di onCreate, si inizializzano Helper, per la gestione del database, e AudioManager, per la gestione delle telefonate.

C'è poi la gestione delle stringhe, che sono state salvate nel database da un'altra schermata:
		//GESTIONE DELLE STRINGHE
		Cursor crs=helper.query();
		if(crs.getCount()!=0){
			Random rnd=new Random();
			int indice=rnd.nextInt(crs.getCount());
			crs.moveToPosition(indice);
			frase=crs.getString(0);
		}else{
			frase="Questa è una frase di prova";
		}


Ora c'è la suoneria: questo codice viene eseguito sul momento e innesca la suoneria:
//-------------------------------------------------------------------------------
		//SUONERIA
//---------------------------------------------------------------------------------

		Uri ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(this, RingtoneManager.TYPE_RINGTONE);
		ringtone=RingtoneManager.getRingtone(this, ringtoneUri);
		ringtone.play();


Ora, dopo l'istanziazione dei due buttons (che dovrei spostare prima) c'è la chiusura ritardata della suoneria nel caso in cui non vi sia risposta:

		bttRispondi=(Button)findViewById(R.id.button1);
		bttRifiuta=(Button)findViewById(R.id.button2);
		
		TimerTask noRisposta=new TimerTask(){

			@Override
			public void run() {
				ringtone.stop();
				mService.startTime();
				finish();
				
			}
			
		};
		timerNoRisposta=new Timer();
		timerNoRisposta.schedule(noRisposta, 10000);
Questo codice di interruzione della suoneria va a finire alla via finale comune: mService.startTime e finish().

Ed ecco quindi i codici dei pulsanti.
//BOTTONE RISPOSTA

		bttRispondi.setOnClickListener(new View.OnClickListener() {
			
			
			@Override
			public void onClick(View v) {
				
				bttRispondi.setEnabled(false);
				bttRifiuta.setEnabled(false);
				timerNoRisposta.cancel();
				timerNoRisposta.purge();
				ringtone.stop();

				TimerTask tt=new TimerTask(){

					@Override
					public void run() {
						mService.tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){

							@Override
							public void onUtteranceCompleted(String utteranceId) {
								audioManager.setSpeakerphoneOn(true);
								audioManager.setMode(AudioManager.MODE_NORMAL);
								mService.startTime();
								finish();
								
							}
							
						});
						HashMap map=new HashMap();
						map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "value");
						audioManager.setMode(AudioManager.MODE_IN_CALL);
						audioManager.setSpeakerphoneOn(false);
						mService.tts.speak(frase, TextToSpeech.QUEUE_FLUSH, map);
						
					}
					
				};
				Timer Timer = new Timer();
				Timer.schedule(tt, 1500);
Disabilita i pulsanti per evitarne pressioni accidentali con l'orecchio;
Elimina il task della non-risposta;
Blocca la suoneria;

Incapsula in un TimerTask tutto il codice per il parlato: dapprima il listener per il termine del parlato, quindi crea l'HashMap, imposta il microfono del cellulare e parla. Dopo il parlato OnUtteranceCompletedListener torna alla via finale comune mService.startTime e finish().


Quindi il pulsante "Rifiuta":
//BOTTONE RIFIUTA

		bttRifiuta.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				timerNoRisposta.cancel();
				timerNoRisposta.purge();
				ringtone.stop();
				mService.startTime();
				finish();
				
			}
		});
	}
Questo elimina il Task della "Non risposta", blocca la suoneria, e torna alla via finale comune mService.startTime e finish().

Mi sembra abbastanza stabile.
Quindi in pratica ogni evenienza esegue nell'ordine:
  1. Blocco della suoneria;
  2. mService.startTime;
  3. finish();
Fra i primi due si inserisce, nel caso di Risposta, il codice del parlato.

Nessun commento:

Posta un commento