package org.qinshuihepan.bbs.ui.fragment; import android.database.Cursor; import android.os.AsyncTask; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.widget.SwipeRefreshLayout; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.nhaarman.listviewanimations.swinginadapters.AnimationAdapter; import org.jsoup.Connection; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.qinshuihepan.bbs.App; import org.qinshuihepan.bbs.R; import org.qinshuihepan.bbs.api.Api; import org.qinshuihepan.bbs.dao.PostsDataHelper; import org.qinshuihepan.bbs.data.Request; import org.qinshuihepan.bbs.model.BasePost; import org.qinshuihepan.bbs.model.Post; import org.qinshuihepan.bbs.ui.adapter.CardsAnimationAdapter; import org.qinshuihepan.bbs.ui.adapter.PostsAdapter; import org.qinshuihepan.bbs.util.ActionBarUtils; import org.qinshuihepan.bbs.util.ListViewUtils; import org.qinshuihepan.bbs.util.TaskUtils; import org.qinshuihepan.bbs.util.Utils; import org.qinshuihepan.bbs.util.sharedpreference.Athority; import org.qinshuihepan.bbs.view.LoadingFooter; import org.qinshuihepan.bbs.view.PageListView; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import butterknife.ButterKnife; import butterknife.InjectView; /** * Created by liurongchan on 14-4-25. */ public class PostsFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor>, SwipeRefreshLayout.OnRefreshListener { public static final String EXTRA_CATEGORY = "extra_category"; @InjectView(R.id.swipe_container) SwipeRefreshLayout mSwipeLayout; @InjectView(R.id.listView) PageListView mListView; private String mCategory; private PostsDataHelper mpDataHelper; private PostsAdapter mAdapter; private int mPage = 1; private int maxPage = 1; private boolean isloadmaxpage = false; public static PostsFragment newInstance(String category) { PostsFragment fragment = new PostsFragment(); Bundle bundle = new Bundle(); bundle.putString(EXTRA_CATEGORY, category); fragment.setArguments(bundle); return fragment; } private static boolean isNumeric(String str) { for (int i = str.length(); --i >= 0; ) { if (!Character.isDigit(str.charAt(i))) { return false; } } return true; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View contentView = inflater.inflate(R.layout.fragment_post, container, false); ButterKnife.inject(this, contentView); parseArgument(); mpDataHelper = new PostsDataHelper(getActivity()); mAdapter = new PostsAdapter(getActivity(), mListView); View header = new View(getActivity()); mListView.addHeaderView(header); AnimationAdapter animationAdapter = new CardsAnimationAdapter(mAdapter); animationAdapter.setAbsListView(mListView); mListView.setAdapter(animationAdapter); mListView.setLoadNextListener(new PageListView.OnLoadNextListener() { @Override public void onLoadNext() { if (mPage >= maxPage) { mListView.setState(LoadingFooter.State.TheEnd); } else { loadNext(); } } }); initActionBar(); mSwipeLayout.setOnRefreshListener(this); mSwipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, android.R.color.holo_orange_light, android.R.color.holo_red_light); getLoaderManager().initLoader(0, null, this); mpDataHelper.deleteAll(); return contentView; } private void parseArgument() { Bundle bundle = getArguments(); mCategory = bundle.getString(EXTRA_CATEGORY); } private void initActionBar() { View actionBarContainer = ActionBarUtils.findActionBarContainer(getActivity()); actionBarContainer.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ListViewUtils.smoothScrollListViewToTop(mListView); } }); } private void loadData(final int next) { if (!mSwipeLayout.isRefreshing() && (1 == next)) { mSwipeLayout.setRefreshing(true); } final Integer tempCategoryID = Integer.valueOf(App.getContext().getResources().getString(Integer.valueOf(Utils.FORUM_CATEGORY_ID.get(mCategory)))); if (tempCategoryID.equals(10001) || tempCategoryID.equals(10002) || tempCategoryID.equals(10003)) { TaskUtils.executeAsyncTask(new AsyncTask<String, Void, Boolean>() { @Override protected Boolean doInBackground(String... params) { ArrayList<BasePost> posts = new ArrayList<BasePost>(); Document doc = null; mpDataHelper.deleteAll(); try { Connection.Response response = Request.execute(Api.HOST, "Mozilla", (Map<String, String>) Athority.getSharedPreference().getAll(), Connection.Method.GET); doc = response.parse(); Element portalBlockContents = null; String title = ""; String time = ""; String comment_count = ""; int haveimg = 0; int tid = 0; String author = ""; BasePost post; if (Athority.getSharedPreference().getString(Athority.HAVE_UID, "no").equals("no")) { Map<String, String> user_info = new HashMap<String, String>(); Elements ys = doc.getElementsByClass("y"); for (Element y : ys) { for (Element a : y.getElementsByTag("a")) { String start = "http://bbs.stuhome.net/home.php?mod=space uid="; String uid = a.attr("href").substring(start.length() - 1); user_info.put("uid", uid); break; } break; } Athority.addOther(Athority.HAVE_UID, "yes"); Athority.addCookies(user_info); } switch (tempCategoryID) { case 10002: portalBlockContents = doc .getElementById("portal_block_21_content"); break; case 10001: portalBlockContents = doc .getElementById("portal_block_20_content"); break; case 10003: portalBlockContents = doc .getElementById("portal_block_22_content"); break; } for (Element portalBlockContent : portalBlockContents.getElementsByTag("li")) { tid = Integer.valueOf(portalBlockContent.select("a[title]").attr("href").substring(52)); title = portalBlockContent.select("a[title]").attr("title"); post = new Post(tempCategoryID, tid, 0, title, "", "", haveimg, 0, author, null); posts.add(post); } mpDataHelper.bulkInsert(posts); } catch (IOException e) { e.printStackTrace(); } return true; } @Override protected void onPostExecute(Boolean isRefreshFromTop) { super.onPostExecute(isRefreshFromTop); if (isRefreshFromTop) { mSwipeLayout.setRefreshing(false); } else { mListView.setState(LoadingFooter.State.Idle, 3000); } // getLoaderManager().restartLoader(0, null, PostsFragment.this); } }); } else { TaskUtils.executeAsyncTask(new AsyncTask<String, Void, Boolean>() { @Override protected Boolean doInBackground(String... params) { boolean isRefreshFromTop = (1 == mPage); ArrayList<BasePost> posts = new ArrayList<BasePost>(); Document doc = null; if (isRefreshFromTop) { mpDataHelper.deleteAll(); } try { Connection.Response response = Request.execute(String.format(Api.POSTS, App.getContext().getResources().getString(Integer.valueOf(Utils.FORUM_CATEGORY_ID.get(mCategory))), next), "Mozilla", (Map<String, String>) Athority.getSharedPreference().getAll(), Connection.Method.GET); doc = response.parse(); Elements tbodies = doc.getElementsByTag("tbody"); String str_tid = ""; String title = ""; String time = ""; String comment_count = ""; int haveimg = 0; int tid = 0; String author = ""; BasePost post; for (Element tbody : tbodies) { str_tid = tbody.id(); if (str_tid.equals("")) { continue; } else if (str_tid.startsWith("stickthread_")) { tid = Integer.valueOf(str_tid.substring("stickthread_" .length())); } else if (str_tid.startsWith("normalthread_")) { tid = Integer.valueOf(str_tid.substring("normalthread_" .length())); } else if (str_tid.equals("separatorline")) { continue; } Elements titles = tbody.select("a.s.xst"); title = titles.text(); Elements bys = tbody.getElementsByClass("by"); for (Element by : bys) { author = by.getElementsByTag("a").text(); Elements spans = by.getElementsByTag("span"); for (Element span : spans) { time = span.getElementsByTag("span").text(); } break; } Elements nums = tbody.getElementsByClass("num"); for (Element num : nums) { comment_count = num.getElementsByTag("a").text(); if (!isNumeric(comment_count)) { comment_count = "0"; } } post = new Post(0, tid, 0, title, "", time, haveimg, Integer.valueOf(comment_count), author, null); posts.add(post); } if (!isloadmaxpage) { Element fd_page_bottom = doc.getElementById("fd_page_top"); if (fd_page_bottom.getElementsByTag("strong").text() .equals("")) { maxPage = 1; mPage = 1; } else { maxPage = Integer.valueOf(fd_page_bottom .getElementsByTag("strong").text()); mPage = maxPage; Elements page_numbers = fd_page_bottom .getElementsByTag("a"); int now_number = 1; String str_now_number = ""; for (Element page_number : page_numbers) { str_now_number = page_number.text(); if (str_now_number.startsWith("... ")) { now_number = Integer.valueOf(str_now_number .substring("... ".length())); } else if (str_now_number.equals("下一页")) { continue; } else { now_number = Integer.valueOf(str_now_number); } if (now_number > maxPage) { maxPage = now_number; } } isloadmaxpage = true; } } mpDataHelper.bulkInsert(posts); } catch (IOException e) { e.printStackTrace(); } return isRefreshFromTop; } @Override protected void onPostExecute(Boolean isRefreshFromTop) { super.onPostExecute(isRefreshFromTop); if (isRefreshFromTop) { mSwipeLayout.setRefreshing(false); } else { mListView.setState(LoadingFooter.State.Idle, 3000); } // getLoaderManager().restartLoader(0, null, PostsFragment.this); } }); } } private void loadFirst() { mPage = 1; loadData(mPage); } private void loadNext() { mPage++; loadData(mPage); } public void loadFirstAndScrollToTop() { ListViewUtils.smoothScrollListViewToTop(mListView); loadFirst(); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return mpDataHelper.getCursorLoader(); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mAdapter.changeCursor(data); if (data != null && data.getCount() == 0) { loadFirst(); } } @Override public void onLoaderReset(Loader<Cursor> cursorLoader) { mAdapter.changeCursor(null); } @Override public void onRefresh() { loadFirst(); } @Override public void onResume() { super.onResume(); getLoaderManager().restartLoader(0, null, this); } }