JavascriptProva

domenica 26 agosto 2018

Esercizi sulle suonerie.

Ho bisogno di esercitarmi sulle suonerie.

Prima la sezione sulla scelta della suoneria dalle SharedPreferences o di default:
        bttSuona.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                Uri ringtoneUri=null;
                Ringtone ringtone=null;
                String stringSuoneria=sp.getString("suoneria","");
                if(TextUtils.isEmpty(stringSuoneria)){
                    ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(
                            getApplicationContext(),
                            RingtoneManager.TYPE_NOTIFICATION);
                }else{
                    ringtoneUri=Uri.parse(stringSuoneria);
                }
                ringtone=RingtoneManager.getRingtone(
                        getApplicationContext(),
                        ringtoneUri);
                ringtone.play();


            }
        });
Funziona! Cancellando le SharedPreferences, viene invocata la suoneria di default.

Ora la parte che serve per settare la suoneria.
        button.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
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        editor.putString("suoneria",uri.toString());
        editor.apply();
    }
Vediamo se funziona...

Funziona!
Distruggo e riscrivo senza sbirciare:
        bttSuona.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {

                Uri ringtoneUri;
                Ringtone ringtone;
                String strSuoneria=sp.getString("suoneria","");
                if(TextUtils.isEmpty(strSuoneria)){
                    ringtoneUri=RingtoneManager.getActualDefaultRingtoneUri(
                            getApplicationContext(),
                            RingtoneManager.TYPE_NOTIFICATION);

                }else{
                    ringtoneUri=Uri.parse(strSuoneria);
                }
                ringtone=RingtoneManager.getRingtone(getApplicationContext(),
                        ringtoneUri);
                ringtone.play();
            }
        });
Ora riscrivo la seconda parte per la scelta della suoneria.
        button.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
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        Uri uri=data.getParcelableExtra(RingtoneManager.EXTRA_RINGTONE_PICKED_URI);
        editor.putString("suoneria", uri.toString());
        editor.apply();

    }
}
Credo di aver memorizzato abbastanza...

giovedì 16 agosto 2018

Esercitazione sulle misure dello schermo

Innanzitutto devo definire una variabile di tipo Point in cui mettere i valori di larghezza e altezza del display.
Devo definire anche una variabile di tipo WindowManager.
        wm=(WindowManager)getSystemService(WINDOW_SERVICE);
        szWindow=new Point();
Ora creo un oggetto di tipo Display estraendolo mediante la funzione getDefaultDisplay di WindowManager:
        Display display= wm.getDefaultDisplay();
Quindi di questo display estraggo le dimensioni nella variabile Point:
        display.getSize(szWindow);
Bene.
Cancello tutto e poi vado avanti.
        szWindow=new Point();
        wm=(WindowManager)getSystemService(WINDOW_SERVICE);
        Display display=wm.getDefaultDisplay();
        display.getSize(szWindow);
        System.out.println(szWindow.x + " " + szWindow.y);
Provo a visualizzare in LogCat i valori della larghezza e altezza del display:
08-16 10:46:39.880 5341-5341/com.example.antonello.chatheadstudio I/System.out: 720 1184

Andando a vedere nelle caratteristiche dell'emulatore, ottengo dimensioni di 720 x 1280.
Lo scarto sarà dovuto alle barre, poi lo vedrò meglio.
Ora provo il codice su dispositivo reale.
Bene: ecco le misure:
08-16 13:05:21.371 27953-27953/com.example.antonello.chatheadstudio I/System.out: 720 1280

Da dove venga quella differenza fra emulatore e dispositivo fisico, non saprei.
Comunque funziona!

Esercitazione sui permessi a runtime senza riavviare l'App.

Codice che imposta i permessi a runtime senza necessità di riavviare l'applicazione.
Ho cancellato tutto e ora me lo ricostruisco.
public class MainActivity extends AppCompatActivity {

    Handler handler=new Handler();


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

        Runnable runnable =new Runnable() {
            @Override
            public void run() {
                if(Build.VERSION.SDK_INT >= 23 && Settings.canDrawOverlays(getApplicationContext())){
                    Intent i=new Intent(getApplicationContext(),MainActivity.class);
                    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                    startActivity(i);
                }else{
                    handler.postDelayed(this,1000);
                }
            }
        };
        if(Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(getApplicationContext())){
            Intent intent=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:"+getPackageName()));
            startActivity(intent);
            handler.postDelayed(runnable,1000);
        }else{
            continua();
        }

    }

    private void continua(){
        System.out.println("STO CONTINUANDO");
    }

}
Funziona! L'ho scritto bene, a quanto pare!

sabato 11 agosto 2018

Headers delle mail in PHP (From, Reply-To)

Vediamo un po' gli header delle mail...

Semplicemente l'header è "From..." eccetera.
E' praticamente una stringa.
Proviamo.

$email="antonello.iaccarino@alice.it";
$titolo="Titolo";
$testo="La vispa teresa avea tra l'erbetta a volo sorpreso gentil farfalletta";
$headers="From: trigonjac@gmail.com";


mail($email,$titolo,$testo,$headers);
Basta scrivere in una sola stringa "From: ... seguito dall'indirizzo o da una variabile che lo rappresenti."

Per l'aggiunta del Reply-To, voglio provare a scrivere questo nella stessa linea, vediamo che succede.
$headers="From: trigonjac@gmail.com Reply-To: cicciofatticcio@minkia.com";
Vediamo che succede...

Non ho ricevuto nessuna mail.br Invece disponendo su linee diverse in questo modo:
$headers="From: trigonjac@gmail.com\r\n";
$headers.="Reply-To: cicciofatticcio@minkia.com";
ottengo una mail avente per mittente trigonjac ma quando vado a rispondere rispondo a cicciofatticcio.

Da quanto ho capito il From: serve solo per notificare chi sia il mittente, mentre il Reply-To sta a indicare il destinatario della risposta.

Immagini in overlay: i permessi supplementari dall'API 23 in su.

Il macello dei permessi supplementari nelle API da 23 in su me lo sono dimenticato quasi completamente.
Ma è solo un ripasso, e inoltre ho anche i miei appunti.
Vediamo...

Devo fare un overlay e mi servono i permessi.

Intanto diciamo che il problema si pone solo per un'API superiore o uguale a 23, se contemporaneamente il permesso per gli overlay può essere negato. In tutti gli altri casi vale la classica procedura.

        if(Build.VERSION.SDK_INT >=23 && !Settings.canDrawOverlays(getApplicationContext())){
            
        }
Ecco, questa è l'eventualità in cui si deve porre una risposta diversa: API da 23 in su e assenza (!) dei permessi System.canDrawOverlays(Context).
In questo caso, che dobbiamo fare?

Il codice che viene dopo non mi risulta facilmente comprensibile, come non mi ci era mai risultato nemmeno prima.
Lo vedrò in seguito.
Intanto andiamo avanti.
        if (Build.VERSION.SDK_INT >= 23 && !Settings.canDrawOverlays(getApplicationContext())) {

            Intent i=new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:"+getPackageName()));
            startActivityForResult(i,0);
        }

        else{
            Intent intent=new Intent(getApplicationContext(),MyService.class);
            startService(intent);
        }
Praticamente fa la distinzione del caso in cui sia un'API superiore o uguale a 23 con i permessi canDrawOverlay negati e gli altri casi.
C'è poi onActivityResult, che riscrivo:
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode==RESULT_OK){
            if(Build.VERSION.SDK_INT >= 23 && Settings.canDrawOverlays(getApplicationContext())){
                Intent intent=new Intent(getApplicationContext(),MyService.class);
                startService(intent);

            }
        }
    }
Dovrebbe funzionare... Speriamo.

E infatti funziona!.

Dovrei farmi diversi Mandala ancora, e comprendere bene il codice.

venerdì 10 agosto 2018

Numeri casuali

Ho un intervallo di tempo e voglio estrarre a sorte un valore casuale in un range che va dal valore dell'intervallo meno una percentuale al valore dell'intervallo più la stessa percentuale.

min = intervallo - intervallo * percentuale
max = intervallo + intervallo * percentuale
Andiamo...

Ecco il codice, cui ho aggiunto due mie funzioni, una che converte il tempo espresso in ore, minuti e secondi in millisecondi, l'altra che dà una lettura sotto forma di stringa in ore, minuti e secondi di un tempo espresso in millisecondi.
        long intervallo = intervalInMillis(1,0,0);
        float percentuale=0.5f;
        long variazione = (long)((float)intervallo * percentuale);
        long min = intervallo - variazione;
        long max = intervallo + variazione;

        long random = (long)(Math.random() * (max - min + 1) + min);

        System.out.println("minimo "+strTime(min));
        System.out.println("massimo "+strTime(max));
        System.out.println("valore casuale "+strTime(random));

    }

    public long intervalInMillis(long ore, long minuti, long secondi){
        return ore*3600*1000+minuti*60*1000+secondi*1000;
    }

    public String strTime(long tempo) {
        long minuti = tempo / 60000;
        long ore = minuti / 60;
        minuti = minuti % 60;
        return "ore: " + ore + "; minuti: " + minuti;
    }
Ed ecco il risultato (ho scelto una percentuale del 50% in meno o in più su un intervallo di un'ora:
08-10 21:33:05.953 6860-6860/com.antonello.labagosto18 I/System.out: minimo ore: 0; minuti: 30
08-10 21:33:05.954 6860-6860/com.antonello.labagosto18 I/System.out: massimo ore: 1; minuti: 30
                                                                     valore casuale ore: 1; minuti: 29
08-10 21:34:09.683 6936-6936/com.antonello.labagosto18 I/System.out: minimo ore: 0; minuti: 30
                                                                     massimo ore: 1; minuti: 30
                                                                     valore casuale ore: 1; minuti: 13
08-10 21:34:57.812 6981-6981/com.antonello.labagosto18 I/System.out: minimo ore: 0; minuti: 30
                                                                     massimo ore: 1; minuti: 30
                                                                     valore casuale ore: 0; minuti: 39
08-10 21:35:52.024 7026-7026/? I/System.out: minimo ore: 0; minuti: 30
                                             massimo ore: 1; minuti: 30
                                             valore casuale ore: 1; minuti: 4

AlarmManager

AlarmManager.
Mi riscrivo da capo il codice...

public class MainActivity extends AppCompatActivity {
    AlarmManager alarmManager;
    PendingIntent pendingIntent;
    Calendar calendar;
    Intent intent;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        calendar=Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.set(Calendar.HOUR_OF_DAY,20);
        calendar.set(Calendar.MINUTE,0);
        calendar.set(Calendar.SECOND,0);


        intent=new Intent(getApplicationContext(),MyService.class);
        pendingIntent=PendingIntent.getService(getApplicationContext(),0,
                intent,0);
        alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.set(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),
                pendingIntent);


    }
}
Funziona alla perfezione!
Ho ripassato anche la modalità ELAPSED_REALTIME:
public class MainActivity extends AppCompatActivity {
    AlarmManager alarmManager;
    PendingIntent pendingIntent;
    Calendar calendar;
    Intent intent;
    Button button;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)findViewById(R.id.button);



        intent=new Intent(getApplicationContext(),MyService.class);
        pendingIntent=PendingIntent.getService(getApplicationContext(),0,
                intent,0);
        alarmManager=(AlarmManager)getSystemService(ALARM_SERVICE);


        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
                        SystemClock.elapsedRealtime()+20*1000,
                        pendingIntent);
            }
        });

    }
}
E da quanto ho sperimentato, è indipendente dal fatto che durante l'intervallo il dispositivo venga spento o no.