package com.athena.asm.fragment;
import java.util.ArrayList;
import java.util.List;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.Bundle;
import android.text.Editable;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.HapticFeedbackConstants;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.Toast;
import com.actionbarsherlock.app.SherlockFragment;
import com.actionbarsherlock.app.SherlockFragmentActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuInflater;
import com.actionbarsherlock.view.MenuItem;
import com.actionbarsherlock.widget.ShareActionProvider;
import com.athena.asm.ActivityFragmentTargets;
import com.athena.asm.OnOpenActivityFragmentListener;
import com.athena.asm.PostListActivity;
import com.athena.asm.ProgressDialogProvider;
import com.athena.asm.R;
import com.athena.asm.WritePostActivity;
import com.athena.asm.aSMApplication;
import com.athena.asm.Adapter.PostListAdapter;
import com.athena.asm.data.Mail;
import com.athena.asm.data.Post;
import com.athena.asm.data.Subject;
import com.athena.asm.listener.RefreshEventListener;
import com.athena.asm.util.StringUtility;
import com.athena.asm.util.task.DeletePostTask;
import com.athena.asm.util.task.ForwardPostToMailTask;
import com.athena.asm.util.task.LoadPostTask;
import com.athena.asm.util.task.OpenPostInBrowserTask;
import com.athena.asm.viewmodel.BaseViewModel;
import com.athena.asm.viewmodel.PostListViewModel;
/*
* this fragment is responsible to display three kinds of things:
* 1. post list in subject view mode
* 2. single post in normal view mode, digest mode, mark mode
* 3. post @ or replied to current user, opened in mailbox
* it's important to differentiate these three types
*/
public class PostListFragment extends SherlockFragment implements OnClickListener, OnTouchListener,
BaseViewModel.OnViewModelChangObserver, RefreshEventListener {
private LayoutInflater m_inflater;
private PostListViewModel m_viewModel;
private PostListAdapter m_postListAdapter;
EditText m_pageNumberEditText;
Button m_firstButton;
Button m_lastButton;
Button m_preButton;
Button m_goButton;
Button m_nextButton;
private Toast myToast;
private boolean m_isPageNumberEditTextTouched = false;
private int m_screenHeight;
private ListView m_listView;
private GestureDetector m_gestureDetector;
private boolean m_isNewInstance = false;
private boolean m_isFromReplyOrAt = false;
private int m_startNumber = 0;
private String m_url = null;
private ShareActionProvider m_actionProvider;
private ProgressDialogProvider m_progressDialogProvider;
private OnOpenActivityFragmentListener m_onOpenActivityFragmentListener;
// internal class for gesture detection
// http://stackoverflow.com/questions/3921138/gesture-in-listview-android
// if position change on Y axis > SWIPE_MAX_OFF_PATH, not swipe
private int SWIPE_MAX_OFF_PATH;
// if position change on X axis > SWIPE_MIN_DISTANCE, is swipe
private int SWIPE_MIN_DISTANCE;
// velocity must be larger than SWIPE_THRESHOLD_VELOCITY
private int SWIPE_THRESHOLD_VELOCITY;
class MyGestureDetector extends SimpleOnGestureListener {
@Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
// get current view from position
int pos = m_listView.pointToPosition((int) e.getX(), (int) e.getY());
// do not get view from listview, since it might be null
// http://stackoverflow.com/questions/6766625/listview-getchildat-returning-null-for-visible-children
// int start = m_listView.getFirstVisiblePosition();
// int end = m_listView.getLastVisiblePosition();
// if( pos >= start && pos <= end){
// View v = (View) m_listView.getChildAt(pos - start);
// // trigger long click on the selected view
// onLongClickOnView(v);
// }
Post post = m_viewModel.getPostList().get(pos);
onLongClickOnPost(post);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
if (aSMApplication.getCurrentApplication().isTouchScroll()) {
int touchY = (int) e.getRawY();
if (touchY < m_screenHeight * 0.45) {
setListOffsetByPage(-1);
return true;
} else if (touchY > m_screenHeight * 0.55) {
setListOffsetByPage(1);
return true;
}
}
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
if (!aSMApplication.getCurrentApplication().isTouchSwipe())
return false;
try {
if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
return false;
// right to left swipe
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_SUBJECT) {
if (aSMApplication.getCurrentApplication().isTouchHint()) {
myToast.setText("下一页");
myToast.show();
}
m_nextButton.performClick();
return true;
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_NORMAL
&& !m_isFromReplyOrAt) {
if (aSMApplication.getCurrentApplication().isTouchHint()) {
myToast.setText("同主题下一篇");
myToast.show();
}
m_nextButton.performClick();
return true;
}
return false;
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_SUBJECT) {
if (aSMApplication.getCurrentApplication().isTouchSwipeBack()
&& m_viewModel.getCurrentPageNumber() == 1) {
if (aSMApplication.getCurrentApplication().isTouchHint()) {
myToast.setText("返回");
myToast.show();
}
getActivity().onBackPressed();
return true;
} else {
if (aSMApplication.getCurrentApplication().isTouchHint()) {
myToast.setText("上一页");
myToast.show();
}
m_preButton.performClick();
return true;
}
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_NORMAL
&& !m_isFromReplyOrAt) {
if (aSMApplication.getCurrentApplication().isTouchHint()) {
myToast.setText("同主题上一篇");
myToast.show();
}
m_preButton.performClick();
return true;
}
return false;
}
} catch (Exception e) {
// nothing
Log.d("onFling", e.toString());
}
return false;
}
}
@SuppressLint("ShowToast")
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
myToast = Toast.makeText(getActivity(), null, Toast.LENGTH_SHORT);
setRetainInstance(true);
m_isNewInstance = true;
// use density-aware measurements.
DisplayMetrics dm = getResources().getDisplayMetrics();
SWIPE_MIN_DISTANCE = (int) (100.0f * dm.densityDpi / 160.0f + 0.5);
SWIPE_MAX_OFF_PATH = (int) (200.0f * dm.densityDpi / 160.0f + 0.5);
SWIPE_THRESHOLD_VELOCITY = (int) (150.0f * dm.densityDpi / 160.0f + 0.5);
}
@SuppressWarnings("deprecation")
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
m_inflater = inflater;
View postListView = inflater.inflate(R.layout.post_list, null);
aSMApplication application = (aSMApplication) getActivity().getApplication();
m_viewModel = application.getPostListViewModel();
m_viewModel.registerViewModelChangeObserver(this);
// http://stackoverflow.com/questions/1016896/android-how-to-get-screen-dimensions
// Point size = new Point();
// getActivity().getWindowManager().getDefaultDisplay().getSize(size);
// this.m_screenHeight = size.y;
// issue 2
this.m_screenHeight = getActivity().getWindowManager().getDefaultDisplay().getHeight();
m_pageNumberEditText = (EditText) postListView.findViewById(R.id.edittext_page_no);
m_pageNumberEditText.setText(m_viewModel.getCurrentPageNumber() + "");
m_pageNumberEditText.setOnClickListener(this);
m_pageNumberEditText.setOnTouchListener(this);
m_pageNumberEditText.setTextColor(Color.GRAY);
m_firstButton = (Button) postListView.findViewById(R.id.btn_first_page);
m_firstButton.setOnClickListener(this);
m_lastButton = (Button) postListView.findViewById(R.id.btn_last_page);
m_lastButton.setOnClickListener(this);
m_preButton = (Button) postListView.findViewById(R.id.btn_pre_page);
m_preButton.setOnClickListener(this);
m_goButton = (Button) postListView.findViewById(R.id.btn_go_page);
m_goButton.setOnClickListener(this);
m_nextButton = (Button) postListView.findViewById(R.id.btn_next_page);
m_nextButton.setOnClickListener(this);
// hide all buttons and edittext
m_firstButton.setVisibility(View.GONE);
m_lastButton.setVisibility(View.GONE);
m_preButton.setVisibility(View.GONE);
m_nextButton.setVisibility(View.GONE);
m_goButton.setVisibility(View.GONE);
m_pageNumberEditText.setVisibility(View.GONE);
m_listView = (ListView) postListView.findViewById(R.id.post_list);
m_listView.setFastScrollAlwaysVisible(true);
m_viewModel.setBoardType(getActivity().getIntent().getIntExtra(StringUtility.BOARD_TYPE, 0));
m_viewModel.setIsToRefreshBoard(false);
m_gestureDetector = new GestureDetector(m_listView.getContext(), new MyGestureDetector());
m_listView.setOnTouchListener(this);
getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true);
return postListView;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
boolean isNewSubject = false;
Activity parentActivity = getSherlockActivity();
if (parentActivity instanceof ProgressDialogProvider) {
m_progressDialogProvider = (ProgressDialogProvider) parentActivity;
}
if (parentActivity instanceof OnOpenActivityFragmentListener) {
m_onOpenActivityFragmentListener = (OnOpenActivityFragmentListener) parentActivity;
}
if (m_isNewInstance) {
Subject newSubject = (Subject) getActivity().getIntent().getSerializableExtra(StringUtility.SUBJECT);
if (newSubject != null) {
isNewSubject = m_viewModel.updateSubject(newSubject);
} else {
m_isFromReplyOrAt = true;
Mail mail = (Mail) getActivity().getIntent().getSerializableExtra(StringUtility.MAIL);
if (mail.getBoxType() == 4) {
m_url = "http://m.newsmth.net/refer/at/read?index=" + mail.getNumber();
} else {
m_url = "http://m.newsmth.net/refer/reply/read?index=" + mail.getNumber();
}
}
m_isNewInstance = false;
}
if (isNewSubject) {
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getCurrentSubject(), 0, false, false,
m_startNumber, null);
loadPostTask.execute();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.showProgressDialog();
}
} else if (m_isFromReplyOrAt) {
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getCurrentSubject(), 0, false, false,
m_startNumber, m_url);
loadPostTask.execute();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.showProgressDialog();
}
} else {
reloadPostList();
}
}
@Override
public void onDestroy() {
m_viewModel.unregisterViewModelChangeObserver(this);
super.onDestroy();
}
public void reloadPostList() {
if (m_viewModel.getPostList() == null) {
m_viewModel.ensurePostExists();
m_firstButton.setEnabled(false);
m_preButton.setEnabled(false);
m_nextButton.setEnabled(false);
m_lastButton.setEnabled(false);
}
if (m_actionProvider != null) {
m_actionProvider.setShareIntent(createShareIntent());
}
m_postListAdapter = new PostListAdapter(this, m_inflater, m_viewModel.getPostList());
m_listView.setAdapter(m_postListAdapter);
m_viewModel.setPostListAdapter(m_postListAdapter);
m_viewModel.updateCurrentPageNumberFromSubject();
m_pageNumberEditText.setText(m_viewModel.getCurrentPageNumber() + "");
m_isPageNumberEditTextTouched = false;
m_listView.requestFocus();
m_viewModel.setIsPreloadFinished(false);
m_viewModel.updatePreloadSubjectFromCurrentSubject();
if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_SUBJECT) {
m_firstButton.setText(R.string.first_page);
m_lastButton.setText(R.string.last_page);
m_preButton.setText(R.string.pre_page);
m_nextButton.setText(R.string.next_page);
m_goButton.setText(R.string.go_and_last_page);
// show buttons
m_goButton.setVisibility(View.VISIBLE);
m_pageNumberEditText.setVisibility(View.VISIBLE);
m_firstButton.setVisibility(View.VISIBLE);
m_preButton.setVisibility(View.VISIBLE);
m_nextButton.setVisibility(View.VISIBLE);
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_NORMAL && !m_isFromReplyOrAt) {
m_firstButton.setText(R.string.topic_first_page);
m_lastButton.setText(R.string.topic_all_page);
m_preButton.setText(R.string.topic_pre_page);
m_nextButton.setText(R.string.topic_next_page);
// show buttons
m_firstButton.setVisibility(View.VISIBLE);
m_lastButton.setVisibility(View.VISIBLE);
m_preButton.setVisibility(View.VISIBLE);
m_nextButton.setVisibility(View.VISIBLE);
} else {
// do not show any button in BOARD_TYPE_DIGEST & BOARD_TYPE_MARK
}
// getActivity might return null in Fragment
// http://stackoverflow.com/questions/11631408/android-fragment-getactivity-sometime-returns-null
Activity act = getActivity();
if (act != null)
act.setTitle(m_viewModel.getSubjectTitle());
if (m_viewModel.getBoardType() == 0) {
int nextPage = m_viewModel.getNextPageNumber();
if (nextPage > 0) {
m_viewModel.getPreloadSubject().setCurrentPageNo(nextPage);
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getPreloadSubject(), 0, true,
false, m_startNumber, null);
loadPostTask.execute();
}
} else {
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getPreloadSubject(), 3, true, false,
m_startNumber, null);
loadPostTask.execute();
}
}
@Override
public void onClick(View view) {
if (view.getId() == R.id.edittext_page_no) {
changePageNumberEditStatus();
return;
}
boolean isNext = false;
if (m_viewModel.getBoardType() == 0) {
// 同主题导航
if (view.getId() == R.id.btn_first_page) {
if (m_viewModel.getCurrentPageNumber() == 1) {
myToast.setText("已在第一页");
myToast.show();
return;
}
m_viewModel.gotoFirstPage();
} else if (view.getId() == R.id.btn_last_page) {
// this button is hidden, so this code can never be reached
m_viewModel.gotoLastPage();
} else if (view.getId() == R.id.btn_pre_page) {
if (m_viewModel.getCurrentPageNumber() == 1) {
myToast.setText("已在第一页");
myToast.show();
return;
}
m_viewModel.gotoPrevPage();
} else if (view.getId() == R.id.btn_next_page) {
if (m_viewModel.getCurrentPageNumber() == m_viewModel.getTotalPageNumber()) {
myToast.setText("已在最后一页");
myToast.show();
return;
}
m_viewModel.gotoNextPage();
isNext = true;
} else if (view.getId() == R.id.btn_go_page) {
// 如果未按过编辑框,GO的功能为末页。否则为GO
if (m_isPageNumberEditTextTouched) {
// jump to the page number
int pageSet = Integer.parseInt(m_pageNumberEditText.getText().toString());
if (m_viewModel.getCurrentPageNumber() == pageSet) {
String hint = String.format("已在第%d页, 请输入新页码!", pageSet);
myToast.setText(hint);
myToast.show();
return;
}
m_viewModel.setCurrentPageNumber(pageSet);
} else {
// go to last page
if (m_viewModel.getCurrentPageNumber() == m_viewModel.getTotalPageNumber()) {
myToast.setText("已在最后一页");
myToast.show();
return;
}
m_viewModel.gotoLastPage();
}
}
m_viewModel.updateSubjectCurrentPageNumberFromCurrentPageNumber();
m_pageNumberEditText.setText(m_viewModel.getCurrentPageNumber() + "");
m_isPageNumberEditTextTouched = false;
if (view.getParent() != null) {
((View) view.getParent()).requestFocus();
}
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getCurrentSubject(), 0, false,
isNext, m_startNumber, null);
loadPostTask.execute();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.showProgressDialog();
}
} else {
// 非同主题下的导航按钮
int action = Post.ACTION_DEFAULT;
if (view.getId() == R.id.btn_first_page) {
action = Post.ACTION_FIRST_POST_IN_SUBJECT;
} else if (view.getId() == R.id.btn_pre_page) {
action = Post.ACTION_PREVIOUS_POST_IN_SUBJECT;
} else if (view.getId() == R.id.btn_next_page) {
action = Post.ACTION_NEXT_POST_IN_SUBJECT;
isNext = true;
} else if (view.getId() == R.id.btn_last_page) {
// expand subject from this post
m_viewModel.setSubjectExpand(true);
m_viewModel.setBoardType(0);
try {
m_startNumber = Integer.parseInt(m_viewModel.getCurrentSubject().getSubjectID());
} catch (NumberFormatException e) {
Log.d("PostListFragment", e.toString());
return;
}
m_viewModel.updateSubjectIDFromTopicSubjectID();
m_viewModel.setSubjectCurrentPageNumber(1);
}
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getCurrentSubject(), action, false,
isNext, m_startNumber, null);
loadPostTask.execute();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.showProgressDialog();
}
}
}
@Override
public void onViewModelChange(BaseViewModel viewModel, String changedPropertyName, Object... params) {
if (changedPropertyName.equals(PostListViewModel.POSTLIST_PROPERTY_NAME)) {
reloadPostList();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.dismissProgressDialog();
}
}
}
private void setListOffsetByPage(int jump) {
int offset = (int) (m_listView.getHeight() * 0.95);
if (jump == -1) {
m_listView.smoothScrollBy(-1 * offset, 500);
} else {
m_listView.smoothScrollBy(offset, 500);
}
}
// this method is called by guesture.onLongPress()
public boolean onLongClickOnPost(final Post post) {
if (m_viewModel.getSmthSupport().getLoginStatus()) {
m_listView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS);
final String authorID = post.getAuthor();
if (authorID == null || authorID.equals("guest")) {
// the post was not loaded successfully, return
Toast.makeText(getActivity(), "帖子异常,请返回!", Toast.LENGTH_SHORT).show();
return false;
}
final Post firstPost = m_viewModel.getPostList().get(0);
// show popup menu now now
List<String> itemList = new ArrayList<String>();
itemList.add(getString(R.string.post_reply_post));
itemList.add(getString(R.string.post_reply_mail));
itemList.add(getString(R.string.post_view_in_browser));
itemList.add(getString(R.string.post_query_author));
itemList.add(getString(R.string.post_copy_author));
itemList.add(getString(R.string.post_copy_content));
itemList.add(getString(R.string.post_foward_self));
itemList.add(getString(R.string.post_foward_external));
itemList.add(getString(R.string.post_group_foward_external));
if (authorID.compareToIgnoreCase(m_viewModel.getSmthSupport().userid) == 0) {
itemList.add(getString(R.string.post_edit_post));
itemList.add(getString(R.string.post_delete_post));
}
final String[] items = new String[itemList.size()];
itemList.toArray(items);
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setTitle(R.string.post_alert_title);
builder.setItems(items, new DialogInterface.OnClickListener() {
@SuppressWarnings("deprecation")
public void onClick(DialogInterface dialog, int item) {
switch (item) {
case 0:
// post_reply_post
if (m_onOpenActivityFragmentListener != null) {
Bundle bundle = new Bundle();
bundle.putSerializable(
StringUtility.URL,
"http://www.newsmth.net/bbspst.php?board=" + post.getBoard() + "&reid="
+ post.getSubjectID());
bundle.putSerializable(StringUtility.WRITE_TYPE, WritePostActivity.TYPE_POST);
bundle.putSerializable(StringUtility.IS_REPLY, true);
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(
ActivityFragmentTargets.WRITE_POST, bundle);
}
break;
case 1:
// post_reply_mail
if (m_onOpenActivityFragmentListener != null) {
Bundle bundle = new Bundle();
bundle.putSerializable(StringUtility.URL, "http://www.newsmth.net/bbspstmail.php?board="
+ post.getBoard() + "&id=" + post.getSubjectID());
bundle.putSerializable(StringUtility.WRITE_TYPE, WritePostActivity.TYPE_MAIL);
bundle.putSerializable(StringUtility.IS_REPLY, true);
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(
ActivityFragmentTargets.WRITE_POST, bundle);
}
break;
case 2:
// post_view_in_browser
if (post.getSubjectID() == null) {
// subjectID extracted from <a
// href="/article/FamilyLife/post/1752675592">回复</a>
// so guest user can't get postid, open topic list
// as a workaround
// http://m.newsmth.net/article/Love/5528596?p=1
String weburl = String.format("http://m.newsmth.net/article/%s/%s?p=%d", post.getBoard(),
post.getTopicSubjectID(), m_viewModel.getCurrentPageNumber());
Uri uri = Uri.parse(weburl);
startActivity(new Intent(Intent.ACTION_VIEW, uri));
} else {
// http://www.newsmth.net/bbscon.php?bid=647&id=930420291
// check boardID, if user comes from guidance
// boardID might be null or "fake"
String boardID = post.getBoardID();
if (boardID == null || boardID.length() == 0 || boardID.equals("fake")) {
// we will look up boardID by boardName in this
// Async task then open the post
OpenPostInBrowserTask browserTask = new OpenPostInBrowserTask(getActivity(), post);
browserTask.execute();
} else {
// open post directly
String weburl = String.format("http://www.newsmth.net/bbscon.php?bid=%s&id=%s",
boardID, post.getSubjectID());
Uri uri = Uri.parse(weburl);
startActivity(new Intent(Intent.ACTION_VIEW, uri));
}
}
break;
case 3:
// post_query_author
if (m_onOpenActivityFragmentListener != null) {
Bundle bundle = new Bundle();
bundle.putSerializable(StringUtility.USERID, authorID);
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(
ActivityFragmentTargets.VIEW_PROFILE, bundle);
}
break;
case 4:
// post_copy_author
// http://stackoverflow.com/questions/14189544/copy-with-clipboard-manager-that-supports-old-and-new-android-versions
android.text.ClipboardManager clip = (android.text.ClipboardManager) getActivity()
.getSystemService(Context.CLIPBOARD_SERVICE);
clip.setText(authorID);
Toast.makeText(getActivity(), "ID : " + authorID + "已复制到剪贴板", Toast.LENGTH_SHORT).show();
break;
case 5:
// post_copy_content
android.text.ClipboardManager clip2 = (android.text.ClipboardManager) getActivity()
.getSystemService(Context.CLIPBOARD_SERVICE);
clip2.setText(post.getTextContent());
Toast.makeText(getActivity(), "帖子内容已复制到剪贴板", Toast.LENGTH_SHORT).show();
break;
case 6:
// post_foward_self
ForwardPostToMailTask task = new ForwardPostToMailTask(getActivity(), m_viewModel, post,
ForwardPostToMailTask.FORWARD_TO_SELF, "");
task.execute();
break;
case 7:
// post_foward_external
forwardToEmail(post, false);
break;
case 8:
// post_group_foward_external
forwardToEmail(firstPost, true);
break;
case 9:
// post_edit_post
if (m_onOpenActivityFragmentListener != null) {
Bundle bundle = new Bundle();
// http://www.newsmth.net/bbsedit.php?board=PocketLife&id=1408697&ftype=0
String url = "http://www.newsmth.net/bbsedit.php?board=" + post.getBoard() + "&id="
+ post.getSubjectID() + "&ftype=0";
bundle.putSerializable(StringUtility.URL, url);
// Log.d("TYPE_POST_EDIT read URL = ", url);
bundle.putSerializable(StringUtility.WRITE_TYPE, WritePostActivity.TYPE_POST_EDIT);
bundle.putSerializable(StringUtility.TITLE, post.getTitle().replace("主题:", ""));
m_onOpenActivityFragmentListener.onOpenActivityOrFragment(
ActivityFragmentTargets.WRITE_POST, bundle);
}
break;
case 10:
// post_delete_post
DeletePostTask deleteTask = new DeletePostTask(getActivity(), m_viewModel, post.getBoard(),
post.getSubjectID(), PostListFragment.this);
deleteTask.execute();
// expect callback RefreshEvent.refresh()
break;
default:
break;
}
dialog.dismiss();
}
});
AlertDialog alert = builder.create();
alert.show();
return true;
}
return false;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
if (v.getId() == R.id.edittext_page_no) {
changePageNumberEditStatus();
return false;
}
m_gestureDetector.onTouchEvent(event);
return false;
}
private void refreshPostList() {
LoadPostTask loadPostTask = new LoadPostTask(m_viewModel, m_viewModel.getCurrentSubject(), 0, false, false,
m_startNumber, null);
loadPostTask.execute();
if (m_progressDialogProvider != null) {
m_progressDialogProvider.showProgressDialog();
}
}
public static final int REFRESH_SUBJECTLIST = Menu.FIRST;
public static final int GO_TO_BOARD = Menu.FIRST + 1;
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
boolean isLight = aSMApplication.THEME == R.style.Theme_Sherlock_Light;
((SherlockFragmentActivity) getActivity()).getSupportMenuInflater().inflate(R.menu.share_action_provider, menu);
menu.add(0, REFRESH_SUBJECTLIST, Menu.NONE, "刷新")
.setIcon(isLight ? R.drawable.refresh_inverse : R.drawable.refresh)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
menu.add(0, GO_TO_BOARD, Menu.NONE, "返回版面").setIcon(isLight ? R.drawable.toboard_inverse : R.drawable.toboard)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
MenuItem actionItem = menu.findItem(R.id.menu_item_share_action_provider_action_bar);
m_actionProvider = (ShareActionProvider) actionItem.getActionProvider();
// m_actionProvider.setShareHistoryFileName(ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME);
// don't save share history persistently
m_actionProvider.setShareHistoryFileName(null);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// super.onOptionsItemSelected(item);
if (!m_isFromReplyOrAt) {
switch (item.getItemId()) {
case android.R.id.home:
getActivity().onBackPressed();
break;
case REFRESH_SUBJECTLIST:
refreshPostList();
break;
case GO_TO_BOARD:
if (getActivity() instanceof PostListActivity) {
String boardEngName = m_viewModel.getCurrentSubject().getBoardEngName();
String boardChsName = m_viewModel.getCurrentSubject().getBoardChsName();
if (boardEngName != null) {
((PostListActivity) getActivity()).doFinishBackToBoard(boardEngName, boardChsName);
}
}
break;
}
}
return true;
}
/**
* Creates a sharing {@link Intent}.
*
* @return The sharing intent.
*/
private Intent createShareIntent() {
Intent shareIntent = new Intent(Intent.ACTION_SEND);
shareIntent.setType("text/plain");
if (m_viewModel.getCurrentSubject() != null) {
Subject subject = m_viewModel.getCurrentSubject();
shareIntent.putExtra(Intent.EXTRA_SUBJECT, subject.getTitle());
if (m_isFromReplyOrAt && m_url != null) {
shareIntent.putExtra(Intent.EXTRA_TEXT, m_url);
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_SUBJECT) {
shareIntent.putExtra(Intent.EXTRA_TEXT,
subject.getTitle() + " http://m.newsmth.net/article/" + subject.getBoardEngName() + "/"
+ subject.getSubjectID());
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_NORMAL) {
shareIntent.putExtra(Intent.EXTRA_TEXT, subject.getTitle() + "http://www.newsmth.net/bbscon.php?bid="
+ subject.getBoardID() + "&id=" + subject.getSubjectID());
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_DIGEST) {
shareIntent.putExtra(Intent.EXTRA_TEXT,
subject.getTitle() + " http://m.newsmth.net/article/" + subject.getBoardEngName() + "/single/"
+ subject.getSubjectID() + "/1");
} else if (m_viewModel.getBoardType() == SubjectListFragment.BOARD_TYPE_MARK) {
shareIntent.putExtra(Intent.EXTRA_TEXT,
subject.getTitle() + " http://m.newsmth.net/article/" + subject.getBoardEngName() + "/single/"
+ subject.getSubjectID() + "/3");
}
}
return shareIntent;
}
private void changePageNumberEditStatus() {
if (aSMApplication.getCurrentApplication().isNightTheme()) {
m_pageNumberEditText.setTextColor(Color.WHITE);
} else {
m_pageNumberEditText.setTextColor(Color.BLACK);
}
m_isPageNumberEditTextTouched = true;
}
// this method can forward post to external email or other user
private void forwardToEmail(final Post post, final boolean group) {
String email = aSMApplication.getCurrentApplication().getForwardEmailAddr();
final EditText input = new EditText(getActivity());
input.setText(email);
new AlertDialog.Builder(getActivity()).setTitle("设置转寄的收件人/外部邮箱").setMessage("输入ID可转寄给站内用户,输入EMAIL可转寄到外部邮箱")
.setView(input).setPositiveButton("转寄", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
Editable value = input.getText();
aSMApplication.getCurrentApplication().updateForwardEmailAddr(value.toString());
ForwardPostToMailTask task;
if (group)
task = new ForwardPostToMailTask(getActivity(), m_viewModel, post,
ForwardPostToMailTask.FORWARD_TO_EMAIL_GROUP, value.toString());
else
task = new ForwardPostToMailTask(getActivity(), m_viewModel, post,
ForwardPostToMailTask.FORWARD_TO_EMAIL, value.toString());
task.execute();
}
}).setNegativeButton("取消", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
// Do nothing.
}
}).show();
return;
}
@Override
public void refresh() {
refreshPostList();
}
public boolean onKeyDown(int keyCode) {
if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
setListOffsetByPage(1);
return true;
} else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
setListOffsetByPage(-1);
return true;
}
return false;
}
public ListView getListView() {
return m_listView;
}
}