public class FbActivity extends Activity {
private static final String TAG = "FbActivity";
private static final String FB_APP_ID = "app_id";
private boolean is_post = false;
private UiLifecycleHelper uiHelper;
private Session session;
private EditText fb_edit;
private Session.StatusCallback facebookCallback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
onSessionStateChange(session, state, exception);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = LayoutInflater.from(this);
SocialPostContainer td = (SocialPostContainer)inflater.inflate(R.layout.container_fb, null);
td.init();
setContentView(td);
fb_edit = td.getEdit();
td.getTitle().setText("Facebook");
td.getCancel().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
finish();
}
});
td.getPost().setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO 自動生成されたメソッド・スタブ
is_post = true;
loginFacebook();
}
});
// ライフサイクルヘルパーの初期化
uiHelper = new UiLifecycleHelper(FbActivity.this, facebookCallback);
uiHelper.onCreate(savedInstanceState);
// Facebook ログイン管理
Session session = Session.getActiveSession();
if (session == null) {
if (savedInstanceState != null) {
session = Session.restoreSession(this, null, facebookCallback, savedInstanceState);
}
if (session == null) {
session = new Session(this);
}
Session.setActiveSession(session);
if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
//session.openForPublish(getOpenRequest());
session.openForRead(new OpenRequest(this));
}
}
// ログイン状態の確認
if (! session.isOpened()) {
loginFacebook();
}
}
private void loginFacebook() {
Session session = Session.getActiveSession();
Log.d(TAG,"doLogin: session state is " + session.getState() + ", isOpend:" + session.isOpened() + ", isClosed:" + session.isClosed());
if (!session.isOpened()) {
if (session.isClosed()) {
session = new Session(this);
Session.setActiveSession(session);
}
//session.openForPublish(getOpenRequest());
session.openForRead(new OpenRequest(this));
} else {
Session.openActiveSession(this, true, facebookCallback);
}
}
private void logoutFacebook() {
Session session = Session.getActiveSession();
if (!session.isClosed()) {
// セッションとトークン情報を廃棄する。
session.closeAndClearTokenInformation();
}
}
private void onSessionStateChange(final Session session, final SessionState state, Exception exception) {
if (session.isOpened()) {
// GraphAPIのmeリクエストを呼び出す。
Request.newMeRequest(session, new FacebookGraphUserCallback("wait...") {
@Override
public void onCompleted(GraphUser user, Response response) {
super.onCompleted(user, response);
Log.d(TAG, "user = " + user.getInnerJSONObject());
if (is_post) postFB();
}
}).executeAsync();
}
}
@Override
public void onResume() {
super.onResume();
Session session = Session.getActiveSession();
if (session.getState().equals(SessionState.CLOSED_LOGIN_FAILED) || session.getState().equals(SessionState.CLOSED)) {
Toast.makeText(this, "Facebook認証に失敗しました。", Toast.LENGTH_LONG).show();
finish();
}
uiHelper.onResume();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}
@Override
public void onPause() {
super.onPause();
uiHelper.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
uiHelper.onDestroy();
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Session session = Session.getActiveSession();
Session.saveSession(session, outState);
outState.putBoolean(PENDING_PUBLISH_KEY, pendingPublishReauthorization);
uiHelper.onSaveInstanceState(outState);
}
class FacebookGraphUserCallback implements Request.GraphUserCallback {
private ProgressDialog mProgress = null;
public FacebookGraphUserCallback(String message) {
mProgress = new ProgressDialog(FbActivity.this);
mProgress.setMessage(message);
mProgress.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgress.show();
}
@Override
public void onCompleted(GraphUser user, Response response) {
mProgress.dismiss();
}
}
private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");
private static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization";
private boolean pendingPublishReauthorization = false;
private void postFB() {
Session session = Session.getActiveSession();
if (session != null){
// Check for publish permissions
List<String> permissions = session.getPermissions();
if (!isSubsetOf(PERMISSIONS, permissions)) {
pendingPublishReauthorization = true;
Session.NewPermissionsRequest newPermissionsRequest = new Session
.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewPublishPermissions(newPermissionsRequest);
return;
}
Bundle postParams = new Bundle();
postParams.putString("name", getString(R.string .app_name));
postParams.putString("caption", "Build great social apps and get more installs.");
postParams.putString("description", fb_edit.getText().toString());
Request.Callback callback= new Request.Callback() {
public void onCompleted(Response response) {
JSONObject graphResponse = response
.getGraphObject()
.getInnerJSONObject();
String postId = null;
try {
postId = graphResponse.getString("id");
} catch (JSONException e) {
Log.i(TAG,
"JSON error "+ e.getMessage());
}
FacebookRequestError error = response.getError();
if (error != null) {
Toast.makeText(getApplicationContext(),
error.getErrorMessage(),
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(),
postId,
Toast.LENGTH_LONG).show();
}
}
};
Request request = new Request(session, "me/feed", postParams,
HttpMethod.POST, callback);
RequestAsyncTask task = new RequestAsyncTask(request);
task.execute();
}
}
private boolean isSubsetOf(Collection<String> subset, Collection<String> superset) {
for (String string : subset) {
if (!superset.contains(string)) {
return false;
}
}
return true;
}
}