JavascriptProva

domenica 7 agosto 2016

Revisione critica dei settings per gli intervalli nella mia CoachCall.

Ripercorriamo il percorso delle SharedPreferences nella mia app...

Si apre MainActivity.
In onStart si avvia e si binda il Service:
 public void onStart() {
  super.onStart();

  Intent intent = new Intent(this, TimerService.class);
  startService(intent);
  bindService(intent, mConnection, Service.BIND_AUTO_CREATE);
 }
Il Service, una volta attivo, crea SharedPreferences:
public class TimerService extends Service {

 SharedPreferences SP; 
 
 public TextToSpeech tts;
 
 OnAlarmChangeListener onAlarmChangeListener;
 boolean alarmOn;

 Handler handler=new Handler();
 IBinder mBinder=new LocalBinder();
 
 @Override
 public void onCreate(){

 
  Intent intent=new Intent(this,MainActivity.class);
  PendingIntent pi=PendingIntent.getActivity(this, 0, intent, 0);
  Notification notification=new NotificationCompat.Builder(this)
    .setSmallIcon(R.drawable.cornetta)
    .setContentTitle("CoachCall")
    .setContentText("Telefonate dal Coach")
    .setContentIntent(pi).build();
  startForeground(1,notification);
    
  
  SP=getApplicationContext().getSharedPreferences("settings", Context.MODE_PRIVATE);
  SharedPreferences.Editor editor= SP.edit();
  editor.putInt("intervalloMin", 10);
  editor.putInt("intervalloMax", 10);
  editor.commit();
Qui viene direttamente impostato intervalloMin e intervalloMax.
Quindi in startTime, ossia quando già onCreate è stato chiamato, si usano intervalloMin e intervalloMax:
 public void startTime(){
  int intervalloMin=SP.getInt("intervalloMin", 0);
  int intervalloMax=SP.getInt("intervalloMax", 0);
  int delta=intervalloMax-intervalloMin;
  Random rnd=new Random();
  int differenza=(intervalloMax==intervalloMin)? 0 : rnd.nextInt(delta);
  int intervallo=intervalloMin+differenza;
  Runnable runnable=new Runnable(){

   @Override
   public void run() {
    Intent intent =new Intent(getApplicationContext(),Telefono.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    startActivity(intent);
    
   }
   
  };
  handler.postDelayed(runnable, intervallo*1000);
  alarmOn=true;
  if(onAlarmChangeListener!=null)onAlarmChangeListener.AlarmChange();
 }

Quando si apre l'activity Impostazioni degli Intervalli, ecco il codice:
  SP=getApplicationContext().getSharedPreferences("settings",Context.MODE_PRIVATE);
  seekBar1=(SeekBar)findViewById(R.id.seekBar1);
  seekBar2=(SeekBar)findViewById(R.id.seekBar2);
  textView1=(TextView)findViewById(R.id.textView1);
  textView2=(TextView)findViewById(R.id.textView2);
  //codice che setta le seekBars in relazione ai valori letti nelle impostazioni
  
  seekBar1.setMax(230);
  intervalloMin=SP.getInt("intervalloMin", 10);
  setTextViewFromSeekBar(intervalloMin,textView1);
  seekBar1.setProgress(intervalloMin-10);
  
  seekBar2.setMax(230);
  intervalloMax=SP.getInt("intervalloMax", 10);
  setTextViewFromSeekBar(intervalloMax,textView2);
  seekBar2.setProgress(intervalloMax-10);
All'atto della regolazione degli intervalli, il valore che viene preso in caso di settings non inizializzati è 10.
In base a questo vengono compilati le TextView con i valori e le seekBars, la cui posizione viene settata a 10 in meno, in modo che per un valore di 10 vengano settate effettivamente a 0.
Il punto centrale è quello dell'utilizzo dei settings nella funzione setTime di TimerService.
Un codice come questo
  SharedPreferences.Editor editor= SP.edit();
  editor.putInt("intervalloMin", 10);
  editor.putInt("intervalloMax", 10);
  editor.commit();
seguito da questo che preleva i dati per l'utilizzo effettivo in startTime
 public void startTime(){
  int intervalloMin=SP.getInt("intervalloMin", 0);
  int intervalloMax=SP.getInt("intervalloMax", 0);
  int delta=intervalloMax-intervalloMin;
  Random rnd=new Random();
  int differenza=(intervalloMax==intervalloMin)? 0 : rnd.nextInt(delta);
  int intervallo=intervalloMin+differenza;
  Runnable runnable=new Runnable(){

   @Override
   public void run() {
    Intent intent =new Intent(getApplicationContext(),Telefono.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    intent.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    startActivity(intent);
    
   }
   
  };
non ha senso: meglio togliere l'impostazione iniziale e prendere direttamente come 10 il valore in startTime se il setting non è inizializzato.
Ossia, il primo diventa:
  SP=getApplicationContext().getSharedPreferences("settings", Context.MODE_PRIVATE);
mentre in startTime:
 public void startTime(){
  int intervalloMin=SP.getInt("intervalloMin", 10);
  int intervalloMax=SP.getInt("intervalloMax", 10);
  int delta=intervalloMax-intervalloMin;
  Random rnd=new Random();
....
Quindi quando andremo a regolare gli intervalli, lasciando tutto inalterato...
  seekBar1.setMax(230);
  intervalloMin=SP.getInt("intervalloMin", 10);
  setTextViewFromSeekBar(intervalloMin,textView1);
  seekBar1.setProgress(intervalloMin-10);
  
  seekBar2.setMax(230);
  intervalloMax=SP.getInt("intervalloMax", 10);
  setTextViewFromSeekBar(intervalloMax,textView2);
  seekBar2.setProgress(intervalloMax-10);
in caso di non inizializzazione dei settings, l'intervallo preso per buono sarà 10, che andrà messo pari pari nelle TextView mentre seekBars saranno settate al valore -10, ossia a zero.
Una volta che invece con le seekBars sarà settato un valore diverso, questo sarà quello utilizzato in startTime del Service, e quello letto dai settings nel form per la regolazione degli intervalli, sempre settando le seekBars al valore sottratto di 10.

Nessun commento:

Posta un commento