Om�wimy logowanie z u�yciem konta FB oraz umieszczanie post�w
Wszystkie informacje: http://developers.facebook.com

0. Utw�rz konto deweloperskie FB i pobierz Facebook App ID
zob.opis i linki w https://developers.facebook.com/docs/accountkit/android#download-facebook-sdk

Uwaga!
Poni�szy opis (pocz�tek) wed�ug: https://developers.facebook.com/docs/facebook-login/android <--- otworzy� t� stron�
Wygodne, bo ma skrypty, kt�re generuj� kody z odpowiednimi numerami App ID

Rejestracja: https://developers.facebook.com/quickstarts/?platform=android
Po zatwierdzeniu nale�y klikn�� "Create App ID".
Nale�y poda� nazw� (ja u�y�em "PUM") i adres e-mail
Przydzielony zostanie wielocyfrowy numer (np. 1766900306675987) i pojawi si� strona, kt�ra pokazuje wszystkie API, kt�rych mo�emy u�y�.

1. Tworzymy nowy projekt o nazwie FacebookDemo (min SDK 15, Android 4.0.3, Empty Activity)
2. Przechodzimy do Gradle Scripts, build.gradle (Module: app)

apply plugin: 'com.android.application'

android {
    compileSdkVersion 25
    buildToolsVersion "25.0.3"
    defaultConfig {
        applicationId "pl.umk.fizyka.facebookdemo"
        minSdkVersion 15
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

//dodane !!!!!!!!!!!!!!!!!!!!
repositories {
    mavenCentral()
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.facebook.android:facebook-android-sdk:[4,5)' //dodane !!!!!!!!!!!!!!!!!!!!
    testCompile 'junit:junit:4.12'
}

3. Kompilujemy projekt (Ctrl+F9)
4. W pliku MainActivity.java dodajemy:

import com.facebook.FacebookSdk;
import com.facebook.appevents.AppEventsLogger;

Nie powinno by� nic zaznaczonego na czerwono w tych liniach


LOGOWANIE
---------

5. Przechodzimy do res/values/strings.xml i dodajemy:

<string name="facebook_app_id">1766900306675987</string>
<string name="fb_login_protocol_scheme">fb1766900306675987</string>
<string name="zaloguj">Zaloguj u�ywaj�c konta FB</string>
<string name="wyloguj">Wyloguj</string>

6. W pliku manifestu dodajemy (poza elementem application):

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

7. Do manifestu dodajemy te� *******

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

8. Pobieramy OpenSSL: http://gnuwin32.sourceforge.net/packages/openssl.htm
   Pobra�em pakiet w 'zip'-ie i rozpakowa�em do c:\EXE\OpenSSL 

9. Tworzenie klucza (bezpiecze�stwo autoryzacji)

W katalogu c:\Program Files\Android\Android Studio\jre\bin\ uruchom 'cmd'

set PATH=%PATH%;C:\EXE\OpenSSL\bin      
path
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl base64

Nale�y wprowadzi� has�o ('haslo')
Otrzymamy 28-znakowy hash do developerki: Cmce+9aHdOoVtE7fS3B07tfj7Bc=

Hash do release (zob. https://developers.facebook.com/docs/facebook-login/android) - wymagany przy wrzucaniu do Google Play

10. Je�eli chcemu "Single Sign On" z aplikacji, musimy ustawi� na stronie i zapisa�.

11. Dodajemy przycisk logowania przez FB do activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="pl.umk.fizyka.facebookdemo.MainActivity">

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

    <com.facebook.login.widget.LoginButton
        xmlns:facebook="http://schemas.android.com/apk/res-auto"
        facebook:com_facebook_login_text="@string/zaloguj"
        facebook:com_facebook_logout_text="@string/wyloguj"
        android:id="@+id/login_button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

</LinearLayout>


12. Deklarujemy pola w klasie MainActivity:

TextView textView;
CallbackManager callbackManager;

13. W metodzie MainActivity.onCreate rejestrujemy funkcj� zwrotn�, kt�ra powiadamia o wynikach logowania

package pl.umk.fizyka.facebookdemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.view.ActionMode;
import android.widget.TextView;

import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.login.LoginBehavior;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;
import com.facebook.login.widget.LoginButton;

import org.w3c.dom.Text;

public class MainActivity extends AppCompatActivity {

    TextView textView;
    CallbackManager callbackManager;

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

        textView = (TextView)findViewById(R.id.hello);
        textView.setText("Niezalogowany");

        callbackManager = CallbackManager.Factory.create();

        LoginButton loginButton = (LoginButton)findViewById(R.id.login_button);
        loginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>()
        {
            @Override
            public void onSuccess(LoginResult loginResult)
            {
                AccessToken accessToken = loginResult.getAccessToken();
                String s = "Zalogowany";
                s += "\nAplikacja: " + accessToken.getApplicationId();
                s += "\nU�ytkownik: " + accessToken.getUserId();
                //s += "\nToken: " + accessToken.getToken();
                s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString();
                textView.setText(s);
            }

            @Override
            public void onCancel()
            {
                textView.setText("Logowanie anulowane");
            }

            @Override
            public void onError(FacebookException error)
            {
                textView.setText("B��d logowania: " + error.getLocalizedMessage());
            }
        });
    }

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


14. Przetestowa� (potrzebny dost�p do internetu z emulatora lub urz�dzenia)

15. �ledzenie zmian (w tym wylogoywanie i utrata wa�no�ci):

Kod dodany w onCreate:

        //wylogowywanie i inne zmiany
        AccessTokenTracker accessTokenTracker = new AccessTokenTracker()
        {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken)
            {
                if(currentAccessToken == null)
                    textView.setText("Wylogowano");
            }
        };

Uwaga! W innych metodach zawsze mo�na u�y�
AccessToken accessToken = AccessToken.getCurrentAccessToken();
aby odczyta� token.

16. Porz�dki na koniec.
    Definiujemy metod�

    private String getTokenInfo(AccessToken accessToken)
    {
        String s;
        if(accessToken == null)
        {
            s = "Niezalogowany";
        }
        else
        {
            s = "Zalogowany";
            s += "\nAplikacja: " + accessToken.getApplicationId();
            s += "\nU�ytkownik: " + accessToken.getUserId();
            //s += "\nToken: " + accessToken.getToken();
            s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString();
        }
        return s;
    }

U�ywamy jej w onCreate:

	textView = (TextView)findViewById(R.id.hello);
        //textView.setText("Niezalogowany");
        AccessToken accessToken = AccessToken.getCurrentAccessToken();
        textView.setText(getTokenInfo(accessToken));

U�ywamy jej w onSuccess:

	public void onSuccess(LoginResult loginResult)
        {
            AccessToken accessToken = loginResult.getAccessToken();
            textView.setText(getTokenInfo(accessToken));
        }

i przy �ledzeniu zmian:

	AccessTokenTracker accessTokenTracker = new AccessTokenTracker()
        {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken)
            {
                getTokenInfo(currentAccessToken);
            }
        };



UDOST�PNIANIE
-------------

Chodzi o umieszczanie wiadomo�ci na samym FB, do messangera jest osobne API.

Uwaga! Zgodnie z polityk� FB nie mo�na w kontrolkach wstawia� �adnych domy�lnych tekst�w.

Opis: https://developers.facebook.com/docs/sharing/android

1. Do manifestu (w obr�bie elementu application) dodaj

<provider android:authorities="com.facebook.app.FacebookContentProvider1766900306675987"
            android:name="com.facebook.FacebookContentProvider"
            android:exported="true"/>

Numer to App ID.

2. Do interfejsu (plik activity_main.xml) dodajemy okno edycyjne i przycisk:

<EditText
        android:id="@+id/tre��Wpisu"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:text="Test umieszczania tre�ci z aplikacji"
        android:textSize="10dp"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

    <Button
        android:id="@+id/wy�lijWpis"
        android:text="Wy�lij"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

3. Bezpo�rednie udost�pnianie (przez mechanizm udost�pniania - bez Facebook SDK):

	final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu);
        Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis);

        wy�lijWpis.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //wysy�anie poprzez dialog "Udost�pnij" (bez Facebook SDK)
                //wymaga instalacji aplikacji Facebook
                Intent intent = new Intent(Intent.ACTION_SEND);
                intent.setType("text/plain");
                intent.putExtra(Intent.EXTRA_TEXT, tre��Wpisu.getText());
                //startActivity(Intent.createChooser(intent, "Udost�pnij"));
            }
        });


4. Udost�pnianie linku przez Facebook SDK:

final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu);
        Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis);

        wy�lijWpis.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //link
                ShareLinkContent zawarto��Link = new ShareLinkContent.Builder()
                        //.setContentDescription("Opis (wycofane)")
                        //.setContentTitle("Tytu� (wycofane)")
                        .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka"))
                        .setQuote(tre��Wpisu.getText().toString())
                        .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build())
                        .build();

                try
                {
                    ShareDialog shareDialog = new ShareDialog(MainActivity.this);
                    shareDialog.show(zawarto��Link); 
		    //mo�na pomin�� drugi argument wybieraj�cy rodzaj okna dialogowego (domy�lny ShareDialog.Mode.AUTOMATIC)
                }
                catch(Exception exc)
                {
                    Toast.makeText(getApplicationContext(), "B��d: " + exc.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });

Poprawno�� linku i wydobywanych z niego informacji mo�na sprawdzi� na stronie:
https://developers.facebook.com/tools/debug/

5. Rejestrowanie si� do informacji zwrotnej o udost�pnieniu:

	final EditText tre��Wpisu = (EditText)findViewById(R.id.tre��Wpisu);
        Button wy�lijWpis = (Button)findViewById(R.id.wy�lijWpis);

        wy�lijWpis.setOnClickListener(new View.OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                //link
                ShareLinkContent zawarto��Link = new ShareLinkContent.Builder()
                        //.setContentDescription("Opis (wycofane)")
                        //.setContentTitle("Tytu� (wycofane)")
                        .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka"))
                        .setQuote(tre��Wpisu.getText().toString())
                        .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build())
                        .build();

                try
                {
                    ShareDialog shareDialog = new ShareDialog(MainActivity.this);

                    FacebookCallback<Sharer.Result> resultFacebookCallback = new FacebookCallback<Sharer.Result>()
                    {
                        @Override
                        public void onSuccess(Sharer.Result result)
                        {
                            textView.setText("Wys�anie posta uda�o si�");
                        }

                        @Override
                        public void onCancel()
                        {
                            textView.setText("Wys�anie posta zosta�o anulowane");
                        }

                        @Override
                        public void onError(FacebookException error)
                        {
                            textView.setText("Wys�anie posta nie powiod�o si�: " + error.getLocalizedMessage());
                        }
                    };
                    shareDialog.registerCallback(callbackManager, resultFacebookCallback);

                    shareDialog.show(zawarto��Link);
                }
                catch(Exception exc)
                {
                    Toast.makeText(getApplicationContext(), "B��d: " + exc.getLocalizedMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });

6. Publikowanie zdj��

Uwaga! Wymaga dodatkowych uprawnie� publikowania: publish_actions - bez tego b�dzie od razu nie udane publikowanie


Przed logowaniem:

    LoginManager.getInstance().logInWithPublishPermissions(
                this,
                Arrays.asList("publish_actions"));


Uwaga! Przy pierwszym logowaniu pojawi si� okno z pro�ba o potwierdzenie uprawnienia.

Uzupe�nianie informacji o uprawnieniach:

    private String getTokenInfo(AccessToken accessToken)
    {
        String s;
        if(accessToken == null)
        {
            s = "Niezalogowany";
        }
        else
        {
            s = "Zalogowany";
            s += "\nAplikacja: " + accessToken.getApplicationId();
            s += "\nU�ytkownik: " + accessToken.getUserId();
            //s += "\nToken: " + accessToken.getToken();
            s += "\nTermin wa�no�ci: " + accessToken.getExpires().toString();
            s += "\nUprawnienia: ";
            for(String permission : accessToken.getPermissions())
            {
                s += "\n\t" + permission;
            }
        }
        return s;
    }

Mo�na teraz przygotowa� zawarto�� z obrazem:

	Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
                SharePhoto photo = new SharePhoto.Builder()
                        .setBitmap(bmp)
                        .build();
                SharePhotoContent zawarto��Obraz = new SharePhotoContent.Builder()
                        .addPhoto(photo)
                        .build();

i publikowanie:

shareDialog.show(zawarto��Obraz);


7. Publikowanie z�o�onej zawarto�ci

Uwaga! Wymaga zainstalowanej aplikacji Facebook

	//mieszanie r�nych zawarto�ci
        ShareContent zawarto��Z�o�ona = new ShareMediaContent.Builder()
        	.addMedium(photo)
                .addMedium(photo) //mo�na dodawa� r�ne zdj�cia i wideo
                .build();

	...

	shareDialog.show(zawarto��Z�o�ona); //to wymaga zainstalowanej aplikacji



Przycisk LIKE
-------------

1. Do pliku activity_main.xml dodajmy kontrolk�:

<com.facebook.share.widget.LikeView
        android:id="@+id/likeView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

2. Na ko�cu onCreate dodajmy

	LikeView likeView = (LikeView) findViewById(R.id.likeView);
        likeView.setLikeViewStyle(LikeView.Style.STANDARD);
        likeView.setAuxiliaryViewPosition(LikeView.AuxiliaryViewPosition.INLINE);
        likeView.setObjectIdAndType(
                "http://www.fizyka.umk.pl/~jacek/dydaktyka",
                LikeView.ObjectType.PAGE);

B��dy? Zob. https://inthecheesefactory.com/blog/how-to-add-facebook-like-button-in-android-app/en


Przycisk Udost�pniania 
----------------------

To samo, co wcze�niej, ale gotowy przycisk z przypisan� akcj�.

1. Do pliku activity_main.xml dodajmy kontrolk�:

<com.facebook.share.widget.ShareButton
        android:id="@+id/shareButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:layout_marginLeft="10dp" />

2. Na ko�cu onCreate dodajmy

	ShareLinkContent zawarto��Link = new ShareLinkContent.Builder()
                //.setContentDescription("Opis (wycofane)")
                //.setContentTitle("Tytu� (wycofane)")
                .setContentUrl(Uri.parse("http://www.fizyka.umk.pl/~jacek/dydaktyka"))
                .setQuote(tre��Wpisu.getText().toString())
                .setShareHashtag(new ShareHashtag.Builder().setHashtag("#UMK").build())
                .build();
        ShareButton shareButton = (ShareButton)findViewById(R.id.shareButton);
        shareButton.setShareContent(zawarto��Link);


Zadanie: Wys�a� zdj�cie (zawarto��Obraz) u�ywaj�c SendButton przez Facebook Messenger - analogicznie do ShareButton