/** * 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.facebook; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.Nullable; import com.facebook.internal.ImageRequest; import com.facebook.internal.Utility; import com.facebook.internal.Validate; import org.json.JSONException; import org.json.JSONObject; /** * This class represents a basic Facebook profile. */ public final class Profile implements Parcelable { private static final String ID_KEY = "id"; private static final String FIRST_NAME_KEY = "first_name"; private static final String MIDDLE_NAME_KEY = "middle_name"; private static final String LAST_NAME_KEY = "last_name"; private static final String NAME_KEY = "name"; private static final String LINK_URI_KEY = "link_uri"; private final String id; private final String firstName; private final String middleName; private final String lastName; private final String name; private final Uri linkUri; /** * Getter for the profile that is currently logged in to the application. * @return The profile that is currently logged in to the application. */ public static Profile getCurrentProfile() { return ProfileManager.getInstance().getCurrentProfile(); } /** * Setter for the profile that is currently logged in to the application. If the access token is * invalidated, the current profile will not be updated. It's only updated when there is an * explicit logout, login or when permissions change via the * {@link com.facebook.login.LoginManager}. * @param profile The profile that is currently logged in to the application. */ public static void setCurrentProfile(Profile profile) { ProfileManager.getInstance().setCurrentProfile(profile); } /** * Fetches and sets the current profile from the current access token. * <p/> * This should only be called from the UI thread. */ public static void fetchProfileForCurrentAccessToken() { AccessToken accessToken = AccessToken.getCurrentAccessToken(); if (accessToken == null) { Profile.setCurrentProfile(null); return; } Utility.getGraphMeRequestWithCacheAsync(accessToken.getToken(), new Utility.GraphMeRequestWithCacheCallback() { @Override public void onSuccess(JSONObject userInfo) { String id = userInfo.optString("id"); if (id == null) { return; } String link = userInfo.optString("link"); Profile profile = new Profile( id, userInfo.optString("first_name"), userInfo.optString("middle_name"), userInfo.optString("last_name"), userInfo.optString("name"), link != null ? Uri.parse(link) : null ); Profile.setCurrentProfile(profile); } @Override public void onFailure(FacebookException error) { return; } }); } /** * Contructor. * @param id The id of the profile. * @param firstName The first name of the profile. Can be null. * @param middleName The middle name of the profile. Can be null. * @param lastName The last name of the profile. Can be null. * @param name The name of the profile. Can be null. * @param linkUri The link for this profile. Can be null. */ public Profile( final String id, @Nullable final String firstName, @Nullable final String middleName, @Nullable final String lastName, @Nullable final String name, @Nullable final Uri linkUri) { Validate.notNullOrEmpty(id, "id"); this.id = id; this.firstName = firstName; this.middleName = middleName; this.lastName = lastName; this.name = name; this.linkUri = linkUri; } /** * Getter for the Uri of the profile picture. * * @param width The desired width for the profile picture. * @param height The desired height for the profile picture. * @return The Uri of the profile picture. */ public Uri getProfilePictureUri( int width, int height) { return ImageRequest.getProfilePictureUri(this.id, width, height); } /** * Getter for the id of the profile. * @return id of the profile. */ public String getId() { return id; } /** * Getter for the first name of the profile. * @return the first name of the profile. */ public String getFirstName() { return firstName; } /** * Getter for the middle name of the profile. * @return the middle name of the profile. */ public String getMiddleName() { return middleName; } /** * Getter for the last name of the profile. * @return the last name of the profile. */ public String getLastName() { return lastName; } /** * Getter for the name of the profile. * @return the name of the profile. */ public String getName() { return name; } /** * Getter for the link of the profile. * @return the link of the profile. */ public Uri getLinkUri() { return linkUri; } @Override public boolean equals(Object other) { if (this == other) { return true; } if (!(other instanceof Profile)) { return false; } Profile o = (Profile) other; return id.equals(o.id) && firstName == null ? o.firstName == null : firstName.equals(o.firstName) && middleName == null ? o.middleName == null : middleName.equals(o.middleName) && lastName == null ? o.lastName == null : lastName.equals(o.lastName) && name == null ? o.name == null : name.equals(o.name) && linkUri == null ? o.linkUri == null : linkUri.equals(o.linkUri); } @Override public int hashCode() { int result = 17; result = result * 31 + id.hashCode(); if (firstName != null) { result = result * 31 + firstName.hashCode(); } if (middleName != null) { result = result * 31 + middleName.hashCode(); } if (lastName != null) { result = result * 31 + lastName.hashCode(); } if (name != null) { result = result * 31 + name.hashCode(); } if (linkUri != null) { result = result * 31 + linkUri.hashCode(); } return result; } JSONObject toJSONObject() { JSONObject jsonObject = new JSONObject(); try { jsonObject.put(ID_KEY, id); jsonObject.put(FIRST_NAME_KEY, firstName); jsonObject.put(MIDDLE_NAME_KEY, middleName); jsonObject.put(LAST_NAME_KEY, lastName); jsonObject.put(NAME_KEY, name); if (linkUri != null) { jsonObject.put(LINK_URI_KEY, linkUri.toString()); } } catch (JSONException object) { jsonObject = null; } return jsonObject; } Profile(JSONObject jsonObject) { id = jsonObject.optString(ID_KEY, null); firstName = jsonObject.optString(FIRST_NAME_KEY, null); middleName = jsonObject.optString(MIDDLE_NAME_KEY, null); lastName = jsonObject.optString(LAST_NAME_KEY, null); name = jsonObject.optString(NAME_KEY, null); String linkUriString = jsonObject.optString(LINK_URI_KEY, null); linkUri = linkUriString == null ? null : Uri.parse(linkUriString); } private Profile(Parcel source) { id = source.readString(); firstName = source.readString(); middleName = source.readString(); lastName = source.readString(); name = source.readString(); String linkUriString = source.readString(); linkUri = linkUriString == null ? null : Uri.parse(linkUriString); } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(id); dest.writeString(firstName); dest.writeString(middleName); dest.writeString(lastName); dest.writeString(name); dest.writeString(linkUri == null ? null : linkUri.toString()); } public static final Parcelable.Creator<Profile> CREATOR = new Parcelable.Creator() { @Override public Profile createFromParcel(Parcel source) { return new Profile(source); } @Override public Profile[] newArray(int size) { return new Profile[size]; } }; }