package com.athena.asm.fragment; import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.support.v4.widget.SwipeRefreshLayout; import android.view.KeyEvent; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import android.widget.Toast; import com.actionbarsherlock.app.SherlockFragment; import com.actionbarsherlock.view.Menu; import com.actionbarsherlock.view.MenuInflater; import com.actionbarsherlock.view.MenuItem; import com.athena.asm.ActivityFragmentTargets; import com.athena.asm.OnOpenActivityFragmentListener; import com.athena.asm.ProgressDialogProvider; import com.athena.asm.R; import com.athena.asm.aSMApplication; import com.athena.asm.Adapter.BoardTypeListAdapter; import com.athena.asm.Adapter.SubjectListAdapter; import com.athena.asm.data.Board; import com.athena.asm.data.Subject; import com.athena.asm.util.SmthSupport; import com.athena.asm.util.StringUtility; import com.athena.asm.util.task.EditFavoriteTask; import com.athena.asm.util.task.LoadSubjectTask; import com.athena.asm.viewmodel.BaseViewModel; import com.athena.asm.viewmodel.HomeViewModel; import com.athena.asm.viewmodel.SubjectListViewModel; public class SubjectListFragment extends SherlockFragment implements OnClickListener, android.content.DialogInterface.OnClickListener, BaseViewModel.OnViewModelChangObserver { private LayoutInflater m_inflater; private SubjectListViewModel m_viewModel; private EditText m_pageNoEditText; private ListView m_listView; private SwipeRefreshLayout m_swipeView; private boolean m_isNewInstance = false; private ProgressDialogProvider m_progressDialogProvider; private OnOpenActivityFragmentListener m_onOpenActivityFragmentListener; public static int BOARD_TYPE_SUBJECT = 0; public static int BOARD_TYPE_NORMAL = 1; public static int BOARD_TYPE_DIGEST = 2; public static int BOARD_TYPE_MARK = 3; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); setRetainInstance(true); m_isNewInstance = true; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { m_inflater = inflater; View subjectListView = inflater.inflate(R.layout.subject_list, null); m_listView = (ListView) subjectListView.findViewById(R.id.subject_list); m_swipeView = (SwipeRefreshLayout) subjectListView.findViewById(R.id.swipe_container); m_swipeView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { public void onRefresh() { // m_swipeView.setRefreshing(true); refreshSubjectList(); } }); aSMApplication application = (aSMApplication) getActivity().getApplication(); m_viewModel = application.getSubjectListViewModel(); m_viewModel.registerViewModelChangeObserver(this); m_pageNoEditText = (EditText) subjectListView.findViewById(R.id.edittext_page_no); m_pageNoEditText.setText(m_viewModel.getCurrentPageNumber() + ""); Button firstButton = (Button) subjectListView.findViewById(R.id.btn_first_page); firstButton.setOnClickListener(this); Button lastButton = (Button) subjectListView.findViewById(R.id.btn_last_page); lastButton.setVisibility(View.GONE); // lastButton.setOnClickListener(this); Button preButton = (Button) subjectListView.findViewById(R.id.btn_pre_page); preButton.setOnClickListener(this); Button goButton = (Button) subjectListView.findViewById(R.id.btn_go_page); goButton.setOnClickListener(this); goButton.setText(R.string.go_page); Button nextButton = (Button) subjectListView.findViewById(R.id.btn_next_page); nextButton.setOnClickListener(this); // ImageButton writeImageButton = (ImageButton) // subjectListView.findViewById(R.id.writePost); // writeImageButton.setOnClickListener(this); // ImageButton switchModeImageButton = (ImageButton) // subjectListView.findViewById(R.id.switchBoardMode); // switchModeImageButton.setOnClickListener(this); getSherlockActivity().getSupportActionBar().setDisplayHomeAsUpEnabled(true); return subjectListView; } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Activity parentActivity = getSherlockActivity(); if (parentActivity instanceof ProgressDialogProvider) { m_progressDialogProvider = (ProgressDialogProvider) parentActivity; } if (parentActivity instanceof OnOpenActivityFragmentListener) { m_onOpenActivityFragmentListener = (OnOpenActivityFragmentListener) parentActivity; } boolean isNewBoard = false; if (m_isNewInstance) { String defaultBoardType = ((aSMApplication) getActivity().getApplication()).getDefaultBoardType(); Board currentBoard = (Board) getActivity().getIntent().getSerializableExtra(StringUtility.BOARD); isNewBoard = m_viewModel.updateCurrentBoard(currentBoard, defaultBoardType); m_viewModel.setIsFirstIn(isNewBoard); } m_isNewInstance = false; if (isNewBoard) { refreshSubjectList(); } else { reloadSubjectList(); } } @Override public void onDestroy() { m_viewModel.unregisterViewModelChangeObserver(this); super.onDestroy(); } @Override public void onClick(View view) { if (view.getId() == R.id.btn_first_page) { m_viewModel.gotoFirstPage(); } else if (view.getId() == R.id.btn_last_page) { m_viewModel.gotoLastPage(); } else if (view.getId() == R.id.btn_pre_page) { m_viewModel.gotoPrevPage(); } else if (view.getId() == R.id.btn_go_page) { int pageSet = Integer.parseInt(m_pageNoEditText.getText().toString()); m_viewModel.setCurrentPageNumber(pageSet); } else if (view.getId() == R.id.btn_next_page) { m_viewModel.gotoNextPage(); } m_viewModel.updateBoardCurrentPage(); m_pageNoEditText.setText(m_viewModel.getCurrentPageNumber() + ""); refreshSubjectList(); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { switch (resultCode) { case Activity.RESULT_OK: Bundle b = data.getExtras(); boolean isToRefreshBoard = b.getBoolean(StringUtility.REFRESH_BOARD); if (isToRefreshBoard) { refreshSubjectList(); } break; default: break; } } public void reloadSubjectList() { if (m_viewModel.getSubjectList() != null) { if (m_viewModel.isFirstIn()) { m_viewModel.gotoFirstPage(); m_pageNoEditText.setText(m_viewModel.getCurrentPageNumber() + ""); m_viewModel.setIsFirstIn(false); } m_listView.setAdapter(new SubjectListAdapter(m_inflater, m_viewModel.getSubjectList())); m_listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, final int position, long id) { if (m_onOpenActivityFragmentListener != null) { Bundle bundle = new Bundle(); bundle.putSerializable(StringUtility.SUBJECT, (Subject) view.getTag(R.id.tag_second)); bundle.putInt(StringUtility.BOARD_TYPE, m_viewModel.getBoardType()); m_onOpenActivityFragmentListener.onOpenActivityOrFragment(ActivityFragmentTargets.POST_LIST, bundle); } } }); getActivity().setTitle(m_viewModel.getTitleText()); m_listView.requestFocus(); } } private void refreshSubjectList() { LoadSubjectTask loadSubjectTask = new LoadSubjectTask(m_viewModel); loadSubjectTask.execute(); if (m_progressDialogProvider != null) { m_progressDialogProvider.showProgressDialog(); } } public static final int SWITCH_BOARD_TYPE = Menu.FIRST; public static final int REFRESH_SUBJECTLIST = Menu.FIRST + 1; public static final int SEARCH_POST = Menu.FIRST + 2; public static final int NEW_POST = Menu.FIRST + 3; public static final int QUICK_SWITCH_BOARD_TYPE = Menu.FIRST + 4; public static final int SWITCH_STICKY = Menu.FIRST + 5; public static final int ADD_TO_FAVORITE = Menu.FIRST + 6; @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { // super.onCreateOptionsMenu(menu, inflater); boolean isLight = aSMApplication.THEME == R.style.Theme_Sherlock_Light; if (SmthSupport.getInstance().getLoginStatus()) { menu.add(0, NEW_POST, Menu.NONE, "发新贴").setIcon(isLight ? R.drawable.write_inverse : R.drawable.write) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); } menu.add(0, QUICK_SWITCH_BOARD_TYPE, Menu.NONE, "模式切换") .setIcon(isLight ? R.drawable.switcher_inverse : R.drawable.switcher) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0, SWITCH_STICKY, Menu.NONE, "切换置底").setIcon(isLight ? R.drawable.sticky_inverse : R.drawable.sticky) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0, SEARCH_POST, Menu.NONE, "搜索").setIcon(isLight ? R.drawable.search_inverse : R.drawable.search) .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); menu.add(0, REFRESH_SUBJECTLIST, Menu.NONE, "刷新") .setIcon(isLight ? R.drawable.refresh_inverse : R.drawable.refresh) .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM); menu.add(0, SWITCH_BOARD_TYPE, Menu.NONE, "切换到...").setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER | MenuItem.SHOW_AS_ACTION_WITH_TEXT); menu.add(0, ADD_TO_FAVORITE, Menu.NONE, "收藏版面").setShowAsAction( MenuItem.SHOW_AS_ACTION_NEVER | MenuItem.SHOW_AS_ACTION_WITH_TEXT); } @Override public boolean onOptionsItemSelected(MenuItem item) { // super.onOptionsItemSelected(item); switch (item.getItemId()) { case android.R.id.home: getActivity().onBackPressed(); break; case QUICK_SWITCH_BOARD_TYPE: m_viewModel.toggleBoardType(); if(m_viewModel.getBoardType() == BOARD_TYPE_SUBJECT){ Toast.makeText(getActivity(), "已切换到同主题模式", Toast.LENGTH_SHORT).show(); } else if (m_viewModel.getBoardType() == BOARD_TYPE_NORMAL){ Toast.makeText(getActivity(), "已切换到普通模式", Toast.LENGTH_SHORT).show(); } m_viewModel.setIsFirstIn(true); refreshSubjectList(); break; case SWITCH_BOARD_TYPE: // String[] items = { "同主题", "普通模式", "文摘区", "保留区" }; AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); builder.setTitle(R.string.post_alert_title); // builder.setItems(items,this); builder.setAdapter(new BoardTypeListAdapter(m_viewModel.getBoardType(), m_inflater), this); AlertDialog alert = builder.create(); alert.show(); break; case SWITCH_STICKY: // switch the variable, but do not save it aSMApplication.getCurrentApplication().switchHidePinSubject(); if(aSMApplication.getCurrentApplication().isHidePinSubject()){ Toast.makeText(getActivity(), "置底文章已隐藏", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(getActivity(), "显示置底文章", Toast.LENGTH_SHORT).show(); } refreshSubjectList(); break; case REFRESH_SUBJECTLIST: refreshSubjectList(); break; case SEARCH_POST: Intent postIntent = new Intent(); postIntent.setClassName("com.athena.asm", "com.athena.asm.SearchPostActivity"); postIntent.putExtra(StringUtility.BOARD, m_viewModel.getCurrentBoard().getEngName()); postIntent.putExtra(StringUtility.BID, m_viewModel.getCurrentBoard().getBoardID()); startActivity(postIntent); break; case NEW_POST: Intent writeIntent = new Intent(); writeIntent.setClassName("com.athena.asm", "com.athena.asm.WritePostActivity"); writeIntent.putExtra(StringUtility.URL, "http://www.newsmth.net/bbspst.php?board=" + m_viewModel.getCurrentBoard().getEngName()); writeIntent.putExtra(StringUtility.WRITE_TYPE, 0); writeIntent.putExtra(StringUtility.IS_REPLY, false); // startActivity(intent); startActivityForResult(writeIntent, 0); break; case ADD_TO_FAVORITE: Board board = m_viewModel.getCurrentBoard(); HomeViewModel viewModel = aSMApplication.getCurrentApplication().getHomeViewModel(); // groupid = "0", we always add the board to root group EditFavoriteTask task = new EditFavoriteTask(getActivity(), viewModel, "0", board.getEngName(), board.getBoardID(), EditFavoriteTask.FAVORITE_ADD); task.execute(); break; default: break; } return true; } @Override public void onClick(DialogInterface dialog, int which) { m_viewModel.setIsFirstIn(true); m_viewModel.setBoardType(which); LoadSubjectTask loadSubjectTask = new LoadSubjectTask(m_viewModel); loadSubjectTask.execute(); dialog.dismiss(); if (m_progressDialogProvider != null) { m_progressDialogProvider.showProgressDialog(); } } @Override public void onViewModelChange(BaseViewModel viewModel, String changedPropertyName, Object... params) { if (changedPropertyName.equals(SubjectListViewModel.SUBJECTLIST_PROPERTY_NAME)) { reloadSubjectList(); if (m_progressDialogProvider != null) { // delay the dismiss action by 0.5 second (new Handler()).postDelayed(new Runnable() { @Override public void run() { m_progressDialogProvider.dismissProgressDialog(); } }, 500); } } } 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); } } 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; } }