package com.sromku.simple.fb.actions;
import com.facebook.FacebookRequestError;
import com.facebook.GraphRequest;
import com.facebook.GraphRequestAsyncTask;
import com.facebook.GraphResponse;
import com.facebook.HttpMethod;
import com.sromku.simple.fb.Permission;
import com.sromku.simple.fb.SimpleFacebook;
import com.sromku.simple.fb.entities.Device;
import com.sromku.simple.fb.listeners.OnConnectDeviceListener;
import com.sromku.simple.fb.utils.JsonUtils;
import com.sromku.simple.fb.utils.Logger;
import com.sromku.simple.fb.utils.Utils;
import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.Locale;
public class ConnectDeviceAction {
private OnConnectDeviceListener mOnActionListener;
private final Permission[] mPermissions;
public ConnectDeviceAction(Permission[] permissions) {
mPermissions = permissions;
}
public void setActionListener(OnConnectDeviceListener actionListener) {
mOnActionListener = actionListener;
}
public void execute() {
try {
if (mPermissions == null || mPermissions.length == 0) {
mOnActionListener.onFail("Must set needed permissions for this device");
return;
}
// set the link
String appId = SimpleFacebook.getConfiguration().getAppId();
String scope = Utils.join(Permission.convert(Arrays.asList(mPermissions)).iterator(), ",");
String url = "https://graph.facebook.com/oauth/device?" +
"type=device_code" +
"&client_id=%s" +
"&scope=%s";
url = String.format(Locale.US, url, appId, scope);
// create POST request
GraphRequest request = new GraphRequest(null, "");
request.setHttpMethod(HttpMethod.POST);
Field field = GraphRequest.class.getDeclaredField("overriddenURL");
field.setAccessible(true);
field.set(request, url);
request.setCallback(new GraphRequest.Callback() {
@Override
public void onCompleted(GraphResponse response) {
FacebookRequestError error = response.getError();
if (error != null) {
Logger.logError(GetAction.class, "Failed to get what you have requested", error.getException());
mOnActionListener.onException(error.getException());
} else {
if (response.getRawResponse() == null) {
Logger.logError(GetAction.class, "The response GraphObject has null value. Response=" + response.toString(), null);
} else {
Device device = JsonUtils.fromJson(response.getRawResponse(), Device.class);
mOnActionListener.onComplete(device);
}
}
}
});
GraphRequestAsyncTask task = new GraphRequestAsyncTask(request);
task.execute();
} catch (Exception e) {
mOnActionListener.onException(e);
}
}
}