diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java new file mode 100644 index 000000000..0687e23a4 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java @@ -0,0 +1,209 @@ +package org.wordpress.android.ui.people; + +import android.app.Fragment; +import android.os.Bundle; +import android.text.TextUtils; +import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.wordpress.android.R; +import org.wordpress.android.WordPress; +import org.wordpress.android.datasets.PeopleTable; +import org.wordpress.android.models.Account; +import org.wordpress.android.models.AccountHelper; +import org.wordpress.android.models.Blog; +import org.wordpress.android.models.Capability; +import org.wordpress.android.models.Person; +import org.wordpress.android.models.Role; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.GravatarUtils; +import org.wordpress.android.util.StringUtils; +import org.wordpress.android.widgets.WPNetworkImageView; + +import java.text.SimpleDateFormat; + +public class PersonDetailFragment extends Fragment { + private static String ARG_PERSON_ID = "person_id"; + private static String ARG_LOCAL_TABLE_BLOG_ID = "local_table_blog_id"; + private static String ARG_PERSON_TYPE = "person_type"; + + private long mPersonID; + private int mLocalTableBlogID; + private Person.PersonType mPersonType; + + private WPNetworkImageView mAvatarImageView; + private TextView mDisplayNameTextView; + private TextView mUsernameTextView; + private LinearLayout mRoleContainer; + private TextView mRoleTextView; + private LinearLayout mSubscribedDateContainer; + private TextView mSubscribedDateTitleView; + private TextView mSubscribedDateTextView; + + public static PersonDetailFragment newInstance(long personID, int localTableBlogID, Person.PersonType personType) { + PersonDetailFragment personDetailFragment = new PersonDetailFragment(); + Bundle bundle = new Bundle(); + bundle.putLong(ARG_PERSON_ID, personID); + bundle.putInt(ARG_LOCAL_TABLE_BLOG_ID, localTableBlogID); + bundle.putSerializable(ARG_PERSON_TYPE, personType); + personDetailFragment.setArguments(bundle); + return personDetailFragment; + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + inflater.inflate(R.menu.person_detail, menu); + super.onCreateOptionsMenu(menu, inflater); + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.person_detail_fragment, container, false); + + mPersonID = getArguments().getLong(ARG_PERSON_ID); + mLocalTableBlogID = getArguments().getInt(ARG_LOCAL_TABLE_BLOG_ID); + mPersonType = (Person.PersonType) getArguments().getSerializable(ARG_PERSON_TYPE); + + mAvatarImageView = (WPNetworkImageView) rootView.findViewById(R.id.person_avatar); + mDisplayNameTextView = (TextView) rootView.findViewById(R.id.person_display_name); + mUsernameTextView = (TextView) rootView.findViewById(R.id.person_username); + mRoleContainer = (LinearLayout) rootView.findViewById(R.id.person_role_container); + mRoleTextView = (TextView) rootView.findViewById(R.id.person_role); + mSubscribedDateContainer = (LinearLayout) rootView.findViewById(R.id.subscribed_date_container); + mSubscribedDateTitleView = (TextView) rootView.findViewById(R.id.subscribed_date_title); + mSubscribedDateTextView = (TextView) rootView.findViewById(R.id.subscribed_date_text); + + Account account = AccountHelper.getDefaultAccount(); + boolean isCurrentUser = account.getUserId() == mPersonID; + Blog blog = WordPress.getBlog(mLocalTableBlogID); + if (!isCurrentUser && blog != null && blog.hasCapability(Capability.REMOVE_USERS)) { + setHasOptionsMenu(true); + } + + return rootView; + } + + @Override + public void onResume() { + super.onResume(); + + refreshPersonDetails(); + } + + public void refreshPersonDetails() { + if (!isAdded()) return; + + Person person = loadPerson(); + if (person != null) { + int avatarSz = getResources().getDimensionPixelSize(R.dimen.people_avatar_sz); + String avatarUrl = GravatarUtils.fixGravatarUrl(person.getAvatarUrl(), avatarSz); + + mAvatarImageView.setImageUrl(avatarUrl, WPNetworkImageView.ImageType.AVATAR); + mDisplayNameTextView.setText(StringUtils.unescapeHTML(person.getDisplayName())); + if (person.getRole() != null) { + mRoleTextView.setText(StringUtils.capitalize(person.getRole().toDisplayString())); + } + + if (!TextUtils.isEmpty(person.getUsername())) { + mUsernameTextView.setText(String.format("@%s", person.getUsername())); + } + + if (mPersonType == Person.PersonType.USER) { + mRoleContainer.setVisibility(View.VISIBLE); + setupRoleContainerForCapability(); + } else { + mRoleContainer.setVisibility(View.GONE); + } + + if (mPersonType == Person.PersonType.USER || mPersonType == Person.PersonType.VIEWER) { + mSubscribedDateContainer.setVisibility(View.GONE); + } else { + mSubscribedDateContainer.setVisibility(View.VISIBLE); + if (mPersonType == Person.PersonType.FOLLOWER) { + mSubscribedDateTitleView.setText(R.string.title_follower); + } else if (mPersonType == Person.PersonType.EMAIL_FOLLOWER) { + mSubscribedDateTitleView.setText(R.string.title_email_follower); + } + String dateSubscribed = SimpleDateFormat.getDateInstance().format(person.getDateSubscribed()); + String dateText = getString(R.string.follower_subscribed_since, dateSubscribed); + mSubscribedDateTextView.setText(dateText); + } + + // Adds extra padding to display name for email followers to make it vertically centered + int padding = mPersonType == Person.PersonType.EMAIL_FOLLOWER + ? (int) getResources().getDimension(R.dimen.margin_small) : 0; + changeDisplayNameTopPadding(padding); + } else { + AppLog.w(AppLog.T.PEOPLE, "Person returned null from DB for personID: " + mPersonID + + " & localTableBlogID: " + mLocalTableBlogID); + } + } + + public void setPersonDetails(long personID, int localTableBlogID) { + mPersonID = personID; + mLocalTableBlogID = localTableBlogID; + refreshPersonDetails(); + } + + // Checks current user's capabilities to decide whether she can change the role or not + private void setupRoleContainerForCapability() { + Blog blog = WordPress.getBlog(mLocalTableBlogID); + Account account = AccountHelper.getDefaultAccount(); + boolean isCurrentUser = account.getUserId() == mPersonID; + boolean canChangeRole = (blog != null) && !isCurrentUser && blog.hasCapability(Capability.PROMOTE_USERS); + if (canChangeRole) { + mRoleContainer.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showRoleChangeDialog(); + } + }); + } else { + // Remove the selectableItemBackground if the user can't be edited + clearRoleContainerBackground(); + // Change transparency to give a visual cue to the user that it's disabled + mRoleContainer.setAlpha(0.5f); + } + } + + private void showRoleChangeDialog() { + Person person = loadPerson(); + if (person == null || person.getRole() == null) { + return; + } + + RoleChangeDialogFragment dialog = RoleChangeDialogFragment.newInstance(person.getPersonID(), + person.getLocalTableBlogId(), person.getRole()); + dialog.show(getFragmentManager(), null); + } + + // used to optimistically update the role + public void changeRole(Role newRole) { + mRoleTextView.setText(newRole.toDisplayString()); + } + + @SuppressWarnings("deprecation") + private void clearRoleContainerBackground() { + if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN) { + mRoleContainer.setBackgroundDrawable(null); + } else { + mRoleContainer.setBackground(null); + } + } + + private void changeDisplayNameTopPadding(int newPadding) { + if (mDisplayNameTextView == null) { + return; + } + mDisplayNameTextView.setPadding(0, newPadding, 0 , 0); + } + + public Person loadPerson() { + return PeopleTable.getPerson(mPersonID, mLocalTableBlogID, mPersonType); + } +} |