package com.jaychang.slm; import android.annotation.SuppressLint; import android.app.Application; import android.content.Context; import android.content.Intent; import android.os.Build; import android.webkit.CookieManager; import com.facebook.FacebookSdk; import rx.Observable; import rx.subjects.PublishSubject; import static com.jaychang.slm.SocialLoginManager.SocialPlatform.FACEBOOK; import static com.jaychang.slm.SocialLoginManager.SocialPlatform.GOOGLE; import static com.jaychang.slm.SocialLoginManager.SocialPlatform.INSTAGRAM; public class SocialLoginManager { private static final String ERROR = "You must choose a social platform."; @SuppressLint("StaticFieldLeak") private static SocialLoginManager instance; private PublishSubject<SocialUser> userEmitter; private Context appContext; private boolean withProfile = true; private SocialPlatform socialPlatform; private String clientId; private String igClientId; private String igRedirectUrl; private String igCleintSecret; private SocialLoginManager(Context context) { appContext = context.getApplicationContext(); } public static synchronized SocialLoginManager getInstance(Context context) { if (instance == null) { instance = new SocialLoginManager(context); } return instance; } @Deprecated public SocialLoginManager withProfile() { this.withProfile = true; return this; } public SocialLoginManager withProfile(boolean withProfile) { this.withProfile = withProfile; return this; } public SocialLoginManager facebook() { this.socialPlatform = FACEBOOK; return this; } public SocialLoginManager google(String clientId) { this.igClientId = clientId; this.socialPlatform = GOOGLE; return this; } public SocialLoginManager instagram(String clientId, String clientSecret, String redirectUrl) { this.igClientId = clientId; this.igCleintSecret = clientSecret; this.igRedirectUrl = redirectUrl; this.socialPlatform = INSTAGRAM; return this; } public static void init(Application application) { FacebookSdk.sdkInitialize(application.getApplicationContext()); } public Observable<SocialUser> login() { userEmitter = PublishSubject.create(); appContext.startActivity(getIntent()); return userEmitter; } public void logout() { if (Build.VERSION.SDK_INT >= 21) { CookieManager.getInstance().removeAllCookies(null); } else { CookieManager.getInstance().removeAllCookie(); } } public Intent getIntent() { if (socialPlatform == FACEBOOK) { Intent intent = new Intent(appContext, FbLoginHiddenActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); return intent; } else if (socialPlatform == GOOGLE) { Intent intent = new Intent(appContext, GoogleLoginHiddenActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(GoogleLoginHiddenActivity.EXTRA_CLIENT_ID, igClientId); return intent; } else if (socialPlatform == INSTAGRAM) { Intent intent = new Intent(appContext, IgLoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.putExtra(IgLoginActivity.EXTRA_CLIENT_ID, igClientId); intent.putExtra(IgLoginActivity.EXTRA_CLIENT_SECRET, igCleintSecret); intent.putExtra(IgLoginActivity.EXTRA_REDIRECT_URL, igRedirectUrl); return intent; } else { throw new IllegalStateException(ERROR); } } boolean isWithProfile() { return this.withProfile; } void onLoginSuccess(SocialUser socialUser) { if (userEmitter != null) { SocialUser copy = new SocialUser(socialUser); userEmitter.onNext(copy); userEmitter.onCompleted(); } } void onLoginError(Throwable throwable) { if (userEmitter != null) { Throwable copy = new Throwable(throwable); userEmitter.onError(copy); } } void onLoginCancel() { if (userEmitter != null) { userEmitter.onCompleted(); } } enum SocialPlatform { FACEBOOK, GOOGLE, INSTAGRAM } }