package org.goodev.discourse.ui; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager.LoaderCallbacks; import android.support.v4.content.AsyncTaskLoader; import android.support.v4.content.Loader; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.view.ViewStub; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import org.goodev.discourse.ActivityUtils; import org.goodev.discourse.App; import org.goodev.discourse.R; import org.goodev.discourse.api.Api; import org.goodev.discourse.api.data.UserDetails; import org.goodev.discourse.utils.HttpRequest; import org.goodev.discourse.utils.HttpRequest.HttpRequestException; import org.goodev.discourse.utils.ImageLoader; import org.goodev.discourse.utils.L; import org.goodev.discourse.utils.SerializableSparseIntArray; import org.goodev.discourse.utils.Utils; import org.json.JSONException; import org.json.JSONObject; import java.io.IOException; import java.net.HttpURLConnection; public class UserFragment extends Fragment implements LoaderCallbacks<UserDetails>, OnClickListener { private static final int LOADER_ID = 1; private String mUsername; private ImageView mUserIcon; private TextView mNameTV; private TextView mUsernameTV; private TextView mBioRawTV; private TextView mWebsiteTV; private TextView mCreateAtTV; private TextView mLastPostTV; private TextView mLastSeenTV; private TextView mTrustLevelTV; private Button mAllBtn; private Button mTopicsBtn; private Button mPostsBtn; private Button mRepliesBtn; private Button mLikesGivenBtn; private Button mLikesReceivedBtn; private Button mEditsBtn; private Button mBookmarksBtn; private Button mLikesBtn; private View mMainContent; private boolean mCanSendPrivateMsg; private View mActivatedBtn; private int mActivatedId; private UserActionsListener mListener; private MenuItem mPrivateMsgMenu; public static UserFragment newInstance(String username) { UserFragment f = new UserFragment(); Bundle args = new Bundle(); args.putString(Utils.EXTRA_NAME, username); f.setArguments(args); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mUsername = getArguments().getString(Utils.EXTRA_NAME); setHasOptionsMenu(true); if (savedInstanceState != null) { mActivatedId = savedInstanceState.getInt(Utils.EXTRA_ID); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = inflater.inflate(R.layout.fragment_user_layout, container, false); mMainContent = v.findViewById(R.id.user_content); mUserIcon = (ImageView) v.findViewById(R.id.user_icon); mNameTV = (TextView) v.findViewById(R.id.name); mUsernameTV = (TextView) v.findViewById(R.id.user_name); mBioRawTV = (TextView) v.findViewById(R.id.bio_raw); mWebsiteTV = (TextView) v.findViewById(R.id.website); mCreateAtTV = (TextView) v.findViewById(R.id.create_at); mLastPostTV = (TextView) v.findViewById(R.id.last_post); mLastSeenTV = (TextView) v.findViewById(R.id.last_seen); mTrustLevelTV = (TextView) v.findViewById(R.id.trust_level); mAllBtn = (Button) v.findViewById(R.id.all_action); mAllBtn.setOnClickListener(this); mTopicsBtn = (Button) v.findViewById(R.id.topics_action); mTopicsBtn.setOnClickListener(this); mPostsBtn = (Button) v.findViewById(R.id.posts_action); mPostsBtn.setOnClickListener(this); mRepliesBtn = (Button) v.findViewById(R.id.replies_action); mRepliesBtn.setOnClickListener(this); mLikesGivenBtn = (Button) v.findViewById(R.id.likes_given_action); mLikesGivenBtn.setOnClickListener(this); mLikesReceivedBtn = (Button) v.findViewById(R.id.likes_received_action); mLikesReceivedBtn.setOnClickListener(this); mEditsBtn = (Button) v.findViewById(R.id.edits_action); mEditsBtn.setOnClickListener(this); mBookmarksBtn = (Button) v.findViewById(R.id.bookmarks_action); mBookmarksBtn.setOnClickListener(this); mLikesBtn = (Button) v.findViewById(R.id.likes_action); mLikesBtn.setOnClickListener(this); if (isYou()) { ViewStub vs = (ViewStub) v.findViewById(R.id.private_msg_stub); View msgLayout = vs.inflate(); msgLayout.findViewById(R.id.all_private_msg).setOnClickListener(this); msgLayout.findViewById(R.id.unread_private_msg).setOnClickListener(this); msgLayout.findViewById(R.id.mine_private_msg).setOnClickListener(this); } if (mActivatedId == 0) { mActivatedBtn = mAllBtn; mActivatedBtn.setActivated(true); } else { View view = v.findViewById(mActivatedId); checkAndSetActivatedView(view); } return v; } private void checkAndSetActivatedView(View v) { if (v.getId() == mActivatedId) { v.setActivated(true); mActivatedBtn = v; } } public boolean isYou() { if (TextUtils.isEmpty(mUsername)) { return false; } return mUsername.equals(App.getUsername()); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // In support library r8, calling initLoader for a fragment in a FragmentPagerAdapter // in the fragment's onCreate may cause the same LoaderManager to be dealt to multiple // fragments because their mIndex is -1 (haven't been added to the activity yet). Thus, // we do this in onActivityCreated. Bundle args = new Bundle(); args.putString(Utils.EXTRA_NAME, mUsername); getLoaderManager().initLoader(LOADER_ID, args, this); showActonBarProgress(); } private void setupData(UserDetails data) { mMainContent.setVisibility(View.VISIBLE); hideActonBarProgress(); if (data == null) { return; } mCanSendPrivateMsg = data.can_send_private_message_to_user; if (mPrivateMsgMenu != null) { mPrivateMsgMenu.setVisible(data.can_send_private_message_to_user); } L.i("UserDetails: " + data.name + " " + data.created_at); int maxSize = Api.AVATAR_SIZE_BIG; String iconUrl = Utils.getAvatarUrl(data.avatar_template, maxSize); ImageLoader loader = App.getImageLoader(getActivity(), getResources()); loader.get(iconUrl, mUserIcon); mNameTV.setText(data.name); mUsernameTV.setText(data.username); String bio = (data.bio_raw == null || data.bio_raw.equals(Api.NULL)) ? getString(R.string.empty_bio, data.name) : data.bio_raw; mBioRawTV.setText(bio); boolean noSite = TextUtils.isEmpty(data.website) || Utils.HTTP_PREFIX.equals(data.website) || data.website.equals(Api.NULL); int showSite = noSite ? View.GONE : View.VISIBLE; mWebsiteTV.setVisibility(showSite); mWebsiteTV.setText(getString(R.string.website, data.website)); mCreateAtTV.setText(getString(R.string.create_at, Utils.formatPostTime(data.created_at))); int showLastPost = data.last_posted_at > 0 ? View.VISIBLE : View.GONE; mLastPostTV.setVisibility(showLastPost); mLastPostTV.setText(getString(R.string.last_post, Utils.formatPostTime(data.last_posted_at))); mLastSeenTV.setText(getString(R.string.last_seen, Utils.formatPostTime(data.last_seen_at))); mTrustLevelTV.setText(getString(R.string.trust_level, getTrustLevel(data.trust_level))); SerializableSparseIntArray actions = data.stats; int count = 0; int num = actions.get(UserActionsFragment.TYPE_TOPIC, 0); boolean hasTopics = num > 0; mTopicsBtn.setVisibility(hasTopics ? View.VISIBLE : View.GONE); mTopicsBtn.setText(getString(R.string.actions_topics, num)); count += num; num = actions.get(UserActionsFragment.TYPE_POST, 0); mPostsBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mPostsBtn.setText(getString(R.string.actions_posts, num)); count += num; num = actions.get(UserActionsFragment.TYPE_REPLY, 0); mRepliesBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mRepliesBtn.setText(getString(R.string.actions_replies, num)); count += num; num = actions.get(UserActionsFragment.TYPE_LIKES_GIVEN, 0); mLikesGivenBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mLikesGivenBtn.setText(getString(R.string.actions_likes_given, num)); count += num; num = actions.get(UserActionsFragment.TYPE_LIKES_RECEIVED, 0); mLikesReceivedBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mLikesReceivedBtn.setText(getString(R.string.actions_likes_received, num)); count += num; num = actions.get(UserActionsFragment.TYPE_EDIT, 0); mEditsBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mEditsBtn.setText(getString(R.string.actions_edits, num)); count += num; num = actions.get(UserActionsFragment.TYPE_BOOKMARK, 0); mBookmarksBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mBookmarksBtn.setText(getString(R.string.actions_bookmarks, num)); count += num; num = actions.get(UserActionsFragment.TYPE_LIKES, 0); mLikesBtn.setVisibility(num > 0 ? View.VISIBLE : View.GONE); mLikesBtn.setText(getString(R.string.actions_likes, num)); count += num; mAllBtn.setVisibility(count > 0 ? View.VISIBLE : View.GONE); mAllBtn.setText(getString(R.string.actions_all, count)); } private String getTrustLevel(int trust_level) { String[] tl = getResources().getStringArray(R.array.trust_levels); if (trust_level >= 0 && trust_level < tl.length) { return tl[trust_level]; } // 如果获取不到信息 则返回为2 正常用户 return tl[2]; } @Override public Loader<UserDetails> onCreateLoader(int id, Bundle args) { return new UserLoader(getActivity(), args.getString(Utils.EXTRA_NAME)); } @Override public void onLoadFinished(Loader<UserDetails> loader, UserDetails data) { setupData(data); } @Override public void onLoaderReset(Loader<UserDetails> loader) { } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); if (mActivatedBtn != null) { outState.putInt(Utils.EXTRA_ID, mActivatedBtn.getId()); } } @Override public void onClick(View v) { if (v instanceof Button) { if (mActivatedBtn != null) { mActivatedBtn.setActivated(false); } mActivatedBtn = v; mActivatedBtn.setActivated(true); } switch (v.getId()) { case R.id.all_action: viewActions(UserActionsFragment.TYPE_ALL); break; case R.id.topics_action: viewActions(UserActionsFragment.TYPE_TOPIC); break; case R.id.posts_action: viewActions(UserActionsFragment.TYPE_POST); break; case R.id.replies_action: viewActions(UserActionsFragment.TYPE_REPLY); break; case R.id.likes_action: viewActions(UserActionsFragment.TYPE_LIKES); break; case R.id.likes_given_action: viewActions(UserActionsFragment.TYPE_LIKES_GIVEN); break; case R.id.likes_received_action: viewActions(UserActionsFragment.TYPE_LIKES_RECEIVED); break; case R.id.edits_action: viewActions(UserActionsFragment.TYPE_EDIT); break; case R.id.bookmarks_action: viewActions(UserActionsFragment.TYPE_BOOKMARK); break; case R.id.all_private_msg: viewActions(UserActionsFragment.TYPE_ALL_PRIVATE_MSG); break; case R.id.unread_private_msg: viewActions(UserActionsFragment.TYPE_UNREAD_PRIVATE_MSG); break; case R.id.mine_private_msg: viewActions(UserActionsFragment.TYPE_MIN_PRIVATE_MSG); break; } } private void viewActions(int type) { if (mListener != null) { mListener.onActionClicked(type); } } @Override public void onAttach(Activity activity) { super.onAttach(activity); if (activity instanceof UserActionsListener) { mListener = (UserActionsListener) activity; } } private void showActonBarProgress() { Activity a = getActivity(); if (a != null) { a.setProgressBarIndeterminateVisibility(Boolean.TRUE); } } private void hideActonBarProgress() { Activity a = getActivity(); if (a != null) { a.setProgressBarIndeterminateVisibility(Boolean.FALSE); } } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.fragment_user, menu); mPrivateMsgMenu = menu.findItem(R.id.action_private_msg); mPrivateMsgMenu.setVisible(mCanSendPrivateMsg); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_private_msg: ActivityUtils.openNewPrivateMsgEditorActivity(getActivity(), mUsername); return true; } return super.onOptionsItemSelected(item); } public interface UserActionsListener { void onActionClicked(int type); } private static class UserLoader extends AsyncTaskLoader<UserDetails> { private final String mUsername; private boolean mIsLoading; private boolean mHasError; public UserLoader(Context context, String username) { super(context); this.mUsername = username; mIsLoading = true; mHasError = false; } @Override public UserDetails loadInBackground() { try { mIsLoading = true; String url = App.getSiteUrl() + String.format(Api.GET_USER, mUsername); L.i(url); HttpRequest hr = HttpRequest.get(url); HttpURLConnection conn = hr.getConnection(); if (App.isLogin()) { App.getCookieManager().setCookies(conn); } String body = hr.body(); L.i(body); JSONObject obj = new JSONObject(body); if (obj.has(Api.K_user)) { JSONObject userObj = obj.getJSONObject(Api.K_user); UserDetails user = Api.getUserDetails(userObj); mHasError = false; return user; } } catch (HttpRequestException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } mHasError = true; return null; } @Override public void deliverResult(UserDetails data) { mIsLoading = false; super.deliverResult(data); } @Override protected void onStartLoading() { super.onStartLoading(); forceLoad(); } @Override protected void onStopLoading() { mIsLoading = false; cancelLoad(); } @Override protected void onReset() { super.onReset(); onStopLoading(); } public boolean isLoading() { return mIsLoading; } public boolean hasError() { return mHasError; } } }