package com.androidsocialnetworks.lib.impl;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.util.Log;
import com.androidsocialnetworks.lib.AccessToken;
import com.androidsocialnetworks.lib.MomentUtil;
import com.androidsocialnetworks.lib.SocialNetwork;
import com.androidsocialnetworks.lib.SocialNetworkException;
import com.androidsocialnetworks.lib.SocialPerson;
import com.androidsocialnetworks.lib.listener.OnCheckIsFriendCompleteListener;
import com.androidsocialnetworks.lib.listener.OnLoginCompleteListener;
import com.androidsocialnetworks.lib.listener.OnPostingCompleteListener;
import com.androidsocialnetworks.lib.listener.OnRequestAddFriendCompleteListener;
import com.androidsocialnetworks.lib.listener.OnRequestRemoveFriendCompleteListener;
import com.androidsocialnetworks.lib.listener.OnRequestSocialPersonCompleteListener;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.plus.Plus;
import com.google.android.gms.plus.model.people.Person;
import java.io.File;
import java.util.UUID;
public class GooglePlusSocialNetwork extends SocialNetwork
implements GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener {
public static final int ID = 3;
private static final String TAG = GooglePlusSocialNetwork.class.getSimpleName();
// max 16 bit to use in startActivityForResult
private static final int REQUEST_AUTH = UUID.randomUUID().hashCode() & 0xFFFF;
/**
* mPlusClient.isConntected() works really strange, it returs false right after init and then true,
* so let's handle state by ourselves
*/
private static final String SAVE_STATE_KEY_IS_CONNECTED = "GooglePlusSocialNetwork.SAVE_STATE_KEY_OAUTH_TOKEN";
private GoogleApiClient mGoogleApiClient;
private ConnectionResult mConnectionResult;
private boolean mConnectRequested;
private Handler mHandler = new Handler();
public GooglePlusSocialNetwork(Fragment fragment) {
super(fragment);
}
@Override
public boolean isConnected() {
return mSharedPreferences.getBoolean(SAVE_STATE_KEY_IS_CONNECTED, false);
}
@Override
public AccessToken getAccessToken() {
throw new SocialNetworkException("Not supported for GooglePlusSocialNetwork");
}
@Override
public void requestLogin(OnLoginCompleteListener onLoginCompleteListener) {
super.requestLogin(onLoginCompleteListener);
mConnectRequested = true;
try {
mConnectionResult.startResolutionForResult(mSocialNetworkManager.getActivity(), REQUEST_AUTH);
} catch (Exception e) {
Log.e(TAG, "ERROR", e);
if (!mGoogleApiClient.isConnecting()) {
mGoogleApiClient.connect();
}
}
}
@Override
public void logout() {
mConnectRequested = false;
if (mGoogleApiClient.isConnected()) {
mSharedPreferences.edit().remove(SAVE_STATE_KEY_IS_CONNECTED)
.commit();
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
mGoogleApiClient.disconnect();
mGoogleApiClient.connect();
}
}
@Override
public int getID() {
return ID;
}
@Override
public void requestCurrentPerson(OnRequestSocialPersonCompleteListener onRequestSocialPersonCompleteListener) {
super.requestCurrentPerson(onRequestSocialPersonCompleteListener);
Person person = Plus.PeopleApi.getCurrentPerson(mGoogleApiClient);
if (person == null) {
if (mLocalListeners.get(REQUEST_GET_CURRENT_PERSON) != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
mLocalListeners.get(REQUEST_GET_CURRENT_PERSON)
.onError(getID(), REQUEST_GET_CURRENT_PERSON, "Can't get person", null);
}
});
}
return;
}
final SocialPerson socialPerson = new SocialPerson();
socialPerson.id = person.getId();
socialPerson.name = person.getDisplayName();
Person.Image image = person.getImage();
if (image != null) {
String imageURL = image.getUrl();
if (imageURL != null) {
socialPerson.avatarURL = imageURL;
}
}
socialPerson.nickname = person.getNickname();
socialPerson.profileURL = person.getUrl();
if (mLocalListeners.get(REQUEST_GET_CURRENT_PERSON) != null) {
mHandler.post(new Runnable() {
@Override
public void run() {
((OnRequestSocialPersonCompleteListener)
mLocalListeners.get(REQUEST_GET_CURRENT_PERSON))
.onRequestSocialPersonSuccess(getID(), socialPerson);
}
});
}
}
@Override
public void requestSocialPerson(String userID, OnRequestSocialPersonCompleteListener onRequestSocialPersonCompleteListener) {
throw new SocialNetworkException("requestSocialPerson isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void requestPostMessage(String message, OnPostingCompleteListener onPostingCompleteListener) {
throw new SocialNetworkException("requestPostMessage isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void requestPostPhoto(File photo, String message, OnPostingCompleteListener onPostingCompleteListener) {
throw new SocialNetworkException("requestPostPhoto isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void requestCheckIsFriend(String userID, OnCheckIsFriendCompleteListener onCheckIsFriendCompleteListener) {
throw new SocialNetworkException("requestCheckIsFriend isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void requestAddFriend(String userID, OnRequestAddFriendCompleteListener onRequestAddFriendCompleteListener) {
throw new SocialNetworkException("requestAddFriend isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void requestRemoveFriend(String userID, OnRequestRemoveFriendCompleteListener onRequestRemoveFriendCompleteListener) {
throw new SocialNetworkException("requestRemoveFriend isn't allowed for GooglePlusSocialNetwork");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGoogleApiClient = new GoogleApiClient.Builder(
mSocialNetworkManager.getActivity()).addApi(Plus.API)
.addScope(Plus.SCOPE_PLUS_LOGIN)
.addScope(Plus.SCOPE_PLUS_PROFILE)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this).build();
}
@Override
public void onStart() {
mGoogleApiClient.connect();
}
@Override
public void onStop() {
if (mGoogleApiClient.isConnected()) {
mGoogleApiClient.disconnect();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == REQUEST_AUTH) {
if (resultCode == Activity.RESULT_OK
&& !mGoogleApiClient.isConnected()
&& !mGoogleApiClient.isConnecting()) {
// This time, connect should succeed.
mGoogleApiClient.connect();
} else if (resultCode == Activity.RESULT_CANCELED) {
if (mLocalListeners.get(REQUEST_LOGIN) != null) {
mLocalListeners.get(REQUEST_LOGIN).onError(getID(),
REQUEST_LOGIN, "canceled", null);
}
}
}
}
@Override
public void onConnected(Bundle bundle) {
if (mConnectRequested) {
if (Plus.PeopleApi.getCurrentPerson(mGoogleApiClient) != null) {
if (mLocalListeners.get(REQUEST_LOGIN) != null) {
mSharedPreferences.edit().putBoolean(SAVE_STATE_KEY_IS_CONNECTED, true).commit();
((OnLoginCompleteListener) mLocalListeners.get(REQUEST_LOGIN)).onLoginSuccess(getID());
}
return;
}
if (mLocalListeners.get(REQUEST_LOGIN) != null) {
mLocalListeners.get(REQUEST_LOGIN).onError(getID(), REQUEST_LOGIN,
"get person == null", null);
}
}
mConnectRequested = false;
}
@Override
public void onConnectionSuspended(int arg0) {
mConnectRequested = false;
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
mConnectionResult = connectionResult;
if (mConnectRequested && mLocalListeners.get(REQUEST_LOGIN) != null) {
mLocalListeners.get(REQUEST_LOGIN).onError(getID(), REQUEST_LOGIN,
"error: " + connectionResult.getErrorCode(), null);
}
mConnectRequested = false;
}
}