package org.aisen.weibo.sina.ui.fragment.timeline; import android.app.Fragment; import android.os.Bundle; import android.text.Html; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.TextView; import org.aisen.android.common.utils.Utils; import org.aisen.android.component.bitmaploader.BitmapLoader; import org.aisen.android.network.http.Params; import org.aisen.android.network.task.TaskException; import org.aisen.android.support.inject.ViewInject; import org.aisen.android.support.paging.IPaging; import org.aisen.android.ui.fragment.AListFragment; import org.aisen.android.ui.fragment.APagingFragment; import org.aisen.android.ui.fragment.ATabsFragment; import org.aisen.android.ui.fragment.adapter.ARecycleViewItemView; import org.aisen.android.ui.fragment.itemview.BasicFooterView; import org.aisen.android.ui.fragment.itemview.IITemView; import org.aisen.android.ui.fragment.itemview.IItemViewCreator; import org.aisen.weibo.sina.R; import org.aisen.weibo.sina.base.AppContext; import org.aisen.weibo.sina.base.AppSettings; import org.aisen.weibo.sina.sinasdk.SinaSDK; import org.aisen.weibo.sina.sinasdk.bean.StatusContent; import org.aisen.weibo.sina.sinasdk.bean.StatusContents; import org.aisen.weibo.sina.sinasdk.bean.StatusRepost; import org.aisen.weibo.sina.sinasdk.bean.WeiBoUser; import org.aisen.weibo.sina.support.paging.TimelinePaging; import org.aisen.weibo.sina.support.utils.AisenUtils; import org.aisen.weibo.sina.support.utils.ImageConfigUtils; import org.aisen.weibo.sina.ui.activity.base.SinaCommonActivity; import org.aisen.weibo.sina.ui.fragment.base.BizFragment; import org.aisen.weibo.sina.ui.fragment.comment.TimelineCommentItemView; import org.aisen.weibo.sina.ui.fragment.comment.TimelineDetailPagerFragment; import org.aisen.weibo.sina.ui.widget.AisenTextView; import java.util.ArrayList; import java.util.List; /** * 某条原创微博的转发微博 * * Created by wangdan on 16/1/22. */ public class TimelineRepostFragment extends AListFragment<StatusContent, StatusContents> implements ATabsFragment.ITabInitData { public static TimelineRepostFragment newInstance(StatusContent statusContent) { Bundle args = new Bundle(); args.putSerializable("status", statusContent); TimelineRepostFragment fragment = new TimelineRepostFragment(); fragment.setArguments(args); return fragment; } private StatusContent statusContent; private BizFragment bizFragment; @Override public int inflateContentView() { return R.layout.ui_timeline_comment; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); statusContent = savedInstanceState == null ? (StatusContent) getArguments().getSerializable("status") : (StatusContent) savedInstanceState.getSerializable("status"); bizFragment = BizFragment.createBizFragment(this); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putSerializable("status", statusContent); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); BizFragment.createBizFragment(getActivity()).getFabAnimator().attachToListView(getRefreshView(), null, this); } @Override public void requestData(RefreshMode mode) { boolean load = true; // 如果还没有加载过数据,切且显示的是当前的页面 if (getTaskCount(PAGING_TASK_ID) == 0) { load = AisenUtils.checkTabsFragmentCanRequestData(this); } if (load) new RepostTask(mode).execute(); } @Override public void onTabRequestData() { requestDataDelay(100); } class RepostTask extends ATimelineTask { public RepostTask(RefreshMode mode) { super(mode); } @Override public StatusContents getStatusContents(Params params) throws TaskException { String statusId = statusContent.getId() + ""; params.addParameter("id", statusId); StatusRepost statusRepost = SinaSDK.getInstance(AppContext.getAccount().getAccessToken()).statusRepostTimeline(params); if (statusRepost != null) { for (StatusContent status : statusRepost.getReposts()) { status.setRetweeted_status(null); } return new StatusContents(statusRepost.getReposts()); } throw new TaskException(TaskException.TaskError.resultIllegal.toString()); } } class RepostItemView extends ARecycleViewItemView<StatusContent> { @ViewInject(id = R.id.imgPhoto) ImageView imgPhoto; @ViewInject(id = R.id.txtName) TextView txtName; @ViewInject(id = R.id.txtDesc) TextView txtDesc; @ViewInject(id = R.id.txtContent) AisenTextView txtContent; int firstTop; int normalTop; public RepostItemView(View convertView) { super(getActivity(), convertView); firstTop = Utils.dip2px(getContext(), 16); normalTop = Utils.dip2px(getContext(), 8); } @Override public void onBindData(View convertView, StatusContent data, int position) { WeiBoUser user = data.getUser(); if (user != null) { BitmapLoader.getInstance().display(TimelineRepostFragment.this, AisenUtils.getUserPhoto(user), imgPhoto, ImageConfigUtils.getLargePhotoConfig()); bizFragment.userShow(imgPhoto, user); txtName.setText(AisenUtils.getUserScreenName(user)); } else { bizFragment.userShow(imgPhoto, null); txtName.setText(R.string.error_cmts); imgPhoto.setImageResource(R.drawable.user_placeholder); } txtContent.setContent(data.getText()); AisenUtils.setTextSize(txtContent); String createAt = AisenUtils.convDate(data.getCreated_at()); String from = String.format("%s", Html.fromHtml(data.getSource())); String desc = String.format("%s %s", createAt, from); txtDesc.setText(desc); int top = position == 0 ? firstTop : normalTop; convertView.setPadding(convertView.getPaddingLeft(), top, convertView.getPaddingRight(), convertView.getPaddingBottom()); } } @Override public IItemViewCreator<StatusContent> configItemViewCreator() { return new IItemViewCreator<StatusContent>() { @Override public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) { return inflater.inflate(TimelineCommentItemView.LAYOUT_RES, parent, false); } @Override public IITemView<StatusContent> newItemView(View convertView, int viewType) { return new RepostItemView(convertView); } }; } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { super.onItemClick(parent, view, position, id); TimelineDetailPagerFragment.launch(getActivity(), getAdapterItems().get(position)); } @Override protected IPaging<StatusContent, StatusContents> newPaging() { return new TimelinePaging(); } @Override protected IItemViewCreator<StatusContent> configFooterViewCreator() { return new IItemViewCreator<StatusContent>() { @Override public View newContentView(LayoutInflater inflater, ViewGroup parent, int viewType) { return inflater.inflate(BasicFooterView.LAYOUT_RES, parent, false); } @Override public IITemView<StatusContent> newItemView(View convertView, int viewType) { return new BasicFooterView<StatusContent>(getActivity(), convertView, TimelineRepostFragment.this) { @Override protected String endpagingText() { return getString(R.string.disable_status); } @Override protected String loadingText() { return String.format(getString(R.string.loading_status), AppSettings.getCommentCount()); } }; } }; } abstract public class ATimelineTask extends APagingTask<Void, Void, StatusContents> { public ATimelineTask(RefreshMode mode) { super(mode); } @Override protected List<StatusContent> parseResult(StatusContents statusContents) { return statusContents.getStatuses(); } @Override protected StatusContents workInBackground(RefreshMode mode, String previousPage, String nextPage, Void... p) throws TaskException { Params params = new Params(); if (mode == APagingFragment.RefreshMode.refresh && !TextUtils.isEmpty(previousPage)) params.addParameter("since_id", previousPage); if (mode == APagingFragment.RefreshMode.update && !TextUtils.isEmpty(nextPage)) params.addParameter("max_id", nextPage); params.addParameter("count", String.valueOf(AppSettings.getTimelineCount())); return getStatusContents(params); } @Override protected boolean handleResult(RefreshMode mode, List<StatusContent> datas) { // 如果是重置或者刷新数据,加载数据大于分页大小,则清空之前的数据 if (mode == RefreshMode.refresh) { // 目前微博加载分页大小是默认大小 if (datas.size() >= AppSettings.getTimelineCount()) { setAdapterItems(new ArrayList<StatusContent>()); return true; } } return super.handleResult(mode, datas); } @Override protected void onFailure(TaskException exception) { super.onFailure(exception); if (!isContentEmpty()) showMessage(exception.getMessage()); } @Override protected void onFinished() { super.onFinished(); if (getActivity() != null) { Fragment fragment = getActivity().getFragmentManager().findFragmentByTag(SinaCommonActivity.FRAGMENT_TAG); if (fragment != null && fragment instanceof TimelineDetailPagerFragment) { ((TimelineDetailPagerFragment) fragment).refreshEnd(); } } } public abstract StatusContents getStatusContents(Params params) throws TaskException; } @Override public boolean onToolbarDoubleClick() { if (AisenUtils.checkTabsFragmentCanRequestData(this)) { Fragment fragment = getActivity().getFragmentManager().findFragmentByTag(SinaCommonActivity.FRAGMENT_TAG); if (fragment != null && fragment instanceof TimelineDetailPagerFragment) { ((TimelineDetailPagerFragment) fragment).swipeRefreshLayout.setRefreshing(true); } requestDataDelaySetRefreshing(AppSettings.REQUEST_DATA_DELAY); getRefreshView().setSelectionFromTop(0, 0); return true; } return false; } }