/**
* Copyright (c) 2014-present, Facebook, Inc. All rights reserved.
*
* You are hereby granted a non-exclusive, worldwide, royalty-free license to use,
* copy, modify, and distribute this software in source code or binary form for use
* in connection with the web services and APIs provided by Facebook.
*
* As with any software that integrates with the Facebook platform, your use of
* this software is subject to the Facebook Developer Principles and Policies
* [http://developers.facebook.com/policy/]. This copyright notice shall be
* included in all copies or substantial portions of the software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package com.example.rps.usersettings;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.facebook.AccessToken;
import com.facebook.AccessTokenTracker;
import com.facebook.CallbackManager;
import com.facebook.GraphRequest;
import com.facebook.GraphResponse;
import com.facebook.internal.ImageDownloader;
import com.facebook.internal.ImageRequest;
import com.facebook.internal.ImageResponse;
import com.example.rps.R;
import com.facebook.login.widget.LoginButton;
import org.json.JSONObject;
/**
* A Fragment that displays a Login/Logout button as well as the user's
* profile picture and name when logged in.
*/
public final class UserSettingsFragment extends Fragment {
private static final String NAME = "name";
private static final String ID = "id";
private static final String PICTURE = "picture";
private static final String FIELDS = "fields";
private static final String REQUEST_FIELDS =
TextUtils.join(",", new String[] {ID, NAME, PICTURE});
private AccessTokenTracker accessTokenTracker;
private CallbackManager callbackManager;
private LoginButton loginButton;
private TextView connectedStateLabel;
private JSONObject user;
private Drawable userProfilePic;
private String userProfilePicID;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken,
AccessToken currentAccessToken) {
fetchUserInfo();
updateUI();
}
};
callbackManager = CallbackManager.Factory.create();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
callbackManager.onActivityResult(requestCode, resultCode, data);
}
@Override
public void onDestroy() {
super.onDestroy();
accessTokenTracker.stopTracking();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.usersettings_fragment, container, false);
loginButton = (LoginButton) view.findViewById(R.id.usersettings_fragment_login_button);
loginButton.setFragment(this);
connectedStateLabel = (TextView) view.findViewById(R.id.usersettings_fragment_profile_name);
// if no background is set for some reason, then default to Facebook blue
if (view.getBackground() == null) {
view.setBackgroundColor(getResources().getColor(R.color.com_facebook_blue));
} else {
view.getBackground().setDither(true);
}
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
/**
* @throws com.facebook.FacebookException if errors occur during the loading of user information
*/
@Override
public void onResume() {
super.onResume();
fetchUserInfo();
updateUI();
}
private void fetchUserInfo() {
final AccessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken != null) {
GraphRequest request = GraphRequest.newMeRequest(
accessToken, new GraphRequest.GraphJSONObjectCallback() {
@Override
public void onCompleted(JSONObject me, GraphResponse response) {
user = me;
updateUI();
}
});
Bundle parameters = new Bundle();
parameters.putString(FIELDS, REQUEST_FIELDS);
request.setParameters(parameters);
GraphRequest.executeBatchAsync(request);
} else {
user = null;
}
}
private void updateUI() {
if (!isAdded()) {
return;
}
if (AccessToken.getCurrentAccessToken() != null) {
connectedStateLabel.setTextColor(getResources().getColor(
R.color.usersettings_fragment_connected_text_color));
connectedStateLabel.setShadowLayer(1f, 0f, -1f,
getResources().getColor(
R.color.usersettings_fragment_connected_shadow_color));
if (user != null) {
ImageRequest request = getImageRequest();
if (request != null) {
Uri requestUri = request.getImageUri();
// Do we already have the right picture? If so, leave it alone.
if (!requestUri.equals(connectedStateLabel.getTag())) {
if (user.optString("id").equals(userProfilePicID)) {
connectedStateLabel.setCompoundDrawables(
null, userProfilePic, null, null);
connectedStateLabel.setTag(requestUri);
} else {
ImageDownloader.downloadAsync(request);
}
}
}
connectedStateLabel.setText(user.optString("name"));
} else {
connectedStateLabel.setText(getResources().getString(
R.string.usersettings_fragment_logged_in));
Drawable noProfilePic = getResources().getDrawable(
R.drawable.profile_default_icon);
noProfilePic.setBounds(0, 0,
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_width),
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_height));
connectedStateLabel.setCompoundDrawables(null, noProfilePic, null, null);
}
} else {
int textColor = getResources().getColor(
R.color.usersettings_fragment_not_connected_text_color);
connectedStateLabel.setTextColor(textColor);
connectedStateLabel.setShadowLayer(0f, 0f, 0f, textColor);
connectedStateLabel.setText(getResources().getString(
R.string.usersettings_fragment_not_logged_in));
connectedStateLabel.setCompoundDrawables(null, null, null, null);
connectedStateLabel.setTag(null);
}
}
private ImageRequest getImageRequest() {
ImageRequest request = null;
ImageRequest.Builder requestBuilder = new ImageRequest.Builder(
getActivity(),
ImageRequest.getProfilePictureUri(
user.optString("id"),
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_width),
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_height)));
request = requestBuilder.setCallerTag(this)
.setCallback(
new ImageRequest.Callback() {
@Override
public void onCompleted(ImageResponse response) {
processImageResponse(user.optString("id"), response);
}
})
.build();
return request;
}
private void processImageResponse(String id, ImageResponse response) {
if (response != null) {
Bitmap bitmap = response.getBitmap();
if (bitmap != null) {
BitmapDrawable drawable = new BitmapDrawable(
UserSettingsFragment.this.getResources(), bitmap);
drawable.setBounds(0, 0,
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_width),
getResources().getDimensionPixelSize(
R.dimen.usersettings_fragment_profile_picture_height));
userProfilePic = drawable;
userProfilePicID = id;
connectedStateLabel.setCompoundDrawables(null, drawable, null, null);
connectedStateLabel.setTag(response.getRequest().getImageUri());
}
}
}
}