0

So my question is straight forward, I created a Facebook login button and it's working flawless. I made it change activity onSuccess(), but if I close the software and open it again it's still on the MainActivity(Loginpage). I want it to check if already logged in, and if so, change to my LandingActivity.

Can someone help me with the code needed for this? I assume it's something regarding LoginResult and an if statement, but I'm unsure.

Thank you.

-- Code for reference --

MainActivity.java:
package com.example.frederik.snapsule;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

public class MainActivity extends Activity {

    LoginButton login;
    TextView info;
    CallbackManager callbackManager;

    //Creating and initializing the feature(Code from Facebook install guide)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext()); //Calls for the facebook feature
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.content_main);

        login = (LoginButton) findViewById(R.id.login_button);
        login.setReadPermissions("public_profile","email");

        // Callback registration
        login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Intent i = new Intent(MainActivity.this, LandingActivity.class);
                startActivity(i);
            }

            @Override
            public void onCancel() {
                // App code
            }

            @Override
            public void onError(FacebookException exception) {
                // App code
            }
        });

    }

    //Facebook code
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

}

AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.frederik.snapsule" >

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name="com.facebook.FacebookActivity"
            android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation"
            android:label="@string/app_name"
            android:theme="@android:style/Theme.Translucent.NoTitleBar" />

        <activity
            android:name=".LandingActivity"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>

        <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fbid" />

    </application>


</manifest>

LandingActivity.java:

package com.example.frederik.snapsule;

import android.app.Activity;
import android.os.Bundle;

public class LandingActivity extends Activity {

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

Edited MainActivity:

package com.example.frederik.snapsule;

//Importing
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

public class MainActivity extends Activity {

    LoginButton login;
    CallbackManager callbackManager;

    SharedPreferences sharedPref = getPreferences(Context.MODE_PRIVATE);
    SharedPreferences.Editor loginStateEditor = sharedPref.edit();

    //Creating and initializing the feature(Code from Facebook install guide)
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        FacebookSdk.sdkInitialize(getApplicationContext()); //Calls for the facebook feature
        callbackManager = CallbackManager.Factory.create();
        setContentView(R.layout.content_main);

        login = (LoginButton) findViewById(R.id.login_button);
        login.setReadPermissions("public_profile", "email");

        if (sharedPref.getBoolean("success_login", false)) {
            Intent i = new Intent(MainActivity.this, LandingActivity.class);
            startActivity(i);
        }

        // Callback registration
        login.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Intent i = new Intent(MainActivity.this, LandingActivity.class);

                loginStateEditor.putBoolean("success_login", true);
                loginStateEditor.commit();

                startActivity(i);

            }

            @Override
            public void onCancel() {

            }

            @Override
            public void onError(FacebookException exception) {

            }
        });

    }

    //Facebook code
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        callbackManager.onActivityResult(requestCode, resultCode, data);
        super.onActivityResult(requestCode, resultCode, data);
    }

}

LogCat error log:

11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: FATAL EXCEPTION: main
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: Process: com.example.frederik.snapsule, PID: 18421
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime: java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.frederik.snapsule/com.example.frederik.snapsule.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2327)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.content.ContextWrapper.getPackageName(ContextWrapper.java:133)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.Activity.getLocalClassName(Activity.java:5205)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.Activity.getPreferences(Activity.java:5239)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at com.example.frederik.snapsule.MainActivity.<init>(MainActivity.java:21)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at java.lang.Class.newInstance(Native Method)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.Instrumentation.newActivity(Instrumentation.java:1067)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2317)
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:148) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5417) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
11-04 14:24:49.858 18421-18421/com.example.frederik.snapsule E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
  • On Coming back check if user is login, if true do the required thing. – Vibhor Chopra Nov 04 '15 at 11:55
  • @VibhorChopra please elaborate :-) –  Nov 04 '15 at 12:11
  • Why are you so sure that you can check if the previous login is still valid, what if the session expired or something? – Nanoc Nov 04 '15 at 12:20
  • @Nanoc If I login the button changes to logout. If I close the app (Completely) and opens it days after I can still logout. –  Nov 04 '15 at 12:30
  • Then if Facebook agree with it you can store a boolean in sharedPreference, or, maybe you can get it from the button since it knows it. – Nanoc Nov 04 '15 at 12:32
  • see this http://stackoverflow.com/questions/18135885/facebook-authentication-without-login-button – Aditya Vyas-Lakhan Nov 04 '15 at 13:03

1 Answers1

0

As @Nanoc commented, if Facebook agree with what you want, You can use SharedPreferences as here:

public class MainActivity extends Activity {
    ...
    // Create SharedPreferences and Editor
    SharedPreferences sharedPref;
    SharedPreferences.Editor;
    ...
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...
        sharedPref= getSharedPreferences("myPref", Context.MODE_PRIVATE);
        loginStateEditor=sharedPref.edit();

        if (sharedPref.getBoolean("success_login", false)) {
            // Start Your LandingActivity
            Intent i = new Intent(MainActivity.this, LandingActivity.class);
            startActivity(i);
        }

        ...

        @Override
        public void onSuccess(LoginResult loginResult) {
            Intent i = new Intent(MainActivity.this, LandingActivity.class);
            // Save login state on shared pref.
            loginStateEditor.putBoolean("success_login", true);
            loginStateEditor.commit();
            ...
        }
    ...
}
Seyyed
  • 1,526
  • 3
  • 20
  • 30
  • Getting an error Cannot resolve method "equals(boolean)" –  Nov 04 '15 at 12:54
  • Sorry for my bad mistake. :( edited.please see again – Seyyed Nov 04 '15 at 12:58
  • Seems to crash my app, added my edited MainActivity in case I inputted in wrong in some manner –  Nov 04 '15 at 13:01
  • Which line causes the crash? what is crash result on LogCat? – Seyyed Nov 04 '15 at 13:19
  • Remember that if you want save Username and Password for automatic login, you can also save them into SharedPreferences as described above. – Seyyed Nov 04 '15 at 14:04
  • For more details about SharedPreferences: http://developer.android.com/training/basics/data-storage/shared-preferences.html – Seyyed Nov 04 '15 at 14:07