JavascriptProva

sabato 15 ottobre 2016

Introduzione alle date

Conversione string a date e viceversa.
Provo da String a Date.
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                String stringa="5/9/1961";
                Date dat;

                SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
                try {
                    dat = sdf.parse(stringa);
                    System.out.println(dat);
                }catch(Exception e){}

            }
        });
10-15 11:05:55.197 3169-3169/? I/System.out: Tue Sep 05 00:00:00 CET 1961

E da data a stringa?
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                String str;
                Date dat=new Date();

                SimpleDateFormat sdf=new SimpleDateFormat("dd/MM/yyyy");
                str=sdf.format(dat);
                System.out.println(str);



            }
        });
10-15 12:05:05.077 5762-5762/? I/System.out: 15/10/2016

Bene.
Leggo che al posto di Date, per ottenere una data, si dovrebbe usare Calendar.
Cerchiamo di capire qualcosa sul suo uso.

Mi conviene fare e basta.
Dunque... io voglio cancellare un record del database che ha una data superiore a quella del 1 ottobre.
Prendo il record e ne tiro fuori la data, come stringa.
Come faccio a sapere se questa data è posteriore al 1 ottobre?
Innanzitutto creo un'istanza di Calendar.
Calendar calendar= Calendar.getInstance();
Ecco, adesso vedo se è possibile ottenere un tipo Date da Calendar:
                Calendar calendar= Calendar.getInstance();
                Date domani=calendar.getTime();
10-15 12:57:31.565 11035-11035/? I/System.out: Sat Oct 15 12:57:31 CEST 2016
Sì, è la data di oggi.

venerdì 14 ottobre 2016

Codice per la scelta e l'esecuzione di una suoneria personalizzata per la notifica dell'activity col bersaglio

Devo aggiungere all'activity Seconda un segnale acustico.
Non ricordo bene, ricordo che l'elemento chiave è RingtoneManager.
Vediamo...

Devo scrivere il codice per la scelta di una suoneria. Dove lo metto? Creo un'activity a parte, per il momento.

Ecco, ho creato la nuova activity SetSound, e ho impostato il codice in questo modo:
public class SetSounds extends AppCompatActivity {

    Button bttPickSound;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_sounds);

        bttPickSound=(Button) findViewById(R.id.button5);
        bttPickSound.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
                startActivityForResult(intent,0);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),uri);
        ringtone.play();
    }
}
Funziona: mi consente di scegliere la suoneria.

Ora devo vedere come impostare la suoneria come default...

Seguo questo link per impostare una suoneria come default.

Ecco, intanto seguendo l'autotutorial ho scritto questo, che dovrebbe impostare tutte le suonerie di tipo NOTIFICATION a quella scelta da me ora.
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),uri);
        RingtoneManager.setActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_NOTIFICATION,uri);
    }
Ora però io vorrei l'impostazione della suoneria alla sola applicazione, e non per tutte le notifiche.
Facciamo la prova se così si impostano tutte le suonerie di tipo notifiche.
Al momento io ho come notifica generale impostata la suoneria Skyline (assumendo sia in DO, è quella col suono "DO MI DO+ SI SOL").
Provo a cambiarla facendo girare l'applicazione...

E ci vuole permission.WRITE_SETTINGS, che provvedo a scrivere in Manifest, quindi riprovo...

Sì, perfetto!

Ora devo cambiarla in modo personalizzato.
Seguo questo autotutorial

La tecnica è quella di ripescare dalle SharedPreferences la suoneria, con un default stringa vuota.
Se non è vuota, allora Uri.parse la stringa risultante.
Per l'impostazione, porre in SharedPreferences Uri.toString.

Proviamo...

Il codice per l'impostazione, sull'activity SetSounds:
public class SetSounds extends AppCompatActivity {

    SharedPreferences SP;
    Button bttPickSound;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_sounds);

        SP=getApplicationContext().getSharedPreferences("suonerie", Context.MODE_PRIVATE);
        bttPickSound=(Button) findViewById(R.id.button5);
        bttPickSound.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Intent intent=new Intent(RingtoneManager.ACTION_RINGTONE_PICKER);
                intent.putExtra(RingtoneManager.EXTRA_RINGTONE_TYPE, RingtoneManager.TYPE_NOTIFICATION);
                startActivityForResult(intent,0);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data){
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),uri);
        SharedPreferences.Editor editor=SP.edit();
        editor.putString("suoneria",uri.toString());
        editor.commit();

    }
}


Il codice per la lettura, sull'activity Seconda:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seconda);
        SP = this.getSharedPreferences("intervalli",Context.MODE_PRIVATE);
        SP2=this.getSharedPreferences("suonerie",Context.MODE_PRIVATE);


        vibrator=(Vibrator)this.getSystemService(Context.VIBRATOR_SERVICE);

        //codice per il rilevamento e l'esecuzione della suoneria personalizzata
        //(a ogni comparsa dell'activity col bersaglio)

        String strSuoneria=SP2.getString("suoneria","");
        if(TextUtils.isEmpty(strSuoneria)){
            ringtoneUri= RingtoneManager.getActualDefaultRingtoneUri(getApplicationContext(),RingtoneManager.TYPE_NOTIFICATION);
        }else{
            ringtoneUri=Uri.parse(strSuoneria);
        }
        Ringtone ringtone=RingtoneManager.getRingtone(getApplicationContext(),ringtoneUri);
        ringtone.play();
        //fine codice per rilevamento ed esecuzione della suoneria personalizzata.

Aggiunta pulsanti all'activity Seconda

Sull'activity Seconda devo rendere i due pulsanti invisibili di base e visualizzabili solo dietro pressione dei pulsanti circolari, facendoli sparire solo dietro pressione del tasto "annulla".
Procedo...

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button"
        android:visibility="invisible"
        android:layout_below="@+id/quattro"
        android:layout_marginTop="50dp"
        android:layout_alignEnd="@+id/quattro" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button4"
        android:visibility="invisible"
        android:layout_alignBottom="@+id/button"
        android:layout_toStartOf="@+id/button" 
        android:layout_marginRight="100dp"/> 
Ora si rendono visibili ambedue da codice:
faccio un esempio per tutti, il touch sul cerchio "uno":
    public void touchUno(){
        GradientDrawable gd = (GradientDrawable) uno.getBackground();
        gd.setColor(Color.BLUE);
        try {
            if (mp.isPlaying()) {
                mp.stop();
                mp.release();
                mp = MediaPlayer.create(context, R.raw.button);
            }
            mp.start();
        }catch(Exception e){e.printStackTrace();}
        bttAnnulla.setVisibility(View.VISIBLE);
        bttInvio.setVisibility(View.VISIBLE);
        bttInvio.setBackgroundColor(0xffffffff);
    }
definendo successivamente il listener per bttAnnulla...
Vediamo intanto se funziona...

Funziona.
Ora setto il listener per bttAnnulla e buonanotte!
        bttAnnulla.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                bttInvio.setVisibility(View.INVISIBLE);
                bttAnnulla.setVisibility(View.INVISIBLE);
            }
        });
E lo sperimentiamo...

Funziona.

giovedì 13 ottobre 2016

Forme particolari per i buttons.

Ora devo affrontare lo studio di come si possa dare a un button una forma complessa.

Ho creato due immagini in drawable.
Ora creo un file selector.
In esso vanno degli item.
Proviamo...

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <bitmap android:src="@drawable/stellarossa" />
    </item>

    <item>
        <bitmap android:src="@drawable/stella" />
    </item>
</selector> 
E vediamo se e come funziona...
Basterebbe solo impostare il background.
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="New Button"
        android:id="@+id/button2"
        android:background="@drawable/tasto"
        android:layout_centerVertical="true"
        android:layout_centerHorizontal="true" /> 
Funziona! Ed è possibile, inoltre, fare dei pulsanti animati!

Custom Listener e Alarm On

Ora dovrei provare, come ho già fatto in passato, a creare una funzione booleana che attesti se il meccanismo Alarm è attivo o no.
Il fatto che un Alarm sia attivo dipende, se ricordo bene, dal PendingIntent.
Si chiama il PendingIntent con una flag impostata a NO_CREATE per vedere se esiste. Cerchiamo di riscrivere la cosa...

Mi sono assicurato che gli intent lavorino bene anche con questa formula:
                intent=new Intent(getApplicationContext(),Seconda.class);
                pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
                alarmManager=(AlarmManager)getApplicationContext().getSystemService(ALARM_SERVICE);
                alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime()+intervalloCasuale*1000,pendingIntent);
e pare che non ci siano problemi: l'activity Seconda si presenta regolarmente all'elapse degli intervalli casuali.
Ora devo scrivere la funzione AlarmOn che individua l'Alarm congegnato con quell'intent e quel pendingIntent, in qualunque activity sia stato implementato, a quanto pare.
Eccola:
    public boolean AlarmOn(){
        intent=new Intent(getApplicationContext(),Seconda.class);
        boolean risultato=PendingIntent.getActivity(getApplicationContext(),0,intent,PendingIntent.FLAG_NO_CREATE)!=null;
        return risultato;
    }
Ora devo fare in modo che quando si apre MainActivity vi appaia il valore di AlarmOn.
Proviamo...

Ci metto una TextView.

Il risultato era sempre true, perché ho sbagliato la sintassi della funzione AlarmOn.
Quella corretta è:
    public boolean AlarmOn(){
        intent=new Intent(getApplicationContext(),Seconda.class);
        boolean risultato=(PendingIntent.getActivity(getApplicationContext(),0,intent,PendingIntent.FLAG_NO_CREATE)!=null);
        return risultato;
    }
Con questa, inizia con false, quindi una volta che si è attivato l'alarm resta sempre true.
Bisogna definire la funzione che disattiva l'alarm e vedere come attivarla.
Posso farla dipendere da un altro pulsante su MainActivity.
Inserisco un altro button.
Ecco il listener: ci devo aggiungere il codice che, annullando il pendingIntent, annulla l'Alarm.
        buttonStop.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                
            }
        });
Ricopio pari pari il codice che stabilisce Intent, PendingIntent e AlarmManager:
        buttonStop.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                intent=new Intent(getApplicationContext(),Seconda.class);
                pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
                alarmManager=(AlarmManager)getApplicationContext().getSystemService(ALARM_SERVICE);

            }
        });
E poi ci aggiungo il codice che cancella il PendingIntent:
        buttonStop.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                intent=new Intent(getApplicationContext(),Seconda.class);
                pendingIntent=PendingIntent.getActivity(getApplicationContext(),0,intent,0);
                alarmManager=(AlarmManager)getApplicationContext().getSystemService(ALARM_SERVICE);
                alarmManager.cancel(pendingIntent);
                if(pendingIntent!=null)pendingIntent=null;
            }
        });
E vediamo se il ciclo si interrompe.
Devo settarlo a pochi secondi altrimenti lo studio è una palla tremenda!

Sembra che sia tutto OK.
Posso creare un listener per lo status dell'Alarm.
Ci provo.
Fatto e funziona tutto!

Estrazione di numero casuale fra gli intervalli di tempo minimo e massimo.

Bene.
A questo punto devo estrarre un numero casuale compreso fra due numeri interi.
Proviamo...

Ripassati i numeri casuali, vado a estrarre, appena si apre la schermata Seconda, il valore minimo e il valore massimo dagli intervalli selezionati.
Ecco il codice:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seconda);

        SP = this.getSharedPreferences("intervalli",Context.MODE_PRIVATE);
        int intervalloMinimo=SP.getInt("intervalloMin",10);
        int intervalloMassimo=SP.getInt("intervalloMax",10);
Corrisponde ai valori salvati sulle seekBars.
Ora voglio estrarre un numero casuale fra questi due.
Ecco il mio codice, che mi consente di controllare il valore ogni volta che si apre l'activity Seconda:
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_seconda);

        SP = this.getSharedPreferences("intervalli",Context.MODE_PRIVATE);
        int intervalloMinimo=SP.getInt("intervalloMin",10);
        int intervalloMassimo=SP.getInt("intervalloMax",10);
        int intervalloCasuale;
        if(intervalloMassimo==intervalloMinimo) {
            intervalloCasuale = intervalloMassimo;
        }
        else {
            Random r=new Random();
            intervalloCasuale=r.nextInt(intervalloMassimo-intervalloMinimo)+intervalloMinimo;
        }

        System.out.println("ESTREMI: "+intervalloMinimo+"; "+intervalloMassimo+", INTERVALLO CASUALE "+intervalloCasuale);
Derivo dalla memoria un intervallo minimo e uno massimo. Calcolo un numero casuale compreso fra i due.
Mi metto a video l'intervallo minimo e l'intervallo massimo, facendo attenzione che i valori calcolati non superino il primo in basso e il secondo in alto, e pare che stiamo facendo un lavoro egregio.
Ecco i risultati:
10-13 17:27:34.252 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 34
10-13 17:27:56.052 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 61
10-13 17:28:05.202 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 57
10-13 17:28:14.792 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 87
10-13 17:29:56.402 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 100
10-13 17:30:04.862 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 69
10-13 17:30:27.062 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 42
10-13 17:30:34.032 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 102
10-13 17:30:40.822 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 41
10-13 17:30:47.542 19814-19814/? I/System.out: ESTREMI: 30; 110, INTERVALLO CASUALE 39
Provo a rimaneggiare le impostazioni di tempo... le porto a minimo 1 ora e massimo 2 ore.
Vediamo...
10-13 17:35:48.952 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 80
10-13 17:35:57.222 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 108
10-13 17:36:04.162 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 79
10-13 17:36:11.412 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 110
10-13 17:36:18.212 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 97
10-13 17:36:24.592 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 96
10-13 17:36:30.932 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 90
10-13 17:36:37.242 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 97
10-13 17:36:43.542 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 100
10-13 17:36:49.902 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 86
10-13 17:36:56.212 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 106
10-13 17:37:02.702 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 62
10-13 17:37:09.352 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 67
10-13 17:37:16.112 21034-21034/? I/System.out: ESTREMI: 60; 120, INTERVALLO CASUALE 115
Sì, credo sia proprio affidabile!
Ora devo inserire il calcolo casuale negli intervalli fra le riaperture dell'activity Seconda...

Aggiustamento seekBars: memorizzazione dei settaggi di tempo in SharedPreferences

Il passo successivo è memorizzare i valori.
Ho dimenticato completamente come si utilizzano le SharedPreferences.
Innanzitutto si dichiarano sempre. Facciamolo, all'inizio del modulo.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_intervals);

        SP=getApplicationContext().getSharedPreferences("intervalli", Context.MODE_PRIVATE);
        vibrator=(Vibrator)this.getSystemService(VIBRATOR_SERVICE);
        textViewMin=(TextView) findViewById(R.id.textView1);
        textViewMax=(TextView) findViewById(R.id.textView2);
        seekBar1=(SeekBar)findViewById(R.id.seekBar1);
        seekBar2=(SeekBar)findViewById(R.id.seekBar2);
Se io salvo, come per fini mnemonici mi sembra meglio, il valore come intervallo, devo settare poi le seekBars a valori diminuiti di 10 diviso 10, e devo poi salvare in SharedPreferences i valori delle seekBars aumentati di 10 * 10.
Proviamo...

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_intervals);

        SP=getApplicationContext().getSharedPreferences("intervalli", Context.MODE_PRIVATE);
        vibrator=(Vibrator)this.getSystemService(VIBRATOR_SERVICE);
        textViewMin=(TextView) findViewById(R.id.textView1);
        textViewMax=(TextView) findViewById(R.id.textView2);
        seekBar1=(SeekBar)findViewById(R.id.seekBar1);
        seekBar2=(SeekBar)findViewById(R.id.seekBar2);

        seekBar1.setMax(17);
        seekBar2.setMax(17);

        //Qui metto l'inizializzazione delle seekBars.
        int intervalloMinimo=SP.getInt("intervalloMin",10);
        seekBar1.setProgress((intervalloMinimo-10)/10);
E vediamo...

Sì, sembra funzionare. Devo settare anche le textView. Per fare questo meglio calcolare prima ore e minuti, come ho fatto nel codice dello scrolling delle seekBars.
        //Qui metto l'inizializzazione delle seekBars.
        int intervalloMinimo=SP.getInt("intervalloMin",30);
        System.out.println(intervalloMinimo);
        int ore=intervalloMinimo/60;
        int minuti=intervalloMinimo%60;
        seekBar1.setProgress((intervalloMinimo-10)/10);
        textViewMin.setText(ore+" ore e "+minuti+" minuti");
E adesso sembra funzionare proprio bene...
Ora devo provvedere a salvare in SharedPreferences i valori ottenuti dalle seekBars.
Per far questo devo ritornare al codice dello scorrimento di esse...

Ho recuperato e ripassato il codice.
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                vibrator.vibrate(25);
                int ore=(i*10+10)/60;
                int minuti=(i*10+10)%60;
                textViewMin.setText(ore+" ore e "+minuti+" minuti");

                if(seekBar2.getProgress()<i) seekBar2.setProgress(i);

                SharedPreferences.Editor editor=SP.edit();
                editor.putInt("intervalloMin",i*10+10);
                editor.commit();
            }
Vediamo se, salvando un valore diverso da quello di default (che ripristino a 10), questo viene memorizzato.

Sì, funziona!
Adesso sistemo anche l'altra seekBar e il lavoro risulta compiuto!
public class SetIntervals extends AppCompatActivity {

    SharedPreferences SP;
    Vibrator vibrator;
    SeekBar seekBar1, seekBar2;
    TextView textViewMin,textViewMax;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_set_intervals);

        SP=getApplicationContext().getSharedPreferences("intervalli", Context.MODE_PRIVATE);
        vibrator=(Vibrator)this.getSystemService(VIBRATOR_SERVICE);
        textViewMin=(TextView) findViewById(R.id.textView1);
        textViewMax=(TextView) findViewById(R.id.textView2);
        seekBar1=(SeekBar)findViewById(R.id.seekBar1);
        seekBar2=(SeekBar)findViewById(R.id.seekBar2);

        seekBar1.setMax(17);
        seekBar2.setMax(17);

        //Qui metto l'inizializzazione delle seekBars.
        int intervalloMinimo=SP.getInt("intervalloMin",10);
        int ore=intervalloMinimo/60;
        int minuti=intervalloMinimo%60;
        seekBar1.setProgress((intervalloMinimo-10)/10);
        textViewMin.setText(ore+" ore e "+minuti+" minuti");

        int intervalloMassimo=SP.getInt("intervalloMax",10);
        int ore2=intervalloMassimo/60;
        int minuti2=intervalloMassimo%60;
        seekBar2.setProgress((intervalloMassimo-10)/10);
        textViewMax.setText(ore2+ " ore e "+minuti2+" minuti");


        seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                vibrator.vibrate(25);
                int ore=(i*10+10)/60;
                int minuti=(i*10+10)%60;
                textViewMin.setText(ore+" ore e "+minuti+" minuti");

                if(seekBar2.getProgress()<i) seekBar2.setProgress(i);

                SharedPreferences.Editor editor=SP.edit();
                editor.putInt("intervalloMin",i*10+10);
                editor.commit();
            }


            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });

        seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener(){

            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                vibrator.vibrate(25);
                int ore=(i*10+10)/60;
                int minuti=(i*10+10)%60;
                textViewMax.setText(ore+" ore e "+minuti+" minuti");

                if(seekBar1.getProgress()>i) seekBar1.setProgress(i);

                SharedPreferences.Editor editor=SP.edit();
                editor.putInt("intervalloMax",i*10+10);
                editor.commit();

            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {

            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {

            }
        });
    }
}
...e pare funzionare alla grande!