diff --git a/example/build.gradle b/example/build.gradle
index 3861a44..66b2e93 100644
--- a/example/build.gradle
+++ b/example/build.gradle
@@ -21,8 +21,10 @@ android {
versionName "1.0"
manifestPlaceholders = [
- qq_id: "XXXXXX"
+ qq_id: "XXXXXX",
+ FACEBOOK_ID:"XXXXXX"
]
+ resValue "string", "facebook_app_id", "XXXXXX"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
diff --git a/example/src/main/AndroidManifest.xml b/example/src/main/AndroidManifest.xml
index 9fa57f1..2fede8c 100644
--- a/example/src/main/AndroidManifest.xml
+++ b/example/src/main/AndroidManifest.xml
@@ -32,6 +32,13 @@
+
+
\ No newline at end of file
diff --git a/example/src/main/java/com/younglive/livestreaming/LoginActivity.java b/example/src/main/java/com/younglive/livestreaming/LoginActivity.java
index b272767..e63947e 100644
--- a/example/src/main/java/com/younglive/livestreaming/LoginActivity.java
+++ b/example/src/main/java/com/younglive/livestreaming/LoginActivity.java
@@ -28,12 +28,12 @@ protected void onCreate(Bundle savedInstanceState) {
.wxId("XXXXX")
.weiboRedirectUrl("XXXXXX")
.wxSecret("XXXXXX");
- ShareManager.init(config);
+ ShareManager.init(this,config);
findViewById(R.id.login_qq).setOnClickListener(this);
findViewById(R.id.login_weibo).setOnClickListener(this);
findViewById(R.id.login_wx).setOnClickListener(this);
-
+ findViewById(R.id.login_fb).setOnClickListener(this);
mLoginListener = new LoginListener() {
@Override
public void loginSuccess(LoginResult result) {
@@ -80,6 +80,9 @@ public void onClick(View view) {
case R.id.login_wx:
LoginUtil.login(this, LoginPlatform.WX, mLoginListener);
break;
+ case R.id.login_fb:
+ LoginUtil.login(this, LoginPlatform.FB, mLoginListener);
+ break;
}
}
}
diff --git a/example/src/main/java/com/younglive/livestreaming/MainActivity.java b/example/src/main/java/com/younglive/livestreaming/MainActivity.java
index 6b8026e..aa1fbba 100644
--- a/example/src/main/java/com/younglive/livestreaming/MainActivity.java
+++ b/example/src/main/java/com/younglive/livestreaming/MainActivity.java
@@ -23,7 +23,7 @@ protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_main);
ShareConfig config = ShareConfig.instance().wxId(APP_ID).wxSecret(APP_SECRET);
- ShareManager.init(config);
+ ShareManager.init(getApplicationContext(), config);
findViewById(R.id.action_login).setOnClickListener(new View.OnClickListener() {
@Override
diff --git a/example/src/main/java/com/younglive/livestreaming/ShareActivity.java b/example/src/main/java/com/younglive/livestreaming/ShareActivity.java
index 28389c0..ae0b556 100644
--- a/example/src/main/java/com/younglive/livestreaming/ShareActivity.java
+++ b/example/src/main/java/com/younglive/livestreaming/ShareActivity.java
@@ -53,6 +53,6 @@ public void shareCancel() {
.qqId("XXXXXX")
.weiboId("XXXXXX")
.wxId("xXXXXX");
- ShareManager.init(config);
+ ShareManager.init(getApplicationContext(), config);
}
}
diff --git a/example/src/main/java/com/younglive/livestreaming/ShareBottomDialog.java b/example/src/main/java/com/younglive/livestreaming/ShareBottomDialog.java
index 831f593..c87f50f 100644
--- a/example/src/main/java/com/younglive/livestreaming/ShareBottomDialog.java
+++ b/example/src/main/java/com/younglive/livestreaming/ShareBottomDialog.java
@@ -28,6 +28,7 @@ public void bindView(final View v) {
v.findViewById(R.id.share_weibo).setOnClickListener(this);
v.findViewById(R.id.share_wx).setOnClickListener(this);
v.findViewById(R.id.share_wx_timeline).setOnClickListener(this);
+ v.findViewById(R.id.share_facebook).setOnClickListener(this);
mShareListener = new ShareListener() {
@Override
@@ -73,6 +74,10 @@ public void onClick(View view) {
"http://www.google.com", "http://shaohui.me/images/avatar.gif",
mShareListener);
break;
+ case R.id.share_facebook:
+ ShareUtil.shareImage(getContext(),SharePlatform.FACEBOOK, "http://shaohui.me/images/avatar.gif",
+ mShareListener);
+ break;
}
dismiss();
}
diff --git a/example/src/main/res/layout/activity_login.xml b/example/src/main/res/layout/activity_login.xml
index 72b4eaa..edfd06c 100644
--- a/example/src/main/res/layout/activity_login.xml
+++ b/example/src/main/res/layout/activity_login.xml
@@ -36,6 +36,13 @@
android:layout_marginBottom="16dp"
android:text="QQ登录"
/>
+
diff --git a/example/src/main/res/layout/layout_bottom_share.xml b/example/src/main/res/layout/layout_bottom_share.xml
index febfc05..c2a96f5 100644
--- a/example/src/main/res/layout/layout_bottom_share.xml
+++ b/example/src/main/res/layout/layout_bottom_share.xml
@@ -162,6 +162,33 @@
android:text="QQ空间"
/>
+
+
+
+
+
+
+
diff --git a/example/src/main/res/mipmap-hdpi/share_facebook.png b/example/src/main/res/mipmap-hdpi/share_facebook.png
new file mode 100644
index 0000000..01480c9
Binary files /dev/null and b/example/src/main/res/mipmap-hdpi/share_facebook.png differ
diff --git a/shareutil/build.gradle b/shareutil/build.gradle
index 72e1470..e1a10ee 100644
--- a/shareutil/build.gradle
+++ b/shareutil/build.gradle
@@ -26,6 +26,7 @@ dependencies {
compile files('libs/open_sdk_r5756_lite.jar')
compile files('libs/weiboSDKCore_3.1.4.jar')
compile files('libs/libammsdk.jar')
+ compile 'com.facebook.android:facebook-android-sdk:4.+'
}
apply from: 'bintrayUpload.gradle'
diff --git a/shareutil/src/main/AndroidManifest.xml b/shareutil/src/main/AndroidManifest.xml
index 45fd371..6f6ab2e 100644
--- a/shareutil/src/main/AndroidManifest.xml
+++ b/shareutil/src/main/AndroidManifest.xml
@@ -1,5 +1,7 @@
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/LoginUtil.java b/shareutil/src/main/java/me/shaohui/shareutil/LoginUtil.java
index 5074fad..f521ddc 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/LoginUtil.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/LoginUtil.java
@@ -6,6 +6,7 @@
import me.shaohui.shareutil.login.LoginListener;
import me.shaohui.shareutil.login.LoginPlatform;
import me.shaohui.shareutil.login.LoginResult;
+import me.shaohui.shareutil.login.instance.FbLoginInstance;
import me.shaohui.shareutil.login.instance.LoginInstance;
import me.shaohui.shareutil.login.instance.QQLoginInstance;
import me.shaohui.shareutil.login.instance.WeiboLoginInstance;
@@ -54,6 +55,9 @@ static void action(Activity activity) {
case LoginPlatform.WX:
mLoginInstance = new WxLoginInstance(activity, mLoginListener, isFetchUserInfo);
break;
+ case LoginPlatform.FB:
+ mLoginInstance=new FbLoginInstance(activity, mLoginListener, isFetchUserInfo);
+ break;
default:
mLoginListener.loginFailure(new Exception(INFO.UNKNOW_PLATFORM));
activity.finish();
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/ShareManager.java b/shareutil/src/main/java/me/shaohui/shareutil/ShareManager.java
index 58ca3d2..a2641c0 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/ShareManager.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/ShareManager.java
@@ -1,5 +1,7 @@
package me.shaohui.shareutil;
+import android.content.Context;
+import com.facebook.FacebookSdk;
/**
* Created by shaohui on 2016/12/5.
*/
@@ -10,8 +12,9 @@ public class ShareManager {
public static ShareConfig CONFIG;
- public static void init(ShareConfig config) {
+ public static void init(final Context context, ShareConfig config) {
isInit = true;
CONFIG = config;
+ FacebookSdk.sdkInitialize(context.getApplicationContext());
}
}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/ShareUtil.java b/shareutil/src/main/java/me/shaohui/shareutil/ShareUtil.java
index e000329..e676491 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/ShareUtil.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/ShareUtil.java
@@ -19,7 +19,9 @@
import me.shaohui.shareutil.share.ShareImageObject;
import me.shaohui.shareutil.share.ShareListener;
import me.shaohui.shareutil.share.SharePlatform;
+import me.shaohui.shareutil.share.facebook.FbCallBack;
import me.shaohui.shareutil.share.instance.DefaultShareInstance;
+import me.shaohui.shareutil.share.instance.FbShareInstance;
import me.shaohui.shareutil.share.instance.QQShareInstance;
import me.shaohui.shareutil.share.instance.ShareInstance;
import me.shaohui.shareutil.share.instance.WeiboShareInstance;
@@ -147,7 +149,11 @@ private static ShareListener buildProxyListener(ShareListener listener) {
return new ShareListenerProxy(listener);
}
- public static void handleResult(Intent data) {
+ static int getPlatform(){
+ return mPlatform;
+ }
+
+ private static void handleResult(Intent data) {
// 微博分享会同时回调onActivityResult和onNewIntent, 而且前者返回的intent为null
if (mShareInstance != null && data != null) {
mShareInstance.handleResult(data);
@@ -160,6 +166,24 @@ public static void handleResult(Intent data) {
}
}
+ public static void handleResult(final int requestCode,
+ final int resultCode, final Intent data){
+ if (mPlatform==SharePlatform.FACEBOOK) {
+ if (mShareInstance != null && data != null) {
+ if (mShareInstance instanceof FbCallBack) {
+ final FbCallBack fsInstance = (FbCallBack) mShareInstance;
+ fsInstance.handleResult(requestCode, resultCode, data);
+ }
+ } else if (data == null) {
+ ShareLogger.e(INFO.HANDLE_DATA_NULL);
+ } else {
+ ShareLogger.e(INFO.UNKNOWN_ERROR);
+ }
+ }else{
+ handleResult(data);
+ }
+ }
+
private static ShareInstance getShareInstance(@SharePlatform.Platform int platform,
Context context) {
switch (platform) {
@@ -171,6 +195,8 @@ private static ShareInstance getShareInstance(@SharePlatform.Platform int platfo
return new QQShareInstance(context, ShareManager.CONFIG.getQqId());
case SharePlatform.WEIBO:
return new WeiboShareInstance(context, ShareManager.CONFIG.getWeiboId());
+ case SharePlatform.FACEBOOK:
+ return new FbShareInstance(mShareListener);
case SharePlatform.DEFAULT:
default:
return new DefaultShareInstance();
@@ -246,7 +272,7 @@ public static boolean isWeiXinInstalled(Context context) {
IWXAPI api = WXAPIFactory.createWXAPI(context, ShareManager.CONFIG.getWxId(), true);
return api.isWXAppInstalled();
}
-
+
private static class ShareListenerProxy extends ShareListener {
private final ShareListener mShareListener;
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/_ShareActivity.java b/shareutil/src/main/java/me/shaohui/shareutil/_ShareActivity.java
index 072de77..0623581 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/_ShareActivity.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/_ShareActivity.java
@@ -47,7 +47,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
} else {
// handle 微信回调
LoginUtil.handleResult(-1, -1, getIntent());
- ShareUtil.handleResult(getIntent());
+ ShareUtil.handleResult(-1, -1, getIntent());
finish();
}
}
@@ -71,7 +71,7 @@ protected void onNewIntent(Intent intent) {
if (mType == LoginUtil.TYPE) {
LoginUtil.handleResult(0, 0, intent);
} else if (mType == ShareUtil.TYPE) {
- ShareUtil.handleResult(intent);
+ ShareUtil.handleResult(0, 0,intent);
}
finish();
}
@@ -84,7 +84,7 @@ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (mType == LoginUtil.TYPE) {
LoginUtil.handleResult(requestCode, resultCode, data);
} else if (mType == ShareUtil.TYPE) {
- ShareUtil.handleResult(data);
+ ShareUtil.handleResult(requestCode, resultCode, data);
}
finish();
}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/login/LoginPlatform.java b/shareutil/src/main/java/me/shaohui/shareutil/login/LoginPlatform.java
index e6cfb90..783e018 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/login/LoginPlatform.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/login/LoginPlatform.java
@@ -14,7 +14,7 @@
public class LoginPlatform {
@Documented
- @IntDef({QQ, WX, WEIBO})
+ @IntDef({QQ, WX, WEIBO, FB})
@Retention(RetentionPolicy.SOURCE)
@Target(ElementType.PARAMETER)
public @interface Platform {
@@ -26,4 +26,5 @@ public class LoginPlatform {
public static final int WX = 3;
public static final int WEIBO = 5;
+ public static final int FB = 6;
}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/login/instance/FbLoginInstance.java b/shareutil/src/main/java/me/shaohui/shareutil/login/instance/FbLoginInstance.java
new file mode 100644
index 0000000..90e9e78
--- /dev/null
+++ b/shareutil/src/main/java/me/shaohui/shareutil/login/instance/FbLoginInstance.java
@@ -0,0 +1,130 @@
+package me.shaohui.shareutil.login.instance;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.text.TextUtils;
+
+import com.facebook.AccessToken;
+import com.facebook.CallbackManager;
+import com.facebook.FacebookCallback;
+import com.facebook.FacebookException;
+import com.facebook.FacebookRequestError;
+import com.facebook.GraphRequest;
+import com.facebook.GraphResponse;
+import com.facebook.login.DefaultAudience;
+import com.facebook.login.LoginBehavior;
+import com.facebook.login.LoginManager;
+import com.facebook.login.LoginResult;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+import java.util.Arrays;
+import java.util.List;
+
+import me.shaohui.shareutil.login.LoginListener;
+import me.shaohui.shareutil.login.result.BaseToken;
+import me.shaohui.shareutil.login.result.FbToken;
+import me.shaohui.shareutil.login.result.FbUser;
+
+import static me.shaohui.shareutil.login.LoginPlatform.FB;
+
+/**
+ * Created by pitt on 2017/3/6.
+ */
+
+public class FbLoginInstance extends LoginInstance {
+
+ private CallbackManager mCallbackManager;
+ private LoginManager mManager;
+ private FacebookCallback mFacebookCallback;
+ private LoginListener mLoginListener;
+
+ public FbLoginInstance(Activity activity, final LoginListener listener, final boolean fetchUserInfo) {
+ super(activity, listener, fetchUserInfo);
+ mManager = LoginManager.getInstance();
+ mManager.setDefaultAudience(DefaultAudience.FRIENDS);
+ mManager.setLoginBehavior(LoginBehavior.NATIVE_ONLY);
+ mCallbackManager = CallbackManager.Factory.create();
+ mLoginListener = listener;
+ mFacebookCallback = new FacebookCallback() {
+ @Override
+ public void onSuccess(LoginResult result) {
+ final FbToken fbToken = FbToken.parse(result.getAccessToken());
+ listener.loginSuccess(new me.shaohui.shareutil.login.LoginResult(FB, fbToken));
+ if (fetchUserInfo) {
+ listener.beforeFetchUserInfo(fbToken);
+ fetchUserInfo(fbToken);
+ }
+ }
+
+ @Override
+ public void onCancel() {
+ listener.loginCancel();
+ }
+
+ @Override
+ public void onError(FacebookException error) {
+ listener.loginFailure(error);
+ }
+ };
+ }
+
+ @Override
+ public void doLogin(Activity activity, LoginListener listener, boolean fetchUserInfo) {
+ mManager.registerCallback(mCallbackManager, mFacebookCallback);
+ mManager.logInWithReadPermissions(activity, Arrays.asList("public_profile"));
+ }
+
+ @Override
+ public void fetchUserInfo(final BaseToken token) {
+ final GraphRequest request = GraphRequest.newMeRequest(AccessToken.getCurrentAccessToken(), new GraphRequest.GraphJSONObjectCallback() {
+ @Override
+ public void onCompleted(JSONObject object, GraphResponse response) {
+ final FacebookRequestError facebookRequestError = response.getError();
+ if (null == facebookRequestError) {
+ try {
+ final FbUser fbUser = FbUser.parse(object);
+ mLoginListener.loginSuccess(new me.shaohui.shareutil.login.LoginResult(FB, token, fbUser));
+ } catch (JSONException e) {
+ mLoginListener.loginFailure(e);
+ }
+ } else {
+ mLoginListener.loginFailure(facebookRequestError.getException());
+ }
+ }
+ });
+ request.executeAsync();
+ }
+
+ @Override
+ public void handleResult(int requestCode, int resultCode, Intent data) {
+ mCallbackManager.onActivityResult(requestCode, resultCode, data);
+ }
+
+ @Override
+ public boolean isInstall(Context context) {
+ final PackageManager pm = context.getPackageManager();
+ if (pm == null) {
+ return false;
+ }
+
+ final List packageInfos = pm.getInstalledPackages(0);
+ for (PackageInfo info : packageInfos) {
+ if (TextUtils.equals(info.packageName.toLowerCase(), "com.facebook.katana")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void recycle() {
+ mCallbackManager = null;
+ mManager = null;
+ mFacebookCallback = null;
+ }
+}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbToken.java b/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbToken.java
new file mode 100644
index 0000000..8c5cf7d
--- /dev/null
+++ b/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbToken.java
@@ -0,0 +1,26 @@
+package me.shaohui.shareutil.login.result;
+
+import com.facebook.AccessToken;
+
+/**
+ * Created by pitt on 2017/3/7.
+ */
+
+public class FbToken extends BaseToken {
+ private String user_id;
+
+ public static FbToken parse(AccessToken token) {
+ final FbToken fbToken = new FbToken();
+ fbToken.setAccessToken(token.getToken());
+ fbToken.setUserId(token.getUserId());
+ return fbToken;
+ }
+
+ public String getUserId() {
+ return user_id;
+ }
+
+ public void setUserId(String userId) {
+ this.user_id = userId;
+ }
+}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbUser.java b/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbUser.java
new file mode 100644
index 0000000..3bdb121
--- /dev/null
+++ b/shareutil/src/main/java/me/shaohui/shareutil/login/result/FbUser.java
@@ -0,0 +1,19 @@
+package me.shaohui.shareutil.login.result;
+
+import android.text.TextUtils;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+
+/**
+ * Created by pitt on 2017/3/7.
+ */
+
+public class FbUser extends BaseUser {
+ public static FbUser parse(final JSONObject jsonObject) throws JSONException {
+ final FbUser fbUser = new FbUser();
+ fbUser.setSex(TextUtils.equals("male", jsonObject.getString("gender")) ? 1 : 2);
+ fbUser.setHeadImageUrl(jsonObject.getString("profile"));
+ return fbUser;
+ }
+}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/share/SharePlatform.java b/shareutil/src/main/java/me/shaohui/shareutil/share/SharePlatform.java
index 1005e68..3cbdb05 100644
--- a/shareutil/src/main/java/me/shaohui/shareutil/share/SharePlatform.java
+++ b/shareutil/src/main/java/me/shaohui/shareutil/share/SharePlatform.java
@@ -10,7 +10,7 @@
public class SharePlatform {
- @IntDef({ DEFAULT, QQ, QZONE, WEIBO, WX, WX_TIMELINE })
+ @IntDef({ DEFAULT, QQ, QZONE, WEIBO, WX, WX_TIMELINE,FACEBOOK })
@Retention(RetentionPolicy.SOURCE)
public @interface Platform{}
@@ -20,6 +20,7 @@ public class SharePlatform {
public static final int WX = 3;
public static final int WX_TIMELINE = 4;
public static final int WEIBO = 5;
+ public static final int FACEBOOK = 6;
}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/share/facebook/FbCallBack.java b/shareutil/src/main/java/me/shaohui/shareutil/share/facebook/FbCallBack.java
new file mode 100644
index 0000000..e5cd194
--- /dev/null
+++ b/shareutil/src/main/java/me/shaohui/shareutil/share/facebook/FbCallBack.java
@@ -0,0 +1,19 @@
+package me.shaohui.shareutil.share.facebook;
+
+import android.content.Intent;
+
+/**
+ * Created by pitt on 2017/3/13.
+ */
+
+public interface FbCallBack {
+ /**
+ * The method that should be called from the Activity's or Fragment's onActivityResult method.
+ *
+ * @param requestCode The request code that's received by the Activity or Fragment.
+ * @param resultCode The result code that's received by the Activity or Fragment.
+ * @param data The result data that's received by the Activity or Fragment.
+ * @return true If the result could be handled.
+ */
+ boolean handleResult(int requestCode, int resultCode, Intent data);
+}
diff --git a/shareutil/src/main/java/me/shaohui/shareutil/share/instance/FbShareInstance.java b/shareutil/src/main/java/me/shaohui/shareutil/share/instance/FbShareInstance.java
new file mode 100644
index 0000000..78c68a3
--- /dev/null
+++ b/shareutil/src/main/java/me/shaohui/shareutil/share/instance/FbShareInstance.java
@@ -0,0 +1,189 @@
+package me.shaohui.shareutil.share.instance;
+
+import android.app.Activity;
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.support.annotation.Nullable;
+import android.text.TextUtils;
+
+import com.facebook.CallbackManager;
+import com.facebook.FacebookCallback;
+import com.facebook.FacebookException;
+import com.facebook.share.Sharer;
+import com.facebook.share.model.ShareContent;
+import com.facebook.share.model.ShareLinkContent;
+import com.facebook.share.model.SharePhoto;
+import com.facebook.share.model.SharePhotoContent;
+import com.facebook.share.widget.ShareDialog;
+
+import java.util.List;
+import java.util.Locale;
+
+import me.shaohui.shareutil.share.ImageDecoder;
+import me.shaohui.shareutil.share.ShareImageObject;
+import me.shaohui.shareutil.share.ShareListener;
+import me.shaohui.shareutil.share.SharePlatform;
+import me.shaohui.shareutil.share.facebook.FbCallBack;
+import rx.Emitter;
+import rx.Observable;
+import rx.android.schedulers.AndroidSchedulers;
+import rx.functions.Action1;
+import rx.schedulers.Schedulers;
+
+/**
+ * Created by pitt on 2017/3/13.
+ */
+
+public class FbShareInstance implements ShareInstance, FbCallBack {
+
+ private final CallbackManager mCallbackManager;
+ private final FacebookCallback mFacebookCallback;
+
+ public FbShareInstance(final ShareListener listener) {
+ mCallbackManager = CallbackManager.Factory.create();
+ mFacebookCallback = new FacebookCallback() {
+ @Override
+ public void onSuccess(Sharer.Result result) {
+ listener.shareSuccess();
+ }
+
+ @Override
+ public void onCancel() {
+ listener.shareCancel();
+ }
+
+ @Override
+ public void onError(FacebookException error) {
+ listener.shareFailure(error);
+ }
+ };
+ }
+
+ @Override
+ public void shareText(int platform, String text, Activity activity, ShareListener listener) {
+
+ }
+
+ @Override
+ public void shareMedia(int platform, String title, String targetUrl,
+ String summary, ShareImageObject shareImageObject, Activity activity, ShareListener listener) {
+ final ShareLinkContent faceContent = new ShareLinkContent.Builder()
+ .setContentTitle(title)
+ .setContentDescription(summary)
+ .setContentUrl(Uri.parse(targetUrl))
+ .setImageUrl(Uri.parse(shareImageObject.getPathOrUrl()))
+ .build();
+ doShare(faceContent, activity, listener);
+ }
+
+ /**
+ * @param shareImageObject 优先使用Bitmap,如果没有Bitmap,则使用PathOrUrl
+ */
+ @Override
+ public void shareImage(int platform, @Nullable final ShareImageObject shareImageObject,
+ final Activity activity, final ShareListener listener) {
+
+ if (shareImageObject.getBitmap() == null
+ && shareImageObject.getPathOrUrl() == null) {
+ activity.finish();
+ listener.shareFailure(new IllegalArgumentException("ShareImageObject must have content."));
+ return;
+ }
+ if (shareImageObject.getBitmap() != null) {
+ final SharePhoto sharePhoto = new SharePhoto.Builder()
+ .setBitmap(shareImageObject.getBitmap())
+ .build();
+ final SharePhotoContent sharePhotoContent = new SharePhotoContent.Builder()
+ .addPhoto(sharePhoto)
+ .build();
+ doShare(sharePhotoContent, activity, listener);
+ return;
+ }
+
+ Observable.fromEmitter(new Action1>() {
+ @Override
+ public void call(Emitter emitter) {
+ try {
+ emitter.onNext(ImageDecoder.decode(activity, shareImageObject));
+ emitter.onCompleted();
+ } catch (Exception e) {
+ emitter.onError(e);
+ }
+ }
+ }, Emitter.BackpressureMode.DROP)
+ .subscribeOn(Schedulers.io())
+ .observeOn(AndroidSchedulers.mainThread())
+ .doOnRequest(new Action1() {
+ @Override
+ public void call(Long aLong) {
+ listener.shareRequest();
+ }
+ })
+ .subscribe(new Action1() {
+ @Override
+ public void call(String localPath) {
+ final SharePhoto.Builder photoBuilder = new SharePhoto.Builder();
+ photoBuilder.setImageUrl(Uri.parse(String.format(Locale.ENGLISH, "%s%s", "file://", localPath)));
+
+ final SharePhotoContent content = new SharePhotoContent.Builder()
+ .addPhoto(photoBuilder.build())
+ .build();
+ doShare(content, activity, listener);
+ }
+ }, new Action1() {
+ @Override
+ public void call(Throwable throwable) {
+ activity.finish();
+ listener.shareFailure(new Exception(throwable));
+ }
+ });
+ }
+
+ @Override
+ public void handleResult(Intent data) {
+ //do notiong
+ }
+
+
+ private void doShare(final ShareContent shareContent, final Activity activity, final ShareListener listener) {
+ final ShareDialog dialog = new ShareDialog(activity);
+ if (isInstall(activity.getApplicationContext())
+ && dialog.canShow(shareContent, ShareDialog.Mode.NATIVE)) {
+ dialog.registerCallback(mCallbackManager, mFacebookCallback);
+ dialog.show(shareContent, ShareDialog.Mode.NATIVE);
+ } else {
+ listener.shareFailure(new Exception("you must install facebook first."));
+ activity.finish();
+ }
+ }
+
+ @Override
+ public boolean isInstall(Context context) {
+ PackageManager pm = context.getPackageManager();
+ if (pm == null) {
+ return false;
+ }
+
+ List packageInfos = pm.getInstalledPackages(0);
+ for (PackageInfo info : packageInfos) {
+ if (TextUtils.equals(info.packageName.toLowerCase(), "com.facebook.katana")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @Override
+ public void recycle() {
+
+ }
+
+ @Override
+ public boolean handleResult(int requestCode, int resultCode, Intent data) {
+ return mCallbackManager.onActivityResult(requestCode, resultCode, data);
+ }
+}