package com.integreight.onesheeld.shields.controller;
import android.Manifest;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.widget.Toast;
import com.facebook.AccessToken;
import com.facebook.CallbackManager;
import com.facebook.FacebookRequestError;
import com.facebook.FacebookSdk;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.HttpMethod;
import com.facebook.Profile;
import com.facebook.ProfileTracker;
import com.facebook.login.LoginManager;
import com.integreight.onesheeld.R;
import com.integreight.onesheeld.enums.UIShield;
import com.integreight.onesheeld.model.ApiObjects;
import com.integreight.onesheeld.sdk.ShieldFrame;
import com.integreight.onesheeld.shields.ControllerParent;
import com.integreight.onesheeld.shields.controller.utils.CameraUtils;
import com.integreight.onesheeld.shields.controller.utils.ImageUtils;
import com.integreight.onesheeld.utils.ConnectionDetector;
import com.integreight.onesheeld.utils.Log;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.ArrayList;
public class FacebookShield extends ControllerParent<FacebookShield> {
private static FacebookEventHandler eventHandler;
private String lastPost;
private Fragment fragment;
private static final byte UPDATE_STATUS_METHOD_ID = (byte) 0x01;
private static final byte UPLOAD_PHOTO_METHOD_ID = (byte) 0x02;
private static final String PERMISSION = "publish_actions";
private CallbackManager callbackManager;
private ProfileTracker profileTracker;
public CallbackManager getCallbackManager() {
return callbackManager;
}
public String getLastPost() {
return lastPost;
}
public FacebookShield() {
super();
}
private void initFBSdk() {
if (!FacebookSdk.isInitialized()) {
FacebookSdk.setApplicationId(ApiObjects.facebook.get("app_id"));
FacebookSdk.sdkInitialize(getActivity().getApplicationContext());
}
callbackManager = CallbackManager.Factory.create();
profileTracker = new ProfileTracker() {
@Override
protected void onCurrentProfileChanged(Profile oldProfile, Profile currentProfile) {
if (eventHandler != null) {
if (currentProfile != null)
eventHandler.onFacebookLoggedIn();
}
}
};
}
@Override
public ControllerParent<FacebookShield> init(String tag) {
initFBSdk();
return super.init(tag);
}
public FacebookShield(Activity activity, String tag, Fragment fragment,
Bundle savedInstanceState) {
super(activity, tag);
initFBSdk();
this.fragment = fragment;
}
public void setShieldFragment(Fragment fragment) {
this.fragment = fragment;
}
public void setFacebookEventHandler(FacebookEventHandler eventHandler) {
FacebookShield.eventHandler = eventHandler;
}
public static interface FacebookEventHandler {
void onRecievePost(String post);
void onFacebookLoggedIn();
void onFacebookError(String error);
void startProgress();
void stopProgress();
}
public void loginToFacebook() {
ArrayList<String> perms = new ArrayList<>();
perms.add("publish_actions");
LoginManager.getInstance().logInWithPublishPermissions(fragment, perms);
}
public void logoutFromFacebook() {
LoginManager.getInstance().logOut();
}
public String getUsername() {
Profile profile = Profile.getCurrentProfile();
return profile != null ? profile.getName() : "";
}
public boolean isFacebookLoggedInAlready() {
return AccessToken.getCurrentAccessToken() != null;
}
private void publishStory(final String message) {
if (AccessToken.getCurrentAccessToken() != null) {
Bundle postParams = new Bundle();
postParams.putString("message", message);
GraphRequest.Callback callback = new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse graphResponse) {
FacebookRequestError error = graphResponse.getError();
if (error != null) {
if (eventHandler != null) {
Log.sysOut("$#$#$ " + error);
eventHandler.stopProgress();
eventHandler.onFacebookError(error
.getErrorMessage());
}
return;
}
if (eventHandler != null) {
eventHandler.stopProgress();
eventHandler.onRecievePost(message);
}
}
};
GraphRequest request = new GraphRequest(AccessToken.getCurrentAccessToken(), "feed", postParams,
HttpMethod.POST, callback);
request.executeAsync();
} else if (eventHandler != null) eventHandler.onFacebookError(activity.getString(R.string.facebook_you_must_login_first_toast));
}
public void uploadImage(final String path, final String msg) {
new AsyncTask<Void, Void, Void>() {
byte[] data = null;
Bitmap bi;
@Override
protected Void doInBackground(Void... params) {
int rotate = ImageUtils.getCameraPhotoOrientation(path);
bi = ImageUtils.decodeFile(new File(path), 1024);
Matrix matrix = new Matrix();
matrix.postRotate(rotate);
bi = Bitmap.createBitmap(bi, 0, 0, bi.getWidth(),
bi.getHeight(), matrix, true);
return null;
}
@Override
protected void onPostExecute(final Void result1) {
if (AccessToken.getCurrentAccessToken() != null) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
if (bi != null) {
bi.compress(Bitmap.CompressFormat.JPEG, 100, baos);
bi.recycle();
}
data = baos.toByteArray();
Bundle postParams = new Bundle();
postParams.putString("message", msg);
postParams.putByteArray("source", data);
GraphRequest.Callback callback = new GraphRequest.Callback() {
public void onCompleted(GraphResponse response) {
FacebookRequestError error = response.getError();
if (error != null) {
if (eventHandler != null) {
Log.sysOut("$#$#$ " + error);
eventHandler.onFacebookError(error
.getErrorMessage());
eventHandler.stopProgress();
}
return;
}
data = null;
if (bi != null)
bi.recycle();
System.gc();
if (eventHandler != null) {
eventHandler.stopProgress();
Toast.makeText(activity, R.string.facebook_image_uploaded,
Toast.LENGTH_SHORT).show();
eventHandler.onRecievePost(msg);
}
}
};
Toast.makeText(activity, R.string.facebook_uploading_your_image,
Toast.LENGTH_SHORT).show();
GraphRequest request = new GraphRequest(AccessToken.getCurrentAccessToken(), "me/photos",
postParams, HttpMethod.POST, callback);
request.executeAsync();
} else {
if (bi != null)
bi.recycle();
}
super.onPostExecute(result1);
}
}.execute(null, null);
}
@Override
public void onNewShieldFrameReceived(ShieldFrame frame) {
// TODO Auto-generated method stub
if (frame.getShieldId() == UIShield.FACEBOOK_SHIELD.getId()) {
lastPost = frame.getArgumentAsString(0);
if (isFacebookLoggedInAlready()) {
if (ConnectionDetector.isConnectingToInternet(getApplication()
.getApplicationContext())) {
if (eventHandler != null)
eventHandler.startProgress();
if (frame.getFunctionId() == UPDATE_STATUS_METHOD_ID)
publishStory(lastPost);
else if (frame.getFunctionId() == UPLOAD_PHOTO_METHOD_ID) {
String imgPath = null;
byte sourceFolderId = frame.getArgument(1)[0];
if (sourceFolderId == CameraUtils.FROM_ONESHEELD_FOLDER)
imgPath = CameraUtils
.getLastCapturedImagePathFromOneSheeldFolder(activity,true);
else if (sourceFolderId == CameraUtils.FROM_CAMERA_FOLDER)
imgPath = CameraUtils
.getLastCapturedImagePathFromCameraFolder(activity);
if (imgPath != null) {
uploadImage(imgPath, lastPost);
}
}
} else
Toast.makeText(
getApplication().getApplicationContext(),
R.string.general_toasts_please_check_your_internet_connection_and_try_again_toast,
Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void preConfigChange() {
super.preConfigChange();
}
@Override
public void postConfigChange() {
super.postConfigChange();
}
@Override
public void reset() {
profileTracker.stopTracking();
}
@Override
public ControllerParent<FacebookShield> invalidate(
com.integreight.onesheeld.shields.ControllerParent.SelectionAction selectionAction,
boolean isToastable) {
this.selectionAction = selectionAction;
if(Build.VERSION.SDK_INT >=16)
addRequiredPremission(Manifest.permission.READ_EXTERNAL_STORAGE);
if (checkForPermissions())
this.selectionAction.onSuccess();
else
this.selectionAction.onFailure();
return super.invalidate(selectionAction, isToastable);
}
}