Mantenimento della sessione in un’app android

Mantenimento della sessione in un’app android

Ci sono vari modi per mantenere e gestire la sessione in un’app Android.

Oggi vedremo come sia possibile farlo mediante le Shared Preferences il cui uso è stato discusso in questo articolo.

Anzitutto andiamo a creare una classe SessionHelper.

Questa classe ha lo scopo di consentire la gestione della sessione attraverso le varie activity, nascondendo il metodo utilizzato (come detto in questo caso le Shared preferences).

Nel costruttore di questa classe viene creato un file di preferenze chiamato “session”.

public SessionHelper(Context context) {
    this.sharedPreferences = context.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
    this.editor = sharedPreferences.edit();
    this.editor.apply();
}

La classe ha due metodi, setLogin e getLogin che permettono di salvare lo stato della sessione come booleano utilizzando la chiave “KEY_REMEMBERLOGIN” nel file di Shared preferences.

public void setLogin (boolean login){
    this.editor.putBoolean("KEY_REMEMBERLOGIN", login);
    this.editor.apply();
}

public boolean getLogin(){
    return sharedPreferences.getBoolean("KEY_REMEMBERLOGIN", false);
}

Quando l’utente si sarà autenticato, lo stato della sessione sarà messo a true.

Di seguito l’intera classe.

import android.content.Context;
import android.content.SharedPreferences;

public class SessionHelper {

    private SharedPreferences sharedPreferences;
    private SharedPreferences.Editor editor;

    private String SHARED_PREF_NAME ="session";

    public SessionHelper(Context context) {
        this.sharedPreferences = context.getSharedPreferences(SHARED_PREF_NAME, Context.MODE_PRIVATE);
        this.editor = sharedPreferences.edit();
        this.editor.apply();
    }

    public void setLogin (boolean login){
        this.editor.putBoolean("KEY_REMEMBERLOGIN", login);
        this.editor.apply();
    }

    public boolean getLogin(){
        return sharedPreferences.getBoolean("KEY_REMEMBERLOGIN", false);
    }

    public void closeSession(){
        this.setLogin(false);
    }
}

Notiamo che questa classe non si occupa dell’autenticazione dell’utente vera e propria che invece, come vedremo in qualche successivo articolo, verrà gestita mediante FireBase.

sessione1Vediamo adesso come può essere utilizzata questa classe. Quando l’utente avvia l’app per la prima volta, nella schermata di Login gli presenteremo uno switch “Remember me” come in figura.

Nel codice che viene eseguito sulla pressione del tasto Login, prima di effettuare l’autenticazione mediante FireBase (nel nostro caso la classe MainActivity), andremo a verificare se l’utente ha scelto di mantenere la sessione.

if(sessionSwitch.isChecked()) {
loginSession.setLogin(true);
}

Scriviamo adesso una Activity che nel file manifest sarà andrà impostata come LAUNCHER e quindi sarà la prima a essere richiamata al lancio dell’applicazione.

Tale Activity potrà anche essere la SplashActivity, anche se non è necessario che l’app contenga uno Splash per gestire la sessione.

<activity
     android:name=".SplashActivity"
     android:exported="true"
     android:screenOrientation="portrait">
     <intent-filter>
         <action android:name="android.intent.action.MAIN" />

         <category android:name="android.intent.category.LAUNCHER" />
     </intent-filter>
 </activity>

In questa Activity effettueremo anzitutto il check della sessione

SessionHelper loginSession = new SessionHelper(this.getApplicationContext());
boolean sess=loginSession.getLogin();

Se la sessione è settata a true allora andremo a controllare, mediante Firebase se l’utente è loggato e quindi diverso da null.

FirebaseAuth fAuth = FirebaseAuth.getInstance();
FirebaseUser fUser = fAuth.getCurrentUser();

if (fUser!=null){
    Intent intent = new Intent(SplashActivity.this,HomeActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
}

Nel caso lo sia, allora andiamo a caricare l’Activity successiva a quella della schermata di Login ( nel nostro caso sarà la HomeActivity) e che l’utente, quindi, può visualizzare solo nel caso in cui in precedenza si sia loggato e abbia scelto di “Essere ricordato” nella schermata della Login.

Nel caso la sessione fosse settato a false, allora viene caricata l’activity corripondente alla schermata di Login. Nel nostro caso la MainActivity.

Di seguito il codice completo della SpashActivity.

import android.content.Intent;
import android.os.Bundle;
import android.view.WindowManager;
import androidx.appcompat.app.AppCompatActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        SessionHelper loginSession = new SessionHelper(this.getApplicationContext());
        boolean sess=loginSession.getLogin();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);

        Thread thread =new Thread(){

            public void run(){
                try {
                    Thread.sleep(5000);
                }
                catch (Exception e){
                    e.printStackTrace();
                }

                finally {

                    if (sess){
                        FirebaseAuth fAuth = FirebaseAuth.getInstance();
                        FirebaseUser fUser = fAuth.getCurrentUser();

                        if (fUser!=null){
                            Intent intent = new Intent(SplashActivity.this,HomeActivity.class);
                            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                            startActivity(intent);
                        }
                    }else{
                        Intent intent2 = new Intent(SplashActivity.this, MainActivity.class);
                        intent2.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                        startActivity(intent2);
                    }

                }
            }
        };
        thread.start();
    }
}

Ricordiamo che tutta la parte relativa allo splash, compresa la gestione del thread, non è necessaria alla gestione della sessione che è invece concentrata nella sezione finally.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.