vendredi 30 septembre 2016

Apply design Patterns to android with firebase application

I want to apply design pattern to my application. I think to divide it by this categories: My code separation

Where:

  1. LoginListener : implements the listener for the activity
  2. LoginNetwork : is the class where i want to execute the firebase code
  3. LoginNetworkListener : is the class where i want to insert the code for the firebase listener
  4. LoginLogic : is the class where i insert the code for initialize the googleSignIn for my application ( and the request permission )
  5. LoginController : there isn't code here
  6. LoginSignleton : is Singleton for all data necessary between the other Login classes.

This is my code: LoginActiivity:

public class LoginActivity extends AppCompatActivity {

    private final static String TAG = "Login Activity";
    private final static int RC_SIGN_IN = 9000;

    private Button continueNoLogin;
    private SignInButton googleLogin;

    private LoginNetwork loginNetwork;
    private LoginSingleton loginSingleton;
    private LoginLogic loginLogic;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        FirebaseApp.initializeApp(this);
        continueNoLogin = (Button) findViewById(R.id.login_unregistered);
        googleLogin = (SignInButton) findViewById(R.id.login_registered_google);
        loginNetwork = new LoginNetwork();
        loginSingleton = LoginSingleton.getInstance();
        loginLogic = new LoginLogic(this);
    }

    @Override
    protected void onStart() {
        super.onStart();
        LoginListener loginListener = new LoginListener();
        continueNoLogin.setOnClickListener(loginListener);
        googleLogin.setOnClickListener(loginListener);
    }

    public void startLoginResultActivity(){
        Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(LoginSingleton.getInstance().getGoogleApiClient());
        startActivityForResult(signInIntent,RC_SIGN_IN);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.d(TAG,"OnActivityResult");
        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Log.d(TAG,"RC_SIGN_IN");
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                Log.d(TAG,"google signin successfull");
                // Google Sign In was successful, authenticate with Firebase

            } else {
                Log.d(TAG,"SignInWithGoogle Failed " + result.getStatus());
                // Google Sign In failed, update UI appropriately

            }
        }
    }
}

LoginListener:

public class LoginListener implements View.OnClickListener,GoogleApiClient.OnConnectionFailedListener {

    private final static String TAG = "LoginListener";



    @Override
    public void onClick(View view) {
        switch (view.getId()){
            case R.id.login_unregistered:

                break;
            case R.id.login_registered_google:
                Log.d(TAG,"Ho ricevuto l'intent");
                LoginActivity loginActivity = new LoginActivity();
                loginActivity.startLoginResultActivity();
                break;
        }
    }

    @Override
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

    }
}

LoginSingleton:

public class LoginSingleton {

    private GoogleApiClient googleApiClient;
    private GoogleSignInOptions googleSignInOptions;

    private static LoginSingleton ourInstance = new LoginSingleton();

    public static LoginSingleton getInstance() {
        return ourInstance;
    }

    private LoginSingleton() {
    }

    public void setGoogleApiClient(GoogleApiClient googleApiClient) {
        this.googleApiClient = googleApiClient;
    }

    public GoogleApiClient getGoogleApiClient() {
        return googleApiClient;
    }

    public void setGoogleSignInOptions(GoogleSignInOptions googleSignInOptions) {
        this.googleSignInOptions = googleSignInOptions;
    }

    public GoogleSignInOptions getGoogleSignInOptions() {
        return googleSignInOptions;
    }
}

LoginNetwork:

public class LoginNetwork  {

    private final static String TAG = "LoginNetwork";

    private FirebaseAuth firebaseAuth;


    public LoginNetwork(){

        // Init FirebaseAuth
        firebaseAuth = FirebaseAuth.getInstance();

        // generate listener
        LoginNetworkListener loginNetworkListener = new LoginNetworkListener();

        firebaseAuth.addAuthStateListener(loginNetworkListener);

    }

}

LoginNetworkListener:

public class LoginNetworkListener implements FirebaseAuth.AuthStateListener {

    private final static String TAG = "LoginNetworkListener";

    @Override
    public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {

        if (firebaseAuth.getCurrentUser() != null){
            Log.d(TAG,firebaseAuth.getCurrentUser().toString()+"is signedIn");
        } else {
            Log.d(TAG,"User is signedOut");
        }

    }
}

LoginLogic:

public class LoginLogic {

    private final static String TAG = "LoginLogic";

    private GoogleApiClient googleApiClient;
    private GoogleSignInOptions googleSignInOptions;

    public LoginLogic(AppCompatActivity activity){

        LoginListener loginListener = new LoginListener();
        /*
        * Configure Google Signin
        */
        LoginSingleton.getInstance().setGoogleSignInOptions(new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken("571158992107-7bifs7qrivnqpkk77gmmoko9rkg73c0d.apps.googleusercontent.com").requestEmail().build());

        LoginSingleton.getInstance().setGoogleApiClient(new GoogleApiClient.Builder(activity).enableAutoManage(activity,loginListener).build());
    }
}

When i start the application it give me this error:

FATAL EXCEPTION: main                                                                                                    Process: it.unisalento.progetto.software.cunamameli.dafb, PID: 24354                                                                            java.lang.RuntimeException: Unable to start activity ComponentInfo{http://ift.tt/2dGLObD}: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process it.unisalento.progetto.software.cunamameli.dafb. Make sure to call FirebaseApp.initializeApp(Context) first.                                     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2456)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539)
at android.app.ActivityThread.access$900(ActivityThread.java:159)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5507)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.IllegalStateException: Default FirebaseApp is not initialized in this process it.unisalento.progetto.software.cunamameli.dafb. Make sure to call FirebaseApp.initializeApp(Context) first.
at com.google.firebase.FirebaseApp.getInstance(Unknown Source)
at com.google.firebase.auth.FirebaseAuth.getInstance(Unknown Source)
at it.unisalento.progetto.software.cunamameli.dafb.loginPack.LoginNetwork.<init>(LoginNetwork.java:19)
at it.unisalento.progetto.software.cunamameli.dafb.loginPack.LoginActivity.onCreate(LoginActivity.java:35)
at android.app.Activity.performCreate(Activity.java:6304)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2409)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2539) 
at android.app.ActivityThread.access$900(ActivityThread.java:159) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1384) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:152) 
at android.app.ActivityThread.main(ActivityThread.java:5507) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

Where:

LoginNetwork.java:19 is -> firebaseAuth = FirebaseAuth.getInstance();

and

LoginActivity.java:35 is -> loginNetwork = new LoginNetwork();

I don't understand the where is the error. Please help me. Thanks a lot!

Aucun commentaire:

Enregistrer un commentaire