package org.qinshuihepan.bbs.ui; import android.app.ActionBar; import android.app.AlertDialog; import android.app.ProgressDialog; import android.database.Cursor; import android.net.http.HttpResponseCache; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; import android.support.v4.widget.SwipeRefreshLayout; import android.text.InputFilter; import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.EditText; import android.widget.Toast; 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.R; import org.qinshuihepan.bbs.api.Api; import org.qinshuihepan.bbs.dao.ImagesDataHelper; import org.qinshuihepan.bbs.dao.ItemsDataHelper; import org.qinshuihepan.bbs.data.Request; import org.qinshuihepan.bbs.model.BasePost; import org.qinshuihepan.bbs.model.Image; import org.qinshuihepan.bbs.model.Post; import org.qinshuihepan.bbs.model.PostWithPic; import org.qinshuihepan.bbs.ui.adapter.CardsAnimationAdapter; import org.qinshuihepan.bbs.ui.adapter.PostContentAdapter; 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.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; /** * Created by liurongchan on 14-5-2. */ public class PostContentActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor>, SwipeRefreshLayout.OnRefreshListener { public static final String TID = "tid"; public static final String FID = "fid"; public static final String TITLE = "title"; SwipeRefreshLayout mSwipeLayout; PageListView mListView; ArrayList<BasePost> posts = new ArrayList<BasePost>(); String formhash = ""; String url = ""; private int tid; private int fid; private String title; private ItemsDataHelper mtDataHelper; private ImagesDataHelper miDataHelper; private PostContentAdapter mAdapter; private int mPage = 1; private int maxPage; private boolean isloadmaxpage = false; private ProgressDialog progressDialog; private HttpResponseCache httpResponseCache; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActionBar actionBar = getActionBar(); actionBar.setDisplayHomeAsUpEnabled(true); setTitle(R.string.view_post); tid = getIntent().getExtras().getInt(TID); fid = getIntent().getExtras().getInt(FID); title = getIntent().getExtras().getString(TITLE); setContentView(R.layout.post_layout); mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); mListView = (PageListView) findViewById(R.id.listView); mtDataHelper = new ItemsDataHelper(this); miDataHelper = new ImagesDataHelper(this); mAdapter = new PostContentAdapter(this); View header = new View(this); 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) { Toast.makeText(getApplicationContext(), "已经滑到底啦!", Toast.LENGTH_SHORT).show(); mListView.setState(LoadingFooter.State.TheEnd); } else { loadNext(); } } }); mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override public boolean onItemLongClick(AdapterView<?> parent, View view, final int postion, long id) { final EditText editText = new EditText(PostContentActivity.this); editText.setHeight(PostContentActivity.this.getResources().getDimensionPixelSize( R.dimen.comment_dialog_height)); editText.setFilters(new InputFilter[]{new InputFilter.LengthFilter( 250)}); editText.setGravity(Gravity.LEFT | Gravity.TOP); AlertDialog.Builder commentDialog = new AlertDialog.Builder( PostContentActivity.this).setTitle("回复").setView(editText) .setNegativeButton("取消", null) .setPositiveButton("确定", null); final AlertDialog dialog = commentDialog.create(); dialog.show(); if (postion == 1) { url = String.format(Api.REPLY, fid, tid); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { String message = editText.getText().toString(); byte[] m = message.getBytes(); if (m.length < 6) { Toast.makeText(PostContentActivity.this, "输入字节数不能小于6!", Toast.LENGTH_SHORT).show(); } else { dialog.dismiss(); final String[] params = {url, message}; final Comment comment = new Comment(); progressDialog = ProgressDialog.show(PostContentActivity.this, null, "请稍后"); if (Build.VERSION.SDK_INT >= 11) { comment.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); } else { comment.execute(params); } } } } ); } else { url = String.format(Api.REPLY_SINGLE, fid, tid); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener( new View.OnClickListener() { @Override public void onClick(View v) { String message = editText.getText().toString(); byte[] m = message.getBytes(); if (m.length < 6) { Toast.makeText(PostContentActivity.this, "输入字节数不能小于6!", Toast.LENGTH_SHORT).show(); } else { dialog.dismiss(); final String[] params = {url, message, String.valueOf(postion)}; final Comment_Single comment_single = new Comment_Single(); progressDialog = ProgressDialog.show(PostContentActivity.this, null, "请稍后"); if (Build.VERSION.SDK_INT >= 11) { comment_single.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params); } else { comment_single.execute(params); } } } } ); } return true; } }); 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); getSupportLoaderManager().initLoader(1, null, this); loadFirst(); try { File httpCacheDir = new File(PostContentActivity.this.getExternalCacheDir(), "http"); long httpCacheSize = 20 * 1024 * 1024; // 10 MiB httpResponseCache = HttpResponseCache.install(httpCacheDir, httpCacheSize); } catch (IOException e) { e.printStackTrace(); } } private void initActionBar() { View actionBarContainer = ActionBarUtils.findActionBarContainer(this); 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); } TaskUtils.executeAsyncTask(new AsyncTask<Void, Object, Boolean>() { @Override protected Boolean doInBackground(Void... objects) { boolean isRefreshFromTop = (1 == mPage); try { ArrayList<Image> images = new ArrayList<Image>(); Document doc; int pid; String time; String content; String author; String temp = ""; if (isRefreshFromTop) { mtDataHelper.deleteAll(); miDataHelper.deleteAll(); } Connection.Response res = Request.execute(String.format(Api.POST_CONTENT, tid, next), "Mozilla", (Map<String, String>) Athority.getSharedPreference().getAll(), Connection.Method.GET); Athority.addCookies(res.cookies()); doc = res.parse(); Elements inputs = doc.getElementsByTag("input"); for (Element input : inputs) { if (input.attr("name").equals("formhash")) { formhash = input.attr("value"); } } Elements plhins = doc.getElementsByClass("plhin"); posts.clear(); for (Element plhin : plhins) { pid = Integer.valueOf(plhin.id().substring("pid".length())); Elements xw1s = plhin.getElementsByClass("xw1"); author = xw1s.text(); Elements t_fs = plhin.getElementsByClass("t_f"); for (Element t_f : t_fs) { temp = t_f.getElementsByTag("blockquote").text(); break; } content = t_fs.text(); content = content.substring(temp.length()); content = temp + "%%%%%" + content; time = plhin.getElementById("authorposton" + pid).text(); Elements e_pics = plhin.getElementsByClass("zoom"); images.clear(); if (e_pics != null) { for (Element e_pic : e_pics) { if (e_pic.attr("zoomfile").equals("")) { if (e_pic.attr("file").equals("")) { continue; } else { images.add(new Image(e_pic.attr("file"), pid)); } } else { images.add(new Image(e_pic.attr("zoomfile"), pid)); } } } if (images.size() == 0) { posts.add(new Post(fid, tid, pid, title, content, time, 0, 0, author, null)); } else { posts.add(new PostWithPic(fid, tid, pid, title, content, time, 1, 0, author, null)); miDataHelper.bulkInsert(images); } } if (!isloadmaxpage) { Element pgt = doc.getElementById("pgt"); if (pgt == null) { maxPage = 1; mPage = 1; isloadmaxpage = true; return false; } else { if (pgt.getElementsByTag("strong").text().equals("")) { maxPage = 1; mPage = 1; } else { maxPage = Integer.valueOf(pgt.getElementsByTag( "strong").text()); mPage = maxPage; Elements page_numbers = pgt.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 if (str_now_number.equals("返回列表")) { continue; } else if (str_now_number.equals("")) { continue; } else { now_number = Integer .valueOf(str_now_number); } if (now_number > maxPage) { maxPage = now_number; } } isloadmaxpage = true; } } } mtDataHelper.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); } getSupportLoaderManager().restartLoader(1, null, PostContentActivity.this); } }); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: finish(); return true; } return super.onOptionsItemSelected(item); } @Override protected void onDestroy() { super.onDestroy(); try { httpResponseCache.delete(); } catch (IOException e) { e.printStackTrace(); } } private void loadFirst() { mPage = 1; loadData(mPage); } private void loadNext() { mPage++; loadData(mPage); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return mtDataHelper.getCursorLoader(); } @Override public void onLoadFinished(Loader<Cursor> cursorLoader, 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 onStop() { super.onStop(); mAdapter.changeCursor(null); HttpResponseCache cache = HttpResponseCache.getInstalled(); if (cache != null) { cache.flush(); } } @Override protected void onResume() { super.onResume(); getSupportLoaderManager().restartLoader(1, null, PostContentActivity.this); } private class Comment extends AsyncTask<String, Void, Integer> { @Override protected Integer doInBackground(String... params) { int statusCode = 0; HashMap<String, String> datas = new HashMap<String, String>(); datas.put("message", params[1]); datas.put("formhash", formhash); datas.put("useig", "1"); datas.put("subject", ""); datas.put("posttime", ""); datas.put("handlekey", "reply"); datas.put("replysubmit", "true"); Connection.Response res = Request.execute(params[0], "Mozilla", datas, (Map<String, String>) Athority.getSharedPreference().getAll(), Connection.Method.POST); statusCode = res.statusCode(); return statusCode; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); progressDialog.dismiss(); if (result == 200) { Toast.makeText(PostContentActivity.this, "回复成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(PostContentActivity.this, "回复失败!", Toast.LENGTH_SHORT).show(); } } } private class Comment_Single extends AsyncTask<String, Void, Integer> { @Override protected Integer doInBackground(String... params) { int statusCode = 0; String noticetrimstr; String content = ""; if (posts.get(Integer.valueOf(params[2]) - 1).content.startsWith("%%%%%")) { content = posts.get(Integer.valueOf(params[2]) - 1).content.substring("%%%%%".length()); } else { String[] temp = posts.get(Integer.valueOf(params[2]) - 1).content.split("%%%%%"); content = temp[1]; } noticetrimstr = "[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=" + posts.get(Integer.valueOf(params[2]) - 1).pid + "&tid=" + posts.get(Integer.valueOf(params[2]) - 1).tid + "][color=#999999]" + posts.get(Integer.valueOf(params[2]) - 1).author + posts.get(Integer.valueOf(params[2]) - 1).time + "[/color][/url][/size] " + content + "[/quote]"; HashMap<String, String> datas = new HashMap<String, String>(); datas.put("message", params[1]); datas.put("formhash", formhash); datas.put("useig", "1"); datas.put("subject", ""); datas.put("posttime", ""); datas.put("handlekey", "reply"); datas.put("replysubmit", "true"); datas.put("noticetrimstr", noticetrimstr); Connection.Response res = Request.execute(params[0], "Mozilla", datas, (Map<String, String>) Athority.getSharedPreference().getAll(), Connection.Method.POST); statusCode = res.statusCode(); return statusCode; } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); progressDialog.dismiss(); if (result == 200) { Toast.makeText(PostContentActivity.this, "回复成功!", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(PostContentActivity.this, "回复失败!", Toast.LENGTH_SHORT).show(); } } } }