aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/people/PersonDetailFragment.java
diff options
context:
space:
mode:
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.java209
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);
+ }
+}